nell 0.0.2

Linux netlink API access
Documentation
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
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
// Copyright (C) 2018 - Will Glozer. All rights reserved.

#![allow(non_camel_case_types, non_snake_case)]

use std::mem;
use std::os::raw::*;

#[cfg(target_env = "gnu")]
pub type iovlen = usize;
#[cfg(target_env = "musl")]
pub type iovlen = i32;

#[repr(u32)]
#[derive(Debug, Copy, Clone)]
pub enum netlink_family {
    NETLINK_ROUTE          = 0,
    NETLINK_UNUSED         = 1,
    NETLINK_USERSOCK       = 2,
    NETLINK_FIREWALL       = 3,
    NETLINK_SOCK_DIAG      = 4,
    NETLINK_NFLOG          = 5,
    NETLINK_XFRM           = 6,
    NETLINK_SELINUX        = 7,
    NETLINK_ISCSI          = 8,
    NETLINK_AUDIT          = 9,
    NETLINK_FIB_LOOKUP     = 10,
    NETLINK_CONNECTOR      = 11,
    NETLINK_NETFILTER      = 12,
    NETLINK_IP6_FW         = 13,
    NETLINK_DNRTMSG        = 14,
    NETLINK_KOBJECT_UEVENT = 15,
    NETLINK_GENERIC        = 16,
    NETLINK_SCSITRANSPORT  = 18,
    NETLINK_ECRYPTFS       = 19,
    NETLINK_RDMA           = 20,
    NETLINK_CRYPTO         = 21,
    NETLINK_SMC            = 22,
}

pub const AF_UNSPEC:               u8  = 0;
pub const AF_UNIX:                 u8  = 1;
pub const AF_INET:                 u8  = 2;
pub const AF_INET6:                u8  = 10;

pub const IPPROTO_ICMP:            u8  = 1;
pub const IPPROTO_IGMP:            u8  = 2;
pub const IPPROTO_IPIP:            u8  = 4;
pub const IPPROTO_TCP:             u8  = 6;
pub const IPPROTO_EGP:             u8  = 8;
pub const IPPROTO_PUP:             u8  = 12;
pub const IPPROTO_UDP:             u8  = 17;
pub const IPPROTO_IDP:             u8  = 22;
pub const IPPROTO_TP:              u8  = 29;
pub const IPPROTO_DCCP:            u8  = 33;
pub const IPPROTO_IPV6:            u8  = 41;
pub const IPPROTO_RSVP:            u8  = 46;
pub const IPPROTO_GRE:             u8  = 47;
pub const IPPROTO_ESP:             u8  = 50;
pub const IPPROTO_AH:              u8  = 51;
pub const IPPROTO_MTP:             u8  = 92;
pub const IPPROTO_BEETPH:          u8  = 94;
pub const IPPROTO_ENCAP:           u8  = 98;
pub const IPPROTO_PIM:             u8  = 103;
pub const IPPROTO_COMP:            u8  = 108;
pub const IPPROTO_SCTP:            u8  = 132;
pub const IPPROTO_UDPLITE:         u8  = 136;
pub const IPPROTO_MPLS:            u8  = 137;
pub const IPPROTO_RAW:             u8  = 255;

