Goal and requirements
The main goal of this issue is to track the development of a generic Rust Socket interface binded to the C struct socket.
The functionalities I am planning to add to the Rust interface are:
- Socket generic structure and, possibly, specific Tcp and Udp wrappers.
- Basic socket functionalities
- Socket creation (
sock_create, sock_create_kern, sock_create_lite)
- Bind, listen and accept (
kernel_bind, kernel_listen, kernel_accept)
- Information retrieval (
kernel_getsockname, kernel_getpeername)
- Release (
sock_shutdown, sock_release)
- Generic addresses handling
- Enum representation of the
sockaddr structs (sockaddr_in, sockaddr_in6, etc)
- Bindings for the internet address structures (
in_addr, in6_addr)
- Binding for the generic C
struct sockaddr_storage.
Dependencies
The following graph shows the interaction between the different C entities involved in the socket abstraction.
- Green entities will be implemented in the Rust interface.
- Purple entities will be implemented partially, at least in the beginning, starting with the most used ones (i.e.
IPPROTO_TCP and IPPROTO_UDP will be added before IPPROTO_ETHERNET)
- Yellow entities will not be implemented: these entities are highly complex and their implementation is not strictly required to accomplish the goal, which is to provide basic socket functionalities.

Implementation
A possible implementation UML could be as follows:

There are a few considerations on that:
-
Receive and Send operations behave differently based on the type of socket: UDP (and other connection-less protocols) write in msghdr->msg_name the address of the sender of the packet; other protocols, like TCP, do not do it, as they are connection-oriented. I tried to keep it as generic as possible, binding a struct to the C struct msghdr.
-
Tcp and Udp wrappers could give an abstraction layer advantage: since they behave differently, their send and receive methods could use the generic socket one, but have a different return type; for example:

Development
The socket implementation would happen inside the rust/kernel/net/ folder. It is probably best to put the widely used entities, like IPPROTO_* and AddressFamily in a separate module, in order to keep a fine-grained logical division.
I will be working on the implementation of these functionalities on this this branch.
Contributions
The work on this interface is based on:
Any comment or suggestion is highly appreciated :)
Goal and requirements
The main goal of this issue is to track the development of a generic Rust
Socketinterface binded to the Cstruct socket.The functionalities I am planning to add to the Rust interface are:
sock_create,sock_create_kern,sock_create_lite)kernel_bind,kernel_listen,kernel_accept)kernel_getsockname,kernel_getpeername)sock_shutdown,sock_release)sockaddrstructs (sockaddr_in,sockaddr_in6, etc)in_addr,in6_addr)struct sockaddr_storage.Dependencies
The following graph shows the interaction between the different C entities involved in the socket abstraction.
IPPROTO_TCPandIPPROTO_UDPwill be added beforeIPPROTO_ETHERNET)Implementation
A possible implementation UML could be as follows:
There are a few considerations on that:
Receive and Send operations behave differently based on the type of socket: UDP (and other connection-less protocols) write in
msghdr->msg_namethe address of the sender of the packet; other protocols, like TCP, do not do it, as they are connection-oriented. I tried to keep it as generic as possible, binding a struct to the Cstruct msghdr.Tcp and Udp wrappers could give an abstraction layer advantage: since they behave differently, their send and receive methods could use the generic socket one, but have a different return type; for example:
Development
The socket implementation would happen inside the
rust/kernel/net/folder. It is probably best to put the widely used entities, likeIPPROTO_*andAddressFamilyin a separate module, in order to keep a fine-grained logical division.I will be working on the implementation of these functionalities on this this branch.
Contributions
The work on this interface is based on:
rustbranchAny comment or suggestion is highly appreciated :)