lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 1 | #ifndef __LIBNETLINK_H__ |
| 2 | #define __LIBNETLINK_H__ 1 |
| 3 | |
| 4 | #include <string.h> |
| 5 | #include <asm/types.h> |
| 6 | #include <linux/netlink.h> |
| 7 | #include <linux/rtnetlink.h> |
| 8 | #include <linux/if_link.h> |
| 9 | #include <linux/if_addr.h> |
| 10 | #include <linux/neighbour.h> |
| 11 | |
| 12 | struct rtnl_handle |
| 13 | { |
| 14 | int fd; |
| 15 | struct sockaddr_nl local; |
| 16 | struct sockaddr_nl peer; |
| 17 | __u32 seq; |
| 18 | __u32 dump; |
| 19 | }; |
| 20 | |
| 21 | extern int rcvbuf; |
| 22 | |
| 23 | extern int rtnl_open(struct rtnl_handle *rth, unsigned subscriptions); |
| 24 | extern int rtnl_open_byproto(struct rtnl_handle *rth, unsigned subscriptions, int protocol); |
| 25 | extern void rtnl_close(struct rtnl_handle *rth); |
| 26 | extern int rtnl_wilddump_request(struct rtnl_handle *rth, int fam, int type); |
| 27 | extern int rtnl_dump_request(struct rtnl_handle *rth, int type, void *req, int len); |
| 28 | |
| 29 | typedef int (*rtnl_filter_t)(const struct sockaddr_nl *, |
| 30 | struct nlmsghdr *n, void *); |
| 31 | |
| 32 | struct rtnl_dump_filter_arg |
| 33 | { |
| 34 | rtnl_filter_t filter; |
| 35 | void *arg1; |
| 36 | }; |
| 37 | |
| 38 | extern int rtnl_dump_filter_l(struct rtnl_handle *rth, |
| 39 | const struct rtnl_dump_filter_arg *arg); |
| 40 | extern int rtnl_dump_filter(struct rtnl_handle *rth, rtnl_filter_t filter, |
| 41 | void *arg); |
| 42 | extern int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, pid_t peer, |
| 43 | unsigned groups, struct nlmsghdr *answer); |
| 44 | extern int rtnl_send(struct rtnl_handle *rth, const void *buf, int); |
| 45 | extern int rtnl_send_check(struct rtnl_handle *rth, const void *buf, int); |
| 46 | |
| 47 | extern int addattr(struct nlmsghdr *n, int maxlen, int type); |
| 48 | extern int addattr8(struct nlmsghdr *n, int maxlen, int type, __u8 data); |
| 49 | extern int addattr16(struct nlmsghdr *n, int maxlen, int type, __u16 data); |
| 50 | extern int addattr32(struct nlmsghdr *n, int maxlen, int type, __u32 data); |
| 51 | extern int addattr64(struct nlmsghdr *n, int maxlen, int type, __u64 data); |
| 52 | extern int addattrstrz(struct nlmsghdr *n, int maxlen, int type, const char *data); |
| 53 | |
| 54 | extern int addattr_l(struct nlmsghdr *n, int maxlen, int type, const void *data, int alen); |
| 55 | extern int addraw_l(struct nlmsghdr *n, int maxlen, const void *data, int len); |
| 56 | extern struct rtattr *addattr_nest(struct nlmsghdr *n, int maxlen, int type); |
| 57 | extern int addattr_nest_end(struct nlmsghdr *n, struct rtattr *nest); |
| 58 | extern struct rtattr *addattr_nest_compat(struct nlmsghdr *n, int maxlen, int type, const void *data, int len); |
| 59 | extern int addattr_nest_compat_end(struct nlmsghdr *n, struct rtattr *nest); |
| 60 | extern int rta_addattr32(struct rtattr *rta, int maxlen, int type, __u32 data); |
| 61 | extern int rta_addattr_l(struct rtattr *rta, int maxlen, int type, const void *data, int alen); |
| 62 | |
| 63 | extern int parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len); |
| 64 | extern int parse_rtattr_byindex(struct rtattr *tb[], int max, struct rtattr *rta, int len); |
| 65 | extern int __parse_rtattr_nested_compat(struct rtattr *tb[], int max, struct rtattr *rta, int len); |
| 66 | |
| 67 | #define parse_rtattr_nested(tb, max, rta) \ |
| 68 | (parse_rtattr((tb), (max), RTA_DATA(rta), RTA_PAYLOAD(rta))) |
| 69 | |
| 70 | #define parse_rtattr_nested_compat(tb, max, rta, data, len) \ |
| 71 | ({ data = RTA_PAYLOAD(rta) >= len ? RTA_DATA(rta) : NULL; \ |
| 72 | __parse_rtattr_nested_compat(tb, max, rta, len); }) |
| 73 | |
| 74 | static inline __u8 rta_getattr_u8(const struct rtattr *rta) |
| 75 | { |
| 76 | return *(__u8 *)RTA_DATA(rta); |
| 77 | } |
| 78 | static inline __u16 rta_getattr_u16(const struct rtattr *rta) |
| 79 | { |
| 80 | return *(__u16 *)RTA_DATA(rta); |
| 81 | } |
| 82 | static inline __u32 rta_getattr_u32(const struct rtattr *rta) |
| 83 | { |
| 84 | return *(__u32 *)RTA_DATA(rta); |
| 85 | } |
| 86 | static inline __u64 rta_getattr_u64(const struct rtattr *rta) |
| 87 | { |
| 88 | __u64 tmp; |
| 89 | memcpy(&tmp, RTA_DATA(rta), sizeof(__u64)); |
| 90 | return tmp; |
| 91 | } |
| 92 | static inline const char *rta_getattr_str(const struct rtattr *rta) |
| 93 | { |
| 94 | return (const char *)RTA_DATA(rta); |
| 95 | } |
| 96 | |
| 97 | extern int rtnl_listen(struct rtnl_handle *, rtnl_filter_t handler, |
| 98 | void *jarg); |
| 99 | extern int rtnl_from_file(FILE *, rtnl_filter_t handler, |
| 100 | void *jarg); |
| 101 | |
| 102 | #define NLMSG_TAIL(nmsg) \ |
| 103 | ((struct rtattr *) (((void *) (nmsg)) + NLMSG_ALIGN((nmsg)->nlmsg_len))) |
| 104 | |
| 105 | #ifndef IFA_RTA |
| 106 | #define IFA_RTA(r) \ |
| 107 | ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifaddrmsg)))) |
| 108 | #endif |
| 109 | #ifndef IFA_PAYLOAD |
| 110 | #define IFA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifaddrmsg)) |
| 111 | #endif |
| 112 | |
| 113 | #ifndef IFLA_RTA |
| 114 | #define IFLA_RTA(r) \ |
| 115 | ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifinfomsg)))) |
| 116 | #endif |
| 117 | #ifndef IFLA_PAYLOAD |
| 118 | #define IFLA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifinfomsg)) |
| 119 | #endif |
| 120 | |
| 121 | #ifndef NDA_RTA |
| 122 | #define NDA_RTA(r) \ |
| 123 | ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ndmsg)))) |
| 124 | #endif |
| 125 | #ifndef NDA_PAYLOAD |
| 126 | #define NDA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ndmsg)) |
| 127 | #endif |
| 128 | |
| 129 | #ifndef NDTA_RTA |
| 130 | #define NDTA_RTA(r) \ |
| 131 | ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ndtmsg)))) |
| 132 | #endif |
| 133 | #ifndef NDTA_PAYLOAD |
| 134 | #define NDTA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ndtmsg)) |
| 135 | #endif |
| 136 | |
| 137 | #endif /* __LIBNETLINK_H__ */ |
| 138 | |