1
0
Fork 0
mirror of https://gitlab.com/sortix/sortix.git synced 2023-02-13 20:55:38 -05:00
sortix--sortix/share/man/man4/inet.4
Jonas 'Sortie' Termansen 2ef6804ead Add networking stack.
This change adds all the kernel parts of a network stack. The network stack
is partial but implements many of the important parts.

Add if(4) network interface abstraction. Network interfaces are registered
in a global list that can be iterated and each assigned an unique integer
identifier.

Add reference counted packets with a cache that recycles recent packets.

Add support for lo(4) loopback and ether(4) ethernet network interfaces.
The /dev/lo0 loopback device is created automatically on boot.

Add arp(4) address resolution protocol driver for translation of inet(4)
network layer addresses into ether(4) link layer addresses. arp(4) entries
are cached and evicted from the cache when needed or when the entry has not
been used for a while. The cache is limited to 256 entries for now.

Add ip(4) internet protocol version 4 support. IP fragmentation and options
are not implemented yet.

Add tcp(4) transmission control protocol sockets for a reliable transport
layer protocol that provides a reliable byte stream connection between two
hosts. The implementation is incomplete and does not yet implement out of
band data, options, and high performance extensions.

Add udp(4) user datagram protocol sockets for a connectionless transport
layer that provides best-effort delivery of datagrams.

Add ping(4) sockets for a best-effort delivery of echo datagrams.

Change type of sa_family_t from unsigned short to uint16_t.

Add --disable-network-drivers to the kernel(7) options and expose it with a
bootloader menu. tix-iso-bootconfig can set this option by default.

Import CRC32 code from libz for the Ethernet checksum.

This is a compatible ABI change that adds features to socket(2) (AF_INET,
IPPROTO_TCP, IPPROTO_UDP, IPPROTO_PING), the ioctls for if(4), socket
options, and the lo0 loopback interface.

This commit is based on work by Meisaka Yukara contributed as the commit
bbf7f1e8a5238a2bd1fe8eb1d2cc5c9c2421e2c4. Almost no lines of this work
remains in this final commit as it has been rewritten or refactored away
over the years, see the individual file headers for which files contain
remnants of this work.

Co-authored-by: Meisaka Yukara <Meisaka.Yukara@gmail.com>
2022-12-11 13:40:34 +01:00

214 lines
5.2 KiB
Groff

