1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 #ifndef NETLINK_HELPERS_H 3 #define NETLINK_HELPERS_H 4 5 #include <string.h> 6 #include <linux/netlink.h> 7 #include <linux/rtnetlink.h> 8 9 struct rtnl_handle { 10 int fd; 11 struct sockaddr_nl local; 12 struct sockaddr_nl peer; 13 __u32 seq; 14 __u32 dump; 15 int proto; 16 FILE *dump_fp; 17 #define RTNL_HANDLE_F_LISTEN_ALL_NSID 0x01 18 #define RTNL_HANDLE_F_SUPPRESS_NLERR 0x02 19 #define RTNL_HANDLE_F_STRICT_CHK 0x04 20 int flags; 21 }; 22 23 #define NLMSG_TAIL(nmsg) \ 24 ((struct rtattr *) (((void *) (nmsg)) + NLMSG_ALIGN((nmsg)->nlmsg_len))) 25 26 typedef int (*nl_ext_ack_fn_t)(const char *errmsg, uint32_t off, 27 const struct nlmsghdr *inner_nlh); 28 29 int rtnl_open(struct rtnl_handle *rth, unsigned int subscriptions) 30 __attribute__((warn_unused_result)); 31 void rtnl_close(struct rtnl_handle *rth); 32 int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, 33 struct nlmsghdr **answer) 34 __attribute__((warn_unused_result)); 35 36 int addattr(struct nlmsghdr *n, int maxlen, int type); 37 int addattr8(struct nlmsghdr *n, int maxlen, int type, __u8 data); 38 int addattr16(struct nlmsghdr *n, int maxlen, int type, __u16 data); 39 int addattr32(struct nlmsghdr *n, int maxlen, int type, __u32 data); 40 int addattr64(struct nlmsghdr *n, int maxlen, int type, __u64 data); 41 int addattrstrz(struct nlmsghdr *n, int maxlen, int type, const char *data); 42 int addattr_l(struct nlmsghdr *n, int maxlen, int type, const void *data, int alen); 43 int addraw_l(struct nlmsghdr *n, int maxlen, const void *data, int len); 44 struct rtattr *addattr_nest(struct nlmsghdr *n, int maxlen, int type); 45 int addattr_nest_end(struct nlmsghdr *n, struct rtattr *nest); 46 #endif /* NETLINK_HELPERS_H */ 47