pub const RTM_NEWLINK:             u16 = 16;
pub const RTM_DELLINK:             u16 = 17;
pub const RTM_GETLINK:             u16 = 18;
pub const RTM_SETLINK:             u16 = 19;
pub const RTM_NEWADDR:             u16 = 20;
pub const RTM_DELADDR:             u16 = 21;
pub const RTM_GETADDR:             u16 = 22;
pub const RTM_NEWROUTE:            u16 = 24;
pub const RTM_DELROUTE:            u16 = 25;
pub const RTM_GETROUTE:            u16 = 26;
pub const RTM_NEWNEIGH:            u16 = 28;
pub const RTM_DELNEIGH:            u16 = 29;
pub const RTM_GETNEIGH:            u16 = 20;
pub const RTM_NEWRULE:             u16 = 32;
pub const RTM_DELRULE:             u16 = 31;
pub const RTM_GETRULE:             u16 = 32;
pub const RTM_NEWQDISC:            u16 = 36;
pub const RTM_DELQDISC:            u16 = 33;
pub const RTM_GETQDISC:            u16 = 34;
pub const RTM_NEWTCLASS:           u16 = 40;
pub const RTM_DELTCLASS:           u16 = 41;
pub const RTM_GETTCLASS:           u16 = 42;
pub const RTM_NEWTFILTER:          u16 = 44;
pub const RTM_DELTFILTER:          u16 = 45;
pub const RTM_GETTFILTER:          u16 = 46;
pub const RTM_NEWACTION:           u16 = 48;
pub const RTM_DELACTION:           u16 = 49;
pub const RTM_GETACTION:           u16 = 50;
pub const RTM_NEWPREFIX:           u16 = 52;
pub const RTM_GETMULTICAST:        u16 = 58;
pub const RTM_GETANYCAST:          u16 = 62;
pub const RTM_NEWNEIGHTBL:         u16 = 64;
pub const RTM_GETNEIGHTBL:         u16 = 66;
pub const RTM_SETNEIGHTBL:         u16 = 67;
pub const RTM_NEWNDUSEROPT:        u16 = 68;
pub const RTM_NEWADDRLABEL:        u16 = 72;
pub const RTM_DELADDRLABEL:        u16 = 73;
pub const RTM_GETADDRLABEL:        u16 = 74;
pub const RTM_GETDCB:              u16 = 78;
pub const RTM_SETDCB:              u16 = 79;
pub const RTM_NEWNETCONF:          u16 = 80;
pub const RTM_DELNETCONF:          u16 = 81;
pub const RTM_GETNETCONF:          u16 = 82;
pub const RTM_NEWMDB:              u16 = 84;
pub const RTM_DELMDB:              u16 = 85;
pub const RTM_GETMDB:              u16 = 86;
pub const RTM_NEWNSID:             u16 = 88;
pub const RTM_DELNSID:             u16 = 89;
pub const RTM_GETNSID:             u16 = 90;
pub const RTM_NEWSTATS:            u16 = 92;
pub const RTM_GETSTATS:            u16 = 94;
pub const RTM_NEWCACHEREPORT:      u16 = 96;

pub const SOCK_DIAG_BY_FAMILY:     u16 = 20;

pub const NLM_F_REQUEST:           u16 = 0x01;
pub const NLM_F_MULTI:             u16 = 0x02;
pub const NLM_F_ACK:               u16 = 0x04;
pub const NLM_F_ECHO:              u16 = 0x08;
pub const NLM_F_DUMP_INTR:         u16 = 0x10;
pub const NLM_F_DUMP_FILTERED:     u16 = 0x20;
pub const NLM_F_ROOT:              u16 = 0x100;
pub const NLM_F_MATCH:             u16 = 0x200;
pub const NLM_F_ATOMIC:            u16 = 0x400;
pub const NLM_F_DUMP:              u16 = NLM_F_ROOT|NLM_F_MATCH;
pub const NLM_F_REPLACE:           u16 = 0x100;
pub const NLM_F_EXCL:              u16 = 0x200;
pub const NLM_F_CREATE:            u16 = 0x400;
pub const NLM_F_APPEND:            u16 = 0x800;
pub const NLM_F_CAPPED:            u16 = 0x100;
pub const NLM_F_ACK_TLVS:          u16 = 0x200;

pub const NLMSG_NOOP:              u16 = 0x01;
pub const NLMSG_ERROR:             u16 = 0x02;
pub const NLMSG_DONE:              u16 = 0x03;
pub const NLMSG_OVERRUN:           u16 = 0x04;

