relibc/header/netinet_in/mod.rs
1//! `netinet/in.h` implementation.
2//!
3//! See <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/netinet_in.h.html>.
4
5#![allow(non_camel_case_types)]
6
7use crate::{
8 header::{bits_safamily_t::sa_family_t, sys_socket::sockaddr_storage},
9 platform::types::{c_char, c_int},
10};
11
12/// See <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/netinet_in.h.html>.
13pub type in_addr_t = u32;
14/// See <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/netinet_in.h.html>.
15pub type in_port_t = u16;
16
17/// See <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/netinet_in.h.html>.
18#[repr(C)]
19#[derive(Debug, Clone, Default)]
20pub struct in_addr {
21 pub s_addr: in_addr_t,
22}
23
24/// See <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/netinet_in.h.html>.
25#[repr(C)]
26pub struct in6_addr {
27 pub s6_addr: [u8; 16],
28}
29
30/// See <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/netinet_in.h.html>.
31#[repr(C)]
32#[derive(Debug, Default)]
33pub struct sockaddr_in {
34 pub sin_family: sa_family_t,
35 pub sin_port: in_port_t,
36 pub sin_addr: in_addr,
37 pub sin_zero: [c_char; 8],
38}
39
40/// See <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/netinet_in.h.html>.
41#[repr(C)]
42pub struct sockaddr_in6 {
43 pub sin6_family: sa_family_t,
44 pub sin6_port: in_port_t,
45 pub sin6_flowinfo: u32,
46 pub sin6_addr: in6_addr,
47 pub sin6_scope_id: u32,
48}
49
50/// See <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/netinet_in.h.html>.
51#[repr(C)]
52pub struct ipv6_mreq {
53 pub ipv6mr_multiaddr: in6_addr,
54 pub ipv6mr_interface: u32,
55}
56
57// Address String Lengths
58/// See <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/netinet_in.h.html>.
59pub const INET_ADDRSTRLEN: c_int = 16;
60/// See <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/netinet_in.h.html>.
61pub const INET6_ADDRSTRLEN: c_int = 46;
62
63// IP options
64/// Non-POSIX, see <https://www.man7.org/linux/man-pages/man7/ip.7.html>.
65pub const IP_TOS: c_int = 1;
66/// Non-POSIX, see <https://www.man7.org/linux/man-pages/man7/ip.7.html>.
67pub const IP_RECVTOS: c_int = 13;
68
69// Protocol Numbers
70/// See <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/netinet_in.h.html>.
71pub const IPPROTO_IP: u8 = 0;
72/// See <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/netinet_in.h.html>.
73pub const IPPROTO_ICMP: u8 = 1;
74/// Non-POSIX.
75pub const IPPROTO_IGMP: u8 = 2;
76/// See <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/netinet_in.h.html>.
77pub const IPPROTO_TCP: u8 = 6;
78/// Non-POSIX.
79pub const IPPROTO_PUP: u8 = 12;
80/// See <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/netinet_in.h.html>.
81pub const IPPROTO_UDP: u8 = 17;
82/// Non-POSIX.
83pub const IPPROTO_IDP: u8 = 22;
84/// See <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/netinet_in.h.html>.
85pub const IPPROTO_IPV6: u8 = 41;
86/// Non-POSIX.
87pub const IPPROTO_ICMPV6: u8 = 58;
88/// See <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/netinet_in.h.html>.
89pub const IPPROTO_RAW: u8 = 0xff;
90/// Non-POSIX.
91pub const IPPROTO_MAX: u8 = 0xff;
92
93/// Non-POSIX, see <https://www.man7.org/linux/man-pages/man7/ip.7.html>.
94pub const IP_TTL: c_int = 2;
95/// See <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/netinet_in.h.html>.
96pub const IPV6_UNICAST_HOPS: c_int = 16;
97/// See <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/netinet_in.h.html>.
98pub const IPV6_MULTICAST_IF: c_int = 17;
99/// See <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/netinet_in.h.html>.
100pub const IPV6_MULTICAST_HOPS: c_int = 18;
101/// See <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/netinet_in.h.html>.
102pub const IPV6_MULTICAST_LOOP: c_int = 19;
103/// Non-POSIX.
104pub const IPV6_ADD_MEMBERSHIP: c_int = 20;
105pub const IPV6_JOIN_GROUP: c_int = 20;
106/// Non-POSIX.
107pub const IPV6_DROP_MEMBERSHIP: c_int = 21;
108pub const IPV6_LEAVE_GROUP: c_int = 21;
109/// See <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/netinet_in.h.html>.
110pub const IPV6_V6ONLY: c_int = 26;
111/// Non-POSIX, see <https://www.man7.org/linux/man-pages/man7/ip.7.html>.
112pub const IP_MULTICAST_IF: c_int = 32;
113/// Non-POSIX, see <https://www.man7.org/linux/man-pages/man7/ip.7.html>.
114pub const IP_MULTICAST_TTL: c_int = 33;
115/// Non-POSIX, see <https://www.man7.org/linux/man-pages/man7/ip.7.html>.
116pub const IP_MULTICAST_LOOP: c_int = 34;
117/// Non-POSIX, see <https://www.man7.org/linux/man-pages/man7/ip.7.html>.
118pub const IP_ADD_MEMBERSHIP: c_int = 35;
119/// Non-POSIX, see <https://www.man7.org/linux/man-pages/man7/ip.7.html>.
120pub const IP_DROP_MEMBERSHIP: c_int = 36;
121
122/// See <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/netinet_in.h.html>.
123pub const INADDR_ANY: u32 = 0; // Can't use in_addr_t alias because cbindgen :(
124/// See <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/netinet_in.h.html>.
125pub const INADDR_BROADCAST: u32 = 0xFFFF_FFFF; // Can't use core::u32::MAX because cbindgen :(
126/// Non-POSIX.
127pub const INADDR_NONE: u32 = 0xFFFF_FFFF;
128/// Non-POSIX, see <https://www.man7.org/linux/man-pages/man7/ip.7.html>.
129pub const INADDR_LOOPBACK: u32 = 0x7F00_0001;
130/// Non-POSIX.
131pub const INADDR_UNSPEC_GROUP: u32 = 0xE000_0000;
132/// Non-POSIX.
133pub const INADDR_ALLHOSTS_GROUP: u32 = 0xE000_0001;
134/// Non-POSIX.
135pub const INADDR_ALLRTRS_GROUP: u32 = 0xE000_0002;
136/// Non-POSIX.
137pub const INADDR_MAX_LOCAL_GROUP: u32 = 0xE000_00FF;
138
139/// Non-POSIX, see <https://www.man7.org/linux/man-pages/man7/ip.7.html>.
140#[repr(C)]
141pub struct ip_mreq_source {
142 pub imr_multiaddr: in_addr,
143 pub imr_interface: in_addr,
144 pub imr_sourceaddr: in_addr,
145}
146
147/// Non-POSIX, see <https://www.man7.org/linux/man-pages/man7/ip.7.html>.
148#[repr(C)]
149pub struct ip_mreq {
150 pub imr_multiaddr: in_addr,
151 pub imr_interface: in_addr,
152}
153
154/// Non-POSIX.
155#[repr(C)]
156pub struct group_req {
157 pub gr_interface: u32,
158 pub gr_group: sockaddr_storage,
159}
160
161/// Non-POSIX.
162#[repr(C)]
163pub struct group_source_req {
164 pub gsr_interface: u32,
165 pub gsr_group: sockaddr_storage,
166 pub gsr_source: sockaddr_storage,
167}
168
169/// See <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/netinet_in.h.html>.
170#[unsafe(no_mangle)]
171pub static in6addr_any: in6_addr = in6_addr {
172 s6_addr: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
173};
174
175/// See <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/netinet_in.h.html>.
176#[unsafe(no_mangle)]
177pub static in6addr_loopback: in6_addr = in6_addr {
178 s6_addr: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
179};