19#include "nl-default.h"
21#include <linux/if_link.h>
23#include <netlink/netlink.h>
24#include <netlink/attr.h>
25#include <netlink/utils.h>
26#include <netlink/object.h>
27#include <netlink/route/rtnl.h>
28#include <netlink/route/link/vxlan.h>
32#include "nl-aux-route/nl-route.h"
35#define VXLAN_ATTR_ID (1<<0)
36#define VXLAN_ATTR_GROUP (1<<1)
37#define VXLAN_ATTR_LINK (1<<2)
38#define VXLAN_ATTR_LOCAL (1<<3)
39#define VXLAN_ATTR_TTL (1<<4)
40#define VXLAN_ATTR_TOS (1<<5)
41#define VXLAN_ATTR_LEARNING (1<<6)
42#define VXLAN_ATTR_AGEING (1<<7)
43#define VXLAN_ATTR_LIMIT (1<<8)
44#define VXLAN_ATTR_PORT_RANGE (1<<9)
45#define VXLAN_ATTR_PROXY (1<<10)
46#define VXLAN_ATTR_RSC (1<<11)
47#define VXLAN_ATTR_L2MISS (1<<12)
48#define VXLAN_ATTR_L3MISS (1<<13)
49#define VXLAN_ATTR_GROUP6 (1<<14)
50#define VXLAN_ATTR_LOCAL6 (1<<15)
51#define VXLAN_ATTR_PORT (1<<16)
52#define VXLAN_ATTR_UDP_CSUM (1<<17)
53#define VXLAN_ATTR_UDP_ZERO_CSUM6_TX (1<<18)
54#define VXLAN_ATTR_UDP_ZERO_CSUM6_RX (1<<19)
55#define VXLAN_ATTR_REMCSUM_TX (1<<20)
56#define VXLAN_ATTR_REMCSUM_RX (1<<21)
57#define VXLAN_ATTR_COLLECT_METADATA (1<<22)
58#define VXLAN_ATTR_LABEL (1<<23)
59#define VXLAN_ATTR_FLAGS (1<<24)
65 struct in6_addr vxi_group6;
68 struct in6_addr vxi_local6;
75 struct ifla_vxlan_port_range vxi_port_range;
82 uint8_t vxi_udp_zero_csum6_tx;
83 uint8_t vxi_udp_zero_csum6_rx;
84 uint8_t vxi_remcsum_tx;
85 uint8_t vxi_remcsum_rx;
86 uint8_t vxi_collect_metadata;
93static struct nla_policy vxlan_policy[IFLA_VXLAN_MAX+1] = {
94 [IFLA_VXLAN_ID] = { .type =
NLA_U32 },
95 [IFLA_VXLAN_GROUP] = { .minlen =
sizeof(uint32_t) },
96 [IFLA_VXLAN_GROUP6] = { .minlen =
sizeof(
struct in6_addr) },
97 [IFLA_VXLAN_LINK] = { .type =
NLA_U32 },
98 [IFLA_VXLAN_LOCAL] = { .minlen =
sizeof(uint32_t) },
99 [IFLA_VXLAN_LOCAL6] = { .minlen =
sizeof(
struct in6_addr) },
100 [IFLA_VXLAN_TTL] = { .type =
NLA_U8 },
101 [IFLA_VXLAN_TOS] = { .type =
NLA_U8 },
102 [IFLA_VXLAN_LABEL] = { .type =
NLA_U32 },
103 [IFLA_VXLAN_LEARNING] = { .type =
NLA_U8 },
104 [IFLA_VXLAN_AGEING] = { .type =
NLA_U32 },
105 [IFLA_VXLAN_LIMIT] = { .type =
NLA_U32 },
106 [IFLA_VXLAN_PORT_RANGE] = { .minlen =
sizeof(
struct ifla_vxlan_port_range) },
107 [IFLA_VXLAN_PROXY] = { .type =
NLA_U8 },
108 [IFLA_VXLAN_RSC] = { .type =
NLA_U8 },
109 [IFLA_VXLAN_L2MISS] = { .type =
NLA_U8 },
110 [IFLA_VXLAN_L3MISS] = { .type =
NLA_U8 },
111 [IFLA_VXLAN_COLLECT_METADATA] = { .type =
NLA_U8 },
112 [IFLA_VXLAN_PORT] = { .type =
NLA_U16 },
113 [IFLA_VXLAN_UDP_CSUM] = { .type =
NLA_U8 },
114 [IFLA_VXLAN_UDP_ZERO_CSUM6_TX] = { .type =
NLA_U8 },
115 [IFLA_VXLAN_UDP_ZERO_CSUM6_RX] = { .type =
NLA_U8 },
116 [IFLA_VXLAN_REMCSUM_TX] = { .type =
NLA_U8 },
117 [IFLA_VXLAN_REMCSUM_RX] = { .type =
NLA_U8 },
118 [IFLA_VXLAN_GBP] = { .type =
NLA_FLAG, },
119 [IFLA_VXLAN_GPE] = { .type =
NLA_FLAG, },
120 [IFLA_VXLAN_REMCSUM_NOPARTIAL] = { .type =
NLA_FLAG },
123static int vxlan_alloc(
struct rtnl_link *link)
125 struct vxlan_info *vxi;
128 memset(link->l_info, 0,
sizeof(*vxi));
130 if ((vxi = calloc(1,
sizeof(*vxi))) == NULL)
139static int vxlan_parse(
struct rtnl_link *link,
struct nlattr *data,
140 struct nlattr *xstats)
142 struct nlattr *tb[IFLA_VXLAN_MAX+1];
143 struct vxlan_info *vxi;
146 NL_DBG(3,
"Parsing VXLAN link info\n");
151 if ((err = vxlan_alloc(link)) < 0)
156 if (tb[IFLA_VXLAN_ID]) {
158 vxi->ce_mask |= VXLAN_ATTR_ID;
161 if (tb[IFLA_VXLAN_GROUP6]) {
162 nla_memcpy(&vxi->vxi_group6, tb[IFLA_VXLAN_GROUP6],
163 sizeof(vxi->vxi_group6));
164 vxi->ce_mask |= VXLAN_ATTR_GROUP6;
167 if (tb[IFLA_VXLAN_GROUP]) {
168 nla_memcpy(&vxi->vxi_group, tb[IFLA_VXLAN_GROUP],
169 sizeof(vxi->vxi_group));
170 vxi->ce_mask |= VXLAN_ATTR_GROUP;
171 vxi->ce_mask &= ~VXLAN_ATTR_GROUP6;
174 if (tb[IFLA_VXLAN_LINK]) {
176 vxi->ce_mask |= VXLAN_ATTR_LINK;
179 if (tb[IFLA_VXLAN_LOCAL6]) {
180 nla_memcpy(&vxi->vxi_local6, tb[IFLA_VXLAN_LOCAL6],
181 sizeof(vxi->vxi_local6));
182 vxi->ce_mask |= VXLAN_ATTR_LOCAL6;
185 if (tb[IFLA_VXLAN_LOCAL]) {
186 nla_memcpy(&vxi->vxi_local, tb[IFLA_VXLAN_LOCAL],
187 sizeof(vxi->vxi_local));
188 vxi->ce_mask |= VXLAN_ATTR_LOCAL;
189 vxi->ce_mask &= ~VXLAN_ATTR_LOCAL6;
192 if (tb[IFLA_VXLAN_TTL]) {
193 vxi->vxi_ttl =
nla_get_u8(tb[IFLA_VXLAN_TTL]);
194 vxi->ce_mask |= VXLAN_ATTR_TTL;
197 if (tb[IFLA_VXLAN_TOS]) {
198 vxi->vxi_tos =
nla_get_u8(tb[IFLA_VXLAN_TOS]);
199 vxi->ce_mask |= VXLAN_ATTR_TOS;
202 if (tb[IFLA_VXLAN_LEARNING]) {
203 vxi->vxi_learning =
nla_get_u8(tb[IFLA_VXLAN_LEARNING]);
204 vxi->ce_mask |= VXLAN_ATTR_LEARNING;
207 if (tb[IFLA_VXLAN_AGEING]) {
208 vxi->vxi_ageing =
nla_get_u32(tb[IFLA_VXLAN_AGEING]);
209 vxi->ce_mask |= VXLAN_ATTR_AGEING;
212 if (tb[IFLA_VXLAN_LIMIT]) {
213 vxi->vxi_limit =
nla_get_u32(tb[IFLA_VXLAN_LIMIT]);
214 vxi->ce_mask |= VXLAN_ATTR_LIMIT;
217 if (tb[IFLA_VXLAN_PORT_RANGE]) {
218 nla_memcpy(&vxi->vxi_port_range, tb[IFLA_VXLAN_PORT_RANGE],
219 sizeof(vxi->vxi_port_range));
220 vxi->ce_mask |= VXLAN_ATTR_PORT_RANGE;
223 if (tb[IFLA_VXLAN_PROXY]) {
224 vxi->vxi_proxy =
nla_get_u8(tb[IFLA_VXLAN_PROXY]);
225 vxi->ce_mask |= VXLAN_ATTR_PROXY;
228 if (tb[IFLA_VXLAN_RSC]) {
229 vxi->vxi_rsc =
nla_get_u8(tb[IFLA_VXLAN_RSC]);
230 vxi->ce_mask |= VXLAN_ATTR_RSC;
233 if (tb[IFLA_VXLAN_L2MISS]) {
234 vxi->vxi_l2miss =
nla_get_u8(tb[IFLA_VXLAN_L2MISS]);
235 vxi->ce_mask |= VXLAN_ATTR_L2MISS;
238 if (tb[IFLA_VXLAN_L3MISS]) {
239 vxi->vxi_l3miss =
nla_get_u8(tb[IFLA_VXLAN_L3MISS]);
240 vxi->ce_mask |= VXLAN_ATTR_L3MISS;
243 if (tb[IFLA_VXLAN_PORT]) {
245 vxi->ce_mask |= VXLAN_ATTR_PORT;
248 if (tb[IFLA_VXLAN_UDP_CSUM]) {
249 vxi->vxi_udp_csum =
nla_get_u8(tb[IFLA_VXLAN_UDP_CSUM]);
250 vxi->ce_mask |= VXLAN_ATTR_UDP_CSUM;
253 if (tb[IFLA_VXLAN_UDP_ZERO_CSUM6_TX]) {
254 vxi->vxi_udp_zero_csum6_tx =
nla_get_u8(tb[IFLA_VXLAN_UDP_ZERO_CSUM6_TX]);
255 vxi->ce_mask |= VXLAN_ATTR_UDP_ZERO_CSUM6_TX;
258 if (tb[IFLA_VXLAN_UDP_ZERO_CSUM6_RX]) {
259 vxi->vxi_udp_zero_csum6_rx =
nla_get_u8(tb[IFLA_VXLAN_UDP_ZERO_CSUM6_RX]);
260 vxi->ce_mask |= VXLAN_ATTR_UDP_ZERO_CSUM6_RX;
263 if (tb[IFLA_VXLAN_REMCSUM_TX]) {
264 vxi->vxi_remcsum_tx =
nla_get_u8(tb[IFLA_VXLAN_REMCSUM_TX]);
265 vxi->ce_mask |= VXLAN_ATTR_REMCSUM_TX;
268 if (tb[IFLA_VXLAN_REMCSUM_RX]) {
269 vxi->vxi_remcsum_rx =
nla_get_u8(tb[IFLA_VXLAN_REMCSUM_RX]);
270 vxi->ce_mask |= VXLAN_ATTR_REMCSUM_RX;
273 if (tb[IFLA_VXLAN_GBP])
274 vxi->vxi_flags |= RTNL_LINK_VXLAN_F_GBP;
276 if (tb[IFLA_VXLAN_REMCSUM_NOPARTIAL])
277 vxi->vxi_flags |= RTNL_LINK_VXLAN_F_REMCSUM_NOPARTIAL;
279 if (tb[IFLA_VXLAN_COLLECT_METADATA]) {
280 vxi->vxi_collect_metadata =
nla_get_u8(tb[IFLA_VXLAN_COLLECT_METADATA]);
281 vxi->ce_mask |= VXLAN_ATTR_COLLECT_METADATA;
284 if (tb[IFLA_VXLAN_LABEL]) {
285 vxi->vxi_label =
nla_get_u32(tb[IFLA_VXLAN_LABEL]);
286 vxi->ce_mask |= VXLAN_ATTR_LABEL;
289 if (tb[IFLA_VXLAN_GPE])
290 vxi->vxi_flags |= RTNL_LINK_VXLAN_F_GPE;
298static void vxlan_free(
struct rtnl_link *link)
300 struct vxlan_info *vxi = link->l_info;
308 struct vxlan_info *vxi = link->l_info;
310 nl_dump(p,
"vxlan-id %u", vxi->vxi_id);
315 struct vxlan_info *vxi = link->l_info;
316 char addr[INET6_ADDRSTRLEN];
318 nl_dump_line(p,
" vxlan-id %u\n", vxi->vxi_id);
320 if (vxi->ce_mask & VXLAN_ATTR_GROUP) {
322 nl_dump_line(p,
"%s\n",
323 _nl_inet_ntop(AF_INET, &vxi->vxi_group, addr));
324 }
else if (vxi->ce_mask & VXLAN_ATTR_GROUP6) {
326 nl_dump_line(p,
"%s\n",
327 _nl_inet_ntop(AF_INET6, &vxi->vxi_group6, addr));
330 if (vxi->ce_mask & VXLAN_ATTR_LINK) {
331 _nl_auto_rtnl_link
struct rtnl_link *parent = NULL;
337 parent = link_lookup(link->ce_cache, vxi->vxi_link);
342 nl_dump_line(p,
"%s\n", name);
344 nl_dump_line(p,
"%u\n", vxi->vxi_link);
347 if (vxi->ce_mask & VXLAN_ATTR_LOCAL) {
349 nl_dump_line(p,
"%s\n",
350 _nl_inet_ntop(AF_INET, &vxi->vxi_local, addr));
351 }
else if (vxi->ce_mask & VXLAN_ATTR_LOCAL6) {
353 nl_dump_line(p,
"%s\n",
354 _nl_inet_ntop(AF_INET6, &vxi->vxi_local6, addr));
357 if (vxi->ce_mask & VXLAN_ATTR_TTL) {
360 nl_dump_line(p,
"%u\n", vxi->vxi_ttl);
362 nl_dump_line(p,
"inherit\n");
365 if (vxi->ce_mask & VXLAN_ATTR_TOS) {
367 if (vxi->vxi_tos == 1)
368 nl_dump_line(p,
"inherit\n");
370 nl_dump_line(p,
"%#x\n", vxi->vxi_tos);
373 if (vxi->ce_mask & VXLAN_ATTR_LEARNING) {
375 if (vxi->vxi_learning)
376 nl_dump_line(p,
"enabled (%#x)\n", vxi->vxi_learning);
378 nl_dump_line(p,
"disabled\n");
381 if (vxi->ce_mask & VXLAN_ATTR_AGEING) {
384 nl_dump_line(p,
"%u seconds\n", vxi->vxi_ageing);
386 nl_dump_line(p,
"disabled\n");
389 if (vxi->ce_mask & VXLAN_ATTR_LIMIT) {
392 nl_dump_line(p,
"%u\n", vxi->vxi_limit);
394 nl_dump_line(p,
"unlimited\n");
397 if (vxi->ce_mask & VXLAN_ATTR_PORT_RANGE)
398 nl_dump_line(p,
" port range %u - %u\n",
399 ntohs(vxi->vxi_port_range.low),
400 ntohs(vxi->vxi_port_range.high));
402 if (vxi->ce_mask & VXLAN_ATTR_PROXY) {
405 nl_dump_line(p,
"enabled (%#x)\n", vxi->vxi_proxy);
407 nl_dump_line(p,
"disabled\n");
410 if (vxi->ce_mask & VXLAN_ATTR_RSC) {
413 nl_dump_line(p,
"enabled (%#x)\n", vxi->vxi_rsc);
415 nl_dump_line(p,
"disabled\n");
418 if (vxi->ce_mask & VXLAN_ATTR_L2MISS) {
421 nl_dump_line(p,
"enabled (%#x)\n", vxi->vxi_l2miss);
423 nl_dump_line(p,
"disabled\n");
426 if (vxi->ce_mask & VXLAN_ATTR_L3MISS) {
429 nl_dump_line(p,
"enabled (%#x)\n", vxi->vxi_l3miss);
431 nl_dump_line(p,
"disabled\n");
434 if (vxi->ce_mask & VXLAN_ATTR_PORT) {
436 nl_dump_line(p,
"%u\n", ntohs(vxi->vxi_port));
439 if (vxi->ce_mask & VXLAN_ATTR_UDP_CSUM) {
441 if (vxi->vxi_udp_csum)
442 nl_dump_line(p,
"enabled (%#x)\n", vxi->vxi_udp_csum);
444 nl_dump_line(p,
"disabled\n");
447 if (vxi->ce_mask & VXLAN_ATTR_UDP_ZERO_CSUM6_TX) {
448 nl_dump(p,
" udp-zero-csum6-tx ");
449 if (vxi->vxi_udp_zero_csum6_tx)
450 nl_dump_line(p,
"enabled (%#x)\n", vxi->vxi_udp_zero_csum6_tx);
452 nl_dump_line(p,
"disabled\n");
455 if (vxi->ce_mask & VXLAN_ATTR_UDP_ZERO_CSUM6_RX) {
456 nl_dump(p,
" udp-zero-csum6-rx ");
457 if (vxi->vxi_udp_zero_csum6_rx)
458 nl_dump_line(p,
"enabled (%#x)\n", vxi->vxi_udp_zero_csum6_rx);
460 nl_dump_line(p,
"disabled\n");
463 if (vxi->ce_mask & VXLAN_ATTR_REMCSUM_TX) {
465 if (vxi->vxi_remcsum_tx)
466 nl_dump_line(p,
"enabled (%#x)\n", vxi->vxi_remcsum_tx);
468 nl_dump_line(p,
"disabled\n");
471 if (vxi->ce_mask & VXLAN_ATTR_REMCSUM_RX) {
473 if (vxi->vxi_remcsum_rx)
474 nl_dump_line(p,
"enabled (%#x)\n", vxi->vxi_remcsum_rx);
476 nl_dump_line(p,
"disabled\n");
479 if (vxi->vxi_flags & RTNL_LINK_VXLAN_F_GBP)
482 if (vxi->vxi_flags & RTNL_LINK_VXLAN_F_REMCSUM_NOPARTIAL)
483 nl_dump(p,
" rncsum-nopartial\n");
485 if (vxi->ce_mask & VXLAN_ATTR_COLLECT_METADATA) {
487 if (vxi->vxi_collect_metadata)
488 nl_dump_line(p,
"enabled (%#x)\n", vxi->vxi_collect_metadata);
490 nl_dump_line(p,
"disabled\n");
493 if (vxi->ce_mask & VXLAN_ATTR_LABEL) {
495 nl_dump_line(p,
"%u\n", ntohl(vxi->vxi_label));
498 if (vxi->vxi_flags & RTNL_LINK_VXLAN_F_GPE)
504 struct vxlan_info *vdst, *vsrc = src->l_info;
515 memcpy(vdst, vsrc,
sizeof(
struct vxlan_info));
520static int vxlan_put_attrs(
struct nl_msg *msg,
struct rtnl_link *link)
522 struct vxlan_info *vxi = link->l_info;
528 if (vxi->ce_mask & VXLAN_ATTR_ID)
531 if (vxi->ce_mask & VXLAN_ATTR_GROUP)
532 NLA_PUT(msg, IFLA_VXLAN_GROUP,
sizeof(vxi->vxi_group), &vxi->vxi_group);
534 if (vxi->ce_mask & VXLAN_ATTR_GROUP6)
535 NLA_PUT(msg, IFLA_VXLAN_GROUP6,
sizeof(vxi->vxi_group6), &vxi->vxi_group6);
537 if (vxi->ce_mask & VXLAN_ATTR_LINK)
540 if (vxi->ce_mask & VXLAN_ATTR_LOCAL)
541 NLA_PUT(msg, IFLA_VXLAN_LOCAL,
sizeof(vxi->vxi_local), &vxi->vxi_local);
543 if (vxi->ce_mask & VXLAN_ATTR_LOCAL6)
544 NLA_PUT(msg, IFLA_VXLAN_LOCAL6,
sizeof(vxi->vxi_local6), &vxi->vxi_local6);
546 if (vxi->ce_mask & VXLAN_ATTR_TTL)
547 NLA_PUT_U8(msg, IFLA_VXLAN_TTL, vxi->vxi_ttl);
549 if (vxi->ce_mask & VXLAN_ATTR_TOS)
550 NLA_PUT_U8(msg, IFLA_VXLAN_TOS, vxi->vxi_tos);
552 if (vxi->ce_mask & VXLAN_ATTR_LEARNING)
553 NLA_PUT_U8(msg, IFLA_VXLAN_LEARNING, vxi->vxi_learning);
555 if (vxi->ce_mask & VXLAN_ATTR_AGEING)
556 NLA_PUT_U32(msg, IFLA_VXLAN_AGEING, vxi->vxi_ageing);
558 if (vxi->ce_mask & VXLAN_ATTR_LIMIT)
559 NLA_PUT_U32(msg, IFLA_VXLAN_LIMIT, vxi->vxi_limit);
561 if (vxi->ce_mask & VXLAN_ATTR_PORT_RANGE)
562 NLA_PUT(msg, IFLA_VXLAN_PORT_RANGE,
sizeof(vxi->vxi_port_range),
563 &vxi->vxi_port_range);
565 if (vxi->ce_mask & VXLAN_ATTR_PROXY)
566 NLA_PUT_U8(msg, IFLA_VXLAN_PROXY, vxi->vxi_proxy);
568 if (vxi->ce_mask & VXLAN_ATTR_RSC)
569 NLA_PUT_U8(msg, IFLA_VXLAN_RSC, vxi->vxi_rsc);
571 if (vxi->ce_mask & VXLAN_ATTR_L2MISS)
572 NLA_PUT_U8(msg, IFLA_VXLAN_L2MISS, vxi->vxi_l2miss);
574 if (vxi->ce_mask & VXLAN_ATTR_L3MISS)
575 NLA_PUT_U8(msg, IFLA_VXLAN_L3MISS, vxi->vxi_l3miss);
577 if (vxi->ce_mask & VXLAN_ATTR_PORT)
580 if (vxi->ce_mask & VXLAN_ATTR_UDP_CSUM)
581 NLA_PUT_U8(msg, IFLA_VXLAN_UDP_CSUM, vxi->vxi_udp_csum);
583 if (vxi->ce_mask & VXLAN_ATTR_UDP_ZERO_CSUM6_TX)
584 NLA_PUT_U8(msg, IFLA_VXLAN_UDP_ZERO_CSUM6_TX, vxi->vxi_udp_zero_csum6_tx);
586 if (vxi->ce_mask & VXLAN_ATTR_UDP_ZERO_CSUM6_RX)
587 NLA_PUT_U8(msg, IFLA_VXLAN_UDP_ZERO_CSUM6_RX, vxi->vxi_udp_zero_csum6_rx);
589 if (vxi->ce_mask & VXLAN_ATTR_REMCSUM_TX)
590 NLA_PUT_U8(msg, IFLA_VXLAN_REMCSUM_TX, vxi->vxi_remcsum_tx);
592 if (vxi->ce_mask & VXLAN_ATTR_REMCSUM_RX)
593 NLA_PUT_U8(msg, IFLA_VXLAN_REMCSUM_RX, vxi->vxi_remcsum_rx);
595 if (vxi->vxi_flags & RTNL_LINK_VXLAN_F_GBP)
598 if (vxi->vxi_flags & RTNL_LINK_VXLAN_F_REMCSUM_NOPARTIAL)
601 if (vxi->ce_mask & VXLAN_ATTR_COLLECT_METADATA)
602 NLA_PUT_U8(msg, IFLA_VXLAN_COLLECT_METADATA, vxi->vxi_collect_metadata);
604 if (vxi->ce_mask & VXLAN_ATTR_LABEL)
605 NLA_PUT_U32(msg, IFLA_VXLAN_LABEL, vxi->vxi_label);
607 if (vxi->vxi_flags & RTNL_LINK_VXLAN_F_GPE)
620 struct vxlan_info *a = link_a->l_info;
621 struct vxlan_info *b = link_b->l_info;
623 uint32_t attrs = flags & LOOSE_COMPARISON ? b->ce_mask :
626#define _DIFF(ATTR, EXPR) ATTR_DIFF(attrs, ATTR, a, b, EXPR)
627 diff |= _DIFF(VXLAN_ATTR_ID, a->vxi_id != b->vxi_id);
628 diff |= _DIFF(VXLAN_ATTR_GROUP, a->vxi_group != b->vxi_group);
629 diff |= _DIFF(VXLAN_ATTR_LINK, a->vxi_link != b->vxi_link);
630 diff |= _DIFF(VXLAN_ATTR_LOCAL, a->vxi_local != b->vxi_local);
631 diff |= _DIFF(VXLAN_ATTR_TOS, a->vxi_tos != b->vxi_tos);
632 diff |= _DIFF(VXLAN_ATTR_TTL, a->vxi_ttl != b->vxi_ttl);
633 diff |= _DIFF(VXLAN_ATTR_LEARNING, a->vxi_learning != b->vxi_learning);
634 diff |= _DIFF(VXLAN_ATTR_AGEING, a->vxi_ageing != b->vxi_ageing);
635 diff |= _DIFF(VXLAN_ATTR_LIMIT, a->vxi_limit != b->vxi_limit);
636 diff |= _DIFF(VXLAN_ATTR_PORT_RANGE,
637 a->vxi_port_range.low != b->vxi_port_range.low);
638 diff |= _DIFF(VXLAN_ATTR_PORT_RANGE,
639 a->vxi_port_range.high != b->vxi_port_range.high);
640 diff |= _DIFF(VXLAN_ATTR_PROXY, a->vxi_proxy != b->vxi_proxy);
641 diff |= _DIFF(VXLAN_ATTR_RSC, a->vxi_proxy != b->vxi_proxy);
642 diff |= _DIFF(VXLAN_ATTR_L2MISS, a->vxi_proxy != b->vxi_proxy);
643 diff |= _DIFF(VXLAN_ATTR_L3MISS, a->vxi_proxy != b->vxi_proxy);
644 diff |= _DIFF(VXLAN_ATTR_PORT, a->vxi_port != b->vxi_port);
645 diff |= _DIFF(VXLAN_ATTR_GROUP6, memcmp(&a->vxi_group6, &b->vxi_group6,
646 sizeof(a->vxi_group6)) != 0);
647 diff |= _DIFF(VXLAN_ATTR_LOCAL6, memcmp(&a->vxi_local6, &b->vxi_local6,
648 sizeof(a->vxi_local6)) != 0);
649 diff |= _DIFF(VXLAN_ATTR_UDP_CSUM, a->vxi_udp_csum != b->vxi_udp_csum);
650 diff |= _DIFF(VXLAN_ATTR_UDP_ZERO_CSUM6_TX,
651 a->vxi_udp_zero_csum6_tx != b->vxi_udp_zero_csum6_tx);
652 diff |= _DIFF(VXLAN_ATTR_UDP_ZERO_CSUM6_RX,
653 a->vxi_udp_zero_csum6_rx != b->vxi_udp_zero_csum6_rx);
654 diff |= _DIFF(VXLAN_ATTR_REMCSUM_TX,
655 a->vxi_remcsum_tx != b->vxi_remcsum_tx);
656 diff |= _DIFF(VXLAN_ATTR_REMCSUM_RX,
657 a->vxi_remcsum_rx != b->vxi_remcsum_rx);
658 diff |= _DIFF(VXLAN_ATTR_COLLECT_METADATA,
659 a->vxi_collect_metadata != b->vxi_collect_metadata);
660 diff |= _DIFF(VXLAN_ATTR_LABEL, a->vxi_label != b->vxi_label);
661 diff |= _DIFF(VXLAN_ATTR_FLAGS, a->vxi_flags != b->vxi_flags);
669 .io_alloc = vxlan_alloc,
670 .io_parse = vxlan_parse,
675 .io_clone = vxlan_clone,
676 .io_put_attrs = vxlan_put_attrs,
677 .io_free = vxlan_free,
678 .io_compare = vxlan_compare,
682#define IS_VXLAN_LINK_ASSERT(link) \
683 if ((link)->l_info_ops != &vxlan_info_ops) { \
684 APPBUG("Link is not a vxlan link. set type \"vxlan\" first."); \
685 return -NLE_OPNOTSUPP; \
722 return link->l_info_ops && !strcmp(link->l_info_ops->
io_name,
"vxlan");
734 struct vxlan_info *vxi = link->l_info;
736 IS_VXLAN_LINK_ASSERT(link);
738 if (
id > VXLAN_ID_MAX)
742 vxi->ce_mask |= VXLAN_ATTR_ID;
756 struct vxlan_info *vxi = link->l_info;
758 IS_VXLAN_LINK_ASSERT(link);
763 if (vxi->ce_mask & VXLAN_ATTR_ID)
780 struct vxlan_info *vxi = link->l_info;
782 IS_VXLAN_LINK_ASSERT(link);
787 sizeof(vxi->vxi_group));
788 vxi->ce_mask |= VXLAN_ATTR_GROUP;
789 vxi->ce_mask &= ~VXLAN_ATTR_GROUP6;
793 sizeof(vxi->vxi_group6));
794 vxi->ce_mask |= VXLAN_ATTR_GROUP6;
795 vxi->ce_mask &= ~VXLAN_ATTR_GROUP;
811 struct vxlan_info *vxi = link->l_info;
813 IS_VXLAN_LINK_ASSERT(link);
818 if (vxi->ce_mask & VXLAN_ATTR_GROUP)
819 *addr =
nl_addr_build(AF_INET, &vxi->vxi_group,
sizeof(vxi->vxi_group));
820 else if (vxi->ce_mask & VXLAN_ATTR_GROUP6)
821 *addr =
nl_addr_build(AF_INET6, &vxi->vxi_group6,
sizeof(vxi->vxi_group6));
837 struct vxlan_info *vxi = link->l_info;
839 IS_VXLAN_LINK_ASSERT(link);
841 vxi->vxi_link = index;
842 vxi->ce_mask |= VXLAN_ATTR_LINK;
856 struct vxlan_info *vxi = link->l_info;
858 IS_VXLAN_LINK_ASSERT(link);
863 if (!(vxi->ce_mask & VXLAN_ATTR_LINK))
866 *index = vxi->vxi_link;
880 struct vxlan_info *vxi = link->l_info;
882 IS_VXLAN_LINK_ASSERT(link);
887 sizeof(vxi->vxi_local));
888 vxi->ce_mask |= VXLAN_ATTR_LOCAL;
889 vxi->ce_mask &= ~VXLAN_ATTR_LOCAL6;
893 sizeof(vxi->vxi_local6));
894 vxi->ce_mask |= VXLAN_ATTR_LOCAL6;
895 vxi->ce_mask &= ~VXLAN_ATTR_LOCAL;
911 struct vxlan_info *vxi = link->l_info;
913 IS_VXLAN_LINK_ASSERT(link);
918 if (vxi->ce_mask & VXLAN_ATTR_LOCAL)
919 *addr =
nl_addr_build(AF_INET, &vxi->vxi_local,
sizeof(vxi->vxi_local));
920 else if (vxi->ce_mask & VXLAN_ATTR_LOCAL6)
921 *addr =
nl_addr_build(AF_INET6, &vxi->vxi_local6,
sizeof(vxi->vxi_local6));
937 struct vxlan_info *vxi = link->l_info;
939 IS_VXLAN_LINK_ASSERT(link);
942 vxi->ce_mask |= VXLAN_ATTR_TTL;
955 struct vxlan_info *vxi = link->l_info;
957 IS_VXLAN_LINK_ASSERT(link);
959 if (!(vxi->ce_mask & VXLAN_ATTR_TTL))
974 struct vxlan_info *vxi = link->l_info;
976 IS_VXLAN_LINK_ASSERT(link);
979 vxi->ce_mask |= VXLAN_ATTR_TOS;
992 struct vxlan_info *vxi = link->l_info;
994 IS_VXLAN_LINK_ASSERT(link);
996 if (!(vxi->ce_mask & VXLAN_ATTR_TOS))
1011 struct vxlan_info *vxi = link->l_info;
1013 IS_VXLAN_LINK_ASSERT(link);
1015 vxi->vxi_learning = learning;
1016 vxi->ce_mask |= VXLAN_ATTR_LEARNING;
1029 struct vxlan_info *vxi = link->l_info;
1031 IS_VXLAN_LINK_ASSERT(link);
1033 if (!(vxi->ce_mask & VXLAN_ATTR_LEARNING))
1036 return vxi->vxi_learning;
1070 struct vxlan_info *vxi = link->l_info;
1072 IS_VXLAN_LINK_ASSERT(link);
1074 vxi->vxi_ageing = expiry;
1075 vxi->ce_mask |= VXLAN_ATTR_AGEING;
1089 struct vxlan_info *vxi = link->l_info;
1091 IS_VXLAN_LINK_ASSERT(link);
1096 if (vxi->ce_mask & VXLAN_ATTR_AGEING)
1097 *expiry = vxi->vxi_ageing;
1113 struct vxlan_info *vxi = link->l_info;
1115 IS_VXLAN_LINK_ASSERT(link);
1117 vxi->vxi_limit = limit;
1118 vxi->ce_mask |= VXLAN_ATTR_LIMIT;
1132 struct vxlan_info *vxi = link->l_info;
1134 IS_VXLAN_LINK_ASSERT(link);
1139 if (vxi->ce_mask & VXLAN_ATTR_LIMIT)
1140 *limit = vxi->vxi_limit;
1155 struct ifla_vxlan_port_range *range)
1157 struct vxlan_info *vxi = link->l_info;
1159 IS_VXLAN_LINK_ASSERT(link);
1164 memcpy(&vxi->vxi_port_range, range,
sizeof(vxi->vxi_port_range));
1165 vxi->ce_mask |= VXLAN_ATTR_PORT_RANGE;
1178 struct ifla_vxlan_port_range *range)
1180 struct vxlan_info *vxi = link->l_info;
1182 IS_VXLAN_LINK_ASSERT(link);
1187 if (vxi->ce_mask & VXLAN_ATTR_PORT_RANGE)
1188 memcpy(range, &vxi->vxi_port_range,
sizeof(*range));
1204 struct vxlan_info *vxi = link->l_info;
1206 IS_VXLAN_LINK_ASSERT(link);
1208 vxi->vxi_proxy = proxy;
1209 vxi->ce_mask |= VXLAN_ATTR_PROXY;
1222 struct vxlan_info *vxi = link->l_info;
1224 IS_VXLAN_LINK_ASSERT(link);
1226 if (!(vxi->ce_mask & VXLAN_ATTR_PROXY))
1229 return vxi->vxi_proxy;
1263 struct vxlan_info *vxi = link->l_info;
1265 IS_VXLAN_LINK_ASSERT(link);
1268 vxi->ce_mask |= VXLAN_ATTR_RSC;
1281 struct vxlan_info *vxi = link->l_info;
1283 IS_VXLAN_LINK_ASSERT(link);
1285 if (!(vxi->ce_mask & VXLAN_ATTR_RSC))
1288 return vxi->vxi_rsc;
1322 struct vxlan_info *vxi = link->l_info;
1324 IS_VXLAN_LINK_ASSERT(link);
1326 vxi->vxi_l2miss = miss;
1327 vxi->ce_mask |= VXLAN_ATTR_L2MISS;
1340 struct vxlan_info *vxi = link->l_info;
1342 IS_VXLAN_LINK_ASSERT(link);
1344 if (!(vxi->ce_mask & VXLAN_ATTR_L2MISS))
1347 return vxi->vxi_l2miss;
1381 struct vxlan_info *vxi = link->l_info;
1383 IS_VXLAN_LINK_ASSERT(link);
1385 vxi->vxi_l3miss = miss;
1386 vxi->ce_mask |= VXLAN_ATTR_L3MISS;
1399 struct vxlan_info *vxi = link->l_info;
1401 IS_VXLAN_LINK_ASSERT(link);
1403 if (!(vxi->ce_mask & VXLAN_ATTR_L3MISS))
1406 return vxi->vxi_l3miss;
1440 struct vxlan_info *vxi = link->l_info;
1442 IS_VXLAN_LINK_ASSERT(link);
1444 vxi->vxi_port = htons(port);
1445 vxi->ce_mask |= VXLAN_ATTR_PORT;
1459 struct vxlan_info *vxi = link->l_info;
1461 IS_VXLAN_LINK_ASSERT(link);
1466 if (!(vxi->ce_mask & VXLAN_ATTR_PORT))
1469 *port = ntohs(vxi->vxi_port);
1483 struct vxlan_info *vxi = link->l_info;
1485 IS_VXLAN_LINK_ASSERT(link);
1487 vxi->vxi_udp_csum = csum;
1488 vxi->ce_mask |= VXLAN_ATTR_UDP_CSUM;
1501 struct vxlan_info *vxi = link->l_info;
1503 IS_VXLAN_LINK_ASSERT(link);
1505 if (!(vxi->ce_mask & VXLAN_ATTR_UDP_CSUM))
1508 return vxi->vxi_udp_csum;
1520 struct vxlan_info *vxi = link->l_info;
1522 IS_VXLAN_LINK_ASSERT(link);
1524 vxi->vxi_udp_zero_csum6_tx = csum;
1525 vxi->ce_mask |= VXLAN_ATTR_UDP_ZERO_CSUM6_TX;
1538 struct vxlan_info *vxi = link->l_info;
1540 IS_VXLAN_LINK_ASSERT(link);
1542 if (!(vxi->ce_mask & VXLAN_ATTR_UDP_ZERO_CSUM6_TX))
1545 return vxi->vxi_udp_zero_csum6_tx;
1557 struct vxlan_info *vxi = link->l_info;
1559 IS_VXLAN_LINK_ASSERT(link);
1561 vxi->vxi_udp_zero_csum6_rx = csum;
1562 vxi->ce_mask |= VXLAN_ATTR_UDP_ZERO_CSUM6_RX;
1575 struct vxlan_info *vxi = link->l_info;
1577 IS_VXLAN_LINK_ASSERT(link);
1579 if (!(vxi->ce_mask & VXLAN_ATTR_UDP_ZERO_CSUM6_RX))
1582 return vxi->vxi_udp_zero_csum6_rx;
1594 struct vxlan_info *vxi = link->l_info;
1596 IS_VXLAN_LINK_ASSERT(link);
1598 vxi->vxi_remcsum_tx = csum;
1599 vxi->ce_mask |= VXLAN_ATTR_REMCSUM_TX;
1612 struct vxlan_info *vxi = link->l_info;
1614 IS_VXLAN_LINK_ASSERT(link);
1616 if (!(vxi->ce_mask & VXLAN_ATTR_REMCSUM_TX))
1619 return vxi->vxi_remcsum_tx;
1631 struct vxlan_info *vxi = link->l_info;
1633 IS_VXLAN_LINK_ASSERT(link);
1635 vxi->vxi_remcsum_rx = csum;
1636 vxi->ce_mask |= VXLAN_ATTR_REMCSUM_RX;
1649 struct vxlan_info *vxi = link->l_info;
1651 IS_VXLAN_LINK_ASSERT(link);
1653 if (!(vxi->ce_mask & VXLAN_ATTR_REMCSUM_RX))
1656 return vxi->vxi_remcsum_rx;
1668 struct vxlan_info *vxi = link->l_info;
1670 IS_VXLAN_LINK_ASSERT(link);
1672 vxi->vxi_collect_metadata = collect;
1673 vxi->ce_mask |= VXLAN_ATTR_COLLECT_METADATA;
1686 struct vxlan_info *vxi = link->l_info;
1688 IS_VXLAN_LINK_ASSERT(link);
1690 if (!(vxi->ce_mask & VXLAN_ATTR_COLLECT_METADATA))
1693 return vxi->vxi_collect_metadata;
1705 struct vxlan_info *vxi = link->l_info;
1707 IS_VXLAN_LINK_ASSERT(link);
1709 vxi->vxi_label = htonl(label);
1710 vxi->ce_mask |= VXLAN_ATTR_LABEL;
1724 struct vxlan_info *vxi = link->l_info;
1726 IS_VXLAN_LINK_ASSERT(link);
1731 if (!(vxi->ce_mask & VXLAN_ATTR_LABEL))
1734 *label = ntohl(vxi->vxi_label);
1749 struct vxlan_info *vxi = link->l_info;
1751 IS_VXLAN_LINK_ASSERT(link);
1753 if (flags & ~(RTNL_LINK_VXLAN_F_GBP | RTNL_LINK_VXLAN_F_GPE | RTNL_LINK_VXLAN_F_REMCSUM_NOPARTIAL))
1757 vxi->vxi_flags |= flags;
1759 vxi->vxi_flags &= ~flags;
1773 struct vxlan_info *vxi = link->l_info;
1775 IS_VXLAN_LINK_ASSERT(link);
1777 *out_flags = vxi->vxi_flags;
1783static void _nl_init vxlan_init(
void)
1788static void _nl_exit vxlan_exit(
void)
struct nl_addr * nl_addr_build(int family, const void *buf, size_t size)
Allocate abstract address based on a binary address.
void * nl_addr_get_binary_addr(const struct nl_addr *addr)
Get binary address of abstract address object.
int nl_addr_get_family(const struct nl_addr *addr)
Return address family.
unsigned int nl_addr_get_len(const struct nl_addr *addr)
Get length of binary address of abstract address object.
uint32_t nla_get_u32(const struct nlattr *nla)
Return payload of 32 bit integer attribute.
uint16_t nla_get_u16(const struct nlattr *nla)
Return payload of 16 bit integer attribute.
#define NLA_PUT_FLAG(msg, attrtype)
Add flag attribute to netlink message.
#define NLA_PUT_U16(msg, attrtype, value)
Add 16 bit integer attribute to netlink message.
#define NLA_PUT_U8(msg, attrtype, value)
Add 8 bit integer attribute to netlink message.
#define NLA_PUT(msg, attrtype, attrlen, data)
Add unspecific attribute to netlink message.
#define NLA_PUT_U32(msg, attrtype, value)
Add 32 bit integer attribute to netlink message.
uint8_t nla_get_u8(const struct nlattr *nla)
Return value of 8 bit integer attribute.
int nla_memcpy(void *dest, const struct nlattr *src, int count)
Copy attribute payload to another memory area.
struct nlattr * nla_nest_start(struct nl_msg *msg, int attrtype)
Start a new level of nested attributes.
int nla_parse_nested(struct nlattr *tb[], int maxtype, struct nlattr *nla, const struct nla_policy *policy)
Create attribute index based on nested attribute.
int nla_nest_end(struct nl_msg *msg, struct nlattr *start)
Finalize nesting of attributes.
int rtnl_link_register_info(struct rtnl_link_info_ops *ops)
Register operations for a link info type.
int rtnl_link_unregister_info(struct rtnl_link_info_ops *ops)
Unregister operations for a link info type.
struct rtnl_link * rtnl_link_alloc(void)
Allocate link object.
char * rtnl_link_get_name(struct rtnl_link *link)
Return name of link object.
void rtnl_link_put(struct rtnl_link *link)
Release a link object reference.
int rtnl_link_set_type(struct rtnl_link *link, const char *type)
Set type of link object.
void nl_dump(struct nl_dump_params *params, const char *fmt,...)
Dump a formatted character string.
@ NL_DUMP_LINE
Dump object briefly on one line.
@ NL_DUMP_DETAILS
Dump all attributes but no statistics.
int rtnl_link_vxlan_get_tos(struct rtnl_link *link)
Get IP ToS value to use for VXLAN.
int rtnl_link_vxlan_get_rsc(struct rtnl_link *link)
Get Route Short Circuit status to use for VXLAN.
int rtnl_link_vxlan_disable_learning(struct rtnl_link *link)
Disable VXLAN address learning.
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.
int rtnl_link_vxlan_set_udp_zero_csum6_rx(struct rtnl_link *link, uint8_t csum)
Set skip UDP checksum received over IPv6 status to use for VXLAN.
int rtnl_link_vxlan_get_ttl(struct rtnl_link *link)
Get IP TTL value to use for VXLAN.
int rtnl_link_vxlan_get_learning(struct rtnl_link *link)
Get VXLAN learning status.
int rtnl_link_vxlan_set_learning(struct rtnl_link *link, uint8_t learning)
Set VXLAN learning status.
int rtnl_link_vxlan_get_label(struct rtnl_link *link, uint32_t *label)
Get flow label to use for VXLAN.
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_set_port(struct rtnl_link *link, uint32_t port)
Set UDP destination port to use for VXLAN.
int rtnl_link_vxlan_get_proxy(struct rtnl_link *link)
Get ARP proxy status to use for VXLAN.
int rtnl_link_vxlan_enable_rsc(struct rtnl_link *link)
Enable Route Short Circuit.
int rtnl_link_vxlan_set_group(struct rtnl_link *link, struct nl_addr *addr)
Set VXLAN multicast IP address.
int rtnl_link_vxlan_enable_proxy(struct rtnl_link *link)
Enable ARP proxy.
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_set_remcsum_rx(struct rtnl_link *link, uint8_t csum)
Set remote offload receive checksum status to use for VXLAN.
int rtnl_link_vxlan_set_flags(struct rtnl_link *link, uint32_t flags, int enable)
Set VXLAN flags RTNL_LINK_VXLAN_F_*.
int rtnl_link_vxlan_set_udp_csum(struct rtnl_link *link, uint8_t csum)
Set UDP checksum status to use for VXLAN.
int rtnl_link_vxlan_get_udp_zero_csum6_rx(struct rtnl_link *link)
Get skip UDP checksum received over IPv6 status 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 rtnl_link_vxlan_enable_l2miss(struct rtnl_link *link)
Enable netlink LLADDR miss notifications.
int rtnl_link_vxlan_get_flags(struct rtnl_link *link, uint32_t *out_flags)
Get VXLAN flags RTNL_LINK_VXLAN_F_*.
int rtnl_link_vxlan_get_remcsum_rx(struct rtnl_link *link)
Get remote offload receive checksum status 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_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_collect_metadata(struct rtnl_link *link, uint8_t collect)
Set collect metadata status to use for VXLAN.
int rtnl_link_vxlan_get_l2miss(struct rtnl_link *link)
Get netlink LLADDR miss notification status to use for VXLAN.
int rtnl_link_vxlan_set_id(struct rtnl_link *link, uint32_t id)
Set VXLAN Network Identifier.
int rtnl_link_vxlan_get_collect_metadata(struct rtnl_link *link)
Get collect metadata status to use for VXLAN.
int rtnl_link_vxlan_disable_l2miss(struct rtnl_link *link)
Disable netlink LLADDR miss notifications.
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_label(struct rtnl_link *link, uint32_t label)
Set flow label to use for VXLAN.
int rtnl_link_is_vxlan(struct rtnl_link *link)
Check if link is a VXLAN link.
int rtnl_link_vxlan_set_remcsum_tx(struct rtnl_link *link, uint8_t csum)
Set remote offload transmit checksum status to use for VXLAN.
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_link(struct rtnl_link *link, uint32_t *index)
Get physical device to use for VXLAN.
int rtnl_link_vxlan_set_proxy(struct rtnl_link *link, uint8_t proxy)
Set ARP proxy status to use for VXLAN.
int rtnl_link_vxlan_enable_learning(struct rtnl_link *link)
Enable VXLAN address learning.
int rtnl_link_vxlan_set_ttl(struct rtnl_link *link, uint8_t ttl)
Set IP TTL value to use for VXLAN.
struct rtnl_link * rtnl_link_vxlan_alloc(void)
Allocate link object of type VXLAN.
int rtnl_link_vxlan_get_udp_zero_csum6_tx(struct rtnl_link *link)
Get skip UDP checksum transmitted over IPv6 status to use for VXLAN.
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_get_remcsum_tx(struct rtnl_link *link)
Get remote offload transmit checksum status to use for VXLAN.
int rtnl_link_vxlan_get_port(struct rtnl_link *link, uint32_t *port)
Get UDP destination port to use for VXLAN.
int rtnl_link_vxlan_disable_proxy(struct rtnl_link *link)
Disable ARP proxy.
int rtnl_link_vxlan_set_l2miss(struct rtnl_link *link, uint8_t miss)
Set netlink LLADDR miss notification status 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.
int rtnl_link_vxlan_get_id(struct rtnl_link *link, uint32_t *id)
Get VXLAN Network Identifier.
int rtnl_link_vxlan_disable_rsc(struct rtnl_link *link)
Disable Route Short Circuit.
int rtnl_link_vxlan_set_rsc(struct rtnl_link *link, uint8_t rsc)
Set Route Short Circuit status to use for VXLAN.
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_set_udp_zero_csum6_tx(struct rtnl_link *link, uint8_t csum)
Set skip UDP checksum transmitted over IPv6 status to use for VXLAN.
int rtnl_link_vxlan_get_udp_csum(struct rtnl_link *link)
Get UDP checksum status to use for VXLAN.
int rtnl_link_vxlan_enable_l3miss(struct rtnl_link *link)
Enable netlink IP ADDR miss notifications.
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_ageing(struct rtnl_link *link, uint32_t *expiry)
Get expiration timer value to use for VXLAN.
Attribute validation policy.
Available operations to modules implementing a link info type.
char * io_name
Name of link info type, must match name on kernel side.