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 9struct 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 26typedef int (*nl_ext_ack_fn_t)(const char *errmsg, uint32_t off, 27 const struct nlmsghdr *inner_nlh); 28 29int rtnl_open(struct rtnl_handle *rth, unsigned int subscriptions) 30 __attribute__((warn_unused_result)); 31void rtnl_close(struct rtnl_handle *rth); 32int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, 33 struct nlmsghdr **answer) 34 __attribute__((warn_unused_result)); 35 36int addattr(struct nlmsghdr *n, int maxlen, int type); 37int addattr8(struct nlmsghdr *n, int maxlen, int type, __u8 data); 38int addattr16(struct nlmsghdr *n, int maxlen, int type, __u16 data); 39int addattr32(struct nlmsghdr *n, int maxlen, int type, __u32 data); 40int addattr64(struct nlmsghdr *n, int maxlen, int type, __u64 data); 41int addattrstrz(struct nlmsghdr *n, int maxlen, int type, const char *data); 42int addattr_l(struct nlmsghdr *n, int maxlen, int type, const void *data, int alen); 43int addraw_l(struct nlmsghdr *n, int maxlen, const void *data, int len); 44struct rtattr *addattr_nest(struct nlmsghdr *n, int maxlen, int type); 45int addattr_nest_end(struct nlmsghdr *n, struct rtattr *nest); 46#endif /* NETLINK_HELPERS_H */ 47