1 #ifndef __LIBNETLINK_H__ 2 #define __LIBNETLINK_H__ 1 3 4 #include <stdio.h> 5 #include <string.h> 6 #include <asm/types.h> 7 #include <linux/netlink.h> 8 #include <linux/rtnetlink.h> 9 #include <linux/if_link.h> 10 #include <linux/if_addr.h> 11 #include <linux/neighbour.h> 12 #include <linux/netconf.h> 13 14 struct rtnl_handle 15 { 16 int fd; 17 struct sockaddr_nl local; 18 struct sockaddr_nl peer; 19 __u32 seq; 20 __u32 dump; 21 int proto; 22 FILE *dump_fp; 23 #define RTNL_HANDLE_F_LISTEN_ALL_NSID 0x01 24 int flags; 25 }; 26 27 extern int rcvbuf; 28 29 int rtnl_open(struct rtnl_handle *rth, unsigned subscriptions) 30 __attribute__((warn_unused_result)); 31 32 int rtnl_open_byproto(struct rtnl_handle *rth, unsigned subscriptions, 33 int protocol) 34 __attribute__((warn_unused_result)); 35 36 void rtnl_close(struct rtnl_handle *rth); 37 int rtnl_wilddump_request(struct rtnl_handle *rth, int fam, int type) 38 __attribute__((warn_unused_result)); 39 int rtnl_wilddump_req_filter(struct rtnl_handle *rth, int fam, int type, 40 __u32 filt_mask) 41 __attribute__((warn_unused_result)); 42 int rtnl_dump_request(struct rtnl_handle *rth, int type, void *req, 43 int len) 44 __attribute__((warn_unused_result)); 45 int rtnl_dump_request_n(struct rtnl_handle *rth, struct nlmsghdr *n) 46 __attribute__((warn_unused_result)); 47 48 struct rtnl_ctrl_data { 49 int nsid; 50 }; 51 52 typedef int (*rtnl_filter_t)(const struct sockaddr_nl *, 53 struct nlmsghdr *n, void *); 54 55 typedef int (*rtnl_listen_filter_t)(const struct sockaddr_nl *, 56 struct rtnl_ctrl_data *, 57 struct nlmsghdr *n, void *); 58 59 struct rtnl_dump_filter_arg 60 { 61 rtnl_filter_t filter; 62 void *arg1; 63 __u16 nc_flags; 64 }; 65 66 int rtnl_dump_filter_l(struct rtnl_handle *rth, 67 const struct rtnl_dump_filter_arg *arg); 68 int rtnl_dump_filter_nc(struct rtnl_handle *rth, 69 rtnl_filter_t filter, 70 void *arg, __u16 nc_flags); 71 #define rtnl_dump_filter(rth, filter, arg) \ 72 rtnl_dump_filter_nc(rth, filter, arg, 0) 73 int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, 74 struct nlmsghdr *answer, size_t len) 75 __attribute__((warn_unused_result)); 76 int rtnl_send(struct rtnl_handle *rth, const void *buf, int) 77 __attribute__((warn_unused_result)); 78 int rtnl_send_check(struct rtnl_handle *rth, const void *buf, int) 79 __attribute__((warn_unused_result)); 80 81 int addattr(struct nlmsghdr *n, int maxlen, int type); 82 int addattr8(struct nlmsghdr *n, int maxlen, int type, __u8 data); 83 int addattr16(struct nlmsghdr *n, int maxlen, int type, __u16 data); 84 int addattr32(struct nlmsghdr *n, int maxlen, int type, __u32 data); 85 int addattr64(struct nlmsghdr *n, int maxlen, int type, __u64 data); 86 int addattrstrz(struct nlmsghdr *n, int maxlen, int type, const char *data); 87 88 int addattr_l(struct nlmsghdr *n, int maxlen, int type, 89 const void *data, int alen); 90 int addraw_l(struct nlmsghdr *n, int maxlen, const void *data, int len); 91 struct rtattr *addattr_nest(struct nlmsghdr *n, int maxlen, int type); 92 int addattr_nest_end(struct nlmsghdr *n, struct rtattr *nest); 93 struct rtattr *addattr_nest_compat(struct nlmsghdr *n, int maxlen, int type, 94 const void *data, int len); 95 int addattr_nest_compat_end(struct nlmsghdr *n, struct rtattr *nest); 96 int rta_addattr8(struct rtattr *rta, int maxlen, int type, __u8 data); 97 int rta_addattr16(struct rtattr *rta, int maxlen, int type, __u16 data); 98 int rta_addattr32(struct rtattr *rta, int maxlen, int type, __u32 data); 99 int rta_addattr64(struct rtattr *rta, int maxlen, int type, __u64 data); 100 int rta_addattr_l(struct rtattr *rta, int maxlen, int type, 101 const void *data, int alen); 102 103 int parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len); 104 int parse_rtattr_flags(struct rtattr *tb[], int max, struct rtattr *rta, 105 int len, unsigned short flags); 106 int parse_rtattr_byindex(struct rtattr *tb[], int max, 107 struct rtattr *rta, int len); 108 struct rtattr *parse_rtattr_one(int type, struct rtattr *rta, int len); 109 int __parse_rtattr_nested_compat(struct rtattr *tb[], int max, struct rtattr *rta, int len); 110 111 struct rtattr *rta_nest(struct rtattr *rta, int maxlen, int type); 112 int rta_nest_end(struct rtattr *rta, struct rtattr *nest); 113 114 #define RTA_TAIL(rta) \ 115 ((struct rtattr *) (((void *) (rta)) + \ 116 RTA_ALIGN((rta)->rta_len))) 117 118 #define parse_rtattr_nested(tb, max, rta) \ 119 (parse_rtattr((tb), (max), RTA_DATA(rta), RTA_PAYLOAD(rta))) 120 121 #define parse_rtattr_one_nested(type, rta) \ 122 (parse_rtattr_one(type, RTA_DATA(rta), RTA_PAYLOAD(rta))) 123 124 #define parse_rtattr_nested_compat(tb, max, rta, data, len) \ 125 ({ data = RTA_PAYLOAD(rta) >= len ? RTA_DATA(rta) : NULL; \ 126 __parse_rtattr_nested_compat(tb, max, rta, len); }) 127 128 static inline __u8 rta_getattr_u8(const struct rtattr *rta) 129 { 130 return *(__u8 *)RTA_DATA(rta); 131 } 132 static inline __u16 rta_getattr_u16(const struct rtattr *rta) 133 { 134 return *(__u16 *)RTA_DATA(rta); 135 } 136 static inline __u32 rta_getattr_u32(const struct rtattr *rta) 137 { 138 return *(__u32 *)RTA_DATA(rta); 139 } 140 static inline __u64 rta_getattr_u64(const struct rtattr *rta) 141 { 142 __u64 tmp; 143 memcpy(&tmp, RTA_DATA(rta), sizeof(__u64)); 144 return tmp; 145 } 146 static inline const char *rta_getattr_str(const struct rtattr *rta) 147 { 148 return (const char *)RTA_DATA(rta); 149 } 150 151 int rtnl_listen_all_nsid(struct rtnl_handle *); 152 int rtnl_listen(struct rtnl_handle *, rtnl_listen_filter_t handler, 153 void *jarg); 154 int rtnl_from_file(FILE *, rtnl_listen_filter_t handler, 155 void *jarg); 156 157 #define NLMSG_TAIL(nmsg) \ 158 ((struct rtattr *) (((void *) (nmsg)) + NLMSG_ALIGN((nmsg)->nlmsg_len))) 159 160 #ifndef IFA_RTA 161 #define IFA_RTA(r) \ 162 ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifaddrmsg)))) 163 #endif 164 #ifndef IFA_PAYLOAD 165 #define IFA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifaddrmsg)) 166 #endif 167 168 #ifndef IFLA_RTA 169 #define IFLA_RTA(r) \ 170 ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifinfomsg)))) 171 #endif 172 #ifndef IFLA_PAYLOAD 173 #define IFLA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifinfomsg)) 174 #endif 175 176 #ifndef NDA_RTA 177 #define NDA_RTA(r) \ 178 ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ndmsg)))) 179 #endif 180 #ifndef NDA_PAYLOAD 181 #define NDA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ndmsg)) 182 #endif 183 184 #ifndef NDTA_RTA 185 #define NDTA_RTA(r) \ 186 ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ndtmsg)))) 187 #endif 188 #ifndef NDTA_PAYLOAD 189 #define NDTA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ndtmsg)) 190 #endif 191 192 #ifndef NETNS_RTA 193 #define NETNS_RTA(r) \ 194 ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct rtgenmsg)))) 195 #endif 196 #ifndef NETNS_PAYLOAD 197 #define NETNS_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct rtgenmsg)) 198 #endif 199 200 /* User defined nlmsg_type which is used mostly for logging netlink 201 * messages from dump file */ 202 #define NLMSG_TSTAMP 15 203 204 #endif /* __LIBNETLINK_H__ */ 205 206