1use core::option::Option;
2use libc::{c_char, c_int, c_uint, c_void, nlattr, nlmsghdr, pid_t, socklen_t, FILE};
3
4pub const MNL_SOCKET_AUTOPID: c_int = 0;
5pub const MNL_ALIGNTO: c_int = 4;
6
7pub const MNL_CB_ERROR: c_int = -1;
8pub const MNL_CB_STOP: c_int = 0;
9pub const MNL_CB_OK: c_int = 1;
10
11pub const MNL_TYPE_UNSPEC: mnl_attr_data_type = 0;
12pub const MNL_TYPE_U8: mnl_attr_data_type = 1;
13pub const MNL_TYPE_U16: mnl_attr_data_type = 2;
14pub const MNL_TYPE_U32: mnl_attr_data_type = 3;
15pub const MNL_TYPE_U64: mnl_attr_data_type = 4;
16pub const MNL_TYPE_STRING: mnl_attr_data_type = 5;
17pub const MNL_TYPE_FLAG: mnl_attr_data_type = 6;
18pub const MNL_TYPE_MSECS: mnl_attr_data_type = 7;
19pub const MNL_TYPE_NESTED: mnl_attr_data_type = 8;
20pub const MNL_TYPE_NESTED_COMPAT: mnl_attr_data_type = 9;
21pub const MNL_TYPE_NUL_STRING: mnl_attr_data_type = 10;
22pub const MNL_TYPE_BINARY: mnl_attr_data_type = 11;
23pub const MNL_TYPE_MAX: mnl_attr_data_type = 12;
24
25pub type mnl_attr_data_type = u32;
26
27pub type mnl_attr_cb_t =
28 Option<unsafe extern "C" fn(attr: *const nlattr, data: *mut c_void) -> c_int>;
29
30pub type mnl_cb_t = Option<unsafe extern "C" fn(nlh: *const nlmsghdr, data: *mut c_void) -> c_int>;
31
32#[repr(C)]
33pub struct mnl_socket(c_void);
34
35#[repr(C)]
36pub struct mnl_nlmsg_batch(c_void);
37
38extern "C" {
39 pub fn mnl_socket_open(bus: c_int) -> *mut mnl_socket;
40
41 #[cfg(feature = "mnl-1-0-4")]
42 pub fn mnl_socket_open2(bus: c_int, flags: c_int) -> *mut mnl_socket;
43
44 #[cfg(feature = "mnl-1-0-4")]
45 pub fn mnl_socket_fdopen(fd: c_int) -> *mut mnl_socket;
46
47 pub fn mnl_socket_bind(nl: *mut mnl_socket, groups: c_uint, pid: pid_t) -> c_int;
48
49 pub fn mnl_socket_close(nl: *mut mnl_socket) -> c_int;
50
51 pub fn mnl_socket_get_fd(nl: *const mnl_socket) -> c_int;
52
53 pub fn mnl_socket_get_portid(nl: *const mnl_socket) -> c_uint;
54
55 pub fn mnl_socket_sendto(nl: *const mnl_socket, req: *const c_void, siz: usize) -> isize;
56
57 pub fn mnl_socket_recvfrom(nl: *const mnl_socket, buf: *mut c_void, siz: usize) -> isize;
58
59 pub fn mnl_socket_setsockopt(
60 nl: *const mnl_socket,
61 type_: c_int,
62 buf: *mut c_void,
63 len: socklen_t,
64 ) -> c_int;
65
66 pub fn mnl_socket_getsockopt(
67 nl: *const mnl_socket,
68 type_: c_int,
69 buf: *mut c_void,
70 len: *mut socklen_t,
71 ) -> c_int;
72
73 pub fn mnl_nlmsg_size(len: usize) -> usize;
74
75 pub fn mnl_nlmsg_get_payload_len(nlh: *const nlmsghdr) -> usize;
76
77 pub fn mnl_nlmsg_put_header(buf: *mut c_void) -> *mut nlmsghdr;
78
79 pub fn mnl_nlmsg_put_extra_header(nlh: *mut nlmsghdr, size: usize) -> *mut c_void;
80
81 pub fn mnl_nlmsg_ok(nlh: *const nlmsghdr, len: c_int) -> bool;
82
83 pub fn mnl_nlmsg_next(nlh: *const nlmsghdr, len: *mut c_int) -> *mut nlmsghdr;
84
85 pub fn mnl_nlmsg_seq_ok(nlh: *const nlmsghdr, seq: c_uint) -> bool;
86
87 pub fn mnl_nlmsg_portid_ok(nlh: *const nlmsghdr, portid: c_uint) -> bool;
88
89 pub fn mnl_nlmsg_get_payload(nlh: *const nlmsghdr) -> *mut c_void;
90
91 pub fn mnl_nlmsg_get_payload_offset(nlh: *const nlmsghdr, offset: usize) -> *mut c_void;
92
93 pub fn mnl_nlmsg_get_payload_tail(nlh: *const nlmsghdr) -> *mut c_void;
94
95 pub fn mnl_nlmsg_fprintf(
96 fd: *mut FILE,
97 data: *const c_void,
98 datalen: usize,
99 extra_header_size: usize,
100 );
101
102 pub fn mnl_nlmsg_batch_start(buf: *mut c_void, bufsiz: usize) -> *mut mnl_nlmsg_batch;
103
104 pub fn mnl_nlmsg_batch_next(b: *mut mnl_nlmsg_batch) -> bool;
105
106 pub fn mnl_nlmsg_batch_stop(b: *mut mnl_nlmsg_batch);
107
108 pub fn mnl_nlmsg_batch_size(b: *mut mnl_nlmsg_batch) -> usize;
109
110 pub fn mnl_nlmsg_batch_reset(b: *mut mnl_nlmsg_batch);
111
112 pub fn mnl_nlmsg_batch_head(b: *mut mnl_nlmsg_batch) -> *mut c_void;
113
114 pub fn mnl_nlmsg_batch_current(b: *mut mnl_nlmsg_batch) -> *mut c_void;
115
116 pub fn mnl_nlmsg_batch_is_empty(b: *mut mnl_nlmsg_batch) -> bool;
117
118 pub fn mnl_attr_get_type(attr: *const nlattr) -> u16;
119
120 pub fn mnl_attr_get_len(attr: *const nlattr) -> u16;
121
122 pub fn mnl_attr_get_payload_len(attr: *const nlattr) -> u16;
123
124 pub fn mnl_attr_get_payload(attr: *const nlattr) -> *mut c_void;
125
126 pub fn mnl_attr_get_u8(attr: *const nlattr) -> u8;
127
128 pub fn mnl_attr_get_u16(attr: *const nlattr) -> u16;
129
130 pub fn mnl_attr_get_u32(attr: *const nlattr) -> u32;
131
132 pub fn mnl_attr_get_u64(attr: *const nlattr) -> u64;
133
134 pub fn mnl_attr_get_str(attr: *const nlattr) -> *const c_char;
135
136 pub fn mnl_attr_put(nlh: *mut nlmsghdr, type_: u16, len: usize, data: *const c_void);
137
138 pub fn mnl_attr_put_u8(nlh: *mut nlmsghdr, type_: u16, data: u8);
139
140 pub fn mnl_attr_put_u16(nlh: *mut nlmsghdr, type_: u16, data: u16);
141
142 pub fn mnl_attr_put_u32(nlh: *mut nlmsghdr, type_: u16, data: u32);
143
144 pub fn mnl_attr_put_u64(nlh: *mut nlmsghdr, type_: u16, data: u64);
145
146 pub fn mnl_attr_put_str(nlh: *mut nlmsghdr, type_: u16, data: *const c_char);
147
148 pub fn mnl_attr_put_strz(nlh: *mut nlmsghdr, type_: u16, data: *const c_char);
149
150 pub fn mnl_attr_put_check(
151 nlh: *mut nlmsghdr,
152 buflen: usize,
153 type_: u16,
154 len: usize,
155 data: *const c_void,
156 ) -> bool;
157
158 pub fn mnl_attr_put_u8_check(nlh: *mut nlmsghdr, buflen: usize, type_: u16, data: u8) -> bool;
159
160 pub fn mnl_attr_put_u16_check(nlh: *mut nlmsghdr, buflen: usize, type_: u16, data: u16)
161 -> bool;
162
163 pub fn mnl_attr_put_u32_check(nlh: *mut nlmsghdr, buflen: usize, type_: u16, data: u32)
164 -> bool;
165
166 pub fn mnl_attr_put_u64_check(nlh: *mut nlmsghdr, buflen: usize, type_: u16, data: u64)
167 -> bool;
168
169 pub fn mnl_attr_put_str_check(
170 nlh: *mut nlmsghdr,
171 buflen: usize,
172 type_: u16,
173 data: *const c_char,
174 ) -> bool;
175
176 pub fn mnl_attr_put_strz_check(
177 nlh: *mut nlmsghdr,
178 buflen: usize,
179 type_: u16,
180 data: *const c_char,
181 ) -> bool;
182
183 pub fn mnl_attr_nest_start(nlh: *mut nlmsghdr, type_: u16) -> *mut nlattr;
184
185 pub fn mnl_attr_nest_start_check(nlh: *mut nlmsghdr, buflen: usize, type_: u16) -> *mut nlattr;
186
187 pub fn mnl_attr_nest_end(nlh: *mut nlmsghdr, start: *mut nlattr);
188
189 pub fn mnl_attr_nest_cancel(nlh: *mut nlmsghdr, start: *mut nlattr);
190
191 pub fn mnl_attr_type_valid(attr: *const nlattr, maxtype: u16) -> c_int;
192
193 pub fn mnl_attr_validate(attr: *const nlattr, type_: mnl_attr_data_type) -> c_int;
194
195 pub fn mnl_attr_validate2(attr: *const nlattr, type_: mnl_attr_data_type, len: usize) -> c_int;
196
197 pub fn mnl_attr_ok(attr: *const nlattr, len: c_int) -> bool;
198
199 pub fn mnl_attr_next(attr: *const nlattr) -> *mut nlattr;
200
201 pub fn mnl_attr_parse(
202 nlh: *const nlmsghdr,
203 offset: c_uint,
204 cb: mnl_attr_cb_t,
205 data: *mut c_void,
206 ) -> c_int;
207
208 pub fn mnl_attr_parse_nested(
209 attr: *const nlattr,
210 cb: mnl_attr_cb_t,
211 data: *mut c_void,
212 ) -> c_int;
213
214 pub fn mnl_attr_parse_payload(
215 payload: *const c_void,
216 payload_len: usize,
217 cb: mnl_attr_cb_t,
218 data: *mut c_void,
219 ) -> c_int;
220
221 pub fn mnl_cb_run(
222 buf: *const c_void,
223 numbytes: usize,
224 seq: c_uint,
225 portid: c_uint,
226 cb_data: mnl_cb_t,
227 data: *mut c_void,
228 ) -> c_int;
229
230 pub fn mnl_cb_run2(
231 buf: *const c_void,
232 numbytes: usize,
233 seq: c_uint,
234 portid: c_uint,
235 cb_data: mnl_cb_t,
236 data: *mut c_void,
237 cb_ctl_array: *mut mnl_cb_t,
238 cb_ctl_array_len: c_uint,
239 ) -> c_int;
240}