1 diff --git a/configure.ac b/configure.ac
2 index 718ab1c..313a015 100644
5 @@ -27,5 +27,5 @@ regular_CFLAGS="-Wall -Waggregate-return -Wmissing-declarations \
7 AC_SUBST([regular_CPPFLAGS])
8 AC_SUBST([regular_CFLAGS])
9 -AC_CONFIG_FILES([Makefile src/Makefile include/Makefile include/libmnl/Makefile include/linux/Makefile examples/Makefile examples/genl/Makefile examples/netfilter/Makefile examples/rtnl/Makefile libmnl.pc doxygen.cfg])
10 +AC_CONFIG_FILES([Makefile src/Makefile include/Makefile include/libmnl/Makefile include/linux/Makefile include/linux/netfilter/Makefile examples/Makefile examples/genl/Makefile examples/netfilter/Makefile examples/rtnl/Makefile libmnl.pc doxygen.cfg])
12 diff --git a/include/libmnl/libmnl.h b/include/libmnl/libmnl.h
13 index a647fd9..223709c 100644
14 --- a/include/libmnl/libmnl.h
15 +++ b/include/libmnl/libmnl.h
24 -# include <stdbool.h> /* not in C++ */
32 #include <sys/socket.h> /* for sa_family_t */
33 #include <linux/netlink.h>
34 diff --git a/include/linux/Makefile.am b/include/linux/Makefile.am
35 index 2d02887..08c600b 100644
36 --- a/include/linux/Makefile.am
37 +++ b/include/linux/Makefile.am
39 -noinst_HEADERS = netlink.h
41 +noinst_HEADERS = netlink.h socket.h
42 diff --git a/include/linux/netfilter/Makefile.am b/include/linux/netfilter/Makefile.am
44 index 0000000..64a975e
46 +++ b/include/linux/netfilter/Makefile.am
48 +noinst_HEADERS = nfnetlink_conntrack.h
49 diff --git a/include/linux/netfilter/nfnetlink_conntrack.h b/include/linux/netfilter/nfnetlink_conntrack.h
51 index 0000000..08fabc6
53 +++ b/include/linux/netfilter/nfnetlink_conntrack.h
55 +#ifndef _IPCONNTRACK_NETLINK_H
56 +#define _IPCONNTRACK_NETLINK_H
57 +#include <linux/netfilter/nfnetlink.h>
59 +enum cntl_msg_types {
62 + IPCTNL_MSG_CT_DELETE,
63 + IPCTNL_MSG_CT_GET_CTRZERO,
64 + IPCTNL_MSG_CT_GET_STATS_CPU,
65 + IPCTNL_MSG_CT_GET_STATS,
66 + IPCTNL_MSG_CT_GET_DYING,
67 + IPCTNL_MSG_CT_GET_UNCONFIRMED,
72 +enum ctnl_exp_msg_types {
75 + IPCTNL_MSG_EXP_DELETE,
76 + IPCTNL_MSG_EXP_GET_STATS_CPU,
90 +#define CTA_NAT CTA_NAT_SRC /* backwards compatibility */
99 + CTA_NAT_SEQ_ADJ_ORIG,
100 + CTA_NAT_SEQ_ADJ_REPLY,
101 + CTA_SECMARK, /* obsolete */
110 +#define CTA_MAX (__CTA_MAX - 1)
118 +#define CTA_TUPLE_MAX (__CTA_TUPLE_MAX - 1)
128 +#define CTA_IP_MAX (__CTA_IP_MAX - 1)
130 +enum ctattr_l4proto {
133 + CTA_PROTO_SRC_PORT,
134 + CTA_PROTO_DST_PORT,
136 + CTA_PROTO_ICMP_TYPE,
137 + CTA_PROTO_ICMP_CODE,
138 + CTA_PROTO_ICMPV6_ID,
139 + CTA_PROTO_ICMPV6_TYPE,
140 + CTA_PROTO_ICMPV6_CODE,
143 +#define CTA_PROTO_MAX (__CTA_PROTO_MAX - 1)
145 +enum ctattr_protoinfo {
146 + CTA_PROTOINFO_UNSPEC,
148 + CTA_PROTOINFO_DCCP,
149 + CTA_PROTOINFO_SCTP,
150 + __CTA_PROTOINFO_MAX
152 +#define CTA_PROTOINFO_MAX (__CTA_PROTOINFO_MAX - 1)
154 +enum ctattr_protoinfo_tcp {
155 + CTA_PROTOINFO_TCP_UNSPEC,
156 + CTA_PROTOINFO_TCP_STATE,
157 + CTA_PROTOINFO_TCP_WSCALE_ORIGINAL,
158 + CTA_PROTOINFO_TCP_WSCALE_REPLY,
159 + CTA_PROTOINFO_TCP_FLAGS_ORIGINAL,
160 + CTA_PROTOINFO_TCP_FLAGS_REPLY,
161 + __CTA_PROTOINFO_TCP_MAX
163 +#define CTA_PROTOINFO_TCP_MAX (__CTA_PROTOINFO_TCP_MAX - 1)
165 +enum ctattr_protoinfo_dccp {
166 + CTA_PROTOINFO_DCCP_UNSPEC,
167 + CTA_PROTOINFO_DCCP_STATE,
168 + CTA_PROTOINFO_DCCP_ROLE,
169 + CTA_PROTOINFO_DCCP_HANDSHAKE_SEQ,
170 + __CTA_PROTOINFO_DCCP_MAX,
172 +#define CTA_PROTOINFO_DCCP_MAX (__CTA_PROTOINFO_DCCP_MAX - 1)
174 +enum ctattr_protoinfo_sctp {
175 + CTA_PROTOINFO_SCTP_UNSPEC,
176 + CTA_PROTOINFO_SCTP_STATE,
177 + CTA_PROTOINFO_SCTP_VTAG_ORIGINAL,
178 + CTA_PROTOINFO_SCTP_VTAG_REPLY,
179 + __CTA_PROTOINFO_SCTP_MAX
181 +#define CTA_PROTOINFO_SCTP_MAX (__CTA_PROTOINFO_SCTP_MAX - 1)
183 +enum ctattr_counters {
184 + CTA_COUNTERS_UNSPEC,
185 + CTA_COUNTERS_PACKETS, /* 64bit counters */
186 + CTA_COUNTERS_BYTES, /* 64bit counters */
187 + CTA_COUNTERS32_PACKETS, /* old 32bit counters, unused */
188 + CTA_COUNTERS32_BYTES, /* old 32bit counters, unused */
191 +#define CTA_COUNTERS_MAX (__CTA_COUNTERS_MAX - 1)
193 +enum ctattr_tstamp {
194 + CTA_TIMESTAMP_UNSPEC,
195 + CTA_TIMESTAMP_START,
196 + CTA_TIMESTAMP_STOP,
197 + __CTA_TIMESTAMP_MAX
199 +#define CTA_TIMESTAMP_MAX (__CTA_TIMESTAMP_MAX - 1)
204 +#define CTA_NAT_MINIP CTA_NAT_V4_MINIP
206 +#define CTA_NAT_MAXIP CTA_NAT_V4_MAXIP
212 +#define CTA_NAT_MAX (__CTA_NAT_MAX - 1)
214 +enum ctattr_protonat {
215 + CTA_PROTONAT_UNSPEC,
216 + CTA_PROTONAT_PORT_MIN,
217 + CTA_PROTONAT_PORT_MAX,
220 +#define CTA_PROTONAT_MAX (__CTA_PROTONAT_MAX - 1)
222 +enum ctattr_natseq {
223 + CTA_NAT_SEQ_UNSPEC,
224 + CTA_NAT_SEQ_CORRECTION_POS,
225 + CTA_NAT_SEQ_OFFSET_BEFORE,
226 + CTA_NAT_SEQ_OFFSET_AFTER,
229 +#define CTA_NAT_SEQ_MAX (__CTA_NAT_SEQ_MAX - 1)
231 +enum ctattr_expect {
236 + CTA_EXPECT_TIMEOUT,
238 + CTA_EXPECT_HELP_NAME,
246 +#define CTA_EXPECT_MAX (__CTA_EXPECT_MAX - 1)
248 +enum ctattr_expect_nat {
249 + CTA_EXPECT_NAT_UNSPEC,
250 + CTA_EXPECT_NAT_DIR,
251 + CTA_EXPECT_NAT_TUPLE,
252 + __CTA_EXPECT_NAT_MAX
254 +#define CTA_EXPECT_NAT_MAX (__CTA_EXPECT_NAT_MAX - 1)
262 +#define CTA_HELP_MAX (__CTA_HELP_MAX - 1)
264 +enum ctattr_secctx {
269 +#define CTA_SECCTX_MAX (__CTA_SECCTX_MAX - 1)
271 +enum ctattr_stats_cpu {
273 + CTA_STATS_SEARCHED,
279 + CTA_STATS_DELETE_LIST,
281 + CTA_STATS_INSERT_FAILED,
283 + CTA_STATS_EARLY_DROP,
285 + CTA_STATS_SEARCH_RESTART,
288 +#define CTA_STATS_MAX (__CTA_STATS_MAX - 1)
290 +enum ctattr_stats_global {
291 + CTA_STATS_GLOBAL_UNSPEC,
292 + CTA_STATS_GLOBAL_ENTRIES,
293 + __CTA_STATS_GLOBAL_MAX,
295 +#define CTA_STATS_GLOBAL_MAX (__CTA_STATS_GLOBAL_MAX - 1)
297 +enum ctattr_expect_stats {
298 + CTA_STATS_EXP_UNSPEC,
300 + CTA_STATS_EXP_CREATE,
301 + CTA_STATS_EXP_DELETE,
302 + __CTA_STATS_EXP_MAX,
304 +#define CTA_STATS_EXP_MAX (__CTA_STATS_EXP_MAX - 1)
306 +#endif /* _IPCONNTRACK_NETLINK_H */
307 diff --git a/include/linux/netlink.h b/include/linux/netlink.h
308 index f55ed8c..ced0e1a 100644
309 --- a/include/linux/netlink.h
310 +++ b/include/linux/netlink.h
312 #ifndef __LINUX_NETLINK_H
313 #define __LINUX_NETLINK_H
315 -#include <linux/socket.h> /* for sa_family_t */
316 +#include <linux/socket.h> /* for __kernel_sa_family_t */
317 #include <linux/types.h>
319 #define NETLINK_ROUTE 0 /* Routing/device hook */
320 #define NETLINK_UNUSED 1 /* Unused number */
321 #define NETLINK_USERSOCK 2 /* Reserved for user mode socket protocols */
322 -#define NETLINK_FIREWALL 3 /* Firewalling hook */
323 -#define NETLINK_INET_DIAG 4 /* INET socket monitoring */
324 +#define NETLINK_FIREWALL 3 /* Unused number, formerly ip_queue */
325 +#define NETLINK_SOCK_DIAG 4 /* socket monitoring */
326 #define NETLINK_NFLOG 5 /* netfilter/iptables ULOG */
327 #define NETLINK_XFRM 6 /* ipsec */
328 #define NETLINK_SELINUX 7 /* SELinux event notifications */
330 /* leave room for NETLINK_DM (DM Events) */
331 #define NETLINK_SCSITRANSPORT 18 /* SCSI Transports */
332 #define NETLINK_ECRYPTFS 19
333 +#define NETLINK_RDMA 20
334 +#define NETLINK_CRYPTO 21 /* Crypto layer */
336 +#define NETLINK_INET_DIAG NETLINK_SOCK_DIAG
341 - sa_family_t nl_family; /* AF_NETLINK */
342 + __kernel_sa_family_t nl_family; /* AF_NETLINK */
343 unsigned short nl_pad; /* zero */
344 __u32 nl_pid; /* port ID */
345 __u32 nl_groups; /* multicast groups mask */
346 @@ -48,6 +52,7 @@ struct nlmsghdr {
347 #define NLM_F_MULTI 2 /* Multipart message, terminated by NLMSG_DONE */
348 #define NLM_F_ACK 4 /* Reply with ack, with zero or error code */
349 #define NLM_F_ECHO 8 /* Echo this request */
350 +#define NLM_F_DUMP_INTR 16 /* Dump was inconsistent due to sequence change */
352 /* Modifiers to GET request */
353 #define NLM_F_ROOT 0x100 /* specify tree root */
354 @@ -145,4 +150,4 @@ struct nlattr {
355 #define NLA_HDRLEN ((int) NLA_ALIGN(sizeof(struct nlattr)))
358 -#endif /* __LINUX_NETLINK_H */
359 +#endif /* __LINUX_NETLINK_H */
360 diff --git a/include/linux/socket.h b/include/linux/socket.h
362 index 0000000..8c1e501
364 +++ b/include/linux/socket.h
366 +#ifndef _LINUX_SOCKET_H
367 +#define _LINUX_SOCKET_H
370 + * Desired design of maximum size and alignment (see RFC2553)
372 +#define _K_SS_MAXSIZE 128 /* Implementation specific max size */
373 +#define _K_SS_ALIGNSIZE (__alignof__ (struct sockaddr *))
374 + /* Implementation specific desired alignment */
376 +typedef unsigned short __kernel_sa_family_t;
378 +struct __kernel_sockaddr_storage {
379 + __kernel_sa_family_t ss_family; /* address family */
380 + /* Following field(s) are implementation specific */
381 + char __data[_K_SS_MAXSIZE - sizeof(unsigned short)];
382 + /* space to achieve desired size, */
383 + /* _SS_MAXSIZE value minus size of ss_family */
384 +} __attribute__ ((aligned(_K_SS_ALIGNSIZE))); /* force desired alignment */
386 +#endif /* _LINUX_SOCKET_H */
387 diff --git a/src/attr.c b/src/attr.c
388 index 1136c50..c3c57e6 100644
391 @@ -200,6 +200,7 @@ static const size_t mnl_attr_data_type_len[MNL_TYPE_MAX] = {
392 [MNL_TYPE_U16] = sizeof(uint16_t),
393 [MNL_TYPE_U32] = sizeof(uint32_t),
394 [MNL_TYPE_U64] = sizeof(uint64_t),
395 + [MNL_TYPE_MSECS] = sizeof(uint64_t),
399 diff --git a/src/callback.c b/src/callback.c
400 index 6337acc..f023401 100644
403 @@ -65,6 +65,12 @@ __mnl_cb_run(const void *buf, size_t numbytes, unsigned int seq,
407 + /* dump was interrupted */
408 + if (nlh->nlmsg_flags & NLM_F_DUMP_INTR) {
413 /* netlink data message handling */
414 if (nlh->nlmsg_type >= NLMSG_MIN_TYPE) {