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) 58 struct in6_addr vxi_group6;
61 struct in6_addr vxi_local6;
67 struct ifla_vxlan_port_range vxi_port_range;
77 static struct nla_policy vxlan_policy[IFLA_VXLAN_MAX+1] = {
79 [IFLA_VXLAN_GROUP] = { .minlen =
sizeof(uint32_t) },
80 [IFLA_VXLAN_GROUP6] = { .minlen =
sizeof(
struct in6_addr) },
81 [IFLA_VXLAN_LINK] = { .type =
NLA_U32 },
82 [IFLA_VXLAN_LOCAL] = { .minlen =
sizeof(uint32_t) },
83 [IFLA_VXLAN_LOCAL6] = { .minlen =
sizeof(
struct in6_addr) },
84 [IFLA_VXLAN_TTL] = { .type =
NLA_U8 },
85 [IFLA_VXLAN_TOS] = { .type =
NLA_U8 },
86 [IFLA_VXLAN_LEARNING] = { .type =
NLA_U8 },
87 [IFLA_VXLAN_AGEING] = { .type =
NLA_U32 },
88 [IFLA_VXLAN_LIMIT] = { .type =
NLA_U32 },
89 [IFLA_VXLAN_PORT_RANGE] = { .minlen =
sizeof(
struct ifla_vxlan_port_range) },
90 [IFLA_VXLAN_PROXY] = { .type =
NLA_U8 },
91 [IFLA_VXLAN_RSC] = { .type =
NLA_U8 },
92 [IFLA_VXLAN_L2MISS] = { .type =
NLA_U8 },
93 [IFLA_VXLAN_L3MISS] = { .type =
NLA_U8 },
96 static int vxlan_alloc(
struct rtnl_link *link)
98 struct vxlan_info *vxi;
101 memset(link->l_info, 0,
sizeof(*vxi));
103 if ((vxi = calloc(1,
sizeof(*vxi))) == NULL)
112 static int vxlan_parse(
struct rtnl_link *link,
struct nlattr *data,
113 struct nlattr *xstats)
115 struct nlattr *tb[IFLA_VXLAN_MAX+1];
116 struct vxlan_info *vxi;
119 NL_DBG(3,
"Parsing VXLAN link info\n");
124 if ((err = vxlan_alloc(link)) < 0)
129 if (tb[IFLA_VXLAN_ID]) {
131 vxi->ce_mask |= VXLAN_ATTR_ID;
134 if (tb[IFLA_VXLAN_GROUP6]) {
135 nla_memcpy(&vxi->vxi_group6, tb[IFLA_VXLAN_GROUP6],
136 sizeof(vxi->vxi_group6));
137 vxi->ce_mask |= VXLAN_ATTR_GROUP6;
140 if (tb[IFLA_VXLAN_GROUP]) {
141 nla_memcpy(&vxi->vxi_group, tb[IFLA_VXLAN_GROUP],
142 sizeof(vxi->vxi_group));
143 vxi->ce_mask |= VXLAN_ATTR_GROUP;
144 vxi->ce_mask &= ~VXLAN_ATTR_GROUP6;
147 if (tb[IFLA_VXLAN_LINK]) {
149 vxi->ce_mask |= VXLAN_ATTR_LINK;
152 if (tb[IFLA_VXLAN_LOCAL6]) {
153 nla_memcpy(&vxi->vxi_local6, tb[IFLA_VXLAN_LOCAL6],
154 sizeof(vxi->vxi_local6));
155 vxi->ce_mask |= VXLAN_ATTR_LOCAL6;
158 if (tb[IFLA_VXLAN_LOCAL]) {
159 nla_memcpy(&vxi->vxi_local, tb[IFLA_VXLAN_LOCAL],
160 sizeof(vxi->vxi_local));
161 vxi->ce_mask |= VXLAN_ATTR_LOCAL;
162 vxi->ce_mask &= ~VXLAN_ATTR_LOCAL6;
165 if (tb[IFLA_VXLAN_TTL]) {
166 vxi->vxi_ttl =
nla_get_u8(tb[IFLA_VXLAN_TTL]);
167 vxi->ce_mask |= VXLAN_ATTR_TTL;
170 if (tb[IFLA_VXLAN_TOS]) {
171 vxi->vxi_tos =
nla_get_u8(tb[IFLA_VXLAN_TOS]);
172 vxi->ce_mask |= VXLAN_ATTR_TOS;
175 if (tb[IFLA_VXLAN_LEARNING]) {
176 vxi->vxi_learning =
nla_get_u8(tb[IFLA_VXLAN_LEARNING]);
177 vxi->ce_mask |= VXLAN_ATTR_LEARNING;
180 if (tb[IFLA_VXLAN_AGEING]) {
181 vxi->vxi_ageing =
nla_get_u32(tb[IFLA_VXLAN_AGEING]);
182 vxi->ce_mask |= VXLAN_ATTR_AGEING;
185 if (tb[IFLA_VXLAN_LIMIT]) {
186 vxi->vxi_limit =
nla_get_u32(tb[IFLA_VXLAN_LIMIT]);
187 vxi->ce_mask |= VXLAN_ATTR_LIMIT;
190 if (tb[IFLA_VXLAN_PORT_RANGE]) {
191 nla_memcpy(&vxi->vxi_port_range, tb[IFLA_VXLAN_PORT_RANGE],
192 sizeof(vxi->vxi_port_range));
193 vxi->ce_mask |= VXLAN_ATTR_PORT_RANGE;
196 if (tb[IFLA_VXLAN_PROXY]) {
197 vxi->vxi_proxy =
nla_get_u8(tb[IFLA_VXLAN_PROXY]);
198 vxi->ce_mask |= VXLAN_ATTR_PROXY;
201 if (tb[IFLA_VXLAN_RSC]) {
202 vxi->vxi_rsc =
nla_get_u8(tb[IFLA_VXLAN_RSC]);
203 vxi->ce_mask |= VXLAN_ATTR_RSC;
206 if (tb[IFLA_VXLAN_L2MISS]) {
207 vxi->vxi_l2miss =
nla_get_u8(tb[IFLA_VXLAN_L2MISS]);
208 vxi->ce_mask |= VXLAN_ATTR_L2MISS;
211 if (tb[IFLA_VXLAN_L3MISS]) {
212 vxi->vxi_l3miss =
nla_get_u8(tb[IFLA_VXLAN_L3MISS]);
213 vxi->ce_mask |= VXLAN_ATTR_L3MISS;
222 static void vxlan_free(
struct rtnl_link *link)
224 struct vxlan_info *vxi = link->l_info;
232 struct vxlan_info *vxi = link->l_info;
234 nl_dump(p,
"vxlan-id %u", vxi->vxi_id);
239 struct vxlan_info *vxi = link->l_info;
240 char *name, addr[INET6_ADDRSTRLEN];
243 nl_dump_line(p,
" vxlan-id %u\n", vxi->vxi_id);
245 if (vxi->ce_mask & VXLAN_ATTR_GROUP) {
247 if (inet_ntop(AF_INET, &vxi->vxi_group, addr,
sizeof(addr)))
248 nl_dump_line(p,
"%s\n", addr);
250 nl_dump_line(p,
"%#x\n", ntohs(vxi->vxi_group));
251 }
else if (vxi->ce_mask & VXLAN_ATTR_GROUP6) {
253 if (inet_ntop(AF_INET6, &vxi->vxi_group6, addr,
sizeof(addr)))
254 nl_dump_line(p,
"%s\n", addr);
256 nl_dump_line(p,
"%#x\n", vxi->vxi_group6);
259 if (vxi->ce_mask & VXLAN_ATTR_LINK) {
263 parent = link_lookup(link->ce_cache, vxi->vxi_link);
268 nl_dump_line(p,
"%s\n", name);
270 nl_dump_line(p,
"%u\n", vxi->vxi_link);
273 if (vxi->ce_mask & VXLAN_ATTR_LOCAL) {
275 if (inet_ntop(AF_INET, &vxi->vxi_local, addr,
sizeof(addr)))
276 nl_dump_line(p,
"%s\n", addr);
278 nl_dump_line(p,
"%#x\n", ntohs(vxi->vxi_local));
279 }
else if (vxi->ce_mask & VXLAN_ATTR_LOCAL6) {
281 if (inet_ntop(AF_INET6, &vxi->vxi_local6, addr,
sizeof(addr)))
282 nl_dump_line(p,
"%s\n", addr);
284 nl_dump_line(p,
"%#x\n", vxi->vxi_local6);
288 if (vxi->ce_mask & VXLAN_ATTR_TTL) {
291 nl_dump_line(p,
"%u\n", vxi->vxi_ttl);
293 nl_dump_line(p,
"inherit\n");
296 if (vxi->ce_mask & VXLAN_ATTR_TOS) {
298 if (vxi->vxi_tos == 1)
299 nl_dump_line(p,
"inherit\n", vxi->vxi_tos);
301 nl_dump_line(p,
"%#x\n", vxi->vxi_tos);
304 if (vxi->ce_mask & VXLAN_ATTR_LEARNING) {
306 if (vxi->vxi_learning)
307 nl_dump_line(p,
"enabled (%#x)\n", vxi->vxi_learning);
309 nl_dump_line(p,
"disabled\n");
312 if (vxi->ce_mask & VXLAN_ATTR_AGEING) {
315 nl_dump_line(p,
"%u seconds\n", vxi->vxi_ageing);
317 nl_dump_line(p,
"disabled\n");
320 if (vxi->ce_mask & VXLAN_ATTR_LIMIT) {
323 nl_dump_line(p,
"%u\n", vxi->vxi_limit);
325 nl_dump_line(p,
"unlimited\n");
328 if (vxi->ce_mask & VXLAN_ATTR_PORT_RANGE)
329 nl_dump_line(p,
" port range %u - %u\n",
330 ntohs(vxi->vxi_port_range.low),
331 ntohs(vxi->vxi_port_range.high));
333 if (vxi->ce_mask & VXLAN_ATTR_PROXY) {
336 nl_dump_line(p,
"enabled (%#x)\n", vxi->vxi_proxy);
338 nl_dump_line(p,
"disabled\n");
341 if (vxi->ce_mask & VXLAN_ATTR_RSC) {
344 nl_dump_line(p,
"enabled (%#x)\n", vxi->vxi_rsc);
346 nl_dump_line(p,
"disabled\n");
349 if (vxi->ce_mask & VXLAN_ATTR_L2MISS) {
352 nl_dump_line(p,
"enabled (%#x)\n", vxi->vxi_l2miss);
354 nl_dump_line(p,
"disabled\n");
357 if (vxi->ce_mask & VXLAN_ATTR_L3MISS) {
360 nl_dump_line(p,
"enabled (%#x)\n", vxi->vxi_l3miss);
362 nl_dump_line(p,
"disabled\n");
368 struct vxlan_info *vdst, *vsrc = src->l_info;
379 memcpy(vdst, vsrc,
sizeof(
struct vxlan_info));
384 static int vxlan_put_attrs(
struct nl_msg *msg,
struct rtnl_link *link)
386 struct vxlan_info *vxi = link->l_info;
392 if (vxi->ce_mask & VXLAN_ATTR_ID)
395 if (vxi->ce_mask & VXLAN_ATTR_GROUP)
396 NLA_PUT(msg, IFLA_VXLAN_GROUP,
sizeof(vxi->vxi_group), &vxi->vxi_group);
398 if (vxi->ce_mask & VXLAN_ATTR_GROUP6)
399 NLA_PUT(msg, IFLA_VXLAN_GROUP6,
sizeof(vxi->vxi_group6), &vxi->vxi_group6);
401 if (vxi->ce_mask & VXLAN_ATTR_LINK)
404 if (vxi->ce_mask & VXLAN_ATTR_LOCAL)
405 NLA_PUT(msg, IFLA_VXLAN_LOCAL,
sizeof(vxi->vxi_local), &vxi->vxi_local);
407 if (vxi->ce_mask & VXLAN_ATTR_LOCAL6)
408 NLA_PUT(msg, IFLA_VXLAN_LOCAL6,
sizeof(vxi->vxi_local6), &vxi->vxi_local6);
410 if (vxi->ce_mask & VXLAN_ATTR_TTL)
411 NLA_PUT_U8(msg, IFLA_VXLAN_TTL, vxi->vxi_ttl);
413 if (vxi->ce_mask & VXLAN_ATTR_TOS)
414 NLA_PUT_U8(msg, IFLA_VXLAN_TOS, vxi->vxi_tos);
416 if (vxi->ce_mask & VXLAN_ATTR_LEARNING)
417 NLA_PUT_U8(msg, IFLA_VXLAN_LEARNING, vxi->vxi_learning);
419 if (vxi->ce_mask & VXLAN_ATTR_AGEING)
420 NLA_PUT_U32(msg, IFLA_VXLAN_AGEING, vxi->vxi_ageing);
422 if (vxi->ce_mask & VXLAN_ATTR_LIMIT)
423 NLA_PUT_U32(msg, IFLA_VXLAN_LIMIT, vxi->vxi_limit);
425 if (vxi->ce_mask & VXLAN_ATTR_PORT_RANGE)
426 NLA_PUT(msg, IFLA_VXLAN_PORT_RANGE,
sizeof(vxi->vxi_port_range),
427 &vxi->vxi_port_range);
429 if (vxi->ce_mask & VXLAN_ATTR_PROXY)
430 NLA_PUT_U8(msg, IFLA_VXLAN_PROXY, vxi->vxi_proxy);
432 if (vxi->ce_mask & VXLAN_ATTR_RSC)
433 NLA_PUT_U8(msg, IFLA_VXLAN_RSC, vxi->vxi_rsc);
435 if (vxi->ce_mask & VXLAN_ATTR_L2MISS)
436 NLA_PUT_U8(msg, IFLA_VXLAN_L2MISS, vxi->vxi_l2miss);
438 if (vxi->ce_mask & VXLAN_ATTR_L3MISS)
439 NLA_PUT_U8(msg, IFLA_VXLAN_L3MISS, vxi->vxi_l3miss);
451 struct vxlan_info *a = link_a->l_info;
452 struct vxlan_info *b = link_b->l_info;
454 uint32_t attrs = flags & LOOSE_COMPARISON ? b->ce_mask : ~0;
456 #define VXLAN_DIFF(ATTR, EXPR) ATTR_DIFF(attrs, VXLAN_ATTR_##ATTR, a, b, EXPR) 458 diff |= VXLAN_DIFF(ID, a->vxi_id != b->vxi_id);
459 diff |= VXLAN_DIFF(GROUP, a->vxi_group != b->vxi_group);
460 diff |= VXLAN_DIFF(LINK, a->vxi_link != b->vxi_link);
461 diff |= VXLAN_DIFF(LOCAL, a->vxi_local != b->vxi_local);
462 diff |= VXLAN_DIFF(TOS, a->vxi_tos != b->vxi_tos);
463 diff |= VXLAN_DIFF(TTL, a->vxi_ttl != b->vxi_ttl);
464 diff |= VXLAN_DIFF(LEARNING, a->vxi_learning != b->vxi_learning);
465 diff |= VXLAN_DIFF(AGEING, a->vxi_ageing != b->vxi_ageing);
466 diff |= VXLAN_DIFF(PORT_RANGE,
467 a->vxi_port_range.low != b->vxi_port_range.low);
468 diff |= VXLAN_DIFF(PORT_RANGE,
469 a->vxi_port_range.high != b->vxi_port_range.high);
470 diff |= VXLAN_DIFF(GROUP6, memcmp(&a->vxi_group6, &b->vxi_group6,
sizeof(a->vxi_group6)) != 0);
471 diff |= VXLAN_DIFF(LOCAL6, memcmp(&a->vxi_local6, &b->vxi_local6,
sizeof(a->vxi_local6)) != 0);
477 static struct rtnl_link_info_ops vxlan_info_ops = {
479 .io_alloc = vxlan_alloc,
480 .io_parse = vxlan_parse,
485 .io_clone = vxlan_clone,
486 .io_put_attrs = vxlan_put_attrs,
487 .io_free = vxlan_free,
488 .io_compare = vxlan_compare,
492 #define IS_VXLAN_LINK_ASSERT(link) \ 493 if ((link)->l_info_ops != &vxlan_info_ops) { \ 494 APPBUG("Link is not a vxlan link. set type \"vxlan\" first."); \ 495 return -NLE_OPNOTSUPP; \ 533 return link->l_info_ops && !strcmp(link->l_info_ops->io_name,
"vxlan");
545 struct vxlan_info *vxi = link->l_info;
547 IS_VXLAN_LINK_ASSERT(link);
549 if (
id > VXLAN_ID_MAX)
553 vxi->ce_mask |= VXLAN_ATTR_ID;
567 struct vxlan_info *vxi = link->l_info;
569 IS_VXLAN_LINK_ASSERT(link);
574 if (vxi->ce_mask & VXLAN_ATTR_ID)
591 struct vxlan_info *vxi = link->l_info;
593 IS_VXLAN_LINK_ASSERT(link);
598 sizeof(vxi->vxi_group));
599 vxi->ce_mask |= VXLAN_ATTR_GROUP;
600 vxi->ce_mask &= ~VXLAN_ATTR_GROUP6;
604 sizeof(vxi->vxi_group6));
605 vxi->ce_mask |= VXLAN_ATTR_GROUP6;
606 vxi->ce_mask &= ~VXLAN_ATTR_GROUP;
622 struct vxlan_info *vxi = link->l_info;
624 IS_VXLAN_LINK_ASSERT(link);
629 if (vxi->ce_mask & VXLAN_ATTR_GROUP)
630 *addr =
nl_addr_build(AF_INET, &vxi->vxi_group,
sizeof(vxi->vxi_group));
631 else if (vxi->ce_mask & VXLAN_ATTR_GROUP6)
632 *addr =
nl_addr_build(AF_INET6, &vxi->vxi_group6,
sizeof(vxi->vxi_group6));
648 struct vxlan_info *vxi = link->l_info;
650 IS_VXLAN_LINK_ASSERT(link);
652 vxi->vxi_link = index;
653 vxi->ce_mask |= VXLAN_ATTR_LINK;
667 struct vxlan_info *vxi = link->l_info;
669 IS_VXLAN_LINK_ASSERT(link);
674 if (!(vxi->ce_mask & VXLAN_ATTR_LINK))
677 *index = vxi->vxi_link;
691 struct vxlan_info *vxi = link->l_info;
693 IS_VXLAN_LINK_ASSERT(link);
698 sizeof(vxi->vxi_local));
699 vxi->ce_mask |= VXLAN_ATTR_LOCAL;
700 vxi->ce_mask &= VXLAN_ATTR_LOCAL6;
704 sizeof(vxi->vxi_local6));
705 vxi->ce_mask |= VXLAN_ATTR_LOCAL6;
706 vxi->ce_mask &= ~VXLAN_ATTR_LOCAL;
722 struct vxlan_info *vxi = link->l_info;
724 IS_VXLAN_LINK_ASSERT(link);
729 if (vxi->ce_mask & VXLAN_ATTR_LOCAL)
730 *addr =
nl_addr_build(AF_INET, &vxi->vxi_local,
sizeof(vxi->vxi_local));
731 else if (vxi->ce_mask & VXLAN_ATTR_LOCAL6)
732 *addr =
nl_addr_build(AF_INET6, &vxi->vxi_local6,
sizeof(vxi->vxi_local6));
748 struct vxlan_info *vxi = link->l_info;
750 IS_VXLAN_LINK_ASSERT(link);
753 vxi->ce_mask |= VXLAN_ATTR_TTL;
766 struct vxlan_info *vxi = link->l_info;
768 IS_VXLAN_LINK_ASSERT(link);
770 if (!(vxi->ce_mask & VXLAN_ATTR_TTL))
785 struct vxlan_info *vxi = link->l_info;
787 IS_VXLAN_LINK_ASSERT(link);
790 vxi->ce_mask |= VXLAN_ATTR_TOS;
803 struct vxlan_info *vxi = link->l_info;
805 IS_VXLAN_LINK_ASSERT(link);
807 if (!(vxi->ce_mask & VXLAN_ATTR_TOS))
822 struct vxlan_info *vxi = link->l_info;
824 IS_VXLAN_LINK_ASSERT(link);
826 vxi->vxi_learning = learning;
827 vxi->ce_mask |= VXLAN_ATTR_LEARNING;
840 struct vxlan_info *vxi = link->l_info;
842 IS_VXLAN_LINK_ASSERT(link);
844 if (!(vxi->ce_mask & VXLAN_ATTR_LEARNING))
847 return vxi->vxi_learning;
881 struct vxlan_info *vxi = link->l_info;
883 IS_VXLAN_LINK_ASSERT(link);
885 vxi->vxi_ageing = expiry;
886 vxi->ce_mask |= VXLAN_ATTR_AGEING;
900 struct vxlan_info *vxi = link->l_info;
902 IS_VXLAN_LINK_ASSERT(link);
907 if (vxi->ce_mask & VXLAN_ATTR_AGEING)
908 *expiry = vxi->vxi_ageing;
924 struct vxlan_info *vxi = link->l_info;
926 IS_VXLAN_LINK_ASSERT(link);
928 vxi->vxi_limit = limit;
929 vxi->ce_mask |= VXLAN_ATTR_LIMIT;
943 struct vxlan_info *vxi = link->l_info;
945 IS_VXLAN_LINK_ASSERT(link);
950 if (vxi->ce_mask & VXLAN_ATTR_LIMIT)
951 *limit = vxi->vxi_limit;
966 struct ifla_vxlan_port_range *range)
968 struct vxlan_info *vxi = link->l_info;
970 IS_VXLAN_LINK_ASSERT(link);
975 memcpy(&vxi->vxi_port_range, range,
sizeof(vxi->vxi_port_range));
976 vxi->ce_mask |= VXLAN_ATTR_PORT_RANGE;
989 struct ifla_vxlan_port_range *range)
991 struct vxlan_info *vxi = link->l_info;
993 IS_VXLAN_LINK_ASSERT(link);
998 if (vxi->ce_mask & VXLAN_ATTR_PORT_RANGE)
999 memcpy(range, &vxi->vxi_port_range,
sizeof(*range));
1015 struct vxlan_info *vxi = link->l_info;
1017 IS_VXLAN_LINK_ASSERT(link);
1019 vxi->vxi_proxy = proxy;
1020 vxi->ce_mask |= VXLAN_ATTR_PROXY;
1033 struct vxlan_info *vxi = link->l_info;
1035 IS_VXLAN_LINK_ASSERT(link);
1037 if (!(vxi->ce_mask & VXLAN_ATTR_PROXY))
1040 return vxi->vxi_proxy;
1074 struct vxlan_info *vxi = link->l_info;
1076 IS_VXLAN_LINK_ASSERT(link);
1079 vxi->ce_mask |= VXLAN_ATTR_RSC;
1092 struct vxlan_info *vxi = link->l_info;
1094 IS_VXLAN_LINK_ASSERT(link);
1096 if (!(vxi->ce_mask & VXLAN_ATTR_RSC))
1099 return vxi->vxi_rsc;
1133 struct vxlan_info *vxi = link->l_info;
1135 IS_VXLAN_LINK_ASSERT(link);
1137 vxi->vxi_l2miss = miss;
1138 vxi->ce_mask |= VXLAN_ATTR_L2MISS;
1151 struct vxlan_info *vxi = link->l_info;
1153 IS_VXLAN_LINK_ASSERT(link);
1155 if (!(vxi->ce_mask & VXLAN_ATTR_L2MISS))
1158 return vxi->vxi_l2miss;
1192 struct vxlan_info *vxi = link->l_info;
1194 IS_VXLAN_LINK_ASSERT(link);
1196 vxi->vxi_l3miss = miss;
1197 vxi->ce_mask |= VXLAN_ATTR_L3MISS;
1210 struct vxlan_info *vxi = link->l_info;
1212 IS_VXLAN_LINK_ASSERT(link);
1214 if (!(vxi->ce_mask & VXLAN_ATTR_L3MISS))
1217 return vxi->vxi_l3miss;
1244 static void __init vxlan_init(
void)
1249 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.