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