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>
215 lines
5.2 KiB
Groff
215 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.
|