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_ATTR_ID (1<<0) 38 #define VXLAN_ATTR_GROUP (1<<1) 39 #define VXLAN_ATTR_LINK (1<<2) 40 #define VXLAN_ATTR_LOCAL (1<<3) 41 #define VXLAN_ATTR_TTL (1<<4) 42 #define VXLAN_ATTR_TOS (1<<5) 43 #define VXLAN_ATTR_LEARNING (1<<6) 44 #define VXLAN_ATTR_AGEING (1<<7) 45 #define VXLAN_ATTR_LIMIT (1<<8) 46 #define VXLAN_ATTR_PORT_RANGE (1<<9) 47 #define VXLAN_ATTR_PROXY (1<<10) 48 #define VXLAN_ATTR_RSC (1<<11) 49 #define VXLAN_ATTR_L2MISS (1<<12) 50 #define VXLAN_ATTR_L3MISS (1<<13) 51 #define VXLAN_ATTR_GROUP6 (1<<14) 52 #define VXLAN_ATTR_LOCAL6 (1<<15) 53 #define VXLAN_ATTR_PORT (1<<16) 54 #define VXLAN_ATTR_UDP_CSUM (1<<17) 55 #define VXLAN_ATTR_UDP_ZERO_CSUM6_TX (1<<18) 56 #define VXLAN_ATTR_UDP_ZERO_CSUM6_RX (1<<19) 57 #define VXLAN_ATTR_REMCSUM_TX (1<<20) 58 #define VXLAN_ATTR_REMCSUM_RX (1<<21) 59 #define VXLAN_ATTR_COLLECT_METADATA (1<<22) 60 #define VXLAN_ATTR_LABEL (1<<23) 61 #define VXLAN_ATTR_FLAGS (1<<24) 67 struct in6_addr vxi_group6;
70 struct in6_addr vxi_local6;
77 struct ifla_vxlan_port_range vxi_port_range;
84 uint8_t vxi_udp_zero_csum6_tx;
85 uint8_t vxi_udp_zero_csum6_rx;
86 uint8_t vxi_remcsum_tx;
87 uint8_t vxi_remcsum_rx;
88 uint8_t vxi_collect_metadata;
95 static struct nla_policy vxlan_policy[IFLA_VXLAN_MAX+1] = {
97 [IFLA_VXLAN_GROUP] = { .minlen =
sizeof(uint32_t) },
98 [IFLA_VXLAN_GROUP6] = { .minlen =
sizeof(
struct in6_addr) },
99 [IFLA_VXLAN_LINK] = { .type =
NLA_U32 },
100 [IFLA_VXLAN_LOCAL] = { .minlen =
sizeof(uint32_t) },
101 [IFLA_VXLAN_LOCAL6] = { .minlen =
sizeof(
struct in6_addr) },
102 [IFLA_VXLAN_TTL] = { .type =
NLA_U8 },
103 [IFLA_VXLAN_TOS] = { .type =
NLA_U8 },
104 [IFLA_VXLAN_LABEL] = { .type =
NLA_U32 },
105 [IFLA_VXLAN_LEARNING] = { .type =
NLA_U8 },
106 [IFLA_VXLAN_AGEING] = { .type =
NLA_U32 },
107 [IFLA_VXLAN_LIMIT] = { .type =
NLA_U32 },
108 [IFLA_VXLAN_PORT_RANGE] = { .minlen =
sizeof(
struct ifla_vxlan_port_range) },
109 [IFLA_VXLAN_PROXY] = { .type =
NLA_U8 },
110 [IFLA_VXLAN_RSC] = { .type =
NLA_U8 },
111 [IFLA_VXLAN_L2MISS] = { .type =
NLA_U8 },
112 [IFLA_VXLAN_L3MISS] = { .type =
NLA_U8 },
113 [IFLA_VXLAN_COLLECT_METADATA] = { .type =
NLA_U8 },
114 [IFLA_VXLAN_PORT] = { .type =
NLA_U16 },
115 [IFLA_VXLAN_UDP_CSUM] = { .type =
NLA_U8 },
116 [IFLA_VXLAN_UDP_ZERO_CSUM6_TX] = { .type =
NLA_U8 },
117 [IFLA_VXLAN_UDP_ZERO_CSUM6_RX] = { .type =
NLA_U8 },
118 [IFLA_VXLAN_REMCSUM_TX] = { .type =
NLA_U8 },
119 [IFLA_VXLAN_REMCSUM_RX] = { .type =
NLA_U8 },
120 [IFLA_VXLAN_GBP] = { .type =
NLA_FLAG, },
121 [IFLA_VXLAN_GPE] = { .type =
NLA_FLAG, },
122 [IFLA_VXLAN_REMCSUM_NOPARTIAL] = { .type =
NLA_FLAG },
125 static int vxlan_alloc(
struct rtnl_link *link)
127 struct vxlan_info *vxi;
130 memset(link->l_info, 0,
sizeof(*vxi));
132 if ((vxi = calloc(1,
sizeof(*vxi))) == NULL)
141 static int vxlan_parse(
struct rtnl_link *link,
struct nlattr *data,
142 struct nlattr *xstats)
144 struct nlattr *tb[IFLA_VXLAN_MAX+1];
145 struct vxlan_info *vxi;
148 NL_DBG(3,
"Parsing VXLAN link info\n");
153 if ((err = vxlan_alloc(link)) < 0)
158 if (tb[IFLA_VXLAN_ID]) {
160 vxi->ce_mask |= VXLAN_ATTR_ID;
163 if (tb[IFLA_VXLAN_GROUP6]) {
164 nla_memcpy(&vxi->vxi_group6, tb[IFLA_VXLAN_GROUP6],
165 sizeof(vxi->vxi_group6));
166 vxi->ce_mask |= VXLAN_ATTR_GROUP6;
169 if (tb[IFLA_VXLAN_GROUP]) {
170 nla_memcpy(&vxi->vxi_group, tb[IFLA_VXLAN_GROUP],
171 sizeof(vxi->vxi_group));
172 vxi->ce_mask |= VXLAN_ATTR_GROUP;
173 vxi->ce_mask &= ~VXLAN_ATTR_GROUP6;
176 if (tb[IFLA_VXLAN_LINK]) {
178 vxi->ce_mask |= VXLAN_ATTR_LINK;
181 if (tb[IFLA_VXLAN_LOCAL6]) {
182 nla_memcpy(&vxi->vxi_local6, tb[IFLA_VXLAN_LOCAL6],
183 sizeof(vxi->vxi_local6));
184 vxi->ce_mask |= VXLAN_ATTR_LOCAL6;
187 if (tb[IFLA_VXLAN_LOCAL]) {
188 nla_memcpy(&vxi->vxi_local, tb[IFLA_VXLAN_LOCAL],
189 sizeof(vxi->vxi_local));
190 vxi->ce_mask |= VXLAN_ATTR_LOCAL;
191 vxi->ce_mask &= ~VXLAN_ATTR_LOCAL6;
194 if (tb[IFLA_VXLAN_TTL]) {
195 vxi->vxi_ttl =
nla_get_u8(tb[IFLA_VXLAN_TTL]);
196 vxi->ce_mask |= VXLAN_ATTR_TTL;
199 if (tb[IFLA_VXLAN_TOS]) {
200 vxi->vxi_tos =
nla_get_u8(tb[IFLA_VXLAN_TOS]);
201 vxi->ce_mask |= VXLAN_ATTR_TOS;
204 if (tb[IFLA_VXLAN_LEARNING]) {
205 vxi->vxi_learning =
nla_get_u8(tb[IFLA_VXLAN_LEARNING]);
206 vxi->ce_mask |= VXLAN_ATTR_LEARNING;
209 if (tb[IFLA_VXLAN_AGEING]) {
210 vxi->vxi_ageing =
nla_get_u32(tb[IFLA_VXLAN_AGEING]);
211 vxi->ce_mask |= VXLAN_ATTR_AGEING;
214 if (tb[IFLA_VXLAN_LIMIT]) {
215 vxi->vxi_limit =
nla_get_u32(tb[IFLA_VXLAN_LIMIT]);
216 vxi->ce_mask |= VXLAN_ATTR_LIMIT;
219 if (tb[IFLA_VXLAN_PORT_RANGE]) {
220 nla_memcpy(&vxi->vxi_port_range, tb[IFLA_VXLAN_PORT_RANGE],
221 sizeof(vxi->vxi_port_range));
222 vxi->ce_mask |= VXLAN_ATTR_PORT_RANGE;
225 if (tb[IFLA_VXLAN_PROXY]) {
226 vxi->vxi_proxy =
nla_get_u8(tb[IFLA_VXLAN_PROXY]);
227 vxi->ce_mask |= VXLAN_ATTR_PROXY;
230 if (tb[IFLA_VXLAN_RSC]) {
231 vxi->vxi_rsc =
nla_get_u8(tb[IFLA_VXLAN_RSC]);
232 vxi->ce_mask |= VXLAN_ATTR_RSC;
235 if (tb[IFLA_VXLAN_L2MISS]) {
236 vxi->vxi_l2miss =
nla_get_u8(tb[IFLA_VXLAN_L2MISS]);
237 vxi->ce_mask |= VXLAN_ATTR_L2MISS;
240 if (tb[IFLA_VXLAN_L3MISS]) {
241 vxi->vxi_l3miss =
nla_get_u8(tb[IFLA_VXLAN_L3MISS]);
242 vxi->ce_mask |= VXLAN_ATTR_L3MISS;
245 if (tb[IFLA_VXLAN_PORT]) {
247 vxi->ce_mask |= VXLAN_ATTR_PORT;
250 if (tb[IFLA_VXLAN_UDP_CSUM]) {
251 vxi->vxi_udp_csum =
nla_get_u8(tb[IFLA_VXLAN_UDP_CSUM]);
252 vxi->ce_mask |= VXLAN_ATTR_UDP_CSUM;
255 if (tb[IFLA_VXLAN_UDP_ZERO_CSUM6_TX]) {
256 vxi->vxi_udp_zero_csum6_tx =
nla_get_u8(tb[IFLA_VXLAN_UDP_ZERO_CSUM6_TX]);
257 vxi->ce_mask |= VXLAN_ATTR_UDP_ZERO_CSUM6_TX;
260 if (tb[IFLA_VXLAN_UDP_ZERO_CSUM6_RX]) {
261 vxi->vxi_udp_zero_csum6_rx =
nla_get_u8(tb[IFLA_VXLAN_UDP_ZERO_CSUM6_RX]);
262 vxi->ce_mask |= VXLAN_ATTR_UDP_ZERO_CSUM6_RX;
265 if (tb[IFLA_VXLAN_REMCSUM_TX]) {
266 vxi->vxi_remcsum_tx =
nla_get_u8(tb[IFLA_VXLAN_REMCSUM_TX]);
267 vxi->ce_mask |= VXLAN_ATTR_REMCSUM_TX;
270 if (tb[IFLA_VXLAN_REMCSUM_RX]) {
271 vxi->vxi_remcsum_rx =
nla_get_u8(tb[IFLA_VXLAN_REMCSUM_RX]);
272 vxi->ce_mask |= VXLAN_ATTR_REMCSUM_RX;
275 if (tb[IFLA_VXLAN_GBP])
276 vxi->vxi_flags |= RTNL_LINK_VXLAN_F_GBP;
278 if (tb[IFLA_VXLAN_REMCSUM_NOPARTIAL])
279 vxi->vxi_flags |= RTNL_LINK_VXLAN_F_REMCSUM_NOPARTIAL;
281 if (tb[IFLA_VXLAN_COLLECT_METADATA]) {
282 vxi->vxi_collect_metadata =
nla_get_u8(tb[IFLA_VXLAN_COLLECT_METADATA]);
283 vxi->ce_mask |= VXLAN_ATTR_COLLECT_METADATA;
286 if (tb[IFLA_VXLAN_LABEL]) {
287 vxi->vxi_label =
nla_get_u32(tb[IFLA_VXLAN_LABEL]);
288 vxi->ce_mask |= VXLAN_ATTR_LABEL;
291 if (tb[IFLA_VXLAN_GPE])
292 vxi->vxi_flags |= RTNL_LINK_VXLAN_F_GPE;
300 static void vxlan_free(
struct rtnl_link *link)
302 struct vxlan_info *vxi = link->l_info;
310 struct vxlan_info *vxi = link->l_info;
312 nl_dump(p,
"vxlan-id %u", vxi->vxi_id);
317 struct vxlan_info *vxi = link->l_info;
318 char *name, addr[INET6_ADDRSTRLEN];
321 nl_dump_line(p,
" vxlan-id %u\n", vxi->vxi_id);
323 if (vxi->ce_mask & VXLAN_ATTR_GROUP) {
325 if (inet_ntop(AF_INET, &vxi->vxi_group, addr,
sizeof(addr)))
326 nl_dump_line(p,
"%s\n", addr);
328 nl_dump_line(p,
"%#x\n", ntohs(vxi->vxi_group));
329 }
else if (vxi->ce_mask & VXLAN_ATTR_GROUP6) {
331 if (inet_ntop(AF_INET6, &vxi->vxi_group6, addr,
sizeof(addr)))
332 nl_dump_line(p,
"%s\n", addr);
334 nl_dump_line(p,
"%#x\n", vxi->vxi_group6);
337 if (vxi->ce_mask & VXLAN_ATTR_LINK) {
341 parent = link_lookup(link->ce_cache, vxi->vxi_link);
346 nl_dump_line(p,
"%s\n", name);
348 nl_dump_line(p,
"%u\n", vxi->vxi_link);
351 if (vxi->ce_mask & VXLAN_ATTR_LOCAL) {
353 if (inet_ntop(AF_INET, &vxi->vxi_local, addr,
sizeof(addr)))
354 nl_dump_line(p,
"%s\n", addr);
356 nl_dump_line(p,
"%#x\n", ntohs(vxi->vxi_local));
357 }
else if (vxi->ce_mask & VXLAN_ATTR_LOCAL6) {
359 if (inet_ntop(AF_INET6, &vxi->vxi_local6, addr,
sizeof(addr)))
360 nl_dump_line(p,
"%s\n", addr);
362 nl_dump_line(p,
"%#x\n", vxi->vxi_local6);
366 if (vxi->ce_mask & VXLAN_ATTR_TTL) {
369 nl_dump_line(p,
"%u\n", vxi->vxi_ttl);
371 nl_dump_line(p,
"inherit\n");
374 if (vxi->ce_mask & VXLAN_ATTR_TOS) {
376 if (vxi->vxi_tos == 1)
377 nl_dump_line(p,
"inherit\n", vxi->vxi_tos);
379 nl_dump_line(p,
"%#x\n", vxi->vxi_tos);
382 if (vxi->ce_mask & VXLAN_ATTR_LEARNING) {
384 if (vxi->vxi_learning)
385 nl_dump_line(p,
"enabled (%#x)\n", vxi->vxi_learning);
387 nl_dump_line(p,
"disabled\n");
390 if (vxi->ce_mask & VXLAN_ATTR_AGEING) {
393 nl_dump_line(p,
"%u seconds\n", vxi->vxi_ageing);
395 nl_dump_line(p,
"disabled\n");
398 if (vxi->ce_mask & VXLAN_ATTR_LIMIT) {
401 nl_dump_line(p,
"%u\n", vxi->vxi_limit);
403 nl_dump_line(p,
"unlimited\n");
406 if (vxi->ce_mask & VXLAN_ATTR_PORT_RANGE)
407 nl_dump_line(p,
" port range %u - %u\n",
408 ntohs(vxi->vxi_port_range.low),
409 ntohs(vxi->vxi_port_range.high));
411 if (vxi->ce_mask & VXLAN_ATTR_PROXY) {
414 nl_dump_line(p,
"enabled (%#x)\n", vxi->vxi_proxy);
416 nl_dump_line(p,
"disabled\n");
419 if (vxi->ce_mask & VXLAN_ATTR_RSC) {
422 nl_dump_line(p,
"enabled (%#x)\n", vxi->vxi_rsc);
424 nl_dump_line(p,
"disabled\n");
427 if (vxi->ce_mask & VXLAN_ATTR_L2MISS) {
430 nl_dump_line(p,
"enabled (%#x)\n", vxi->vxi_l2miss);
432 nl_dump_line(p,
"disabled\n");
435 if (vxi->ce_mask & VXLAN_ATTR_L3MISS) {
438 nl_dump_line(p,
"enabled (%#x)\n", vxi->vxi_l3miss);
440 nl_dump_line(p,
"disabled\n");
443 if (vxi->ce_mask & VXLAN_ATTR_PORT) {
445 nl_dump_line(p,
"%u\n", ntohs(vxi->vxi_port));
448 if (vxi->ce_mask & VXLAN_ATTR_UDP_CSUM) {
450 if (vxi->vxi_udp_csum)
451 nl_dump_line(p,
"enabled (%#x)\n", vxi->vxi_udp_csum);
453 nl_dump_line(p,
"disabled\n");
456 if (vxi->ce_mask & VXLAN_ATTR_UDP_ZERO_CSUM6_TX) {
457 nl_dump(p,
" udp-zero-csum6-tx ");
458 if (vxi->vxi_udp_zero_csum6_tx)
459 nl_dump_line(p,
"enabled (%#x)\n", vxi->vxi_udp_zero_csum6_tx);
461 nl_dump_line(p,
"disabled\n");
464 if (vxi->ce_mask & VXLAN_ATTR_UDP_ZERO_CSUM6_RX) {
465 nl_dump(p,
" udp-zero-csum6-rx ");
466 if (vxi->vxi_udp_zero_csum6_rx)
467 nl_dump_line(p,
"enabled (%#x)\n", vxi->vxi_udp_zero_csum6_rx);
469 nl_dump_line(p,
"disabled\n");
472 if (vxi->ce_mask & VXLAN_ATTR_REMCSUM_TX) {
474 if (vxi->vxi_remcsum_tx)
475 nl_dump_line(p,
"enabled (%#x)\n", vxi->vxi_remcsum_tx);
477 nl_dump_line(p,
"disabled\n");
480 if (vxi->ce_mask & VXLAN_ATTR_REMCSUM_RX) {
482 if (vxi->vxi_remcsum_rx)
483 nl_dump_line(p,
"enabled (%#x)\n", vxi->vxi_remcsum_rx);
485 nl_dump_line(p,
"disabled\n");
488 if (vxi->vxi_flags & RTNL_LINK_VXLAN_F_GBP)
491 if (vxi->vxi_flags & RTNL_LINK_VXLAN_F_REMCSUM_NOPARTIAL)
492 nl_dump(p,
" rncsum-nopartial\n");
494 if (vxi->ce_mask & VXLAN_ATTR_COLLECT_METADATA) {
496 if (vxi->vxi_collect_metadata)
497 nl_dump_line(p,
"enabled (%#x)\n", vxi->vxi_collect_metadata);
499 nl_dump_line(p,
"disabled\n");
502 if (vxi->ce_mask & VXLAN_ATTR_LABEL) {
504 nl_dump_line(p,
"%u\n", ntohl(vxi->vxi_label));
507 if (vxi->vxi_flags & RTNL_LINK_VXLAN_F_GPE)
513 struct vxlan_info *vdst, *vsrc = src->l_info;
524 memcpy(vdst, vsrc,
sizeof(
struct vxlan_info));
529 static int vxlan_put_attrs(
struct nl_msg *msg,
struct rtnl_link *link)
531 struct vxlan_info *vxi = link->l_info;
537 if (vxi->ce_mask & VXLAN_ATTR_ID)
540 if (vxi->ce_mask & VXLAN_ATTR_GROUP)
541 NLA_PUT(msg, IFLA_VXLAN_GROUP,
sizeof(vxi->vxi_group), &vxi->vxi_group);
543 if (vxi->ce_mask & VXLAN_ATTR_GROUP6)
544 NLA_PUT(msg, IFLA_VXLAN_GROUP6,
sizeof(vxi->vxi_group6), &vxi->vxi_group6);
546 if (vxi->ce_mask & VXLAN_ATTR_LINK)
549 if (vxi->ce_mask & VXLAN_ATTR_LOCAL)
550 NLA_PUT(msg, IFLA_VXLAN_LOCAL,
sizeof(vxi->vxi_local), &vxi->vxi_local);
552 if (vxi->ce_mask & VXLAN_ATTR_LOCAL6)
553 NLA_PUT(msg, IFLA_VXLAN_LOCAL6,
sizeof(vxi->vxi_local6), &vxi->vxi_local6);
555 if (vxi->ce_mask & VXLAN_ATTR_TTL)
556 NLA_PUT_U8(msg, IFLA_VXLAN_TTL, vxi->vxi_ttl);
558 if (vxi->ce_mask & VXLAN_ATTR_TOS)
559 NLA_PUT_U8(msg, IFLA_VXLAN_TOS, vxi->vxi_tos);
561 if (vxi->ce_mask & VXLAN_ATTR_LEARNING)
562 NLA_PUT_U8(msg, IFLA_VXLAN_LEARNING, vxi->vxi_learning);
564 if (vxi->ce_mask & VXLAN_ATTR_AGEING)
565 NLA_PUT_U32(msg, IFLA_VXLAN_AGEING, vxi->vxi_ageing);
567 if (vxi->ce_mask & VXLAN_ATTR_LIMIT)
568 NLA_PUT_U32(msg, IFLA_VXLAN_LIMIT, vxi->vxi_limit);
570 if (vxi->ce_mask & VXLAN_ATTR_PORT_RANGE)
571 NLA_PUT(msg, IFLA_VXLAN_PORT_RANGE,
sizeof(vxi->vxi_port_range),
572 &vxi->vxi_port_range);
574 if (vxi->ce_mask & VXLAN_ATTR_PROXY)
575 NLA_PUT_U8(msg, IFLA_VXLAN_PROXY, vxi->vxi_proxy);
577 if (vxi->ce_mask & VXLAN_ATTR_RSC)
578 NLA_PUT_U8(msg, IFLA_VXLAN_RSC, vxi->vxi_rsc);
580 if (vxi->ce_mask & VXLAN_ATTR_L2MISS)
581 NLA_PUT_U8(msg, IFLA_VXLAN_L2MISS, vxi->vxi_l2miss);
583 if (vxi->ce_mask & VXLAN_ATTR_L3MISS)
584 NLA_PUT_U8(msg, IFLA_VXLAN_L3MISS, vxi->vxi_l3miss);
586 if (vxi->ce_mask & VXLAN_ATTR_PORT)
589 if (vxi->ce_mask & VXLAN_ATTR_UDP_CSUM)
590 NLA_PUT_U8(msg, IFLA_VXLAN_UDP_CSUM, vxi->vxi_udp_csum);
592 if (vxi->ce_mask & VXLAN_ATTR_UDP_ZERO_CSUM6_TX)
593 NLA_PUT_U8(msg, IFLA_VXLAN_UDP_ZERO_CSUM6_TX, vxi->vxi_udp_zero_csum6_tx);
595 if (vxi->ce_mask & VXLAN_ATTR_UDP_ZERO_CSUM6_RX)
596 NLA_PUT_U8(msg, IFLA_VXLAN_UDP_ZERO_CSUM6_RX, vxi->vxi_udp_zero_csum6_rx);
598 if (vxi->ce_mask & VXLAN_ATTR_REMCSUM_TX)
599 NLA_PUT_U8(msg, IFLA_VXLAN_REMCSUM_TX, vxi->vxi_remcsum_tx);
601 if (vxi->ce_mask & VXLAN_ATTR_REMCSUM_RX)
602 NLA_PUT_U8(msg, IFLA_VXLAN_REMCSUM_RX, vxi->vxi_remcsum_rx);
604 if (vxi->vxi_flags & RTNL_LINK_VXLAN_F_GBP)
607 if (vxi->vxi_flags & RTNL_LINK_VXLAN_F_REMCSUM_NOPARTIAL)
610 if (vxi->ce_mask & VXLAN_ATTR_COLLECT_METADATA)
611 NLA_PUT_U8(msg, IFLA_VXLAN_COLLECT_METADATA, vxi->vxi_collect_metadata);
613 if (vxi->ce_mask & VXLAN_ATTR_LABEL)
614 NLA_PUT_U32(msg, IFLA_VXLAN_LABEL, vxi->vxi_label);
616 if (vxi->vxi_flags & RTNL_LINK_VXLAN_F_GPE)
629 struct vxlan_info *a = link_a->l_info;
630 struct vxlan_info *b = link_b->l_info;
632 uint32_t attrs = flags & LOOSE_COMPARISON ? b->ce_mask : ~0;
634 #define VXLAN_DIFF(ATTR, EXPR) ATTR_DIFF(attrs, VXLAN_ATTR_##ATTR, a, b, EXPR) 636 diff |= VXLAN_DIFF(ID, a->vxi_id != b->vxi_id);
637 diff |= VXLAN_DIFF(GROUP, a->vxi_group != b->vxi_group);
638 diff |= VXLAN_DIFF(LINK, a->vxi_link != b->vxi_link);
639 diff |= VXLAN_DIFF(LOCAL, a->vxi_local != b->vxi_local);
640 diff |= VXLAN_DIFF(TOS, a->vxi_tos != b->vxi_tos);
641 diff |= VXLAN_DIFF(TTL, a->vxi_ttl != b->vxi_ttl);
642 diff |= VXLAN_DIFF(LEARNING, a->vxi_learning != b->vxi_learning);
643 diff |= VXLAN_DIFF(AGEING, a->vxi_ageing != b->vxi_ageing);
644 diff |= VXLAN_DIFF(LIMIT, a->vxi_limit != b->vxi_limit);
645 diff |= VXLAN_DIFF(PORT_RANGE,
646 a->vxi_port_range.low != b->vxi_port_range.low);
647 diff |= VXLAN_DIFF(PORT_RANGE,
648 a->vxi_port_range.high != b->vxi_port_range.high);
649 diff |= VXLAN_DIFF(PROXY, a->vxi_proxy != b->vxi_proxy);
650 diff |= VXLAN_DIFF(RSC, a->vxi_proxy != b->vxi_proxy);
651 diff |= VXLAN_DIFF(L2MISS, a->vxi_proxy != b->vxi_proxy);
652 diff |= VXLAN_DIFF(L3MISS, a->vxi_proxy != b->vxi_proxy);
653 diff |= VXLAN_DIFF(PORT, a->vxi_port != b->vxi_port);
654 diff |= VXLAN_DIFF(GROUP6, memcmp(&a->vxi_group6, &b->vxi_group6,
sizeof(a->vxi_group6)) != 0);
655 diff |= VXLAN_DIFF(LOCAL6, memcmp(&a->vxi_local6, &b->vxi_local6,
sizeof(a->vxi_local6)) != 0);
656 diff |= VXLAN_DIFF(UDP_CSUM, a->vxi_proxy != b->vxi_proxy);
657 diff |= VXLAN_DIFF(UDP_ZERO_CSUM6_TX, a->vxi_proxy != b->vxi_proxy);
658 diff |= VXLAN_DIFF(UDP_ZERO_CSUM6_RX, a->vxi_proxy != b->vxi_proxy);
659 diff |= VXLAN_DIFF(REMCSUM_TX, a->vxi_proxy != b->vxi_proxy);
660 diff |= VXLAN_DIFF(REMCSUM_RX, a->vxi_proxy != b->vxi_proxy);
661 diff |= VXLAN_DIFF(COLLECT_METADATA, a->vxi_collect_metadata != b->vxi_collect_metadata);
662 diff |= VXLAN_DIFF(LABEL, a->vxi_label != b->vxi_label);
663 diff |= VXLAN_DIFF(FLAGS, a->vxi_flags != b->vxi_flags);
669 static struct rtnl_link_info_ops vxlan_info_ops = {
671 .io_alloc = vxlan_alloc,
672 .io_parse = vxlan_parse,
677 .io_clone = vxlan_clone,
678 .io_put_attrs = vxlan_put_attrs,
679 .io_free = vxlan_free,
680 .io_compare = vxlan_compare,
684 #define IS_VXLAN_LINK_ASSERT(link) \ 685 if ((link)->l_info_ops != &vxlan_info_ops) { \ 686 APPBUG("Link is not a vxlan link. set type \"vxlan\" first."); \ 687 return -NLE_OPNOTSUPP; \ 725 return link->l_info_ops && !strcmp(link->l_info_ops->io_name,
"vxlan");
737 struct vxlan_info *vxi = link->l_info;
739 IS_VXLAN_LINK_ASSERT(link);
741 if (
id > VXLAN_ID_MAX)
745 vxi->ce_mask |= VXLAN_ATTR_ID;
759 struct vxlan_info *vxi = link->l_info;
761 IS_VXLAN_LINK_ASSERT(link);
766 if (vxi->ce_mask & VXLAN_ATTR_ID)
783 struct vxlan_info *vxi = link->l_info;
785 IS_VXLAN_LINK_ASSERT(link);
790 sizeof(vxi->vxi_group));
791 vxi->ce_mask |= VXLAN_ATTR_GROUP;
792 vxi->ce_mask &= ~VXLAN_ATTR_GROUP6;
796 sizeof(vxi->vxi_group6));
797 vxi->ce_mask |= VXLAN_ATTR_GROUP6;
798 vxi->ce_mask &= ~VXLAN_ATTR_GROUP;
814 struct vxlan_info *vxi = link->l_info;
816 IS_VXLAN_LINK_ASSERT(link);
821 if (vxi->ce_mask & VXLAN_ATTR_GROUP)
822 *addr =
nl_addr_build(AF_INET, &vxi->vxi_group,
sizeof(vxi->vxi_group));
823 else if (vxi->ce_mask & VXLAN_ATTR_GROUP6)
824 *addr =
nl_addr_build(AF_INET6, &vxi->vxi_group6,
sizeof(vxi->vxi_group6));
840 struct vxlan_info *vxi = link->l_info;
842 IS_VXLAN_LINK_ASSERT(link);
844 vxi->vxi_link = index;
845 vxi->ce_mask |= VXLAN_ATTR_LINK;
859 struct vxlan_info *vxi = link->l_info;
861 IS_VXLAN_LINK_ASSERT(link);
866 if (!(vxi->ce_mask & VXLAN_ATTR_LINK))
869 *index = vxi->vxi_link;
883 struct vxlan_info *vxi = link->l_info;
885 IS_VXLAN_LINK_ASSERT(link);
890 sizeof(vxi->vxi_local));
891 vxi->ce_mask |= VXLAN_ATTR_LOCAL;
892 vxi->ce_mask &= VXLAN_ATTR_LOCAL6;
896 sizeof(vxi->vxi_local6));
897 vxi->ce_mask |= VXLAN_ATTR_LOCAL6;
898 vxi->ce_mask &= ~VXLAN_ATTR_LOCAL;
914 struct vxlan_info *vxi = link->l_info;
916 IS_VXLAN_LINK_ASSERT(link);
921 if (vxi->ce_mask & VXLAN_ATTR_LOCAL)
922 *addr =
nl_addr_build(AF_INET, &vxi->vxi_local,
sizeof(vxi->vxi_local));
923 else if (vxi->ce_mask & VXLAN_ATTR_LOCAL6)
924 *addr =
nl_addr_build(AF_INET6, &vxi->vxi_local6,
sizeof(vxi->vxi_local6));
940 struct vxlan_info *vxi = link->l_info;
942 IS_VXLAN_LINK_ASSERT(link);
945 vxi->ce_mask |= VXLAN_ATTR_TTL;
958 struct vxlan_info *vxi = link->l_info;
960 IS_VXLAN_LINK_ASSERT(link);
962 if (!(vxi->ce_mask & VXLAN_ATTR_TTL))
977 struct vxlan_info *vxi = link->l_info;
979 IS_VXLAN_LINK_ASSERT(link);
982 vxi->ce_mask |= VXLAN_ATTR_TOS;
995 struct vxlan_info *vxi = link->l_info;
997 IS_VXLAN_LINK_ASSERT(link);
999 if (!(vxi->ce_mask & VXLAN_ATTR_TOS))
1002 return vxi->vxi_tos;
1014 struct vxlan_info *vxi = link->l_info;
1016 IS_VXLAN_LINK_ASSERT(link);
1018 vxi->vxi_learning = learning;
1019 vxi->ce_mask |= VXLAN_ATTR_LEARNING;
1032 struct vxlan_info *vxi = link->l_info;
1034 IS_VXLAN_LINK_ASSERT(link);
1036 if (!(vxi->ce_mask & VXLAN_ATTR_LEARNING))
1039 return vxi->vxi_learning;
1073 struct vxlan_info *vxi = link->l_info;
1075 IS_VXLAN_LINK_ASSERT(link);
1077 vxi->vxi_ageing = expiry;
1078 vxi->ce_mask |= VXLAN_ATTR_AGEING;
1092 struct vxlan_info *vxi = link->l_info;
1094 IS_VXLAN_LINK_ASSERT(link);
1099 if (vxi->ce_mask & VXLAN_ATTR_AGEING)
1100 *expiry = vxi->vxi_ageing;
1116 struct vxlan_info *vxi = link->l_info;
1118 IS_VXLAN_LINK_ASSERT(link);
1120 vxi->vxi_limit = limit;
1121 vxi->ce_mask |= VXLAN_ATTR_LIMIT;
1135 struct vxlan_info *vxi = link->l_info;
1137 IS_VXLAN_LINK_ASSERT(link);
1142 if (vxi->ce_mask & VXLAN_ATTR_LIMIT)
1143 *limit = vxi->vxi_limit;
1158 struct ifla_vxlan_port_range *range)
1160 struct vxlan_info *vxi = link->l_info;
1162 IS_VXLAN_LINK_ASSERT(link);
1167 memcpy(&vxi->vxi_port_range, range,
sizeof(vxi->vxi_port_range));
1168 vxi->ce_mask |= VXLAN_ATTR_PORT_RANGE;
1181 struct ifla_vxlan_port_range *range)
1183 struct vxlan_info *vxi = link->l_info;
1185 IS_VXLAN_LINK_ASSERT(link);
1190 if (vxi->ce_mask & VXLAN_ATTR_PORT_RANGE)
1191 memcpy(range, &vxi->vxi_port_range,
sizeof(*range));
1207 struct vxlan_info *vxi = link->l_info;
1209 IS_VXLAN_LINK_ASSERT(link);
1211 vxi->vxi_proxy = proxy;
1212 vxi->ce_mask |= VXLAN_ATTR_PROXY;
1225 struct vxlan_info *vxi = link->l_info;
1227 IS_VXLAN_LINK_ASSERT(link);
1229 if (!(vxi->ce_mask & VXLAN_ATTR_PROXY))
1232 return vxi->vxi_proxy;
1266 struct vxlan_info *vxi = link->l_info;
1268 IS_VXLAN_LINK_ASSERT(link);
1271 vxi->ce_mask |= VXLAN_ATTR_RSC;
1284 struct vxlan_info *vxi = link->l_info;
1286 IS_VXLAN_LINK_ASSERT(link);
1288 if (!(vxi->ce_mask & VXLAN_ATTR_RSC))
1291 return vxi->vxi_rsc;
1325 struct vxlan_info *vxi = link->l_info;
1327 IS_VXLAN_LINK_ASSERT(link);
1329 vxi->vxi_l2miss = miss;
1330 vxi->ce_mask |= VXLAN_ATTR_L2MISS;
1343 struct vxlan_info *vxi = link->l_info;
1345 IS_VXLAN_LINK_ASSERT(link);
1347 if (!(vxi->ce_mask & VXLAN_ATTR_L2MISS))
1350 return vxi->vxi_l2miss;
1384 struct vxlan_info *vxi = link->l_info;
1386 IS_VXLAN_LINK_ASSERT(link);
1388 vxi->vxi_l3miss = miss;
1389 vxi->ce_mask |= VXLAN_ATTR_L3MISS;
1402 struct vxlan_info *vxi = link->l_info;
1404 IS_VXLAN_LINK_ASSERT(link);
1406 if (!(vxi->ce_mask & VXLAN_ATTR_L3MISS))
1409 return vxi->vxi_l3miss;
1443 struct vxlan_info *vxi = link->l_info;
1445 IS_VXLAN_LINK_ASSERT(link);
1447 vxi->vxi_port = htons(port);
1448 vxi->ce_mask |= VXLAN_ATTR_PORT;
1462 struct vxlan_info *vxi = link->l_info;
1464 IS_VXLAN_LINK_ASSERT(link);
1469 if (!(vxi->ce_mask & VXLAN_ATTR_PORT))
1472 *port = ntohs(vxi->vxi_port);
1486 struct vxlan_info *vxi = link->l_info;
1488 IS_VXLAN_LINK_ASSERT(link);
1490 vxi->vxi_udp_csum = csum;
1491 vxi->ce_mask |= VXLAN_ATTR_UDP_CSUM;
1504 struct vxlan_info *vxi = link->l_info;
1506 IS_VXLAN_LINK_ASSERT(link);
1508 if (!(vxi->ce_mask & VXLAN_ATTR_UDP_CSUM))
1511 return vxi->vxi_udp_csum;
1523 struct vxlan_info *vxi = link->l_info;
1525 IS_VXLAN_LINK_ASSERT(link);
1527 vxi->vxi_udp_zero_csum6_tx = csum;
1528 vxi->ce_mask |= VXLAN_ATTR_UDP_ZERO_CSUM6_TX;
1541 struct vxlan_info *vxi = link->l_info;
1543 IS_VXLAN_LINK_ASSERT(link);
1545 if (!(vxi->ce_mask & VXLAN_ATTR_UDP_ZERO_CSUM6_TX))
1548 return vxi->vxi_udp_zero_csum6_tx;
1560 struct vxlan_info *vxi = link->l_info;
1562 IS_VXLAN_LINK_ASSERT(link);
1564 vxi->vxi_udp_zero_csum6_rx = csum;
1565 vxi->ce_mask |= VXLAN_ATTR_UDP_ZERO_CSUM6_RX;
1578 struct vxlan_info *vxi = link->l_info;
1580 IS_VXLAN_LINK_ASSERT(link);
1582 if (!(vxi->ce_mask & VXLAN_ATTR_UDP_ZERO_CSUM6_RX))
1585 return vxi->vxi_udp_zero_csum6_rx;
1597 struct vxlan_info *vxi = link->l_info;
1599 IS_VXLAN_LINK_ASSERT(link);
1601 vxi->vxi_remcsum_tx = csum;
1602 vxi->ce_mask |= VXLAN_ATTR_REMCSUM_TX;
1615 struct vxlan_info *vxi = link->l_info;
1617 IS_VXLAN_LINK_ASSERT(link);
1619 if (!(vxi->ce_mask & VXLAN_ATTR_REMCSUM_TX))
1622 return vxi->vxi_remcsum_tx;
1634 struct vxlan_info *vxi = link->l_info;
1636 IS_VXLAN_LINK_ASSERT(link);
1638 vxi->vxi_remcsum_rx = csum;
1639 vxi->ce_mask |= VXLAN_ATTR_REMCSUM_RX;
1652 struct vxlan_info *vxi = link->l_info;
1654 IS_VXLAN_LINK_ASSERT(link);
1656 if (!(vxi->ce_mask & VXLAN_ATTR_REMCSUM_RX))
1659 return vxi->vxi_remcsum_rx;
1671 struct vxlan_info *vxi = link->l_info;
1673 IS_VXLAN_LINK_ASSERT(link);
1675 vxi->vxi_collect_metadata = collect;
1676 vxi->ce_mask |= VXLAN_ATTR_COLLECT_METADATA;
1689 struct vxlan_info *vxi = link->l_info;
1691 IS_VXLAN_LINK_ASSERT(link);
1693 if (!(vxi->ce_mask & VXLAN_ATTR_COLLECT_METADATA))
1696 return vxi->vxi_collect_metadata;
1708 struct vxlan_info *vxi = link->l_info;
1710 IS_VXLAN_LINK_ASSERT(link);
1712 vxi->vxi_label = htonl(label);
1713 vxi->ce_mask |= VXLAN_ATTR_LABEL;
1727 struct vxlan_info *vxi = link->l_info;
1729 IS_VXLAN_LINK_ASSERT(link);
1734 if (!(vxi->ce_mask & VXLAN_ATTR_LABEL))
1737 *label = ntohl(vxi->vxi_label);
1752 struct vxlan_info *vxi = link->l_info;
1754 IS_VXLAN_LINK_ASSERT(link);
1756 if (flags & ~(RTNL_LINK_VXLAN_F_GBP | RTNL_LINK_VXLAN_F_GPE | RTNL_LINK_VXLAN_F_REMCSUM_NOPARTIAL))
1760 vxi->vxi_flags |= flags;
1762 vxi->vxi_flags &= ~flags;
1776 struct vxlan_info *vxi = link->l_info;
1778 IS_VXLAN_LINK_ASSERT(link);
1780 *out_flags = vxi->vxi_flags;
1786 static void __init vxlan_init(
void)
1791 static void __exit vxlan_exit(
void)
Dump object briefly on one line.
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_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.
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.
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 ADDR 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.
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_label(struct rtnl_link *link, uint32_t *label)
Get flow label to use for VXLAN.
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_set_remcsum_tx(struct rtnl_link *link, uint8_t csum)
Set remote offload transmit checksum status 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_port(struct rtnl_link *link, uint32_t port)
Set UDP destination port to use for VXLAN.
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.
int rtnl_link_vxlan_get_remcsum_rx(struct rtnl_link *link)
Get remote offload receive checksum status 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_set_flags(struct rtnl_link *link, uint32_t flags, int enable)
Set VXLAN flags RTNL_LINK_VXLAN_F_*.
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.
#define NLA_PUT_FLAG(msg, attrtype)
Add flag attribute to netlink message.
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_vxlan_get_collect_metadata(struct rtnl_link *link)
Get collect metadata 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_set_remcsum_rx(struct rtnl_link *link, uint8_t csum)
Set remote offload receive checksum status to use for VXLAN.
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_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_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_vxlan_get_flags(struct rtnl_link *link, uint32_t *out_flags)
Get VXLAN flags RTNL_LINK_VXLAN_F_*.
uint16_t nla_get_u16(const struct nlattr *nla)
Return payload of 16 bit integer attribute.
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.
int rtnl_link_vxlan_set_udp_csum(struct rtnl_link *link, uint8_t csum)
Set UDP checksum status 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_rx(struct rtnl_link *link)
Get skip UDP checksum received over IPv6 status 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_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_get_port(struct rtnl_link *link, uint32_t *port)
Get UDP destination port to use for VXLAN.
void nl_dump(struct nl_dump_params *params, const char *fmt,...)
Dump a formatted character string.
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_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_label(struct rtnl_link *link, uint32_t label)
Set flow label to use for VXLAN.
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.