pub const IFLA_UNSPEC:             u16 = 0;
pub const IFLA_ADDRESS:            u16 = 1;
pub const IFLA_BROADCAST:          u16 = 2;
pub const IFLA_IFNAME:             u16 = 3;
pub const IFLA_MTU:                u16 = 4;
pub const IFLA_LINK:               u16 = 5;
pub const IFLA_QDISC:              u16 = 6;
pub const IFLA_STATS:              u16 = 7;
pub const IFLA_COST:               u16 = 8;
pub const IFLA_PRIORITY:           u16 = 9;
pub const IFLA_MASTER:             u16 = 10;
pub const IFLA_WIRELESS:           u16 = 11;
pub const IFLA_PROTINFO:           u16 = 12;
pub const IFLA_TXQLEN:             u16 = 13;
pub const IFLA_MAP:                u16 = 14;
pub const IFLA_WEIGHT:             u16 = 15;
pub const IFLA_OPERSTATE:          u16 = 16;
pub const IFLA_LINKMODE:           u16 = 17;
pub const IFLA_LINKINFO:           u16 = 18;
pub const IFLA_NET_NS_PID:         u16 = 19;
pub const IFLA_IFALIAS:            u16 = 20;
pub const IFLA_NUM_VF:             u16 = 21;
pub const IFLA_VFINFO_LIST:        u16 = 22;
pub const IFLA_STATS64:            u16 = 23;
pub const IFLA_VF_PORTS:           u16 = 24;
pub const IFLA_PORT_SELF:          u16 = 25;
pub const IFLA_AF_SPEC:            u16 = 26;
pub const IFLA_GROUP:              u16 = 27;
pub const IFLA_NET_NS_FD:          u16 = 28;
pub const IFLA_EXT_MASK:           u16 = 29;
pub const IFLA_PROMISCUITY:        u16 = 30;
pub const IFLA_NUM_TX_QUEUES:      u16 = 31;
pub const IFLA_NUM_RX_QUEUES:      u16 = 32;
pub const IFLA_CARRIER:            u16 = 33;
pub const IFLA_PHYS_PORT_ID:       u16 = 34;
pub const IFLA_CARRIER_CHANGES:    u16 = 35;
pub const IFLA_PHYS_SWITCH_ID:     u16 = 36;
pub const IFLA_LINK_NETNSID:       u16 = 37;
pub const IFLA_PHYS_PORT_NAME:     u16 = 38;
pub const IFLA_PROTO_DOWN:         u16 = 39;
pub const IFLA_GSO_MAX_SEGS:       u16 = 40;
pub const IFLA_GSO_MAX_SIZE:       u16 = 41;
pub const IFLA_PAD:                u16 = 42;
pub const IFLA_XDP:                u16 = 43;
pub const IFLA_EVENT:              u16 = 44;
pub const IFLA_NEW_NETNSID:        u16 = 45;
pub const IFLA_IF_NETNSID:         u16 = 46;
pub const IFLA_CARRIER_UP_COUNT:   u16 = 47;
pub const IFLA_CARRIER_DOWN_COUNT: u16 = 48;
pub const IFLA_NEW_IFINDEX:        u16 = 49;

pub const IFF_UP:              c_int = 1 << 0;
pub const IFF_BROADCAST:       c_int = 1 << 1;
pub const IFF_DEBUG:           c_int = 1 << 2;
pub const IFF_LOOPBACK:        c_int = 1 << 3;
pub const IFF_POINTOPOINT:     c_int = 1 << 4;
pub const IFF_NOTRAILERS:      c_int = 1 << 5;
pub const IFF_RUNNING:         c_int = 1 << 6;
pub const IFF_NOARP:           c_int = 1 << 7;
pub const IFF_PROMISC:         c_int = 1 << 8;
pub const IFF_ALLMULTI:        c_int = 1 << 9;
pub const IFF_MASTER:          c_int = 1 << 10;
pub const IFF_SLAVE:           c_int = 1 << 11;
pub const IFF_MULTICAST:       c_int = 1 << 12;
pub const IFF_PORTSEL:         c_int = 1 << 13;
pub const IFF_AUTOMEDIA:       c_int = 1 << 14;
pub const IFF_DYNAMIC:         c_int = 1 << 15;
pub const IFF_LOWER_UP:        c_int = 1 << 16;
pub const IFF_DORMANT:         c_int = 1 << 17;
pub const IFF_ECHO:            c_int = 1 << 18;

pub const NLA_F_NET_BYTEORDER: u16   = 1 << 14;
pub const NLA_F_NESTED:        u16   = 1 << 15;

#[repr(C)]
#[derive(Copy, Clone, Default, Debug)]
pub struct nlmsghdr {
    pub nlmsg_len:   u32,
    pub nlmsg_type:  u16,
    pub nlmsg_flags: u16,
    pub nlmsg_seq:   u32,
    pub nlmsg_pid:   u32,
}

#[repr(C)]
#[derive(Copy, Clone, Default, Debug)]
pub struct nlmsgerr {
    pub error: c_int,
    pub msg:   nlmsghdr,
}

#[repr(C)]
#[derive(Copy, Clone, Default, Debug)]
pub struct nlattr {
    pub nla_len:  u16,
    pub nla_type: u16,
}