.Dd June 1, 2017
.Dt INET 4
.Os
.Sh NAME
.Nm inet
.Nd internet protocol family
.Sh SYNOPSIS
.In sys/socket.h
.In netinet/in.h
.Pp
.Fd #define AF_INET 1
.Bd -literal
typedef uint16_t sa_family_t;
typedef uint16_t in_port_t;
typedef uint32_t in_addr_t;
struct in_addr {
in_addr_t s_addr;
};
struct sockaddr_in {
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
};
.Ed
.Sh DESCRIPTION
The Internet Protocol version 4 protocol family is a set of protocols using the
Internet Protocol version 4
.Xr ip 4
as the network layer.
.Dv SOCK_STREAM
sockets are provided by the Transmission Control Protocol
.Xr tcp 4 .
.Dv SOCK_DGRAM
sockets are provided by the User Datagram Protocol
.Xr udp 4 .
.Pp
Hosts are addressed with a four byte Internet Protocol (IP) address stored in a
.Vt struct in_addr
in network byte order.
IP addresses are notated by
the decimal byte values interspaced with periods, e.g. 192.0.2.255.
Subnetworks are ranges of IP addresses given by a starting IP address along with
how many leading bits (most significant bit first) of the IP address are common
to the network (the prefix), the first address of the the subnetwork is the
prefix with the remaining bits set to zero, and the last address is the prefix
with the
remaining bits set to one.
A subnetwork can be denoted by the starting IP address and the leading bits,
e.g. 198.51.100.0/24 spans from 198.51.100.0 to 198.51.100.255.
The subnet mask of a subnetwork is an IP address with the bits set that belong
to the network prefix, e.g. the subnet mask of 203.0.113.0/24 is 255.255.255.0.
The subnetworks 192.0.2.0/24 (TEST-NET-1), 198.51.100.0/24 (TEST-NET-2), and
203.0.113.0/24 (TEST-NET-2) are reserved for documentation.
The last address in a network is normally the broadcast address for the network.
.Pp
Services are addressed
with a 16-bit byte port number in a
.Vt in_port_t
in network byte order.
.Pp
Sockets are addressed with the combination of a host address and port number
stored in a
.Vt struct sockaddr_in
where
.Va sin_family
is set to
.Dv AF_INET ,
.Va sin_port
is set to the 16-bit port number in network byte order, and
.Va sin_addr
is set to the host address in network byte order.
.Pp
.Va sin_port
can be set to
.Li 0
(converted to network byte order)
to request
.Xr bind 2
allocate a port.
Port
.Li 0
is not valid as a destination port.
.Pp
.Va sin_addr.s_addr
can be set to
.Dv INADDR_ANY
.Pq 0.0.0.0
(converted to network byte order) to mean an unspecified address.
When a socket is bound to the address
.Dv INADDR_ANY ,
messages are accepted from any address.
In
.Xr connect 2
and
.Xr sendto 2 ,
the destination address
.Dv INADDR_ANY
means the current host.
.Pp
.Va sin_addr.s_addr
can be set to
.Dv INADDR_BROADCAST
.Pq 255.255.255.255
(converted to network byte order),
the broadcast address of the local network.
.Pp
.Va sin_addr.s_addr
can be set to
.Dv INADDR_LOOPBACK
.Pq 127.0.0.1
(converted to network byte order), the address of the loopback interface
.Xr lo 4 .
.Dv INADDR_LOOPMASK
.Pq 255.0.0.0
contains the subnet mask of the loopback interface.
.Pp
Sockets of this protocol family can be created by passing
.Dv AF_INET
as the
.Fa domain
parameter of
.Xr socket 2 .
.Pp
The network byte order is big-endian.
.Pp
IP addresses in 32-bit integer format in the host endian can be converted
to network byte order using
.Xr htobe32 3
or
.Xr htonl 3
and back using
.Xr be32toh 3
or
.Xr ntohl 3 .
.Pp
Port numbers in 16-bit integer format in the host endian can be converted
to network byte order using
.Xr htobe16 3
or
.Xr htons 3
and back using
.Xr be16toh 3
or
.Xr ntohs 3 .
.Pp
.Xr inet_pton 3
can be used to convert an IP address from textual representation to binary
representation.
.Xr inet_ntop 3
can be used to convert an IP address from binary representation to textual
representation.
.Sh EXAMPLES
This example manually constructs and deconstructs a
.Vt struct inaddr_in .
.Bd -literal
struct sockaddr_in saddr;
memset(&saddr, 0, sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = htobe32(0xC0000201); /* 192.0.2.1 */
saddr.sin_port = htobe16(1234);
sa_family_t family = saddr.sin_family;
in_addr_t addr = be32toh(saddr.sin_addr.s_addr);
in_port_t port = be16toh(saddr.sin_port);
.Ed
.Sh COMPATIBILITY
On some operating systems,
.Vt struct sockaddr_in
may contain padding and additional members and the structure should be
initialized to zero prior to initializing its members.
.Sh SEE ALSO
.Xr socket 2 ,
.Xr arp 4 ,
.Xr icmp 4 ,
.Xr ip 4 ,
.Xr ping 4 ,
.Xr tcp 4 ,
.Xr udp 4 ,
.Xr kernel 7
.Sh STANDARDS
.Rs
.%A J. Postel (ed.)
.%D September 1981
.%R STD 5
.%R RFC 791
.%T Internet Protocol - DARPA Internet Program Protocol Specification
.%Q USC/Information Sciences Institute
.Re
.Pp
.Rs
.%A Internet Engineering Task Force
.%A J. Arkko
.%A M. Cotton
.%A L. Vegoda
.%D January 2010
.%R RFC 5737
.%T IPv4 Address Blocks Reserved for Documentation
.%Q Ericsson
.%Q ICANN
.Re
.Pp
The protocol family programming interface conforms to
.St -p1003.1-2008 .
.Sh BUGS
The network stack implementation is incomplete and has known bugs.
See the protocol manual pages for more information.
.Pp
The 4-byte address space allows only a maximum of 4294967296 addresses and is
being exhausted.
The Internet Protocol version 6 replaces version 4 and provides a 16-byte
address space instead.