Home | History | Annotate | Download | only in include
      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