25 #include <netlink-private/netlink.h>
26 #include <netlink/netlink.h>
27 #include <netlink/attr.h>
28 #include <netlink/utils.h>
29 #include <netlink/object.h>
30 #include <netlink/route/rtnl.h>
31 #include <netlink-private/route/link/api.h>
32 #include <netlink/route/link/vxlan.h>
34 #include <linux/if_link.h>
37 #define VXLAN_HAS_ID (1<<0)
38 #define VXLAN_HAS_GROUP (1<<1)
39 #define VXLAN_HAS_LINK (1<<2)
40 #define VXLAN_HAS_LOCAL (1<<3)
41 #define VXLAN_HAS_TTL (1<<4)
42 #define VXLAN_HAS_TOS (1<<5)
43 #define VXLAN_HAS_LEARNING (1<<6)
44 #define VXLAN_HAS_AGEING (1<<7)
45 #define VXLAN_HAS_LIMIT (1<<8)
46 #define VXLAN_HAS_PORT_RANGE (1<<9)
47 #define VXLAN_HAS_PROXY (1<<10)
48 #define VXLAN_HAS_RSC (1<<11)
49 #define VXLAN_HAS_L2MISS (1<<12)
50 #define VXLAN_HAS_L3MISS (1<<13)
63 struct ifla_vxlan_port_range vxi_port_range;
73 static struct nla_policy vxlan_policy[IFLA_VXLAN_MAX+1] = {
75 [IFLA_VXLAN_GROUP] = { .minlen =
sizeof(uint32_t) },
76 [IFLA_VXLAN_LINK] = { .type =
NLA_U32 },
77 [IFLA_VXLAN_LOCAL] = { .minlen =
sizeof(uint32_t) },
78 [IFLA_VXLAN_TTL] = { .type =
NLA_U8 },
79 [IFLA_VXLAN_TOS] = { .type =
NLA_U8 },
80 [IFLA_VXLAN_LEARNING] = { .type =
NLA_U8 },
81 [IFLA_VXLAN_AGEING] = { .type =
NLA_U32 },
82 [IFLA_VXLAN_LIMIT] = { .type =
NLA_U32 },
83 [IFLA_VXLAN_PORT_RANGE] = { .minlen =
sizeof(
struct ifla_vxlan_port_range) },
84 [IFLA_VXLAN_PROXY] = { .type =
NLA_U8 },
85 [IFLA_VXLAN_RSC] = { .type =
NLA_U8 },
86 [IFLA_VXLAN_L2MISS] = { .type =
NLA_U8 },
87 [IFLA_VXLAN_L3MISS] = { .type =
NLA_U8 },
90 static int vxlan_alloc(
struct rtnl_link *link)
92 struct vxlan_info *vxi;
95 memset(link->l_info, 0,
sizeof(*vxi));
97 if ((vxi = calloc(1,
sizeof(*vxi))) == NULL)
106 static int vxlan_parse(
struct rtnl_link *link,
struct nlattr *data,
107 struct nlattr *xstats)
109 struct nlattr *tb[IFLA_VXLAN_MAX+1];
110 struct vxlan_info *vxi;
113 NL_DBG(3,
"Parsing VXLAN link info\n");
118 if ((err = vxlan_alloc(link)) < 0)
123 if (tb[IFLA_VXLAN_ID]) {
125 vxi->vxi_mask |= VXLAN_HAS_ID;
128 if (tb[IFLA_VXLAN_GROUP]) {
129 nla_memcpy(&vxi->vxi_group, tb[IFLA_VXLAN_GROUP],
130 sizeof(vxi->vxi_group));
131 vxi->vxi_mask |= VXLAN_HAS_GROUP;
134 if (tb[IFLA_VXLAN_LINK]) {
136 vxi->vxi_mask |= VXLAN_HAS_LINK;
139 if (tb[IFLA_VXLAN_LOCAL]) {
140 nla_memcpy(&vxi->vxi_local, tb[IFLA_VXLAN_LOCAL],
141 sizeof(vxi->vxi_local));
142 vxi->vxi_mask |= VXLAN_HAS_LOCAL;
145 if (tb[IFLA_VXLAN_TTL]) {
146 vxi->vxi_ttl =
nla_get_u8(tb[IFLA_VXLAN_TTL]);
147 vxi->vxi_mask |= VXLAN_HAS_TTL;
150 if (tb[IFLA_VXLAN_TOS]) {
151 vxi->vxi_tos =
nla_get_u8(tb[IFLA_VXLAN_TOS]);
152 vxi->vxi_mask |= VXLAN_HAS_TOS;
155 if (tb[IFLA_VXLAN_LEARNING]) {
156 vxi->vxi_learning =
nla_get_u8(tb[IFLA_VXLAN_LEARNING]);
157 vxi->vxi_mask |= VXLAN_HAS_LEARNING;
160 if (tb[IFLA_VXLAN_AGEING]) {
161 vxi->vxi_ageing =
nla_get_u32(tb[IFLA_VXLAN_AGEING]);
162 vxi->vxi_mask |= VXLAN_HAS_AGEING;
165 if (tb[IFLA_VXLAN_LIMIT]) {
166 vxi->vxi_limit =
nla_get_u32(tb[IFLA_VXLAN_LIMIT]);
167 vxi->vxi_mask |= VXLAN_HAS_LIMIT;
170 if (tb[IFLA_VXLAN_PORT_RANGE]) {
171 nla_memcpy(&vxi->vxi_port_range, tb[IFLA_VXLAN_PORT_RANGE],
172 sizeof(vxi->vxi_port_range));
173 vxi->vxi_mask |= VXLAN_HAS_PORT_RANGE;
176 if (tb[IFLA_VXLAN_PROXY]) {
177 vxi->vxi_proxy =
nla_get_u8(tb[IFLA_VXLAN_PROXY]);
178 vxi->vxi_mask |= VXLAN_HAS_PROXY;
181 if (tb[IFLA_VXLAN_RSC]) {
182 vxi->vxi_rsc =
nla_get_u8(tb[IFLA_VXLAN_RSC]);
183 vxi->vxi_mask |= VXLAN_HAS_RSC;
186 if (tb[IFLA_VXLAN_L2MISS]) {
187 vxi->vxi_l2miss =
nla_get_u8(tb[IFLA_VXLAN_L2MISS]);
188 vxi->vxi_mask |= VXLAN_HAS_L2MISS;
191 if (tb[IFLA_VXLAN_L3MISS]) {
192 vxi->vxi_l3miss =
nla_get_u8(tb[IFLA_VXLAN_L3MISS]);
193 vxi->vxi_mask |= VXLAN_HAS_L3MISS;
202 static void vxlan_free(
struct rtnl_link *link)
204 struct vxlan_info *vxi = link->l_info;
212 struct vxlan_info *vxi = link->l_info;
214 nl_dump(p,
"vxlan-id %u", vxi->vxi_id);
219 struct vxlan_info *vxi = link->l_info;
220 char *name, addr[INET_ADDRSTRLEN];
222 nl_dump_line(p,
" vxlan-id %u\n", vxi->vxi_id);
224 if (vxi->vxi_mask & VXLAN_HAS_GROUP) {
226 if(inet_ntop(AF_INET, &vxi->vxi_group, addr,
sizeof(addr)))
227 nl_dump_line(p,
"%s\n", addr);
229 nl_dump_line(p,
"%#x\n", ntohs(vxi->vxi_group));
232 if (vxi->vxi_mask & VXLAN_HAS_LINK) {
236 nl_dump_line(p,
"%s\n", name);
238 nl_dump_line(p,
"%u\n", vxi->vxi_link);
241 if (vxi->vxi_mask & VXLAN_HAS_LOCAL) {
243 if(inet_ntop(AF_INET, &vxi->vxi_local, addr,
sizeof(addr)))
244 nl_dump_line(p,
"%s\n", addr);
246 nl_dump_line(p,
"%#x\n", ntohs(vxi->vxi_local));
249 if (vxi->vxi_mask & VXLAN_HAS_TTL) {
252 nl_dump_line(p,
"%u\n", vxi->vxi_ttl);
254 nl_dump_line(p,
"inherit\n");
257 if (vxi->vxi_mask & VXLAN_HAS_TOS) {
259 if (vxi->vxi_tos == 1)
260 nl_dump_line(p,
"inherit\n", vxi->vxi_tos);
262 nl_dump_line(p,
"%#x\n", vxi->vxi_tos);
265 if (vxi->vxi_mask & VXLAN_HAS_LEARNING) {
267 if (vxi->vxi_learning)
268 nl_dump_line(p,
"enabled (%#x)\n", vxi->vxi_learning);
270 nl_dump_line(p,
"disabled\n");
273 if (vxi->vxi_mask & VXLAN_HAS_AGEING) {
276 nl_dump_line(p,
"%u seconds\n", vxi->vxi_ageing);
278 nl_dump_line(p,
"disabled\n");
281 if (vxi->vxi_mask & VXLAN_HAS_LIMIT) {
284 nl_dump_line(p,
"%u\n", vxi->vxi_limit);
286 nl_dump_line(p,
"unlimited\n");
289 if (vxi->vxi_mask & VXLAN_HAS_PORT_RANGE)
290 nl_dump_line(p,
" port range %u - %u\n",
291 ntohs(vxi->vxi_port_range.low),
292 ntohs(vxi->vxi_port_range.high));
294 if (vxi->vxi_mask & VXLAN_HAS_PROXY) {
297 nl_dump_line(p,
"enabled (%#x)\n", vxi->vxi_proxy);
299 nl_dump_line(p,
"disabled\n");
302 if (vxi->vxi_mask & VXLAN_HAS_RSC) {
305 nl_dump_line(p,
"enabled (%#x)\n", vxi->vxi_rsc);
307 nl_dump_line(p,
"disabled\n");
310 if (vxi->vxi_mask & VXLAN_HAS_L2MISS) {
313 nl_dump_line(p,
"enabled (%#x)\n", vxi->vxi_l2miss);
315 nl_dump_line(p,
"disabled\n");
318 if (vxi->vxi_mask & VXLAN_HAS_L3MISS) {
321 nl_dump_line(p,
"enabled (%#x)\n", vxi->vxi_l3miss);
323 nl_dump_line(p,
"disabled\n");
329 struct vxlan_info *vdst, *vsrc = src->l_info;
340 memcpy(vdst, vsrc,
sizeof(
struct vxlan_info));
345 static int vxlan_put_attrs(
struct nl_msg *msg,
struct rtnl_link *link)
347 struct vxlan_info *vxi = link->l_info;
353 if (vxi->vxi_mask & VXLAN_HAS_ID)
356 if (vxi->vxi_mask & VXLAN_HAS_GROUP)
357 NLA_PUT(msg, IFLA_VXLAN_GROUP,
sizeof(vxi->vxi_group), &vxi->vxi_group);
359 if (vxi->vxi_mask & VXLAN_HAS_LINK)
362 if (vxi->vxi_mask & VXLAN_HAS_LOCAL)
363 NLA_PUT(msg, IFLA_VXLAN_LOCAL,
sizeof(vxi->vxi_local), &vxi->vxi_local);
365 if (vxi->vxi_mask & VXLAN_HAS_TTL)
366 NLA_PUT_U8(msg, IFLA_VXLAN_TTL, vxi->vxi_ttl);
368 if (vxi->vxi_mask & VXLAN_HAS_TOS)
369 NLA_PUT_U8(msg, IFLA_VXLAN_TOS, vxi->vxi_tos);
371 if (vxi->vxi_mask & VXLAN_HAS_LEARNING)
372 NLA_PUT_U8(msg, IFLA_VXLAN_LEARNING, vxi->vxi_learning);
374 if (vxi->vxi_mask & VXLAN_HAS_AGEING)
375 NLA_PUT_U32(msg, IFLA_VXLAN_AGEING, vxi->vxi_ageing);
377 if (vxi->vxi_mask & VXLAN_HAS_LIMIT)
378 NLA_PUT_U32(msg, IFLA_VXLAN_LIMIT, vxi->vxi_limit);
380 if (vxi->vxi_mask & VXLAN_HAS_PORT_RANGE)
381 NLA_PUT(msg, IFLA_VXLAN_PORT_RANGE,
sizeof(vxi->vxi_port_range),
382 &vxi->vxi_port_range);
384 if (vxi->vxi_mask & VXLAN_HAS_PROXY)
385 NLA_PUT_U8(msg, IFLA_VXLAN_PROXY, vxi->vxi_proxy);
387 if (vxi->vxi_mask & VXLAN_HAS_RSC)
388 NLA_PUT_U8(msg, IFLA_VXLAN_RSC, vxi->vxi_rsc);
390 if (vxi->vxi_mask & VXLAN_HAS_L2MISS)
391 NLA_PUT_U8(msg, IFLA_VXLAN_L2MISS, vxi->vxi_l2miss);
393 if (vxi->vxi_mask & VXLAN_HAS_L3MISS)
394 NLA_PUT_U8(msg, IFLA_VXLAN_L3MISS, vxi->vxi_l3miss);
403 static struct rtnl_link_info_ops vxlan_info_ops = {
405 .io_alloc = vxlan_alloc,
406 .io_parse = vxlan_parse,
411 .io_clone = vxlan_clone,
412 .io_put_attrs = vxlan_put_attrs,
413 .io_free = vxlan_free,
417 #define IS_VXLAN_LINK_ASSERT(link) \
418 if ((link)->l_info_ops != &vxlan_info_ops) { \
419 APPBUG("Link is not a vxlan link. set type \"vxlan\" first."); \
420 return -NLE_OPNOTSUPP; \
458 return link->l_info_ops && !strcmp(link->l_info_ops->io_name,
"vxlan");
470 struct vxlan_info *vxi = link->l_info;
472 IS_VXLAN_LINK_ASSERT(link);
474 if (
id > VXLAN_ID_MAX)
478 vxi->vxi_mask |= VXLAN_HAS_ID;
492 struct vxlan_info *vxi = link->l_info;
494 IS_VXLAN_LINK_ASSERT(link);
499 if (vxi->vxi_mask & VXLAN_HAS_ID)
516 struct vxlan_info *vxi = link->l_info;
518 IS_VXLAN_LINK_ASSERT(link);
525 sizeof(vxi->vxi_group));
526 vxi->vxi_mask |= VXLAN_HAS_GROUP;
540 struct vxlan_info *vxi = link->l_info;
542 IS_VXLAN_LINK_ASSERT(link);
547 if (!(vxi->vxi_mask & VXLAN_HAS_GROUP))
550 *addr =
nl_addr_build(AF_INET, &vxi->vxi_group,
sizeof(vxi->vxi_group));
564 struct vxlan_info *vxi = link->l_info;
566 IS_VXLAN_LINK_ASSERT(link);
568 vxi->vxi_link = index;
569 vxi->vxi_mask |= VXLAN_HAS_LINK;
583 struct vxlan_info *vxi = link->l_info;
585 IS_VXLAN_LINK_ASSERT(link);
590 if (!(vxi->vxi_mask & VXLAN_HAS_LINK))
593 *index = vxi->vxi_link;
607 struct vxlan_info *vxi = link->l_info;
609 IS_VXLAN_LINK_ASSERT(link);
616 sizeof(vxi->vxi_local));
617 vxi->vxi_mask |= VXLAN_HAS_LOCAL;
631 struct vxlan_info *vxi = link->l_info;
633 IS_VXLAN_LINK_ASSERT(link);
638 if (!(vxi->vxi_mask & VXLAN_HAS_LOCAL))
641 *addr =
nl_addr_build(AF_INET, &vxi->vxi_local,
sizeof(vxi->vxi_local));
655 struct vxlan_info *vxi = link->l_info;
657 IS_VXLAN_LINK_ASSERT(link);
660 vxi->vxi_mask |= VXLAN_HAS_TTL;
673 struct vxlan_info *vxi = link->l_info;
675 IS_VXLAN_LINK_ASSERT(link);
677 if (!(vxi->vxi_mask & VXLAN_HAS_TTL))
692 struct vxlan_info *vxi = link->l_info;
694 IS_VXLAN_LINK_ASSERT(link);
697 vxi->vxi_mask |= VXLAN_HAS_TOS;
710 struct vxlan_info *vxi = link->l_info;
712 IS_VXLAN_LINK_ASSERT(link);
714 if (!(vxi->vxi_mask & VXLAN_HAS_TOS))
729 struct vxlan_info *vxi = link->l_info;
731 IS_VXLAN_LINK_ASSERT(link);
733 vxi->vxi_learning = learning;
734 vxi->vxi_mask |= VXLAN_HAS_LEARNING;
747 struct vxlan_info *vxi = link->l_info;
749 IS_VXLAN_LINK_ASSERT(link);
751 if (!(vxi->vxi_mask & VXLAN_HAS_LEARNING))
754 return vxi->vxi_learning;
788 struct vxlan_info *vxi = link->l_info;
790 IS_VXLAN_LINK_ASSERT(link);
792 vxi->vxi_ageing = expiry;
793 vxi->vxi_mask |= VXLAN_HAS_AGEING;
807 struct vxlan_info *vxi = link->l_info;
809 IS_VXLAN_LINK_ASSERT(link);
814 if (vxi->vxi_mask & VXLAN_HAS_AGEING)
815 *expiry = vxi->vxi_ageing;
831 struct vxlan_info *vxi = link->l_info;
833 IS_VXLAN_LINK_ASSERT(link);
835 vxi->vxi_limit = limit;
836 vxi->vxi_mask |= VXLAN_HAS_LIMIT;
850 struct vxlan_info *vxi = link->l_info;
852 IS_VXLAN_LINK_ASSERT(link);
857 if (vxi->vxi_mask & VXLAN_HAS_LIMIT)
858 *limit = vxi->vxi_limit;
873 struct ifla_vxlan_port_range *range)
875 struct vxlan_info *vxi = link->l_info;
877 IS_VXLAN_LINK_ASSERT(link);
882 memcpy(&vxi->vxi_port_range, range,
sizeof(vxi->vxi_port_range));
883 vxi->vxi_mask |= VXLAN_HAS_PORT_RANGE;
896 struct ifla_vxlan_port_range *range)
898 struct vxlan_info *vxi = link->l_info;
900 IS_VXLAN_LINK_ASSERT(link);
905 if (vxi->vxi_mask & VXLAN_HAS_PORT_RANGE)
906 memcpy(range, &vxi->vxi_port_range,
sizeof(*range));
922 struct vxlan_info *vxi = link->l_info;
924 IS_VXLAN_LINK_ASSERT(link);
926 vxi->vxi_proxy = proxy;
927 vxi->vxi_mask |= VXLAN_HAS_PROXY;
940 struct vxlan_info *vxi = link->l_info;
942 IS_VXLAN_LINK_ASSERT(link);
944 if (!(vxi->vxi_mask & VXLAN_HAS_PROXY))
947 return vxi->vxi_proxy;
981 struct vxlan_info *vxi = link->l_info;
983 IS_VXLAN_LINK_ASSERT(link);
986 vxi->vxi_mask |= VXLAN_HAS_RSC;
999 struct vxlan_info *vxi = link->l_info;
1001 IS_VXLAN_LINK_ASSERT(link);
1003 if (!(vxi->vxi_mask & VXLAN_HAS_RSC))
1006 return vxi->vxi_rsc;
1040 struct vxlan_info *vxi = link->l_info;
1042 IS_VXLAN_LINK_ASSERT(link);
1044 vxi->vxi_l2miss = miss;
1045 vxi->vxi_mask |= VXLAN_HAS_L2MISS;
1058 struct vxlan_info *vxi = link->l_info;
1060 IS_VXLAN_LINK_ASSERT(link);
1062 if (!(vxi->vxi_mask & VXLAN_HAS_L2MISS))
1065 return vxi->vxi_l2miss;
1099 struct vxlan_info *vxi = link->l_info;
1101 IS_VXLAN_LINK_ASSERT(link);
1103 vxi->vxi_l3miss = miss;
1104 vxi->vxi_mask |= VXLAN_HAS_L3MISS;
1117 struct vxlan_info *vxi = link->l_info;
1119 IS_VXLAN_LINK_ASSERT(link);
1121 if (!(vxi->vxi_mask & VXLAN_HAS_L3MISS))
1124 return vxi->vxi_l3miss;
1151 static void __init vxlan_init(
void)
1156 static void __exit vxlan_exit(
void)
Dump object briefly on one line.
int rtnl_link_vxlan_disable_rsc(struct rtnl_link *link)
Disable Route Short Circuit.
int rtnl_link_vxlan_set_proxy(struct rtnl_link *link, uint8_t proxy)
Set ARP proxy status to use for VXLAN.
int rtnl_link_register_info(struct rtnl_link_info_ops *ops)
Register operations for a link info type.
Attribute validation policy.
uint8_t nla_get_u8(const struct nlattr *nla)
Return value of 8 bit integer attribute.
int rtnl_link_vxlan_enable_l3miss(struct rtnl_link *link)
Enable netlink IP DDR miss notifications.
struct rtnl_link * rtnl_link_alloc(void)
Allocate link object.
int rtnl_link_vxlan_get_id(struct rtnl_link *link, uint32_t *id)
Get VXLAN Network Identifier.
struct nl_addr * nl_addr_build(int family, const void *buf, size_t size)
Allocate abstract address based on a binary address.
uint32_t nla_get_u32(const struct nlattr *nla)
Return payload of 32 bit integer attribute.
int rtnl_link_vxlan_set_tos(struct rtnl_link *link, uint8_t tos)
Set IP ToS value to use for VXLAN.
int rtnl_link_vxlan_disable_l3miss(struct rtnl_link *link)
Disable netlink IP ADDR miss notifications.
int rtnl_link_vxlan_set_local(struct rtnl_link *link, struct nl_addr *addr)
Set source address to use for VXLAN.
int rtnl_link_vxlan_get_rsc(struct rtnl_link *link)
Get Route Short Circuit status to use for VXLAN.
#define NLA_PUT_U8(msg, attrtype, value)
Add 8 bit integer attribute to netlink message.
int rtnl_link_vxlan_enable_l2miss(struct rtnl_link *link)
Enable netlink LLADDR miss notifications.
int rtnl_link_vxlan_set_ttl(struct rtnl_link *link, uint8_t ttl)
Set IP TTL value to use for VXLAN.
Dump all attributes but no statistics.
int rtnl_link_vxlan_enable_learning(struct rtnl_link *link)
Enable VXLAN address learning.
int rtnl_link_vxlan_set_rsc(struct rtnl_link *link, uint8_t rsc)
Set Route Short Circuit status to use for VXLAN.
char * rtnl_link_get_name(struct rtnl_link *link)
Return name of link object.
int rtnl_link_vxlan_set_l3miss(struct rtnl_link *link, uint8_t miss)
Set netlink IP ADDR miss notification status to use for VXLAN.
int rtnl_link_vxlan_get_limit(struct rtnl_link *link, uint32_t *limit)
Get maximum number of forwarding database entries to use for VXLAN.
int rtnl_link_vxlan_get_group(struct rtnl_link *link, struct nl_addr **addr)
Get VXLAN multicast IP address.
int rtnl_link_vxlan_set_learning(struct rtnl_link *link, uint8_t learning)
Set VXLAN learning status.
int nla_nest_end(struct nl_msg *msg, struct nlattr *start)
Finalize nesting of attributes.
int rtnl_link_vxlan_get_local(struct rtnl_link *link, struct nl_addr **addr)
Get source address to use for VXLAN.
int rtnl_link_vxlan_get_learning(struct rtnl_link *link)
Get VXLAN learning status.
int rtnl_link_vxlan_get_l3miss(struct rtnl_link *link)
Get netlink IP ADDR miss notification status to use for VXLAN.
int rtnl_link_vxlan_set_l2miss(struct rtnl_link *link, uint8_t miss)
Set netlink LLADDR miss notification status to use for VXLAN.
int nla_memcpy(void *dest, const struct nlattr *src, int count)
Copy attribute payload to another memory area.
#define NLA_PUT(msg, attrtype, attrlen, data)
Add unspecific attribute to netlink message.
int rtnl_link_vxlan_get_link(struct rtnl_link *link, uint32_t *index)
Get physical device to use for VXLAN.
int nla_parse_nested(struct nlattr *tb[], int maxtype, struct nlattr *nla, struct nla_policy *policy)
Create attribute index based on nested attribute.
int rtnl_link_vxlan_get_tos(struct rtnl_link *link)
Get IP ToS value to use for VXLAN.
int rtnl_link_vxlan_disable_learning(struct rtnl_link *link)
Disable VXLAN address learning.
int rtnl_link_set_type(struct rtnl_link *link, const char *type)
Set type of link object.
#define NLA_PUT_U32(msg, attrtype, value)
Add 32 bit integer attribute to netlink message.
int rtnl_link_vxlan_disable_l2miss(struct rtnl_link *link)
Disable netlink LLADDR miss notifications.
int rtnl_link_vxlan_get_l2miss(struct rtnl_link *link)
Get netlink LLADDR miss notification status to use for VXLAN.
int rtnl_link_vxlan_enable_rsc(struct rtnl_link *link)
Enable Route Short Circuit.
int rtnl_link_unregister_info(struct rtnl_link_info_ops *ops)
Unregister operations for a link info type.
uint16_t type
Type of attribute or NLA_UNSPEC.
int rtnl_link_is_vxlan(struct rtnl_link *link)
Check if link is a VXLAN link.
int rtnl_link_vxlan_get_ageing(struct rtnl_link *link, uint32_t *expiry)
Get expiration timer value to use for VXLAN.
int rtnl_link_vxlan_set_id(struct rtnl_link *link, uint32_t id)
Set VXLAN Network Identifier.
struct rtnl_link * rtnl_link_vxlan_alloc(void)
Allocate link object of type VXLAN.
int rtnl_link_vxlan_get_proxy(struct rtnl_link *link)
Get ARP proxy status to use for VXLAN.
int rtnl_link_vxlan_get_port_range(struct rtnl_link *link, struct ifla_vxlan_port_range *range)
Get range of UDP port numbers to use for VXLAN.
void nl_dump(struct nl_dump_params *params, const char *fmt,...)
Dump a formatted character string.
int rtnl_link_vxlan_disable_proxy(struct rtnl_link *link)
Disable ARP proxy.
void rtnl_link_put(struct rtnl_link *link)
Return a link object reference.
int rtnl_link_vxlan_set_group(struct rtnl_link *link, struct nl_addr *addr)
Set VXLAN multicast IP address.
unsigned int nl_addr_get_len(const struct nl_addr *addr)
Get length of binary address of abstract address object.
int rtnl_link_vxlan_get_ttl(struct rtnl_link *link)
Get IP TTL value to use for VXLAN.
void * nl_addr_get_binary_addr(const struct nl_addr *addr)
Get binary address of abstract address object.
int rtnl_link_vxlan_set_limit(struct rtnl_link *link, uint32_t limit)
Set maximum number of forwarding database entries to use for VXLAN.
int rtnl_link_vxlan_set_ageing(struct rtnl_link *link, uint32_t expiry)
Set expiration timer value to use for VXLAN.
struct nlattr * nla_nest_start(struct nl_msg *msg, int attrtype)
Start a new level of nested attributes.
int rtnl_link_vxlan_enable_proxy(struct rtnl_link *link)
Enable ARP proxy.
int rtnl_link_vxlan_set_port_range(struct rtnl_link *link, struct ifla_vxlan_port_range *range)
Set range of UDP port numbers to use for VXLAN.
int rtnl_link_vxlan_set_link(struct rtnl_link *link, uint32_t index)
Set physical device to use for VXLAN.
int nl_addr_get_family(const struct nl_addr *addr)
Return address family.