#[repr(C)]
#[derive(Copy, Clone, Default, Debug)]
pub struct rtattr {
    pub rta_len:  c_ushort,
    pub rta_type: c_ushort,
}

#[repr(C)]
#[derive(Copy, Clone, Default, Debug)]
pub struct rtgenmsg {
    pub rtgen_family: c_uchar,
}

pub const TCPF_ESTABLISHED:    u16 = 1 << 1;
pub const TCPF_SYN_SENT:       u16 = 1 << 2;
pub const TCPF_SYN_RECV:       u16 = 1 << 3;
pub const TCPF_FIN_WAIT1:      u16 = 1 << 4;
pub const TCPF_FIN_WAIT2:      u16 = 1 << 5;
pub const TCPF_TIME_WAIT:      u16 = 1 << 6;
pub const TCPF_CLOSE:          u16 = 1 << 7;
pub const TCPF_CLOSE_WAIT:     u16 = 1 << 8;
pub const TCPF_LAST_ACK:       u16 = 1 << 9;
pub const TCPF_LISTEN:         u16 = 1 << 10;
pub const TCPF_CLOSING:        u16 = 1 << 11;
pub const TCPF_NEW_SYN_RECV:   u16 = 1 << 12;

pub const INET_DIAG_NONE:      u16 = 0;
pub const INET_DIAG_MEMINFO:   u16 = 1;
pub const INET_DIAG_INFO:      u16 = 2;
pub const INET_DIAG_VEGASINFO: u16 = 3;
pub const INET_DIAG_CONG:      u16 = 4;
pub const INET_DIAG_TOS:       u16 = 5;
pub const INET_DIAG_TCLASS:    u16 = 6;
pub const INET_DIAG_SKMEMINFO: u16 = 7;
pub const INET_DIAG_SHUTDOWN:  u16 = 8;
pub const INET_DIAG_DCTCPINFO: u16 = 9;
pub const INET_DIAG_PROTOCOL:  u16 = 10;
pub const INET_DIAG_SKV6ONLY:  u16 = 11;
pub const INET_DIAG_LOCALS:    u16 = 12;
pub const INET_DIAG_PEERS:     u16 = 13;
pub const INET_DIAG_PAD:       u16 = 14;
pub const INET_DIAG_MARK:      u16 = 15;
pub const INET_DIAG_BBRINFO:   u16 = 16;

#[repr(C)]
#[derive(Copy, Clone, Default, Debug)]
pub struct ifinfomsg {
    pub ifi_family: c_uchar,
    pub __ifi_pad:  c_uchar,
    pub ifi_type:   c_ushort,
    pub ifi_index:  c_int,
    pub ifi_flags:  c_uint,
    pub ifi_change: c_uint,
}

#[repr(C)]
#[derive(Copy, Clone, Default, Debug)]
pub struct rtnl_link_stats64 {
    pub rx_packets:          u64,
    pub tx_packets:          u64,
    pub rx_bytes:            u64,
    pub tx_bytes:            u64,
    pub rx_errors:           u64,
    pub tx_errors:           u64,
    pub rx_dropped:          u64,
    pub tx_dropped:          u64,
    pub multicast:           u64,
    pub collisions:          u64,
    pub rx_length_errors:    u64,
    pub rx_over_errors:      u64,
    pub rx_crc_errors:       u64,
    pub rx_frame_errors:     u64,
    pub rx_fifo_errors:      u64,
    pub rx_missed_errors:    u64,
    pub tx_aborted_errors:   u64,
    pub tx_carrier_errors:   u64,
    pub tx_fifo_errors:      u64,
    pub tx_heartbeat_errors: u64,
    pub tx_window_errors:    u64,
    pub rx_compressed:       u64,
    pub tx_compressed:       u64,
    pub rx_nohandler:        u64,
}

#[repr(C)]
#[derive(Copy, Clone, Default, Debug)]
pub struct inet_diag_sockid {
    pub idiag_sport:  u16,
    pub idiag_dport:  u16,
    pub idiag_src:    [u32; 4],
    pub idiag_dst:    [u32; 4],
    pub idiag_if:     u32,
    pub idiag_cookie: [u32; 2],
}

