1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
use super::linux_socket::*;
use super::uapi_types::*;
use core::mem::size_of;
pub const IPPROTO_IP: i32 = 0;
pub const IPPROTO_ICMP: i32 = 1;
pub const IPPROTO_IGMP: i32 = 2;
pub const IPPROTO_IPIP: i32 = 4;
pub const IPPROTO_TCP: i32 = 6;
pub const IPPROTO_EGP: i32 = 8;
pub const IPPROTO_PUP: i32 = 12;
pub const IPPROTO_UDP: i32 = 17;
pub const IPPROTO_IDP: i32 = 22;
pub const IPPROTO_TP: i32 = 29;
pub const IPPROTO_DCCP: i32 = 33;
pub const IPPROTO_IPV6: i32 = 41;
pub const IPPROTO_RSVP: i32 = 46;
pub const IPPROTO_GRE: i32 = 47;
pub const IPPROTO_ESP: i32 = 50;
pub const IPPROTO_AH: i32 = 51;
pub const IPPROTO_MTP: i32 = 92;
pub const IPPROTO_BEETPH: i32 = 94;
pub const IPPROTO_ENCAP: i32 = 98;
pub const IPPROTO_PIM: i32 = 103;
pub const IPPROTO_COMP: i32 = 108;
pub const IPPROTO_SCTP: i32 = 132;
pub const IPPROTO_UDPLITE: i32 = 136;
pub const IPPROTO_MPLS: i32 = 137;
pub const IPPROTO_RAW: i32 = 255;
pub const IPPROTO_MAX: i32 = IPPROTO_RAW + 1;
#[repr(C)]
pub struct in_addr_t {
pub s_addr: be32_t,
}
pub const IP_TOS: i32 = 1;
pub const IP_TTL: i32 = 2;
pub const IP_HDRINCL: i32 = 3;
pub const IP_OPTIONS: i32 = 4;
pub const IP_ROUTER_ALERT: i32 = 5;
pub const IP_RECVOPTS: i32 = 6;
pub const IP_RETOPTS: i32 = 7;
pub const IP_PKTINFO: i32 = 8;
pub const IP_PKTOPTIONS: i32 = 9;
pub const IP_MTU_DISCOVER: i32 = 10;
pub const IP_RECVERR: i32 = 11;
pub const IP_RECVTTL: i32 = 12;
pub const IP_RECVTOS: i32 = 13;
pub const IP_MTU: i32 = 14;
pub const IP_FREEBIND: i32 = 15;
pub const IP_IPSEC_POLICY: i32 = 16;
pub const IP_XFRM_POLICY: i32 = 17;
pub const IP_PASSSEC: i32 = 18;
pub const IP_TRANSPARENT: i32 = 19;
pub const IP_RECVRETOPTS: i32 = IP_RETOPTS;
pub const IP_ORIGDSTADDR: i32 = 20;
pub const IP_RECVORIGDSTADDR: i32 = IP_ORIGDSTADDR;
pub const IP_MINTTL: i32 = 21;
pub const IP_NODEFRAG: i32 = 22;
pub const IP_CHECKSUM: i32 = 23;
pub const IP_BIND_ADDRESS_NO_PORT: i32 = 24;
pub const IP_RECVFRAGSIZE: i32 = 25;
pub const IP_PMTUDISC_DONT: i32 = 0;
pub const IP_PMTUDISC_WANT: i32 = 1;
pub const IP_PMTUDISC_DO: i32 = 2;
pub const IP_PMTUDISC_PROBE: i32 = 3;
pub const IP_PMTUDISC_INTERFACE: i32 = 4;
pub const IP_PMTUDISC_OMIT: i32 = 5;
pub const IP_MULTICAST_IF: i32 = 32;
pub const IP_MULTICAST_TTL: i32 = 33;
pub const IP_MULTICAST_LOOP: i32 = 34;
pub const IP_ADD_MEMBERSHIP: i32 = 35;
pub const IP_DROP_MEMBERSHIP: i32 = 36;
pub const IP_UNBLOCK_SOURCE: i32 = 37;
pub const IP_BLOCK_SOURCE: i32 = 38;
pub const IP_ADD_SOURCE_MEMBERSHIP: i32 = 39;
pub const IP_DROP_SOURCE_MEMBERSHIP: i32 = 40;
pub const IP_MSFILTER: i32 = 41;
pub const MCAST_JOIN_GROUP: i32 = 42;
pub const MCAST_BLOCK_SOURCE: i32 = 43;
pub const MCAST_UNBLOCK_SOURCE: i32 = 44;
pub const MCAST_LEAVE_GROUP: i32 = 45;
pub const MCAST_JOIN_SOURCE_GROUP: i32 = 46;
pub const MCAST_LEAVE_SOURCE_GROUP: i32 = 47;
pub const MCAST_MSFILTER: i32 = 48;
pub const IP_MULTICAST_ALL: i32 = 49;
pub const IP_UNICAST_IF: i32 = 50;
pub const MCAST_EXCLUDE: i32 = 0;
pub const MCAST_INCLUDE: i32 = 1;
pub const IP_DEFAULT_MULTICAST_TTL: i32 = 1;
pub const IP_DEFAULT_MULTICAST_LOOP: i32 = 1;
#[repr(C)]
pub struct ip_mreq_t {
pub imr_multiaddr: in_addr_t,
pub imr_interface: in_addr_t,
}
#[repr(C)]
pub struct ip_mreqn_t {
pub imr_multiaddr: in_addr_t,
pub imr_address: in_addr_t,
pub imr_ifindex: i32,
}
#[repr(C)]
pub struct ip_mreq_source_t {
pub imr_multiaddr: be32_t,
pub imr_interface: be32_t,
pub imr_sourceaddr: be32_t,
}
#[repr(C)]
pub struct ip_msfilter_t {
pub imsf_multiaddr: be32_t,
pub imsf_interface: be32_t,
pub imsf_fmode: u32,
pub imsf_numsrc: u32,
pub imsf_slist: [be32_t; 1],
}
#[repr(C)]
pub struct group_req_t {
pub gr_interface: u32,
pub gr_group: sockaddr_storage_t,
}
#[repr(C)]
pub struct group_source_req_t {
pub gsr_interface: u32,
pub gsr_group: sockaddr_storage_t,
pub gsr_source: sockaddr_storage_t,
}
#[repr(C)]
pub struct group_filter_t {
pub gf_interface: u32,
pub gf_group: sockaddr_storage_t,
pub gf_fmode: u32,
pub gf_numsrc: u32,
pub gf_slist: [sockaddr_storage_t; 1],
}
#[repr(C)]
pub struct in_pktinfo_t {
pub ipi_ifindex: i32,
pub ipi_spec_dst: in_addr_t,
pub ipi_addr: in_addr_t,
}
pub const SOCK_SIZE: usize = 16;
#[repr(C)]
pub struct sockaddr_in_t {
pub sin_family: sa_family_t,
pub sin_port: be16_t,
pub sin_addr: in_addr_t,
pub pad: [u8; SOCK_SIZE - size_of::<i16>() - size_of::<u16>() - size_of::<in_addr_t>()],
}
pub const IN_CLASSA_NET: u64 = 0xff000000;
pub const IN_CLASSA_NSHIFT: i32 = 24;
pub const IN_CLASSA_MAX: u64 = 128;
pub const IN_CLASSB_NET: u64 = 0xffff0000;
pub const IN_CLASSB_NSHIFT: i32 = 16;
pub const IN_CLASSB_MAX: u64 = 65536;
pub const IN_CLASSC_NET: u64 = 0xffffff00;
pub const IN_CLASSC_NSHIFT: i32 = 8;
pub const IN_MULTICAST_NET: u64 = 0xe0000000;
pub const IN_CLASSE_NET: u64 = 0xffffffff;
pub const IN_CLASSE_NSHIFT: u64 = 0;
pub const INADDR_ANY: u64 = 0x00000000;
pub const INADDR_BROADCAST: u64 = 0xffffffff;
pub const INADDR_NONE: u64 = 0xffffffff;
pub const IN_LOOPBACKNET: u32 = 127;
pub const INADDR_LOOPBACK: u64 = 0x7f000001;
pub const INADDR_UNSPEC_GROUP: u64 = 0xe0000000;
pub const INADDR_ALLHOSTS_GROUP: u64 = 0xe0000001;
pub const INADDR_ALLRTRS_GROUP: u64 = 0xe0000002;
pub const INADDR_ALLSNOOPERS_GROUP: u64 = 0xe000006a;
pub const INADDR_MAX_LOCAL_GROUP: u64 = 0xe00000ff;