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