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 14struct 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 27extern int rcvbuf; 28 29int rtnl_open(struct rtnl_handle *rth, unsigned subscriptions) 30 __attribute__((warn_unused_result)); 31 32int rtnl_open_byproto(struct rtnl_handle *rth, unsigned subscriptions, 33 int protocol) 34 __attribute__((warn_unused_result)); 35 36void rtnl_close(struct rtnl_handle *rth); 37int rtnl_wilddump_request(struct rtnl_handle *rth, int fam, int type) 38 __attribute__((warn_unused_result)); 39int rtnl_wilddump_req_filter(struct rtnl_handle *rth, int fam, int type, 40 __u32 filt_mask) 41 __attribute__((warn_unused_result)); 42int rtnl_dump_request(struct rtnl_handle *rth, int type, void *req, 43 int len) 44 __attribute__((warn_unused_result)); 45int rtnl_dump_request_n(struct rtnl_handle *rth, struct nlmsghdr *n) 46 __attribute__((warn_unused_result)); 47 48struct rtnl_ctrl_data { 49 int nsid; 50}; 51 52typedef int (*rtnl_filter_t)(const struct sockaddr_nl *, 53 struct nlmsghdr *n, void *); 54 55typedef int (*rtnl_listen_filter_t)(const struct sockaddr_nl *, 56 struct rtnl_ctrl_data *, 57 struct nlmsghdr *n, void *); 58 59struct rtnl_dump_filter_arg 60{ 61 rtnl_filter_t filter; 62 void *arg1; 63 __u16 nc_flags; 64}; 65 66int rtnl_dump_filter_l(struct rtnl_handle *rth, 67 const struct rtnl_dump_filter_arg *arg); 68int 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) 73int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, 74 struct nlmsghdr *answer, size_t len) 75 __attribute__((warn_unused_result)); 76int rtnl_send(struct rtnl_handle *rth, const void *buf, int) 77 __attribute__((warn_unused_result)); 78int rtnl_send_check(struct rtnl_handle *rth, const void *buf, int) 79 __attribute__((warn_unused_result)); 80 81int addattr(struct nlmsghdr *n, int maxlen, int type); 82int addattr8(struct nlmsghdr *n, int maxlen, int type, __u8 data); 83int addattr16(struct nlmsghdr *n, int maxlen, int type, __u16 data); 84int addattr32(struct nlmsghdr *n, int maxlen, int type, __u32 data); 85int addattr64(struct nlmsghdr *n, int maxlen, int type, __u64 data); 86int addattrstrz(struct nlmsghdr *n, int maxlen, int type, const char *data); 87 88int addattr_l(struct nlmsghdr *n, int maxlen, int type, 89 const void *data, int alen); 90int addraw_l(struct nlmsghdr *n, int maxlen, const void *data, int len); 91struct rtattr *addattr_nest(struct nlmsghdr *n, int maxlen, int type); 92int addattr_nest_end(struct nlmsghdr *n, struct rtattr *nest); 93struct rtattr *addattr_nest_compat(struct nlmsghdr *n, int maxlen, int type, 94 const void *data, int len); 95int addattr_nest_compat_end(struct nlmsghdr *n, struct rtattr *nest); 96int rta_addattr8(struct rtattr *rta, int maxlen, int type, __u8 data); 97int rta_addattr16(struct rtattr *rta, int maxlen, int type, __u16 data); 98int rta_addattr32(struct rtattr *rta, int maxlen, int type, __u32 data); 99int rta_addattr64(struct rtattr *rta, int maxlen, int type, __u64 data); 100int rta_addattr_l(struct rtattr *rta, int maxlen, int type, 101 const void *data, int alen); 102 103int parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len); 104int parse_rtattr_flags(struct rtattr *tb[], int max, struct rtattr *rta, 105 int len, unsigned short flags); 106int parse_rtattr_byindex(struct rtattr *tb[], int max, 107 struct rtattr *rta, int len); 108struct rtattr *parse_rtattr_one(int type, struct rtattr *rta, int len); 109int __parse_rtattr_nested_compat(struct rtattr *tb[], int max, struct rtattr *rta, int len); 110 111struct rtattr *rta_nest(struct rtattr *rta, int maxlen, int type); 112int 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 128static inline __u8 rta_getattr_u8(const struct rtattr *rta) 129{ 130 return *(__u8 *)RTA_DATA(rta); 131} 132static inline __u16 rta_getattr_u16(const struct rtattr *rta) 133{ 134 return *(__u16 *)RTA_DATA(rta); 135} 136static inline __u32 rta_getattr_u32(const struct rtattr *rta) 137{ 138 return *(__u32 *)RTA_DATA(rta); 139} 140static 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} 146static inline const char *rta_getattr_str(const struct rtattr *rta) 147{ 148 return (const char *)RTA_DATA(rta); 149} 150 151int rtnl_listen_all_nsid(struct rtnl_handle *); 152int rtnl_listen(struct rtnl_handle *, rtnl_listen_filter_t handler, 153 void *jarg); 154int 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