12d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert#ifndef __LIBNETLINK_H__
22d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert#define __LIBNETLINK_H__ 1
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#include <stdio.h>
57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#include <string.h>
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#include <asm/types.h>
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#include <linux/netlink.h>
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#include <linux/rtnetlink.h>
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#include <linux/if_link.h>
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#include <linux/if_addr.h>
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#include <linux/neighbour.h>
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#include <linux/netconf.h>
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertstruct rtnl_handle
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert{
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	int			fd;
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	struct sockaddr_nl	local;
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	struct sockaddr_nl	peer;
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	__u32			seq;
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	__u32			dump;
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	int			proto;
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	FILE		       *dump_fp;
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#define RTNL_HANDLE_F_LISTEN_ALL_NSID		0x01
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	int			flags;
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert};
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertextern int rcvbuf;
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertint rtnl_open(struct rtnl_handle *rth, unsigned subscriptions)
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	__attribute__((warn_unused_result));
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertint rtnl_open_byproto(struct rtnl_handle *rth, unsigned subscriptions,
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert			     int protocol)
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	__attribute__((warn_unused_result));
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertvoid rtnl_close(struct rtnl_handle *rth);
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertint rtnl_wilddump_request(struct rtnl_handle *rth, int fam, int type)
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	__attribute__((warn_unused_result));
392d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertint rtnl_wilddump_req_filter(struct rtnl_handle *rth, int fam, int type,
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert				    __u32 filt_mask)
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	__attribute__((warn_unused_result));
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertint rtnl_dump_request(struct rtnl_handle *rth, int type, void *req,
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert			     int len)
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	__attribute__((warn_unused_result));
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertint rtnl_dump_request_n(struct rtnl_handle *rth, struct nlmsghdr *n)
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	__attribute__((warn_unused_result));
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertstruct rtnl_ctrl_data {
497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	int	nsid;
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert};
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Rouberttypedef int (*rtnl_filter_t)(const struct sockaddr_nl *,
537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert			     struct nlmsghdr *n, void *);
547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Rouberttypedef int (*rtnl_listen_filter_t)(const struct sockaddr_nl *,
567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert				    struct rtnl_ctrl_data *,
577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert				    struct nlmsghdr *n, void *);
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertstruct rtnl_dump_filter_arg
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert{
617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	rtnl_filter_t filter;
627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	void *arg1;
637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	__u16 nc_flags;
647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert};
657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertint rtnl_dump_filter_l(struct rtnl_handle *rth,
677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert			      const struct rtnl_dump_filter_arg *arg);
687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertint rtnl_dump_filter_nc(struct rtnl_handle *rth,
697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert			rtnl_filter_t filter,
707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert			void *arg, __u16 nc_flags);
717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#define rtnl_dump_filter(rth, filter, arg) \
727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	rtnl_dump_filter_nc(rth, filter, arg, 0)
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertint rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	      struct nlmsghdr *answer, size_t len)
757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	__attribute__((warn_unused_result));
767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertint rtnl_send(struct rtnl_handle *rth, const void *buf, int)
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	__attribute__((warn_unused_result));
787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertint rtnl_send_check(struct rtnl_handle *rth, const void *buf, int)
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	__attribute__((warn_unused_result));
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertint addattr(struct nlmsghdr *n, int maxlen, int type);
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertint addattr8(struct nlmsghdr *n, int maxlen, int type, __u8 data);
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertint addattr16(struct nlmsghdr *n, int maxlen, int type, __u16 data);
842d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertint addattr32(struct nlmsghdr *n, int maxlen, int type, __u32 data);
857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertint addattr64(struct nlmsghdr *n, int maxlen, int type, __u64 data);
867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertint addattrstrz(struct nlmsghdr *n, int maxlen, int type, const char *data);
877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertint addattr_l(struct nlmsghdr *n, int maxlen, int type,
897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	      const void *data, int alen);
907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertint addraw_l(struct nlmsghdr *n, int maxlen, const void *data, int len);
917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertstruct rtattr *addattr_nest(struct nlmsghdr *n, int maxlen, int type);
927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertint addattr_nest_end(struct nlmsghdr *n, struct rtattr *nest);
937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertstruct rtattr *addattr_nest_compat(struct nlmsghdr *n, int maxlen, int type,
947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert				   const void *data, int len);
957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertint addattr_nest_compat_end(struct nlmsghdr *n, struct rtattr *nest);
967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertint rta_addattr8(struct rtattr *rta, int maxlen, int type, __u8 data);
977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertint rta_addattr16(struct rtattr *rta, int maxlen, int type, __u16 data);
987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertint rta_addattr32(struct rtattr *rta, int maxlen, int type, __u32 data);
997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertint rta_addattr64(struct rtattr *rta, int maxlen, int type, __u64 data);
1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertint rta_addattr_l(struct rtattr *rta, int maxlen, int type,
1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert		  const void *data, int alen);
1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertint parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len);
1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertint parse_rtattr_flags(struct rtattr *tb[], int max, struct rtattr *rta,
1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert			      int len, unsigned short flags);
1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertint parse_rtattr_byindex(struct rtattr *tb[], int max,
1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert			 struct rtattr *rta, int len);
1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertstruct rtattr *parse_rtattr_one(int type, struct rtattr *rta, int len);
1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertint __parse_rtattr_nested_compat(struct rtattr *tb[], int max, struct rtattr *rta, int len);
1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertstruct rtattr *rta_nest(struct rtattr *rta, int maxlen, int type);
1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertint rta_nest_end(struct rtattr *rta, struct rtattr *nest);
1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1142d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert#define RTA_TAIL(rta) \
1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert		((struct rtattr *) (((void *) (rta)) + \
1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert				    RTA_ALIGN((rta)->rta_len)))
1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#define parse_rtattr_nested(tb, max, rta) \
1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	(parse_rtattr((tb), (max), RTA_DATA(rta), RTA_PAYLOAD(rta)))
1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#define parse_rtattr_one_nested(type, rta) \
1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	(parse_rtattr_one(type, RTA_DATA(rta), RTA_PAYLOAD(rta)))
1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#define parse_rtattr_nested_compat(tb, max, rta, data, len) \
1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	({ data = RTA_PAYLOAD(rta) >= len ? RTA_DATA(rta) : NULL;	\
1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert		__parse_rtattr_nested_compat(tb, max, rta, len); })
1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertstatic inline __u8 rta_getattr_u8(const struct rtattr *rta)
1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert{
1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	return *(__u8 *)RTA_DATA(rta);
1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertstatic inline __u16 rta_getattr_u16(const struct rtattr *rta)
1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert{
1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	return *(__u16 *)RTA_DATA(rta);
1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertstatic inline __u32 rta_getattr_u32(const struct rtattr *rta)
1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert{
1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	return *(__u32 *)RTA_DATA(rta);
1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertstatic inline __u64 rta_getattr_u64(const struct rtattr *rta)
1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert{
1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	__u64 tmp;
1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	memcpy(&tmp, RTA_DATA(rta), sizeof(__u64));
1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	return tmp;
1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertstatic inline const char *rta_getattr_str(const struct rtattr *rta)
1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert{
1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	return (const char *)RTA_DATA(rta);
1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertint rtnl_listen_all_nsid(struct rtnl_handle *);
1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertint rtnl_listen(struct rtnl_handle *, rtnl_listen_filter_t handler,
1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert		void *jarg);
1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertint rtnl_from_file(FILE *, rtnl_listen_filter_t handler,
1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert		   void *jarg);
1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#define NLMSG_TAIL(nmsg) \
1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	((struct rtattr *) (((void *) (nmsg)) + NLMSG_ALIGN((nmsg)->nlmsg_len)))
1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#ifndef IFA_RTA
1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#define IFA_RTA(r) \
1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifaddrmsg))))
1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#endif
1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#ifndef IFA_PAYLOAD
1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#define IFA_PAYLOAD(n)	NLMSG_PAYLOAD(n,sizeof(struct ifaddrmsg))
1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#endif
1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#ifndef IFLA_RTA
1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#define IFLA_RTA(r) \
1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifinfomsg))))
1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#endif
1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#ifndef IFLA_PAYLOAD
1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#define IFLA_PAYLOAD(n)	NLMSG_PAYLOAD(n,sizeof(struct ifinfomsg))
1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#endif
1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#ifndef NDA_RTA
1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#define NDA_RTA(r) \
1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ndmsg))))
1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#endif
1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#ifndef NDA_PAYLOAD
1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#define NDA_PAYLOAD(n)	NLMSG_PAYLOAD(n,sizeof(struct ndmsg))
1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#endif
1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#ifndef NDTA_RTA
1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#define NDTA_RTA(r) \
1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ndtmsg))))
1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#endif
1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#ifndef NDTA_PAYLOAD
1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#define NDTA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ndtmsg))
1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#endif
1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#ifndef NETNS_RTA
1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#define NETNS_RTA(r) \
1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert	((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct rtgenmsg))))
1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#endif
1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#ifndef NETNS_PAYLOAD
1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#define NETNS_PAYLOAD(n)	NLMSG_PAYLOAD(n,sizeof(struct rtgenmsg))
1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#endif
1997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/* User defined nlmsg_type which is used mostly for logging netlink
2017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * messages from dump file */
2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#define NLMSG_TSTAMP	15
2037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#endif /* __LIBNETLINK_H__ */
2057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert