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