#[repr(C)]
#[derive(Copy, Clone, Default, Debug)]
pub struct inet_diag_req_v2 {
    pub sdiag_family:   u8,
    pub sdiag_protocol: u8,
    pub idiag_ext:      u8,
    pub _pad:           u8,
    pub idiag_states:   u32,
    pub id:             inet_diag_sockid,
}

#[repr(C)]
#[derive(Copy, Clone, Default, Debug)]
pub struct inet_diag_msg {
    pub idiag_family:  u8,
    pub idiag_state:   u8,
    pub idiag_timer:   u8,
    pub idiag_retrans: u8,
    pub id:            inet_diag_sockid,
    pub idiag_expires: u32,
    pub idiag_rqueue:  u32,
    pub idiag_wqueue:  u32,
    pub idiag_uid:     u32,
    pub idiag_inode:   u32,
}

#[repr(C)]
#[derive(Copy, Clone, Default, Debug)]
pub struct tcp_info {
    pub tcpi_state:           u8,
    pub tcpi_ca_state:        u8,
    pub tcpi_retransmits:     u8,
    pub tcpi_probes:          u8,
    pub tcpi_backoff:         u8,
    pub tcpi_options:         u8,
    pub _bitfield_1:          [u8; 2usize],
    pub tcpi_rto:             u32,
    pub tcpi_ato:             u32,
    pub tcpi_snd_mss:         u32,
    pub tcpi_rcv_mss:         u32,
    pub tcpi_unacked:         u32,
    pub tcpi_sacked:          u32,
    pub tcpi_lost:            u32,
    pub tcpi_retrans:         u32,
    pub tcpi_fackets:         u32,
    pub tcpi_last_data_sent:  u32,
    pub tcpi_last_ack_sent:   u32,
    pub tcpi_last_data_recv:  u32,
    pub tcpi_last_ack_recv:   u32,
    pub tcpi_pmtu:            u32,
    pub tcpi_rcv_ssthresh:    u32,
    pub tcpi_rtt:             u32,
    pub tcpi_rttvar:          u32,
    pub tcpi_snd_ssthresh:    u32,
    pub tcpi_snd_cwnd:        u32,
    pub tcpi_advmss:          u32,
    pub tcpi_reordering:      u32,
    pub tcpi_rcv_rtt:         u32,
    pub tcpi_rcv_space:       u32,
    pub tcpi_total_retrans:   u32,
    pub tcpi_pacing_rate:     u64,
    pub tcpi_max_pacing_rate: u64,
    pub tcpi_bytes_acked:     u64,
    pub tcpi_bytes_received:  u64,
    pub tcpi_segs_out:        u32,
    pub tcpi_segs_in:         u32,
    pub tcpi_notsent_bytes:   u32,
    pub tcpi_min_rtt:         u32,
    pub tcpi_data_segs_in:    u32,
    pub tcpi_data_segs_out:   u32,
    pub tcpi_delivery_rate:   u64,
    pub tcpi_busy_time:       u64,
    pub tcpi_rwnd_limited:    u64,
}

pub const XDP_ATTACHED_NONE:   u16 = 0;
pub const XDP_ATTACHED_DRV:    u16 = 1;
pub const XDP_ATTACHED_SKB:    u16 = 2;
pub const XDP_ATTACHED_HW:     u16 = 3;

pub const IFLA_XDP_UNSPEC:     u16 = 0;
pub const IFLA_XDP_FD:         u16 = 1;
pub const IFLA_XDP_ATTACHED:   u16 = 2;
pub const IFLA_XDP_FLAGS:      u16 = 3;
pub const IFLA_XDP_PROG_ID:    u16 = 4;

pub const XDP_FLAGS_SKB_MODE:  u32 = 1 << 1;
pub const XDP_FLAGS_DRV_MODE:  u32 = 1 << 2;
pub const XDP_FLAGS_HW_MODE:   u32 = 1 << 3;

pub fn nlmsg_align(len: u32) -> u32 {
    const NLMSG_ALIGNTO: u32 = 4;
    (len + NLMSG_ALIGNTO - 1) & !(NLMSG_ALIGNTO - 1)
}

pub fn nlmsg_hdrlen() -> u32 {
    nlmsg_align(mem::size_of::<nlmsghdr>() as u32)
}

pub fn nlmsg_length(len: u32) -> u32 {
    len + nlmsg_hdrlen()
}