1*4dc78e53SAndroid Build Coastguard Worker /* SPDX-License-Identifier: LGPL-2.1-only */
2*4dc78e53SAndroid Build Coastguard Worker /*
3*4dc78e53SAndroid Build Coastguard Worker * Copyright (c) 2013 Yasunobu Chiba <[email protected]>
4*4dc78e53SAndroid Build Coastguard Worker */
5*4dc78e53SAndroid Build Coastguard Worker
6*4dc78e53SAndroid Build Coastguard Worker /**
7*4dc78e53SAndroid Build Coastguard Worker * @ingroup link
8*4dc78e53SAndroid Build Coastguard Worker * @defgroup vxlan VXLAN
9*4dc78e53SAndroid Build Coastguard Worker * Virtual eXtensible Local Area Network link module
10*4dc78e53SAndroid Build Coastguard Worker *
11*4dc78e53SAndroid Build Coastguard Worker * @details
12*4dc78e53SAndroid Build Coastguard Worker * \b Link Type Name: "vxlan"
13*4dc78e53SAndroid Build Coastguard Worker *
14*4dc78e53SAndroid Build Coastguard Worker * @route_doc{link_vxlan, VXLAN Documentation}
15*4dc78e53SAndroid Build Coastguard Worker *
16*4dc78e53SAndroid Build Coastguard Worker * @{
17*4dc78e53SAndroid Build Coastguard Worker */
18*4dc78e53SAndroid Build Coastguard Worker
19*4dc78e53SAndroid Build Coastguard Worker #include "nl-default.h"
20*4dc78e53SAndroid Build Coastguard Worker
21*4dc78e53SAndroid Build Coastguard Worker #include <linux/if_link.h>
22*4dc78e53SAndroid Build Coastguard Worker
23*4dc78e53SAndroid Build Coastguard Worker #include <netlink/netlink.h>
24*4dc78e53SAndroid Build Coastguard Worker #include <netlink/attr.h>
25*4dc78e53SAndroid Build Coastguard Worker #include <netlink/utils.h>
26*4dc78e53SAndroid Build Coastguard Worker #include <netlink/object.h>
27*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/rtnl.h>
28*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/link/vxlan.h>
29*4dc78e53SAndroid Build Coastguard Worker
30*4dc78e53SAndroid Build Coastguard Worker #include "nl-route.h"
31*4dc78e53SAndroid Build Coastguard Worker #include "link-api.h"
32*4dc78e53SAndroid Build Coastguard Worker
33*4dc78e53SAndroid Build Coastguard Worker /** @cond SKIP */
34*4dc78e53SAndroid Build Coastguard Worker #define VXLAN_ATTR_ID (1<<0)
35*4dc78e53SAndroid Build Coastguard Worker #define VXLAN_ATTR_GROUP (1<<1)
36*4dc78e53SAndroid Build Coastguard Worker #define VXLAN_ATTR_LINK (1<<2)
37*4dc78e53SAndroid Build Coastguard Worker #define VXLAN_ATTR_LOCAL (1<<3)
38*4dc78e53SAndroid Build Coastguard Worker #define VXLAN_ATTR_TTL (1<<4)
39*4dc78e53SAndroid Build Coastguard Worker #define VXLAN_ATTR_TOS (1<<5)
40*4dc78e53SAndroid Build Coastguard Worker #define VXLAN_ATTR_LEARNING (1<<6)
41*4dc78e53SAndroid Build Coastguard Worker #define VXLAN_ATTR_AGEING (1<<7)
42*4dc78e53SAndroid Build Coastguard Worker #define VXLAN_ATTR_LIMIT (1<<8)
43*4dc78e53SAndroid Build Coastguard Worker #define VXLAN_ATTR_PORT_RANGE (1<<9)
44*4dc78e53SAndroid Build Coastguard Worker #define VXLAN_ATTR_PROXY (1<<10)
45*4dc78e53SAndroid Build Coastguard Worker #define VXLAN_ATTR_RSC (1<<11)
46*4dc78e53SAndroid Build Coastguard Worker #define VXLAN_ATTR_L2MISS (1<<12)
47*4dc78e53SAndroid Build Coastguard Worker #define VXLAN_ATTR_L3MISS (1<<13)
48*4dc78e53SAndroid Build Coastguard Worker #define VXLAN_ATTR_GROUP6 (1<<14)
49*4dc78e53SAndroid Build Coastguard Worker #define VXLAN_ATTR_LOCAL6 (1<<15)
50*4dc78e53SAndroid Build Coastguard Worker #define VXLAN_ATTR_PORT (1<<16)
51*4dc78e53SAndroid Build Coastguard Worker #define VXLAN_ATTR_UDP_CSUM (1<<17)
52*4dc78e53SAndroid Build Coastguard Worker #define VXLAN_ATTR_UDP_ZERO_CSUM6_TX (1<<18)
53*4dc78e53SAndroid Build Coastguard Worker #define VXLAN_ATTR_UDP_ZERO_CSUM6_RX (1<<19)
54*4dc78e53SAndroid Build Coastguard Worker #define VXLAN_ATTR_REMCSUM_TX (1<<20)
55*4dc78e53SAndroid Build Coastguard Worker #define VXLAN_ATTR_REMCSUM_RX (1<<21)
56*4dc78e53SAndroid Build Coastguard Worker #define VXLAN_ATTR_COLLECT_METADATA (1<<22)
57*4dc78e53SAndroid Build Coastguard Worker #define VXLAN_ATTR_LABEL (1<<23)
58*4dc78e53SAndroid Build Coastguard Worker #define VXLAN_ATTR_FLAGS (1<<24)
59*4dc78e53SAndroid Build Coastguard Worker
60*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info
61*4dc78e53SAndroid Build Coastguard Worker {
62*4dc78e53SAndroid Build Coastguard Worker uint32_t vxi_id;
63*4dc78e53SAndroid Build Coastguard Worker uint32_t vxi_group;
64*4dc78e53SAndroid Build Coastguard Worker struct in6_addr vxi_group6;
65*4dc78e53SAndroid Build Coastguard Worker uint32_t vxi_link;
66*4dc78e53SAndroid Build Coastguard Worker uint32_t vxi_local;
67*4dc78e53SAndroid Build Coastguard Worker struct in6_addr vxi_local6;
68*4dc78e53SAndroid Build Coastguard Worker uint8_t vxi_ttl;
69*4dc78e53SAndroid Build Coastguard Worker uint8_t vxi_tos;
70*4dc78e53SAndroid Build Coastguard Worker uint8_t vxi_learning;
71*4dc78e53SAndroid Build Coastguard Worker uint8_t vxi_flags;
72*4dc78e53SAndroid Build Coastguard Worker uint32_t vxi_ageing;
73*4dc78e53SAndroid Build Coastguard Worker uint32_t vxi_limit;
74*4dc78e53SAndroid Build Coastguard Worker struct ifla_vxlan_port_range vxi_port_range;
75*4dc78e53SAndroid Build Coastguard Worker uint8_t vxi_proxy;
76*4dc78e53SAndroid Build Coastguard Worker uint8_t vxi_rsc;
77*4dc78e53SAndroid Build Coastguard Worker uint8_t vxi_l2miss;
78*4dc78e53SAndroid Build Coastguard Worker uint8_t vxi_l3miss;
79*4dc78e53SAndroid Build Coastguard Worker uint16_t vxi_port;
80*4dc78e53SAndroid Build Coastguard Worker uint8_t vxi_udp_csum;
81*4dc78e53SAndroid Build Coastguard Worker uint8_t vxi_udp_zero_csum6_tx;
82*4dc78e53SAndroid Build Coastguard Worker uint8_t vxi_udp_zero_csum6_rx;
83*4dc78e53SAndroid Build Coastguard Worker uint8_t vxi_remcsum_tx;
84*4dc78e53SAndroid Build Coastguard Worker uint8_t vxi_remcsum_rx;
85*4dc78e53SAndroid Build Coastguard Worker uint8_t vxi_collect_metadata;
86*4dc78e53SAndroid Build Coastguard Worker uint32_t vxi_label;
87*4dc78e53SAndroid Build Coastguard Worker uint32_t ce_mask;
88*4dc78e53SAndroid Build Coastguard Worker };
89*4dc78e53SAndroid Build Coastguard Worker
90*4dc78e53SAndroid Build Coastguard Worker /** @endcond */
91*4dc78e53SAndroid Build Coastguard Worker
92*4dc78e53SAndroid Build Coastguard Worker static struct nla_policy vxlan_policy[IFLA_VXLAN_MAX+1] = {
93*4dc78e53SAndroid Build Coastguard Worker [IFLA_VXLAN_ID] = { .type = NLA_U32 },
94*4dc78e53SAndroid Build Coastguard Worker [IFLA_VXLAN_GROUP] = { .minlen = sizeof(uint32_t) },
95*4dc78e53SAndroid Build Coastguard Worker [IFLA_VXLAN_GROUP6] = { .minlen = sizeof(struct in6_addr) },
96*4dc78e53SAndroid Build Coastguard Worker [IFLA_VXLAN_LINK] = { .type = NLA_U32 },
97*4dc78e53SAndroid Build Coastguard Worker [IFLA_VXLAN_LOCAL] = { .minlen = sizeof(uint32_t) },
98*4dc78e53SAndroid Build Coastguard Worker [IFLA_VXLAN_LOCAL6] = { .minlen = sizeof(struct in6_addr) },
99*4dc78e53SAndroid Build Coastguard Worker [IFLA_VXLAN_TTL] = { .type = NLA_U8 },
100*4dc78e53SAndroid Build Coastguard Worker [IFLA_VXLAN_TOS] = { .type = NLA_U8 },
101*4dc78e53SAndroid Build Coastguard Worker [IFLA_VXLAN_LABEL] = { .type = NLA_U32 },
102*4dc78e53SAndroid Build Coastguard Worker [IFLA_VXLAN_LEARNING] = { .type = NLA_U8 },
103*4dc78e53SAndroid Build Coastguard Worker [IFLA_VXLAN_AGEING] = { .type = NLA_U32 },
104*4dc78e53SAndroid Build Coastguard Worker [IFLA_VXLAN_LIMIT] = { .type = NLA_U32 },
105*4dc78e53SAndroid Build Coastguard Worker [IFLA_VXLAN_PORT_RANGE] = { .minlen = sizeof(struct ifla_vxlan_port_range) },
106*4dc78e53SAndroid Build Coastguard Worker [IFLA_VXLAN_PROXY] = { .type = NLA_U8 },
107*4dc78e53SAndroid Build Coastguard Worker [IFLA_VXLAN_RSC] = { .type = NLA_U8 },
108*4dc78e53SAndroid Build Coastguard Worker [IFLA_VXLAN_L2MISS] = { .type = NLA_U8 },
109*4dc78e53SAndroid Build Coastguard Worker [IFLA_VXLAN_L3MISS] = { .type = NLA_U8 },
110*4dc78e53SAndroid Build Coastguard Worker [IFLA_VXLAN_COLLECT_METADATA] = { .type = NLA_U8 },
111*4dc78e53SAndroid Build Coastguard Worker [IFLA_VXLAN_PORT] = { .type = NLA_U16 },
112*4dc78e53SAndroid Build Coastguard Worker [IFLA_VXLAN_UDP_CSUM] = { .type = NLA_U8 },
113*4dc78e53SAndroid Build Coastguard Worker [IFLA_VXLAN_UDP_ZERO_CSUM6_TX] = { .type = NLA_U8 },
114*4dc78e53SAndroid Build Coastguard Worker [IFLA_VXLAN_UDP_ZERO_CSUM6_RX] = { .type = NLA_U8 },
115*4dc78e53SAndroid Build Coastguard Worker [IFLA_VXLAN_REMCSUM_TX] = { .type = NLA_U8 },
116*4dc78e53SAndroid Build Coastguard Worker [IFLA_VXLAN_REMCSUM_RX] = { .type = NLA_U8 },
117*4dc78e53SAndroid Build Coastguard Worker [IFLA_VXLAN_GBP] = { .type = NLA_FLAG, },
118*4dc78e53SAndroid Build Coastguard Worker [IFLA_VXLAN_GPE] = { .type = NLA_FLAG, },
119*4dc78e53SAndroid Build Coastguard Worker [IFLA_VXLAN_REMCSUM_NOPARTIAL] = { .type = NLA_FLAG },
120*4dc78e53SAndroid Build Coastguard Worker };
121*4dc78e53SAndroid Build Coastguard Worker
vxlan_alloc(struct rtnl_link * link)122*4dc78e53SAndroid Build Coastguard Worker static int vxlan_alloc(struct rtnl_link *link)
123*4dc78e53SAndroid Build Coastguard Worker {
124*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi;
125*4dc78e53SAndroid Build Coastguard Worker
126*4dc78e53SAndroid Build Coastguard Worker if (link->l_info)
127*4dc78e53SAndroid Build Coastguard Worker memset(link->l_info, 0, sizeof(*vxi));
128*4dc78e53SAndroid Build Coastguard Worker else {
129*4dc78e53SAndroid Build Coastguard Worker if ((vxi = calloc(1, sizeof(*vxi))) == NULL)
130*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
131*4dc78e53SAndroid Build Coastguard Worker
132*4dc78e53SAndroid Build Coastguard Worker link->l_info = vxi;
133*4dc78e53SAndroid Build Coastguard Worker }
134*4dc78e53SAndroid Build Coastguard Worker
135*4dc78e53SAndroid Build Coastguard Worker return 0;
136*4dc78e53SAndroid Build Coastguard Worker }
137*4dc78e53SAndroid Build Coastguard Worker
vxlan_parse(struct rtnl_link * link,struct nlattr * data,struct nlattr * xstats)138*4dc78e53SAndroid Build Coastguard Worker static int vxlan_parse(struct rtnl_link *link, struct nlattr *data,
139*4dc78e53SAndroid Build Coastguard Worker struct nlattr *xstats)
140*4dc78e53SAndroid Build Coastguard Worker {
141*4dc78e53SAndroid Build Coastguard Worker struct nlattr *tb[IFLA_VXLAN_MAX+1];
142*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi;
143*4dc78e53SAndroid Build Coastguard Worker int err;
144*4dc78e53SAndroid Build Coastguard Worker
145*4dc78e53SAndroid Build Coastguard Worker NL_DBG(3, "Parsing VXLAN link info\n");
146*4dc78e53SAndroid Build Coastguard Worker
147*4dc78e53SAndroid Build Coastguard Worker if ((err = nla_parse_nested(tb, IFLA_VXLAN_MAX, data, vxlan_policy)) < 0)
148*4dc78e53SAndroid Build Coastguard Worker goto errout;
149*4dc78e53SAndroid Build Coastguard Worker
150*4dc78e53SAndroid Build Coastguard Worker if ((err = vxlan_alloc(link)) < 0)
151*4dc78e53SAndroid Build Coastguard Worker goto errout;
152*4dc78e53SAndroid Build Coastguard Worker
153*4dc78e53SAndroid Build Coastguard Worker vxi = link->l_info;
154*4dc78e53SAndroid Build Coastguard Worker
155*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_VXLAN_ID]) {
156*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_id = nla_get_u32(tb[IFLA_VXLAN_ID]);
157*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_ID;
158*4dc78e53SAndroid Build Coastguard Worker }
159*4dc78e53SAndroid Build Coastguard Worker
160*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_VXLAN_GROUP6]) {
161*4dc78e53SAndroid Build Coastguard Worker nla_memcpy(&vxi->vxi_group6, tb[IFLA_VXLAN_GROUP6],
162*4dc78e53SAndroid Build Coastguard Worker sizeof(vxi->vxi_group6));
163*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_GROUP6;
164*4dc78e53SAndroid Build Coastguard Worker }
165*4dc78e53SAndroid Build Coastguard Worker
166*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_VXLAN_GROUP]) {
167*4dc78e53SAndroid Build Coastguard Worker nla_memcpy(&vxi->vxi_group, tb[IFLA_VXLAN_GROUP],
168*4dc78e53SAndroid Build Coastguard Worker sizeof(vxi->vxi_group));
169*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_GROUP;
170*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask &= ~VXLAN_ATTR_GROUP6;
171*4dc78e53SAndroid Build Coastguard Worker }
172*4dc78e53SAndroid Build Coastguard Worker
173*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_VXLAN_LINK]) {
174*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_link = nla_get_u32(tb[IFLA_VXLAN_LINK]);
175*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_LINK;
176*4dc78e53SAndroid Build Coastguard Worker }
177*4dc78e53SAndroid Build Coastguard Worker
178*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_VXLAN_LOCAL6]) {
179*4dc78e53SAndroid Build Coastguard Worker nla_memcpy(&vxi->vxi_local6, tb[IFLA_VXLAN_LOCAL6],
180*4dc78e53SAndroid Build Coastguard Worker sizeof(vxi->vxi_local6));
181*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_LOCAL6;
182*4dc78e53SAndroid Build Coastguard Worker }
183*4dc78e53SAndroid Build Coastguard Worker
184*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_VXLAN_LOCAL]) {
185*4dc78e53SAndroid Build Coastguard Worker nla_memcpy(&vxi->vxi_local, tb[IFLA_VXLAN_LOCAL],
186*4dc78e53SAndroid Build Coastguard Worker sizeof(vxi->vxi_local));
187*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_LOCAL;
188*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask &= ~VXLAN_ATTR_LOCAL6;
189*4dc78e53SAndroid Build Coastguard Worker }
190*4dc78e53SAndroid Build Coastguard Worker
191*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_VXLAN_TTL]) {
192*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_ttl = nla_get_u8(tb[IFLA_VXLAN_TTL]);
193*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_TTL;
194*4dc78e53SAndroid Build Coastguard Worker }
195*4dc78e53SAndroid Build Coastguard Worker
196*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_VXLAN_TOS]) {
197*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_tos = nla_get_u8(tb[IFLA_VXLAN_TOS]);
198*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_TOS;
199*4dc78e53SAndroid Build Coastguard Worker }
200*4dc78e53SAndroid Build Coastguard Worker
201*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_VXLAN_LEARNING]) {
202*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_learning = nla_get_u8(tb[IFLA_VXLAN_LEARNING]);
203*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_LEARNING;
204*4dc78e53SAndroid Build Coastguard Worker }
205*4dc78e53SAndroid Build Coastguard Worker
206*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_VXLAN_AGEING]) {
207*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_ageing = nla_get_u32(tb[IFLA_VXLAN_AGEING]);
208*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_AGEING;
209*4dc78e53SAndroid Build Coastguard Worker }
210*4dc78e53SAndroid Build Coastguard Worker
211*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_VXLAN_LIMIT]) {
212*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_limit = nla_get_u32(tb[IFLA_VXLAN_LIMIT]);
213*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_LIMIT;
214*4dc78e53SAndroid Build Coastguard Worker }
215*4dc78e53SAndroid Build Coastguard Worker
216*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_VXLAN_PORT_RANGE]) {
217*4dc78e53SAndroid Build Coastguard Worker nla_memcpy(&vxi->vxi_port_range, tb[IFLA_VXLAN_PORT_RANGE],
218*4dc78e53SAndroid Build Coastguard Worker sizeof(vxi->vxi_port_range));
219*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_PORT_RANGE;
220*4dc78e53SAndroid Build Coastguard Worker }
221*4dc78e53SAndroid Build Coastguard Worker
222*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_VXLAN_PROXY]) {
223*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_proxy = nla_get_u8(tb[IFLA_VXLAN_PROXY]);
224*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_PROXY;
225*4dc78e53SAndroid Build Coastguard Worker }
226*4dc78e53SAndroid Build Coastguard Worker
227*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_VXLAN_RSC]) {
228*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_rsc = nla_get_u8(tb[IFLA_VXLAN_RSC]);
229*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_RSC;
230*4dc78e53SAndroid Build Coastguard Worker }
231*4dc78e53SAndroid Build Coastguard Worker
232*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_VXLAN_L2MISS]) {
233*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_l2miss = nla_get_u8(tb[IFLA_VXLAN_L2MISS]);
234*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_L2MISS;
235*4dc78e53SAndroid Build Coastguard Worker }
236*4dc78e53SAndroid Build Coastguard Worker
237*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_VXLAN_L3MISS]) {
238*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_l3miss = nla_get_u8(tb[IFLA_VXLAN_L3MISS]);
239*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_L3MISS;
240*4dc78e53SAndroid Build Coastguard Worker }
241*4dc78e53SAndroid Build Coastguard Worker
242*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_VXLAN_PORT]) {
243*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_port = nla_get_u16(tb[IFLA_VXLAN_PORT]);
244*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_PORT;
245*4dc78e53SAndroid Build Coastguard Worker }
246*4dc78e53SAndroid Build Coastguard Worker
247*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_VXLAN_UDP_CSUM]) {
248*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_udp_csum = nla_get_u8(tb[IFLA_VXLAN_UDP_CSUM]);
249*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_UDP_CSUM;
250*4dc78e53SAndroid Build Coastguard Worker }
251*4dc78e53SAndroid Build Coastguard Worker
252*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_VXLAN_UDP_ZERO_CSUM6_TX]) {
253*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_udp_zero_csum6_tx = nla_get_u8(tb[IFLA_VXLAN_UDP_ZERO_CSUM6_TX]);
254*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_UDP_ZERO_CSUM6_TX;
255*4dc78e53SAndroid Build Coastguard Worker }
256*4dc78e53SAndroid Build Coastguard Worker
257*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_VXLAN_UDP_ZERO_CSUM6_RX]) {
258*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_udp_zero_csum6_rx = nla_get_u8(tb[IFLA_VXLAN_UDP_ZERO_CSUM6_RX]);
259*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_UDP_ZERO_CSUM6_RX;
260*4dc78e53SAndroid Build Coastguard Worker }
261*4dc78e53SAndroid Build Coastguard Worker
262*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_VXLAN_REMCSUM_TX]) {
263*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_remcsum_tx = nla_get_u8(tb[IFLA_VXLAN_REMCSUM_TX]);
264*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_REMCSUM_TX;
265*4dc78e53SAndroid Build Coastguard Worker }
266*4dc78e53SAndroid Build Coastguard Worker
267*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_VXLAN_REMCSUM_RX]) {
268*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_remcsum_rx = nla_get_u8(tb[IFLA_VXLAN_REMCSUM_RX]);
269*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_REMCSUM_RX;
270*4dc78e53SAndroid Build Coastguard Worker }
271*4dc78e53SAndroid Build Coastguard Worker
272*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_VXLAN_GBP])
273*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_flags |= RTNL_LINK_VXLAN_F_GBP;
274*4dc78e53SAndroid Build Coastguard Worker
275*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_VXLAN_REMCSUM_NOPARTIAL])
276*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_flags |= RTNL_LINK_VXLAN_F_REMCSUM_NOPARTIAL;
277*4dc78e53SAndroid Build Coastguard Worker
278*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_VXLAN_COLLECT_METADATA]) {
279*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_collect_metadata = nla_get_u8(tb[IFLA_VXLAN_COLLECT_METADATA]);
280*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_COLLECT_METADATA;
281*4dc78e53SAndroid Build Coastguard Worker }
282*4dc78e53SAndroid Build Coastguard Worker
283*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_VXLAN_LABEL]) {
284*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_label = nla_get_u32(tb[IFLA_VXLAN_LABEL]);
285*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_LABEL;
286*4dc78e53SAndroid Build Coastguard Worker }
287*4dc78e53SAndroid Build Coastguard Worker
288*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_VXLAN_GPE])
289*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_flags |= RTNL_LINK_VXLAN_F_GPE;
290*4dc78e53SAndroid Build Coastguard Worker
291*4dc78e53SAndroid Build Coastguard Worker err = 0;
292*4dc78e53SAndroid Build Coastguard Worker
293*4dc78e53SAndroid Build Coastguard Worker errout:
294*4dc78e53SAndroid Build Coastguard Worker return err;
295*4dc78e53SAndroid Build Coastguard Worker }
296*4dc78e53SAndroid Build Coastguard Worker
vxlan_free(struct rtnl_link * link)297*4dc78e53SAndroid Build Coastguard Worker static void vxlan_free(struct rtnl_link *link)
298*4dc78e53SAndroid Build Coastguard Worker {
299*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
300*4dc78e53SAndroid Build Coastguard Worker
301*4dc78e53SAndroid Build Coastguard Worker free(vxi);
302*4dc78e53SAndroid Build Coastguard Worker link->l_info = NULL;
303*4dc78e53SAndroid Build Coastguard Worker }
304*4dc78e53SAndroid Build Coastguard Worker
vxlan_dump_line(struct rtnl_link * link,struct nl_dump_params * p)305*4dc78e53SAndroid Build Coastguard Worker static void vxlan_dump_line(struct rtnl_link *link, struct nl_dump_params *p)
306*4dc78e53SAndroid Build Coastguard Worker {
307*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
308*4dc78e53SAndroid Build Coastguard Worker
309*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "vxlan-id %u", vxi->vxi_id);
310*4dc78e53SAndroid Build Coastguard Worker }
311*4dc78e53SAndroid Build Coastguard Worker
vxlan_dump_details(struct rtnl_link * link,struct nl_dump_params * p)312*4dc78e53SAndroid Build Coastguard Worker static void vxlan_dump_details(struct rtnl_link *link, struct nl_dump_params *p)
313*4dc78e53SAndroid Build Coastguard Worker {
314*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
315*4dc78e53SAndroid Build Coastguard Worker char *name, addr[INET6_ADDRSTRLEN];
316*4dc78e53SAndroid Build Coastguard Worker struct rtnl_link *parent;
317*4dc78e53SAndroid Build Coastguard Worker
318*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, " vxlan-id %u\n", vxi->vxi_id);
319*4dc78e53SAndroid Build Coastguard Worker
320*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_GROUP) {
321*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " group ");
322*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%s\n",
323*4dc78e53SAndroid Build Coastguard Worker _nl_inet_ntop(AF_INET, &vxi->vxi_group, addr));
324*4dc78e53SAndroid Build Coastguard Worker } else if (vxi->ce_mask & VXLAN_ATTR_GROUP6) {
325*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " group ");
326*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%s\n",
327*4dc78e53SAndroid Build Coastguard Worker _nl_inet_ntop(AF_INET6, &vxi->vxi_group6, addr));
328*4dc78e53SAndroid Build Coastguard Worker }
329*4dc78e53SAndroid Build Coastguard Worker
330*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_LINK) {
331*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " link ");
332*4dc78e53SAndroid Build Coastguard Worker
333*4dc78e53SAndroid Build Coastguard Worker name = NULL;
334*4dc78e53SAndroid Build Coastguard Worker parent = link_lookup(link->ce_cache, vxi->vxi_link);
335*4dc78e53SAndroid Build Coastguard Worker if (parent)
336*4dc78e53SAndroid Build Coastguard Worker name = rtnl_link_get_name(parent);
337*4dc78e53SAndroid Build Coastguard Worker
338*4dc78e53SAndroid Build Coastguard Worker if (name)
339*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%s\n", name);
340*4dc78e53SAndroid Build Coastguard Worker else
341*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%u\n", vxi->vxi_link);
342*4dc78e53SAndroid Build Coastguard Worker }
343*4dc78e53SAndroid Build Coastguard Worker
344*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_LOCAL) {
345*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " local ");
346*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%s\n",
347*4dc78e53SAndroid Build Coastguard Worker _nl_inet_ntop(AF_INET, &vxi->vxi_local, addr));
348*4dc78e53SAndroid Build Coastguard Worker } else if (vxi->ce_mask & VXLAN_ATTR_LOCAL6) {
349*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " local ");
350*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%s\n",
351*4dc78e53SAndroid Build Coastguard Worker _nl_inet_ntop(AF_INET6, &vxi->vxi_local6, addr));
352*4dc78e53SAndroid Build Coastguard Worker }
353*4dc78e53SAndroid Build Coastguard Worker
354*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_TTL) {
355*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " ttl ");
356*4dc78e53SAndroid Build Coastguard Worker if(vxi->vxi_ttl)
357*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%u\n", vxi->vxi_ttl);
358*4dc78e53SAndroid Build Coastguard Worker else
359*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "inherit\n");
360*4dc78e53SAndroid Build Coastguard Worker }
361*4dc78e53SAndroid Build Coastguard Worker
362*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_TOS) {
363*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " tos ");
364*4dc78e53SAndroid Build Coastguard Worker if (vxi->vxi_tos == 1)
365*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "inherit\n");
366*4dc78e53SAndroid Build Coastguard Worker else
367*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%#x\n", vxi->vxi_tos);
368*4dc78e53SAndroid Build Coastguard Worker }
369*4dc78e53SAndroid Build Coastguard Worker
370*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_LEARNING) {
371*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " learning ");
372*4dc78e53SAndroid Build Coastguard Worker if (vxi->vxi_learning)
373*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "enabled (%#x)\n", vxi->vxi_learning);
374*4dc78e53SAndroid Build Coastguard Worker else
375*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "disabled\n");
376*4dc78e53SAndroid Build Coastguard Worker }
377*4dc78e53SAndroid Build Coastguard Worker
378*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_AGEING) {
379*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " ageing ");
380*4dc78e53SAndroid Build Coastguard Worker if (vxi->vxi_ageing)
381*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%u seconds\n", vxi->vxi_ageing);
382*4dc78e53SAndroid Build Coastguard Worker else
383*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "disabled\n");
384*4dc78e53SAndroid Build Coastguard Worker }
385*4dc78e53SAndroid Build Coastguard Worker
386*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_LIMIT) {
387*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " limit ");
388*4dc78e53SAndroid Build Coastguard Worker if (vxi->vxi_limit)
389*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%u\n", vxi->vxi_limit);
390*4dc78e53SAndroid Build Coastguard Worker else
391*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "unlimited\n");
392*4dc78e53SAndroid Build Coastguard Worker }
393*4dc78e53SAndroid Build Coastguard Worker
394*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_PORT_RANGE)
395*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, " port range %u - %u\n",
396*4dc78e53SAndroid Build Coastguard Worker ntohs(vxi->vxi_port_range.low),
397*4dc78e53SAndroid Build Coastguard Worker ntohs(vxi->vxi_port_range.high));
398*4dc78e53SAndroid Build Coastguard Worker
399*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_PROXY) {
400*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " proxy ");
401*4dc78e53SAndroid Build Coastguard Worker if (vxi->vxi_proxy)
402*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "enabled (%#x)\n", vxi->vxi_proxy);
403*4dc78e53SAndroid Build Coastguard Worker else
404*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "disabled\n");
405*4dc78e53SAndroid Build Coastguard Worker }
406*4dc78e53SAndroid Build Coastguard Worker
407*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_RSC) {
408*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " rsc ");
409*4dc78e53SAndroid Build Coastguard Worker if (vxi->vxi_rsc)
410*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "enabled (%#x)\n", vxi->vxi_rsc);
411*4dc78e53SAndroid Build Coastguard Worker else
412*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "disabled\n");
413*4dc78e53SAndroid Build Coastguard Worker }
414*4dc78e53SAndroid Build Coastguard Worker
415*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_L2MISS) {
416*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " l2miss ");
417*4dc78e53SAndroid Build Coastguard Worker if (vxi->vxi_l2miss)
418*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "enabled (%#x)\n", vxi->vxi_l2miss);
419*4dc78e53SAndroid Build Coastguard Worker else
420*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "disabled\n");
421*4dc78e53SAndroid Build Coastguard Worker }
422*4dc78e53SAndroid Build Coastguard Worker
423*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_L3MISS) {
424*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " l3miss ");
425*4dc78e53SAndroid Build Coastguard Worker if (vxi->vxi_l3miss)
426*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "enabled (%#x)\n", vxi->vxi_l3miss);
427*4dc78e53SAndroid Build Coastguard Worker else
428*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "disabled\n");
429*4dc78e53SAndroid Build Coastguard Worker }
430*4dc78e53SAndroid Build Coastguard Worker
431*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_PORT) {
432*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " port ");
433*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%u\n", ntohs(vxi->vxi_port));
434*4dc78e53SAndroid Build Coastguard Worker }
435*4dc78e53SAndroid Build Coastguard Worker
436*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_UDP_CSUM) {
437*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " UDP checksums ");
438*4dc78e53SAndroid Build Coastguard Worker if (vxi->vxi_udp_csum)
439*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "enabled (%#x)\n", vxi->vxi_udp_csum);
440*4dc78e53SAndroid Build Coastguard Worker else
441*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "disabled\n");
442*4dc78e53SAndroid Build Coastguard Worker }
443*4dc78e53SAndroid Build Coastguard Worker
444*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_UDP_ZERO_CSUM6_TX) {
445*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " udp-zero-csum6-tx ");
446*4dc78e53SAndroid Build Coastguard Worker if (vxi->vxi_udp_zero_csum6_tx)
447*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "enabled (%#x)\n", vxi->vxi_udp_zero_csum6_tx);
448*4dc78e53SAndroid Build Coastguard Worker else
449*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "disabled\n");
450*4dc78e53SAndroid Build Coastguard Worker }
451*4dc78e53SAndroid Build Coastguard Worker
452*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_UDP_ZERO_CSUM6_RX) {
453*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " udp-zero-csum6-rx ");
454*4dc78e53SAndroid Build Coastguard Worker if (vxi->vxi_udp_zero_csum6_rx)
455*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "enabled (%#x)\n", vxi->vxi_udp_zero_csum6_rx);
456*4dc78e53SAndroid Build Coastguard Worker else
457*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "disabled\n");
458*4dc78e53SAndroid Build Coastguard Worker }
459*4dc78e53SAndroid Build Coastguard Worker
460*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_REMCSUM_TX) {
461*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " remcsum-tx ");
462*4dc78e53SAndroid Build Coastguard Worker if (vxi->vxi_remcsum_tx)
463*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "enabled (%#x)\n", vxi->vxi_remcsum_tx);
464*4dc78e53SAndroid Build Coastguard Worker else
465*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "disabled\n");
466*4dc78e53SAndroid Build Coastguard Worker }
467*4dc78e53SAndroid Build Coastguard Worker
468*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_REMCSUM_RX) {
469*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " remcsum-rx ");
470*4dc78e53SAndroid Build Coastguard Worker if (vxi->vxi_remcsum_rx)
471*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "enabled (%#x)\n", vxi->vxi_remcsum_rx);
472*4dc78e53SAndroid Build Coastguard Worker else
473*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "disabled\n");
474*4dc78e53SAndroid Build Coastguard Worker }
475*4dc78e53SAndroid Build Coastguard Worker
476*4dc78e53SAndroid Build Coastguard Worker if (vxi->vxi_flags & RTNL_LINK_VXLAN_F_GBP)
477*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " gbp\n");
478*4dc78e53SAndroid Build Coastguard Worker
479*4dc78e53SAndroid Build Coastguard Worker if (vxi->vxi_flags & RTNL_LINK_VXLAN_F_REMCSUM_NOPARTIAL)
480*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " rncsum-nopartial\n");
481*4dc78e53SAndroid Build Coastguard Worker
482*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_COLLECT_METADATA) {
483*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " remcsum-rx ");
484*4dc78e53SAndroid Build Coastguard Worker if (vxi->vxi_collect_metadata)
485*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "enabled (%#x)\n", vxi->vxi_collect_metadata);
486*4dc78e53SAndroid Build Coastguard Worker else
487*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "disabled\n");
488*4dc78e53SAndroid Build Coastguard Worker }
489*4dc78e53SAndroid Build Coastguard Worker
490*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_LABEL) {
491*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " label ");
492*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%u\n", ntohl(vxi->vxi_label));
493*4dc78e53SAndroid Build Coastguard Worker }
494*4dc78e53SAndroid Build Coastguard Worker
495*4dc78e53SAndroid Build Coastguard Worker if (vxi->vxi_flags & RTNL_LINK_VXLAN_F_GPE)
496*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " gpe\n");
497*4dc78e53SAndroid Build Coastguard Worker }
498*4dc78e53SAndroid Build Coastguard Worker
vxlan_clone(struct rtnl_link * dst,struct rtnl_link * src)499*4dc78e53SAndroid Build Coastguard Worker static int vxlan_clone(struct rtnl_link *dst, struct rtnl_link *src)
500*4dc78e53SAndroid Build Coastguard Worker {
501*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vdst, *vsrc = src->l_info;
502*4dc78e53SAndroid Build Coastguard Worker int err;
503*4dc78e53SAndroid Build Coastguard Worker
504*4dc78e53SAndroid Build Coastguard Worker dst->l_info = NULL;
505*4dc78e53SAndroid Build Coastguard Worker if ((err = rtnl_link_set_type(dst, "vxlan")) < 0)
506*4dc78e53SAndroid Build Coastguard Worker return err;
507*4dc78e53SAndroid Build Coastguard Worker vdst = dst->l_info;
508*4dc78e53SAndroid Build Coastguard Worker
509*4dc78e53SAndroid Build Coastguard Worker if (!vdst || !vsrc)
510*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
511*4dc78e53SAndroid Build Coastguard Worker
512*4dc78e53SAndroid Build Coastguard Worker memcpy(vdst, vsrc, sizeof(struct vxlan_info));
513*4dc78e53SAndroid Build Coastguard Worker
514*4dc78e53SAndroid Build Coastguard Worker return 0;
515*4dc78e53SAndroid Build Coastguard Worker }
516*4dc78e53SAndroid Build Coastguard Worker
vxlan_put_attrs(struct nl_msg * msg,struct rtnl_link * link)517*4dc78e53SAndroid Build Coastguard Worker static int vxlan_put_attrs(struct nl_msg *msg, struct rtnl_link *link)
518*4dc78e53SAndroid Build Coastguard Worker {
519*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
520*4dc78e53SAndroid Build Coastguard Worker struct nlattr *data;
521*4dc78e53SAndroid Build Coastguard Worker
522*4dc78e53SAndroid Build Coastguard Worker if (!(data = nla_nest_start(msg, IFLA_INFO_DATA)))
523*4dc78e53SAndroid Build Coastguard Worker return -NLE_MSGSIZE;
524*4dc78e53SAndroid Build Coastguard Worker
525*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_ID)
526*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U32(msg, IFLA_VXLAN_ID, vxi->vxi_id);
527*4dc78e53SAndroid Build Coastguard Worker
528*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_GROUP)
529*4dc78e53SAndroid Build Coastguard Worker NLA_PUT(msg, IFLA_VXLAN_GROUP, sizeof(vxi->vxi_group), &vxi->vxi_group);
530*4dc78e53SAndroid Build Coastguard Worker
531*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_GROUP6)
532*4dc78e53SAndroid Build Coastguard Worker NLA_PUT(msg, IFLA_VXLAN_GROUP6, sizeof(vxi->vxi_group6), &vxi->vxi_group6);
533*4dc78e53SAndroid Build Coastguard Worker
534*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_LINK)
535*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U32(msg, IFLA_VXLAN_LINK, vxi->vxi_link);
536*4dc78e53SAndroid Build Coastguard Worker
537*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_LOCAL)
538*4dc78e53SAndroid Build Coastguard Worker NLA_PUT(msg, IFLA_VXLAN_LOCAL, sizeof(vxi->vxi_local), &vxi->vxi_local);
539*4dc78e53SAndroid Build Coastguard Worker
540*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_LOCAL6)
541*4dc78e53SAndroid Build Coastguard Worker NLA_PUT(msg, IFLA_VXLAN_LOCAL6, sizeof(vxi->vxi_local6), &vxi->vxi_local6);
542*4dc78e53SAndroid Build Coastguard Worker
543*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_TTL)
544*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U8(msg, IFLA_VXLAN_TTL, vxi->vxi_ttl);
545*4dc78e53SAndroid Build Coastguard Worker
546*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_TOS)
547*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U8(msg, IFLA_VXLAN_TOS, vxi->vxi_tos);
548*4dc78e53SAndroid Build Coastguard Worker
549*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_LEARNING)
550*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U8(msg, IFLA_VXLAN_LEARNING, vxi->vxi_learning);
551*4dc78e53SAndroid Build Coastguard Worker
552*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_AGEING)
553*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U32(msg, IFLA_VXLAN_AGEING, vxi->vxi_ageing);
554*4dc78e53SAndroid Build Coastguard Worker
555*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_LIMIT)
556*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U32(msg, IFLA_VXLAN_LIMIT, vxi->vxi_limit);
557*4dc78e53SAndroid Build Coastguard Worker
558*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_PORT_RANGE)
559*4dc78e53SAndroid Build Coastguard Worker NLA_PUT(msg, IFLA_VXLAN_PORT_RANGE, sizeof(vxi->vxi_port_range),
560*4dc78e53SAndroid Build Coastguard Worker &vxi->vxi_port_range);
561*4dc78e53SAndroid Build Coastguard Worker
562*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_PROXY)
563*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U8(msg, IFLA_VXLAN_PROXY, vxi->vxi_proxy);
564*4dc78e53SAndroid Build Coastguard Worker
565*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_RSC)
566*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U8(msg, IFLA_VXLAN_RSC, vxi->vxi_rsc);
567*4dc78e53SAndroid Build Coastguard Worker
568*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_L2MISS)
569*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U8(msg, IFLA_VXLAN_L2MISS, vxi->vxi_l2miss);
570*4dc78e53SAndroid Build Coastguard Worker
571*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_L3MISS)
572*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U8(msg, IFLA_VXLAN_L3MISS, vxi->vxi_l3miss);
573*4dc78e53SAndroid Build Coastguard Worker
574*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_PORT)
575*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U32(msg, IFLA_VXLAN_PORT, vxi->vxi_port);
576*4dc78e53SAndroid Build Coastguard Worker
577*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_UDP_CSUM)
578*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U8(msg, IFLA_VXLAN_UDP_CSUM, vxi->vxi_udp_csum);
579*4dc78e53SAndroid Build Coastguard Worker
580*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_UDP_ZERO_CSUM6_TX)
581*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U8(msg, IFLA_VXLAN_UDP_ZERO_CSUM6_TX, vxi->vxi_udp_zero_csum6_tx);
582*4dc78e53SAndroid Build Coastguard Worker
583*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_UDP_ZERO_CSUM6_RX)
584*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U8(msg, IFLA_VXLAN_UDP_ZERO_CSUM6_RX, vxi->vxi_udp_zero_csum6_rx);
585*4dc78e53SAndroid Build Coastguard Worker
586*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_REMCSUM_TX)
587*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U8(msg, IFLA_VXLAN_REMCSUM_TX, vxi->vxi_remcsum_tx);
588*4dc78e53SAndroid Build Coastguard Worker
589*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_REMCSUM_RX)
590*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U8(msg, IFLA_VXLAN_REMCSUM_RX, vxi->vxi_remcsum_rx);
591*4dc78e53SAndroid Build Coastguard Worker
592*4dc78e53SAndroid Build Coastguard Worker if (vxi->vxi_flags & RTNL_LINK_VXLAN_F_GBP)
593*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_FLAG(msg, IFLA_VXLAN_GBP);
594*4dc78e53SAndroid Build Coastguard Worker
595*4dc78e53SAndroid Build Coastguard Worker if (vxi->vxi_flags & RTNL_LINK_VXLAN_F_REMCSUM_NOPARTIAL)
596*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_FLAG(msg, IFLA_VXLAN_REMCSUM_NOPARTIAL);
597*4dc78e53SAndroid Build Coastguard Worker
598*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_COLLECT_METADATA)
599*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U8(msg, IFLA_VXLAN_COLLECT_METADATA, vxi->vxi_collect_metadata);
600*4dc78e53SAndroid Build Coastguard Worker
601*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_LABEL)
602*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U32(msg, IFLA_VXLAN_LABEL, vxi->vxi_label);
603*4dc78e53SAndroid Build Coastguard Worker
604*4dc78e53SAndroid Build Coastguard Worker if (vxi->vxi_flags & RTNL_LINK_VXLAN_F_GPE)
605*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_FLAG(msg, IFLA_VXLAN_GPE);
606*4dc78e53SAndroid Build Coastguard Worker
607*4dc78e53SAndroid Build Coastguard Worker nla_nest_end(msg, data);
608*4dc78e53SAndroid Build Coastguard Worker
609*4dc78e53SAndroid Build Coastguard Worker nla_put_failure:
610*4dc78e53SAndroid Build Coastguard Worker
611*4dc78e53SAndroid Build Coastguard Worker return 0;
612*4dc78e53SAndroid Build Coastguard Worker }
613*4dc78e53SAndroid Build Coastguard Worker
vxlan_compare(struct rtnl_link * link_a,struct rtnl_link * link_b,int flags)614*4dc78e53SAndroid Build Coastguard Worker static int vxlan_compare(struct rtnl_link *link_a, struct rtnl_link *link_b,
615*4dc78e53SAndroid Build Coastguard Worker int flags)
616*4dc78e53SAndroid Build Coastguard Worker {
617*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *a = link_a->l_info;
618*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *b = link_b->l_info;
619*4dc78e53SAndroid Build Coastguard Worker int diff = 0;
620*4dc78e53SAndroid Build Coastguard Worker uint32_t attrs = flags & LOOSE_COMPARISON ? b->ce_mask :
621*4dc78e53SAndroid Build Coastguard Worker ~((uint32_t)0u);
622*4dc78e53SAndroid Build Coastguard Worker
623*4dc78e53SAndroid Build Coastguard Worker #define _DIFF(ATTR, EXPR) ATTR_DIFF(attrs, ATTR, a, b, EXPR)
624*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(VXLAN_ATTR_ID, a->vxi_id != b->vxi_id);
625*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(VXLAN_ATTR_GROUP, a->vxi_group != b->vxi_group);
626*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(VXLAN_ATTR_LINK, a->vxi_link != b->vxi_link);
627*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(VXLAN_ATTR_LOCAL, a->vxi_local != b->vxi_local);
628*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(VXLAN_ATTR_TOS, a->vxi_tos != b->vxi_tos);
629*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(VXLAN_ATTR_TTL, a->vxi_ttl != b->vxi_ttl);
630*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(VXLAN_ATTR_LEARNING, a->vxi_learning != b->vxi_learning);
631*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(VXLAN_ATTR_AGEING, a->vxi_ageing != b->vxi_ageing);
632*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(VXLAN_ATTR_LIMIT, a->vxi_limit != b->vxi_limit);
633*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(VXLAN_ATTR_PORT_RANGE,
634*4dc78e53SAndroid Build Coastguard Worker a->vxi_port_range.low != b->vxi_port_range.low);
635*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(VXLAN_ATTR_PORT_RANGE,
636*4dc78e53SAndroid Build Coastguard Worker a->vxi_port_range.high != b->vxi_port_range.high);
637*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(VXLAN_ATTR_PROXY, a->vxi_proxy != b->vxi_proxy);
638*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(VXLAN_ATTR_RSC, a->vxi_proxy != b->vxi_proxy);
639*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(VXLAN_ATTR_L2MISS, a->vxi_proxy != b->vxi_proxy);
640*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(VXLAN_ATTR_L3MISS, a->vxi_proxy != b->vxi_proxy);
641*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(VXLAN_ATTR_PORT, a->vxi_port != b->vxi_port);
642*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(VXLAN_ATTR_GROUP6, memcmp(&a->vxi_group6, &b->vxi_group6,
643*4dc78e53SAndroid Build Coastguard Worker sizeof(a->vxi_group6)) != 0);
644*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(VXLAN_ATTR_LOCAL6, memcmp(&a->vxi_local6, &b->vxi_local6,
645*4dc78e53SAndroid Build Coastguard Worker sizeof(a->vxi_local6)) != 0);
646*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(VXLAN_ATTR_UDP_CSUM, a->vxi_proxy != b->vxi_proxy);
647*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(VXLAN_ATTR_UDP_ZERO_CSUM6_TX,
648*4dc78e53SAndroid Build Coastguard Worker a->vxi_proxy != b->vxi_proxy);
649*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(VXLAN_ATTR_UDP_ZERO_CSUM6_RX,
650*4dc78e53SAndroid Build Coastguard Worker a->vxi_proxy != b->vxi_proxy);
651*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(VXLAN_ATTR_REMCSUM_TX, a->vxi_proxy != b->vxi_proxy);
652*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(VXLAN_ATTR_REMCSUM_RX, a->vxi_proxy != b->vxi_proxy);
653*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(VXLAN_ATTR_COLLECT_METADATA,
654*4dc78e53SAndroid Build Coastguard Worker a->vxi_collect_metadata != b->vxi_collect_metadata);
655*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(VXLAN_ATTR_LABEL, a->vxi_label != b->vxi_label);
656*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(VXLAN_ATTR_FLAGS, a->vxi_flags != b->vxi_flags);
657*4dc78e53SAndroid Build Coastguard Worker #undef _DIFF
658*4dc78e53SAndroid Build Coastguard Worker
659*4dc78e53SAndroid Build Coastguard Worker return diff;
660*4dc78e53SAndroid Build Coastguard Worker }
661*4dc78e53SAndroid Build Coastguard Worker
662*4dc78e53SAndroid Build Coastguard Worker static struct rtnl_link_info_ops vxlan_info_ops = {
663*4dc78e53SAndroid Build Coastguard Worker .io_name = "vxlan",
664*4dc78e53SAndroid Build Coastguard Worker .io_alloc = vxlan_alloc,
665*4dc78e53SAndroid Build Coastguard Worker .io_parse = vxlan_parse,
666*4dc78e53SAndroid Build Coastguard Worker .io_dump = {
667*4dc78e53SAndroid Build Coastguard Worker [NL_DUMP_LINE] = vxlan_dump_line,
668*4dc78e53SAndroid Build Coastguard Worker [NL_DUMP_DETAILS] = vxlan_dump_details,
669*4dc78e53SAndroid Build Coastguard Worker },
670*4dc78e53SAndroid Build Coastguard Worker .io_clone = vxlan_clone,
671*4dc78e53SAndroid Build Coastguard Worker .io_put_attrs = vxlan_put_attrs,
672*4dc78e53SAndroid Build Coastguard Worker .io_free = vxlan_free,
673*4dc78e53SAndroid Build Coastguard Worker .io_compare = vxlan_compare,
674*4dc78e53SAndroid Build Coastguard Worker };
675*4dc78e53SAndroid Build Coastguard Worker
676*4dc78e53SAndroid Build Coastguard Worker /** @cond SKIP */
677*4dc78e53SAndroid Build Coastguard Worker #define IS_VXLAN_LINK_ASSERT(link) \
678*4dc78e53SAndroid Build Coastguard Worker if ((link)->l_info_ops != &vxlan_info_ops) { \
679*4dc78e53SAndroid Build Coastguard Worker APPBUG("Link is not a vxlan link. set type \"vxlan\" first."); \
680*4dc78e53SAndroid Build Coastguard Worker return -NLE_OPNOTSUPP; \
681*4dc78e53SAndroid Build Coastguard Worker }
682*4dc78e53SAndroid Build Coastguard Worker /** @endcond */
683*4dc78e53SAndroid Build Coastguard Worker
684*4dc78e53SAndroid Build Coastguard Worker /**
685*4dc78e53SAndroid Build Coastguard Worker * @name VXLAN Object
686*4dc78e53SAndroid Build Coastguard Worker * @{
687*4dc78e53SAndroid Build Coastguard Worker */
688*4dc78e53SAndroid Build Coastguard Worker
689*4dc78e53SAndroid Build Coastguard Worker /**
690*4dc78e53SAndroid Build Coastguard Worker * Allocate link object of type VXLAN
691*4dc78e53SAndroid Build Coastguard Worker *
692*4dc78e53SAndroid Build Coastguard Worker * @return Allocated link object or NULL.
693*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_alloc(void)694*4dc78e53SAndroid Build Coastguard Worker struct rtnl_link *rtnl_link_vxlan_alloc(void)
695*4dc78e53SAndroid Build Coastguard Worker {
696*4dc78e53SAndroid Build Coastguard Worker struct rtnl_link *link;
697*4dc78e53SAndroid Build Coastguard Worker
698*4dc78e53SAndroid Build Coastguard Worker if (!(link = rtnl_link_alloc()))
699*4dc78e53SAndroid Build Coastguard Worker return NULL;
700*4dc78e53SAndroid Build Coastguard Worker
701*4dc78e53SAndroid Build Coastguard Worker if (rtnl_link_set_type(link, "vxlan") < 0) {
702*4dc78e53SAndroid Build Coastguard Worker rtnl_link_put(link);
703*4dc78e53SAndroid Build Coastguard Worker return NULL;
704*4dc78e53SAndroid Build Coastguard Worker }
705*4dc78e53SAndroid Build Coastguard Worker
706*4dc78e53SAndroid Build Coastguard Worker return link;
707*4dc78e53SAndroid Build Coastguard Worker }
708*4dc78e53SAndroid Build Coastguard Worker
709*4dc78e53SAndroid Build Coastguard Worker /**
710*4dc78e53SAndroid Build Coastguard Worker * Check if link is a VXLAN link
711*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
712*4dc78e53SAndroid Build Coastguard Worker *
713*4dc78e53SAndroid Build Coastguard Worker * @return True if link is a VXLAN link, otherwise false is returned.
714*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_is_vxlan(struct rtnl_link * link)715*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_is_vxlan(struct rtnl_link *link)
716*4dc78e53SAndroid Build Coastguard Worker {
717*4dc78e53SAndroid Build Coastguard Worker return link->l_info_ops && !strcmp(link->l_info_ops->io_name, "vxlan");
718*4dc78e53SAndroid Build Coastguard Worker }
719*4dc78e53SAndroid Build Coastguard Worker
720*4dc78e53SAndroid Build Coastguard Worker /**
721*4dc78e53SAndroid Build Coastguard Worker * Set VXLAN Network Identifier
722*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
723*4dc78e53SAndroid Build Coastguard Worker * @arg id VXLAN network identifier (or VXLAN segment identifier)
724*4dc78e53SAndroid Build Coastguard Worker *
725*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
726*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_set_id(struct rtnl_link * link,uint32_t id)727*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_set_id(struct rtnl_link *link, uint32_t id)
728*4dc78e53SAndroid Build Coastguard Worker {
729*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
730*4dc78e53SAndroid Build Coastguard Worker
731*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
732*4dc78e53SAndroid Build Coastguard Worker
733*4dc78e53SAndroid Build Coastguard Worker if (id > VXLAN_ID_MAX)
734*4dc78e53SAndroid Build Coastguard Worker return -NLE_INVAL;
735*4dc78e53SAndroid Build Coastguard Worker
736*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_id = id;
737*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_ID;
738*4dc78e53SAndroid Build Coastguard Worker
739*4dc78e53SAndroid Build Coastguard Worker return 0;
740*4dc78e53SAndroid Build Coastguard Worker }
741*4dc78e53SAndroid Build Coastguard Worker
742*4dc78e53SAndroid Build Coastguard Worker /**
743*4dc78e53SAndroid Build Coastguard Worker * Get VXLAN Network Identifier
744*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
745*4dc78e53SAndroid Build Coastguard Worker * @arg id Pointer to store network identifier
746*4dc78e53SAndroid Build Coastguard Worker *
747*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
748*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_get_id(struct rtnl_link * link,uint32_t * id)749*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_get_id(struct rtnl_link *link, uint32_t *id)
750*4dc78e53SAndroid Build Coastguard Worker {
751*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
752*4dc78e53SAndroid Build Coastguard Worker
753*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
754*4dc78e53SAndroid Build Coastguard Worker
755*4dc78e53SAndroid Build Coastguard Worker if(!id)
756*4dc78e53SAndroid Build Coastguard Worker return -NLE_INVAL;
757*4dc78e53SAndroid Build Coastguard Worker
758*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_ID)
759*4dc78e53SAndroid Build Coastguard Worker *id = vxi->vxi_id;
760*4dc78e53SAndroid Build Coastguard Worker else
761*4dc78e53SAndroid Build Coastguard Worker return -NLE_AGAIN;
762*4dc78e53SAndroid Build Coastguard Worker
763*4dc78e53SAndroid Build Coastguard Worker return 0;
764*4dc78e53SAndroid Build Coastguard Worker }
765*4dc78e53SAndroid Build Coastguard Worker
766*4dc78e53SAndroid Build Coastguard Worker /**
767*4dc78e53SAndroid Build Coastguard Worker * Set VXLAN multicast IP address
768*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
769*4dc78e53SAndroid Build Coastguard Worker * @arg addr Multicast IP address to join
770*4dc78e53SAndroid Build Coastguard Worker *
771*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
772*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_set_group(struct rtnl_link * link,struct nl_addr * addr)773*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_set_group(struct rtnl_link *link, struct nl_addr *addr)
774*4dc78e53SAndroid Build Coastguard Worker {
775*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
776*4dc78e53SAndroid Build Coastguard Worker
777*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
778*4dc78e53SAndroid Build Coastguard Worker
779*4dc78e53SAndroid Build Coastguard Worker if ((nl_addr_get_family(addr) == AF_INET) &&
780*4dc78e53SAndroid Build Coastguard Worker (nl_addr_get_len(addr) == sizeof(vxi->vxi_group))) {
781*4dc78e53SAndroid Build Coastguard Worker memcpy(&vxi->vxi_group, nl_addr_get_binary_addr(addr),
782*4dc78e53SAndroid Build Coastguard Worker sizeof(vxi->vxi_group));
783*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_GROUP;
784*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask &= ~VXLAN_ATTR_GROUP6;
785*4dc78e53SAndroid Build Coastguard Worker } else if ((nl_addr_get_family(addr) == AF_INET6) &&
786*4dc78e53SAndroid Build Coastguard Worker (nl_addr_get_len(addr) == sizeof(vxi->vxi_group6))) {
787*4dc78e53SAndroid Build Coastguard Worker memcpy(&vxi->vxi_group6, nl_addr_get_binary_addr(addr),
788*4dc78e53SAndroid Build Coastguard Worker sizeof(vxi->vxi_group6));
789*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_GROUP6;
790*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask &= ~VXLAN_ATTR_GROUP;
791*4dc78e53SAndroid Build Coastguard Worker } else
792*4dc78e53SAndroid Build Coastguard Worker return -NLE_INVAL;
793*4dc78e53SAndroid Build Coastguard Worker
794*4dc78e53SAndroid Build Coastguard Worker return 0;
795*4dc78e53SAndroid Build Coastguard Worker }
796*4dc78e53SAndroid Build Coastguard Worker
797*4dc78e53SAndroid Build Coastguard Worker /**
798*4dc78e53SAndroid Build Coastguard Worker * Get VXLAN multicast IP address
799*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
800*4dc78e53SAndroid Build Coastguard Worker * @arg addr Pointer to store multicast IP address
801*4dc78e53SAndroid Build Coastguard Worker *
802*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
803*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_get_group(struct rtnl_link * link,struct nl_addr ** addr)804*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_get_group(struct rtnl_link *link, struct nl_addr **addr)
805*4dc78e53SAndroid Build Coastguard Worker {
806*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
807*4dc78e53SAndroid Build Coastguard Worker
808*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
809*4dc78e53SAndroid Build Coastguard Worker
810*4dc78e53SAndroid Build Coastguard Worker if (!addr)
811*4dc78e53SAndroid Build Coastguard Worker return -NLE_INVAL;
812*4dc78e53SAndroid Build Coastguard Worker
813*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_GROUP)
814*4dc78e53SAndroid Build Coastguard Worker *addr = nl_addr_build(AF_INET, &vxi->vxi_group, sizeof(vxi->vxi_group));
815*4dc78e53SAndroid Build Coastguard Worker else if (vxi->ce_mask & VXLAN_ATTR_GROUP6)
816*4dc78e53SAndroid Build Coastguard Worker *addr = nl_addr_build(AF_INET6, &vxi->vxi_group6, sizeof(vxi->vxi_group6));
817*4dc78e53SAndroid Build Coastguard Worker else
818*4dc78e53SAndroid Build Coastguard Worker return -NLE_AGAIN;
819*4dc78e53SAndroid Build Coastguard Worker
820*4dc78e53SAndroid Build Coastguard Worker return 0;
821*4dc78e53SAndroid Build Coastguard Worker }
822*4dc78e53SAndroid Build Coastguard Worker
823*4dc78e53SAndroid Build Coastguard Worker /**
824*4dc78e53SAndroid Build Coastguard Worker * Set physical device to use for VXLAN
825*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
826*4dc78e53SAndroid Build Coastguard Worker * @arg index Interface index
827*4dc78e53SAndroid Build Coastguard Worker *
828*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
829*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_set_link(struct rtnl_link * link,uint32_t index)830*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_set_link(struct rtnl_link *link, uint32_t index)
831*4dc78e53SAndroid Build Coastguard Worker {
832*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
833*4dc78e53SAndroid Build Coastguard Worker
834*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
835*4dc78e53SAndroid Build Coastguard Worker
836*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_link = index;
837*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_LINK;
838*4dc78e53SAndroid Build Coastguard Worker
839*4dc78e53SAndroid Build Coastguard Worker return 0;
840*4dc78e53SAndroid Build Coastguard Worker }
841*4dc78e53SAndroid Build Coastguard Worker
842*4dc78e53SAndroid Build Coastguard Worker /**
843*4dc78e53SAndroid Build Coastguard Worker * Get physical device to use for VXLAN
844*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
845*4dc78e53SAndroid Build Coastguard Worker * @arg index Pointer to store interface index
846*4dc78e53SAndroid Build Coastguard Worker *
847*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
848*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_get_link(struct rtnl_link * link,uint32_t * index)849*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_get_link(struct rtnl_link *link, uint32_t *index)
850*4dc78e53SAndroid Build Coastguard Worker {
851*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
852*4dc78e53SAndroid Build Coastguard Worker
853*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
854*4dc78e53SAndroid Build Coastguard Worker
855*4dc78e53SAndroid Build Coastguard Worker if (!index)
856*4dc78e53SAndroid Build Coastguard Worker return -NLE_INVAL;
857*4dc78e53SAndroid Build Coastguard Worker
858*4dc78e53SAndroid Build Coastguard Worker if (!(vxi->ce_mask & VXLAN_ATTR_LINK))
859*4dc78e53SAndroid Build Coastguard Worker return -NLE_AGAIN;
860*4dc78e53SAndroid Build Coastguard Worker
861*4dc78e53SAndroid Build Coastguard Worker *index = vxi->vxi_link;
862*4dc78e53SAndroid Build Coastguard Worker
863*4dc78e53SAndroid Build Coastguard Worker return 0;
864*4dc78e53SAndroid Build Coastguard Worker }
865*4dc78e53SAndroid Build Coastguard Worker
866*4dc78e53SAndroid Build Coastguard Worker /**
867*4dc78e53SAndroid Build Coastguard Worker * Set source address to use for VXLAN
868*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
869*4dc78e53SAndroid Build Coastguard Worker * @arg addr Local address
870*4dc78e53SAndroid Build Coastguard Worker *
871*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
872*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_set_local(struct rtnl_link * link,struct nl_addr * addr)873*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_set_local(struct rtnl_link *link, struct nl_addr *addr)
874*4dc78e53SAndroid Build Coastguard Worker {
875*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
876*4dc78e53SAndroid Build Coastguard Worker
877*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
878*4dc78e53SAndroid Build Coastguard Worker
879*4dc78e53SAndroid Build Coastguard Worker if ((nl_addr_get_family(addr) == AF_INET) &&
880*4dc78e53SAndroid Build Coastguard Worker (nl_addr_get_len(addr) == sizeof(vxi->vxi_local))) {
881*4dc78e53SAndroid Build Coastguard Worker memcpy(&vxi->vxi_local, nl_addr_get_binary_addr(addr),
882*4dc78e53SAndroid Build Coastguard Worker sizeof(vxi->vxi_local));
883*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_LOCAL;
884*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask &= ~VXLAN_ATTR_LOCAL6;
885*4dc78e53SAndroid Build Coastguard Worker } else if ((nl_addr_get_family(addr) == AF_INET6) &&
886*4dc78e53SAndroid Build Coastguard Worker (nl_addr_get_len(addr) == sizeof(vxi->vxi_local6))) {
887*4dc78e53SAndroid Build Coastguard Worker memcpy(&vxi->vxi_local6, nl_addr_get_binary_addr(addr),
888*4dc78e53SAndroid Build Coastguard Worker sizeof(vxi->vxi_local6));
889*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_LOCAL6;
890*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask &= ~VXLAN_ATTR_LOCAL;
891*4dc78e53SAndroid Build Coastguard Worker } else
892*4dc78e53SAndroid Build Coastguard Worker return -NLE_INVAL;
893*4dc78e53SAndroid Build Coastguard Worker
894*4dc78e53SAndroid Build Coastguard Worker return 0;
895*4dc78e53SAndroid Build Coastguard Worker }
896*4dc78e53SAndroid Build Coastguard Worker
897*4dc78e53SAndroid Build Coastguard Worker /**
898*4dc78e53SAndroid Build Coastguard Worker * Get source address to use for VXLAN
899*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
900*4dc78e53SAndroid Build Coastguard Worker * @arg addr Pointer to store local address
901*4dc78e53SAndroid Build Coastguard Worker *
902*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
903*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_get_local(struct rtnl_link * link,struct nl_addr ** addr)904*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_get_local(struct rtnl_link *link, struct nl_addr **addr)
905*4dc78e53SAndroid Build Coastguard Worker {
906*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
907*4dc78e53SAndroid Build Coastguard Worker
908*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
909*4dc78e53SAndroid Build Coastguard Worker
910*4dc78e53SAndroid Build Coastguard Worker if (!addr)
911*4dc78e53SAndroid Build Coastguard Worker return -NLE_INVAL;
912*4dc78e53SAndroid Build Coastguard Worker
913*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_LOCAL)
914*4dc78e53SAndroid Build Coastguard Worker *addr = nl_addr_build(AF_INET, &vxi->vxi_local, sizeof(vxi->vxi_local));
915*4dc78e53SAndroid Build Coastguard Worker else if (vxi->ce_mask & VXLAN_ATTR_LOCAL6)
916*4dc78e53SAndroid Build Coastguard Worker *addr = nl_addr_build(AF_INET6, &vxi->vxi_local6, sizeof(vxi->vxi_local6));
917*4dc78e53SAndroid Build Coastguard Worker else
918*4dc78e53SAndroid Build Coastguard Worker return -NLE_AGAIN;
919*4dc78e53SAndroid Build Coastguard Worker
920*4dc78e53SAndroid Build Coastguard Worker return 0;
921*4dc78e53SAndroid Build Coastguard Worker }
922*4dc78e53SAndroid Build Coastguard Worker
923*4dc78e53SAndroid Build Coastguard Worker /**
924*4dc78e53SAndroid Build Coastguard Worker * Set IP TTL value to use for VXLAN
925*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
926*4dc78e53SAndroid Build Coastguard Worker * @arg ttl TTL value
927*4dc78e53SAndroid Build Coastguard Worker *
928*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
929*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_set_ttl(struct rtnl_link * link,uint8_t ttl)930*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_set_ttl(struct rtnl_link *link, uint8_t ttl)
931*4dc78e53SAndroid Build Coastguard Worker {
932*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
933*4dc78e53SAndroid Build Coastguard Worker
934*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
935*4dc78e53SAndroid Build Coastguard Worker
936*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_ttl = ttl;
937*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_TTL;
938*4dc78e53SAndroid Build Coastguard Worker
939*4dc78e53SAndroid Build Coastguard Worker return 0;
940*4dc78e53SAndroid Build Coastguard Worker }
941*4dc78e53SAndroid Build Coastguard Worker
942*4dc78e53SAndroid Build Coastguard Worker /**
943*4dc78e53SAndroid Build Coastguard Worker * Get IP TTL value to use for VXLAN
944*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
945*4dc78e53SAndroid Build Coastguard Worker *
946*4dc78e53SAndroid Build Coastguard Worker * @return TTL value on success or a negative error code
947*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_get_ttl(struct rtnl_link * link)948*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_get_ttl(struct rtnl_link *link)
949*4dc78e53SAndroid Build Coastguard Worker {
950*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
951*4dc78e53SAndroid Build Coastguard Worker
952*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
953*4dc78e53SAndroid Build Coastguard Worker
954*4dc78e53SAndroid Build Coastguard Worker if (!(vxi->ce_mask & VXLAN_ATTR_TTL))
955*4dc78e53SAndroid Build Coastguard Worker return -NLE_AGAIN;
956*4dc78e53SAndroid Build Coastguard Worker
957*4dc78e53SAndroid Build Coastguard Worker return vxi->vxi_ttl;
958*4dc78e53SAndroid Build Coastguard Worker }
959*4dc78e53SAndroid Build Coastguard Worker
960*4dc78e53SAndroid Build Coastguard Worker /**
961*4dc78e53SAndroid Build Coastguard Worker * Set IP ToS value to use for VXLAN
962*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
963*4dc78e53SAndroid Build Coastguard Worker * @arg tos ToS value
964*4dc78e53SAndroid Build Coastguard Worker *
965*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
966*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_set_tos(struct rtnl_link * link,uint8_t tos)967*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_set_tos(struct rtnl_link *link, uint8_t tos)
968*4dc78e53SAndroid Build Coastguard Worker {
969*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
970*4dc78e53SAndroid Build Coastguard Worker
971*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
972*4dc78e53SAndroid Build Coastguard Worker
973*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_tos = tos;
974*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_TOS;
975*4dc78e53SAndroid Build Coastguard Worker
976*4dc78e53SAndroid Build Coastguard Worker return 0;
977*4dc78e53SAndroid Build Coastguard Worker }
978*4dc78e53SAndroid Build Coastguard Worker
979*4dc78e53SAndroid Build Coastguard Worker /**
980*4dc78e53SAndroid Build Coastguard Worker * Get IP ToS value to use for VXLAN
981*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
982*4dc78e53SAndroid Build Coastguard Worker *
983*4dc78e53SAndroid Build Coastguard Worker * @return ToS value on success or a negative error code
984*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_get_tos(struct rtnl_link * link)985*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_get_tos(struct rtnl_link *link)
986*4dc78e53SAndroid Build Coastguard Worker {
987*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
988*4dc78e53SAndroid Build Coastguard Worker
989*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
990*4dc78e53SAndroid Build Coastguard Worker
991*4dc78e53SAndroid Build Coastguard Worker if (!(vxi->ce_mask & VXLAN_ATTR_TOS))
992*4dc78e53SAndroid Build Coastguard Worker return -NLE_AGAIN;
993*4dc78e53SAndroid Build Coastguard Worker
994*4dc78e53SAndroid Build Coastguard Worker return vxi->vxi_tos;
995*4dc78e53SAndroid Build Coastguard Worker }
996*4dc78e53SAndroid Build Coastguard Worker
997*4dc78e53SAndroid Build Coastguard Worker /**
998*4dc78e53SAndroid Build Coastguard Worker * Set VXLAN learning status
999*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1000*4dc78e53SAndroid Build Coastguard Worker * @arg learning Learning status value
1001*4dc78e53SAndroid Build Coastguard Worker *
1002*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
1003*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_set_learning(struct rtnl_link * link,uint8_t learning)1004*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_set_learning(struct rtnl_link *link, uint8_t learning)
1005*4dc78e53SAndroid Build Coastguard Worker {
1006*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
1007*4dc78e53SAndroid Build Coastguard Worker
1008*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
1009*4dc78e53SAndroid Build Coastguard Worker
1010*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_learning = learning;
1011*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_LEARNING;
1012*4dc78e53SAndroid Build Coastguard Worker
1013*4dc78e53SAndroid Build Coastguard Worker return 0;
1014*4dc78e53SAndroid Build Coastguard Worker }
1015*4dc78e53SAndroid Build Coastguard Worker
1016*4dc78e53SAndroid Build Coastguard Worker /**
1017*4dc78e53SAndroid Build Coastguard Worker * Get VXLAN learning status
1018*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1019*4dc78e53SAndroid Build Coastguard Worker *
1020*4dc78e53SAndroid Build Coastguard Worker * @return Learning status value on success or a negative error code
1021*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_get_learning(struct rtnl_link * link)1022*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_get_learning(struct rtnl_link *link)
1023*4dc78e53SAndroid Build Coastguard Worker {
1024*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
1025*4dc78e53SAndroid Build Coastguard Worker
1026*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
1027*4dc78e53SAndroid Build Coastguard Worker
1028*4dc78e53SAndroid Build Coastguard Worker if (!(vxi->ce_mask & VXLAN_ATTR_LEARNING))
1029*4dc78e53SAndroid Build Coastguard Worker return -NLE_AGAIN;
1030*4dc78e53SAndroid Build Coastguard Worker
1031*4dc78e53SAndroid Build Coastguard Worker return vxi->vxi_learning;
1032*4dc78e53SAndroid Build Coastguard Worker }
1033*4dc78e53SAndroid Build Coastguard Worker
1034*4dc78e53SAndroid Build Coastguard Worker /**
1035*4dc78e53SAndroid Build Coastguard Worker * Enable VXLAN address learning
1036*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1037*4dc78e53SAndroid Build Coastguard Worker *
1038*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
1039*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_enable_learning(struct rtnl_link * link)1040*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_enable_learning(struct rtnl_link *link)
1041*4dc78e53SAndroid Build Coastguard Worker {
1042*4dc78e53SAndroid Build Coastguard Worker return rtnl_link_vxlan_set_learning(link, 1);
1043*4dc78e53SAndroid Build Coastguard Worker }
1044*4dc78e53SAndroid Build Coastguard Worker
1045*4dc78e53SAndroid Build Coastguard Worker /**
1046*4dc78e53SAndroid Build Coastguard Worker * Disable VXLAN address learning
1047*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1048*4dc78e53SAndroid Build Coastguard Worker *
1049*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
1050*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_disable_learning(struct rtnl_link * link)1051*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_disable_learning(struct rtnl_link *link)
1052*4dc78e53SAndroid Build Coastguard Worker {
1053*4dc78e53SAndroid Build Coastguard Worker return rtnl_link_vxlan_set_learning(link, 0);
1054*4dc78e53SAndroid Build Coastguard Worker }
1055*4dc78e53SAndroid Build Coastguard Worker
1056*4dc78e53SAndroid Build Coastguard Worker /**
1057*4dc78e53SAndroid Build Coastguard Worker * Set expiration timer value to use for VXLAN
1058*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1059*4dc78e53SAndroid Build Coastguard Worker * @arg expiry Expiration timer value
1060*4dc78e53SAndroid Build Coastguard Worker *
1061*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
1062*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_set_ageing(struct rtnl_link * link,uint32_t expiry)1063*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_set_ageing(struct rtnl_link *link, uint32_t expiry)
1064*4dc78e53SAndroid Build Coastguard Worker {
1065*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
1066*4dc78e53SAndroid Build Coastguard Worker
1067*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
1068*4dc78e53SAndroid Build Coastguard Worker
1069*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_ageing = expiry;
1070*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_AGEING;
1071*4dc78e53SAndroid Build Coastguard Worker
1072*4dc78e53SAndroid Build Coastguard Worker return 0;
1073*4dc78e53SAndroid Build Coastguard Worker }
1074*4dc78e53SAndroid Build Coastguard Worker
1075*4dc78e53SAndroid Build Coastguard Worker /**
1076*4dc78e53SAndroid Build Coastguard Worker * Get expiration timer value to use for VXLAN
1077*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1078*4dc78e53SAndroid Build Coastguard Worker * @arg expiry Pointer to store expiration timer value
1079*4dc78e53SAndroid Build Coastguard Worker *
1080*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
1081*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_get_ageing(struct rtnl_link * link,uint32_t * expiry)1082*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_get_ageing(struct rtnl_link *link, uint32_t *expiry)
1083*4dc78e53SAndroid Build Coastguard Worker {
1084*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
1085*4dc78e53SAndroid Build Coastguard Worker
1086*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
1087*4dc78e53SAndroid Build Coastguard Worker
1088*4dc78e53SAndroid Build Coastguard Worker if (!expiry)
1089*4dc78e53SAndroid Build Coastguard Worker return -NLE_INVAL;
1090*4dc78e53SAndroid Build Coastguard Worker
1091*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_AGEING)
1092*4dc78e53SAndroid Build Coastguard Worker *expiry = vxi->vxi_ageing;
1093*4dc78e53SAndroid Build Coastguard Worker else
1094*4dc78e53SAndroid Build Coastguard Worker return -NLE_AGAIN;
1095*4dc78e53SAndroid Build Coastguard Worker
1096*4dc78e53SAndroid Build Coastguard Worker return 0;
1097*4dc78e53SAndroid Build Coastguard Worker }
1098*4dc78e53SAndroid Build Coastguard Worker
1099*4dc78e53SAndroid Build Coastguard Worker /**
1100*4dc78e53SAndroid Build Coastguard Worker * Set maximum number of forwarding database entries to use for VXLAN
1101*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1102*4dc78e53SAndroid Build Coastguard Worker * @arg limit Maximum number
1103*4dc78e53SAndroid Build Coastguard Worker *
1104*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
1105*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_set_limit(struct rtnl_link * link,uint32_t limit)1106*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_set_limit(struct rtnl_link *link, uint32_t limit)
1107*4dc78e53SAndroid Build Coastguard Worker {
1108*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
1109*4dc78e53SAndroid Build Coastguard Worker
1110*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
1111*4dc78e53SAndroid Build Coastguard Worker
1112*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_limit = limit;
1113*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_LIMIT;
1114*4dc78e53SAndroid Build Coastguard Worker
1115*4dc78e53SAndroid Build Coastguard Worker return 0;
1116*4dc78e53SAndroid Build Coastguard Worker }
1117*4dc78e53SAndroid Build Coastguard Worker
1118*4dc78e53SAndroid Build Coastguard Worker /**
1119*4dc78e53SAndroid Build Coastguard Worker * Get maximum number of forwarding database entries to use for VXLAN
1120*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1121*4dc78e53SAndroid Build Coastguard Worker * @arg limit Pointer to store maximum number
1122*4dc78e53SAndroid Build Coastguard Worker *
1123*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
1124*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_get_limit(struct rtnl_link * link,uint32_t * limit)1125*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_get_limit(struct rtnl_link *link, uint32_t *limit)
1126*4dc78e53SAndroid Build Coastguard Worker {
1127*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
1128*4dc78e53SAndroid Build Coastguard Worker
1129*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
1130*4dc78e53SAndroid Build Coastguard Worker
1131*4dc78e53SAndroid Build Coastguard Worker if (!limit)
1132*4dc78e53SAndroid Build Coastguard Worker return -NLE_INVAL;
1133*4dc78e53SAndroid Build Coastguard Worker
1134*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_LIMIT)
1135*4dc78e53SAndroid Build Coastguard Worker *limit = vxi->vxi_limit;
1136*4dc78e53SAndroid Build Coastguard Worker else
1137*4dc78e53SAndroid Build Coastguard Worker return -NLE_AGAIN;
1138*4dc78e53SAndroid Build Coastguard Worker
1139*4dc78e53SAndroid Build Coastguard Worker return 0;
1140*4dc78e53SAndroid Build Coastguard Worker }
1141*4dc78e53SAndroid Build Coastguard Worker
1142*4dc78e53SAndroid Build Coastguard Worker /**
1143*4dc78e53SAndroid Build Coastguard Worker * Set range of UDP port numbers to use for VXLAN
1144*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1145*4dc78e53SAndroid Build Coastguard Worker * @arg range Port number range
1146*4dc78e53SAndroid Build Coastguard Worker *
1147*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
1148*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_set_port_range(struct rtnl_link * link,struct ifla_vxlan_port_range * range)1149*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_set_port_range(struct rtnl_link *link,
1150*4dc78e53SAndroid Build Coastguard Worker struct ifla_vxlan_port_range *range)
1151*4dc78e53SAndroid Build Coastguard Worker {
1152*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
1153*4dc78e53SAndroid Build Coastguard Worker
1154*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
1155*4dc78e53SAndroid Build Coastguard Worker
1156*4dc78e53SAndroid Build Coastguard Worker if (!range)
1157*4dc78e53SAndroid Build Coastguard Worker return -NLE_INVAL;
1158*4dc78e53SAndroid Build Coastguard Worker
1159*4dc78e53SAndroid Build Coastguard Worker memcpy(&vxi->vxi_port_range, range, sizeof(vxi->vxi_port_range));
1160*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_PORT_RANGE;
1161*4dc78e53SAndroid Build Coastguard Worker
1162*4dc78e53SAndroid Build Coastguard Worker return 0;
1163*4dc78e53SAndroid Build Coastguard Worker }
1164*4dc78e53SAndroid Build Coastguard Worker
1165*4dc78e53SAndroid Build Coastguard Worker /**
1166*4dc78e53SAndroid Build Coastguard Worker * Get range of UDP port numbers to use for VXLAN
1167*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1168*4dc78e53SAndroid Build Coastguard Worker * @arg range Pointer to store port range
1169*4dc78e53SAndroid Build Coastguard Worker *
1170*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
1171*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_get_port_range(struct rtnl_link * link,struct ifla_vxlan_port_range * range)1172*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_get_port_range(struct rtnl_link *link,
1173*4dc78e53SAndroid Build Coastguard Worker struct ifla_vxlan_port_range *range)
1174*4dc78e53SAndroid Build Coastguard Worker {
1175*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
1176*4dc78e53SAndroid Build Coastguard Worker
1177*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
1178*4dc78e53SAndroid Build Coastguard Worker
1179*4dc78e53SAndroid Build Coastguard Worker if (!range)
1180*4dc78e53SAndroid Build Coastguard Worker return -NLE_INVAL;
1181*4dc78e53SAndroid Build Coastguard Worker
1182*4dc78e53SAndroid Build Coastguard Worker if (vxi->ce_mask & VXLAN_ATTR_PORT_RANGE)
1183*4dc78e53SAndroid Build Coastguard Worker memcpy(range, &vxi->vxi_port_range, sizeof(*range));
1184*4dc78e53SAndroid Build Coastguard Worker else
1185*4dc78e53SAndroid Build Coastguard Worker return -NLE_AGAIN;
1186*4dc78e53SAndroid Build Coastguard Worker
1187*4dc78e53SAndroid Build Coastguard Worker return 0;
1188*4dc78e53SAndroid Build Coastguard Worker }
1189*4dc78e53SAndroid Build Coastguard Worker
1190*4dc78e53SAndroid Build Coastguard Worker /**
1191*4dc78e53SAndroid Build Coastguard Worker * Set ARP proxy status to use for VXLAN
1192*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1193*4dc78e53SAndroid Build Coastguard Worker * @arg proxy Status value
1194*4dc78e53SAndroid Build Coastguard Worker *
1195*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
1196*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_set_proxy(struct rtnl_link * link,uint8_t proxy)1197*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_set_proxy(struct rtnl_link *link, uint8_t proxy)
1198*4dc78e53SAndroid Build Coastguard Worker {
1199*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
1200*4dc78e53SAndroid Build Coastguard Worker
1201*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
1202*4dc78e53SAndroid Build Coastguard Worker
1203*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_proxy = proxy;
1204*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_PROXY;
1205*4dc78e53SAndroid Build Coastguard Worker
1206*4dc78e53SAndroid Build Coastguard Worker return 0;
1207*4dc78e53SAndroid Build Coastguard Worker }
1208*4dc78e53SAndroid Build Coastguard Worker
1209*4dc78e53SAndroid Build Coastguard Worker /**
1210*4dc78e53SAndroid Build Coastguard Worker * Get ARP proxy status to use for VXLAN
1211*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1212*4dc78e53SAndroid Build Coastguard Worker *
1213*4dc78e53SAndroid Build Coastguard Worker * @return Status value on success or a negative error code
1214*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_get_proxy(struct rtnl_link * link)1215*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_get_proxy(struct rtnl_link *link)
1216*4dc78e53SAndroid Build Coastguard Worker {
1217*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
1218*4dc78e53SAndroid Build Coastguard Worker
1219*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
1220*4dc78e53SAndroid Build Coastguard Worker
1221*4dc78e53SAndroid Build Coastguard Worker if (!(vxi->ce_mask & VXLAN_ATTR_PROXY))
1222*4dc78e53SAndroid Build Coastguard Worker return -NLE_AGAIN;
1223*4dc78e53SAndroid Build Coastguard Worker
1224*4dc78e53SAndroid Build Coastguard Worker return vxi->vxi_proxy;
1225*4dc78e53SAndroid Build Coastguard Worker }
1226*4dc78e53SAndroid Build Coastguard Worker
1227*4dc78e53SAndroid Build Coastguard Worker /**
1228*4dc78e53SAndroid Build Coastguard Worker * Enable ARP proxy
1229*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1230*4dc78e53SAndroid Build Coastguard Worker *
1231*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
1232*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_enable_proxy(struct rtnl_link * link)1233*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_enable_proxy(struct rtnl_link *link)
1234*4dc78e53SAndroid Build Coastguard Worker {
1235*4dc78e53SAndroid Build Coastguard Worker return rtnl_link_vxlan_set_proxy(link, 1);
1236*4dc78e53SAndroid Build Coastguard Worker }
1237*4dc78e53SAndroid Build Coastguard Worker
1238*4dc78e53SAndroid Build Coastguard Worker /**
1239*4dc78e53SAndroid Build Coastguard Worker * Disable ARP proxy
1240*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1241*4dc78e53SAndroid Build Coastguard Worker *
1242*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
1243*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_disable_proxy(struct rtnl_link * link)1244*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_disable_proxy(struct rtnl_link *link)
1245*4dc78e53SAndroid Build Coastguard Worker {
1246*4dc78e53SAndroid Build Coastguard Worker return rtnl_link_vxlan_set_proxy(link, 0);
1247*4dc78e53SAndroid Build Coastguard Worker }
1248*4dc78e53SAndroid Build Coastguard Worker
1249*4dc78e53SAndroid Build Coastguard Worker /**
1250*4dc78e53SAndroid Build Coastguard Worker * Set Route Short Circuit status to use for VXLAN
1251*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1252*4dc78e53SAndroid Build Coastguard Worker * @arg rsc Status value
1253*4dc78e53SAndroid Build Coastguard Worker *
1254*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
1255*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_set_rsc(struct rtnl_link * link,uint8_t rsc)1256*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_set_rsc(struct rtnl_link *link, uint8_t rsc)
1257*4dc78e53SAndroid Build Coastguard Worker {
1258*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
1259*4dc78e53SAndroid Build Coastguard Worker
1260*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
1261*4dc78e53SAndroid Build Coastguard Worker
1262*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_rsc = rsc;
1263*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_RSC;
1264*4dc78e53SAndroid Build Coastguard Worker
1265*4dc78e53SAndroid Build Coastguard Worker return 0;
1266*4dc78e53SAndroid Build Coastguard Worker }
1267*4dc78e53SAndroid Build Coastguard Worker
1268*4dc78e53SAndroid Build Coastguard Worker /**
1269*4dc78e53SAndroid Build Coastguard Worker * Get Route Short Circuit status to use for VXLAN
1270*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1271*4dc78e53SAndroid Build Coastguard Worker *
1272*4dc78e53SAndroid Build Coastguard Worker * @return Status value on success or a negative error code
1273*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_get_rsc(struct rtnl_link * link)1274*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_get_rsc(struct rtnl_link *link)
1275*4dc78e53SAndroid Build Coastguard Worker {
1276*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
1277*4dc78e53SAndroid Build Coastguard Worker
1278*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
1279*4dc78e53SAndroid Build Coastguard Worker
1280*4dc78e53SAndroid Build Coastguard Worker if (!(vxi->ce_mask & VXLAN_ATTR_RSC))
1281*4dc78e53SAndroid Build Coastguard Worker return -NLE_AGAIN;
1282*4dc78e53SAndroid Build Coastguard Worker
1283*4dc78e53SAndroid Build Coastguard Worker return vxi->vxi_rsc;
1284*4dc78e53SAndroid Build Coastguard Worker }
1285*4dc78e53SAndroid Build Coastguard Worker
1286*4dc78e53SAndroid Build Coastguard Worker /**
1287*4dc78e53SAndroid Build Coastguard Worker * Enable Route Short Circuit
1288*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1289*4dc78e53SAndroid Build Coastguard Worker *
1290*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
1291*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_enable_rsc(struct rtnl_link * link)1292*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_enable_rsc(struct rtnl_link *link)
1293*4dc78e53SAndroid Build Coastguard Worker {
1294*4dc78e53SAndroid Build Coastguard Worker return rtnl_link_vxlan_set_rsc(link, 1);
1295*4dc78e53SAndroid Build Coastguard Worker }
1296*4dc78e53SAndroid Build Coastguard Worker
1297*4dc78e53SAndroid Build Coastguard Worker /**
1298*4dc78e53SAndroid Build Coastguard Worker * Disable Route Short Circuit
1299*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1300*4dc78e53SAndroid Build Coastguard Worker *
1301*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
1302*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_disable_rsc(struct rtnl_link * link)1303*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_disable_rsc(struct rtnl_link *link)
1304*4dc78e53SAndroid Build Coastguard Worker {
1305*4dc78e53SAndroid Build Coastguard Worker return rtnl_link_vxlan_set_rsc(link, 0);
1306*4dc78e53SAndroid Build Coastguard Worker }
1307*4dc78e53SAndroid Build Coastguard Worker
1308*4dc78e53SAndroid Build Coastguard Worker /**
1309*4dc78e53SAndroid Build Coastguard Worker * Set netlink LLADDR miss notification status to use for VXLAN
1310*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1311*4dc78e53SAndroid Build Coastguard Worker * @arg miss Status value
1312*4dc78e53SAndroid Build Coastguard Worker *
1313*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
1314*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_set_l2miss(struct rtnl_link * link,uint8_t miss)1315*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_set_l2miss(struct rtnl_link *link, uint8_t miss)
1316*4dc78e53SAndroid Build Coastguard Worker {
1317*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
1318*4dc78e53SAndroid Build Coastguard Worker
1319*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
1320*4dc78e53SAndroid Build Coastguard Worker
1321*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_l2miss = miss;
1322*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_L2MISS;
1323*4dc78e53SAndroid Build Coastguard Worker
1324*4dc78e53SAndroid Build Coastguard Worker return 0;
1325*4dc78e53SAndroid Build Coastguard Worker }
1326*4dc78e53SAndroid Build Coastguard Worker
1327*4dc78e53SAndroid Build Coastguard Worker /**
1328*4dc78e53SAndroid Build Coastguard Worker * Get netlink LLADDR miss notification status to use for VXLAN
1329*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1330*4dc78e53SAndroid Build Coastguard Worker *
1331*4dc78e53SAndroid Build Coastguard Worker * @return Status value on success or a negative error code
1332*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_get_l2miss(struct rtnl_link * link)1333*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_get_l2miss(struct rtnl_link *link)
1334*4dc78e53SAndroid Build Coastguard Worker {
1335*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
1336*4dc78e53SAndroid Build Coastguard Worker
1337*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
1338*4dc78e53SAndroid Build Coastguard Worker
1339*4dc78e53SAndroid Build Coastguard Worker if (!(vxi->ce_mask & VXLAN_ATTR_L2MISS))
1340*4dc78e53SAndroid Build Coastguard Worker return -NLE_AGAIN;
1341*4dc78e53SAndroid Build Coastguard Worker
1342*4dc78e53SAndroid Build Coastguard Worker return vxi->vxi_l2miss;
1343*4dc78e53SAndroid Build Coastguard Worker }
1344*4dc78e53SAndroid Build Coastguard Worker
1345*4dc78e53SAndroid Build Coastguard Worker /**
1346*4dc78e53SAndroid Build Coastguard Worker * Enable netlink LLADDR miss notifications
1347*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1348*4dc78e53SAndroid Build Coastguard Worker *
1349*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
1350*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_enable_l2miss(struct rtnl_link * link)1351*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_enable_l2miss(struct rtnl_link *link)
1352*4dc78e53SAndroid Build Coastguard Worker {
1353*4dc78e53SAndroid Build Coastguard Worker return rtnl_link_vxlan_set_l2miss(link, 1);
1354*4dc78e53SAndroid Build Coastguard Worker }
1355*4dc78e53SAndroid Build Coastguard Worker
1356*4dc78e53SAndroid Build Coastguard Worker /**
1357*4dc78e53SAndroid Build Coastguard Worker * Disable netlink LLADDR miss notifications
1358*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1359*4dc78e53SAndroid Build Coastguard Worker *
1360*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
1361*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_disable_l2miss(struct rtnl_link * link)1362*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_disable_l2miss(struct rtnl_link *link)
1363*4dc78e53SAndroid Build Coastguard Worker {
1364*4dc78e53SAndroid Build Coastguard Worker return rtnl_link_vxlan_set_l2miss(link, 0);
1365*4dc78e53SAndroid Build Coastguard Worker }
1366*4dc78e53SAndroid Build Coastguard Worker
1367*4dc78e53SAndroid Build Coastguard Worker /**
1368*4dc78e53SAndroid Build Coastguard Worker * Set netlink IP ADDR miss notification status to use for VXLAN
1369*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1370*4dc78e53SAndroid Build Coastguard Worker * @arg miss Status value
1371*4dc78e53SAndroid Build Coastguard Worker *
1372*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
1373*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_set_l3miss(struct rtnl_link * link,uint8_t miss)1374*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_set_l3miss(struct rtnl_link *link, uint8_t miss)
1375*4dc78e53SAndroid Build Coastguard Worker {
1376*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
1377*4dc78e53SAndroid Build Coastguard Worker
1378*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
1379*4dc78e53SAndroid Build Coastguard Worker
1380*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_l3miss = miss;
1381*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_L3MISS;
1382*4dc78e53SAndroid Build Coastguard Worker
1383*4dc78e53SAndroid Build Coastguard Worker return 0;
1384*4dc78e53SAndroid Build Coastguard Worker }
1385*4dc78e53SAndroid Build Coastguard Worker
1386*4dc78e53SAndroid Build Coastguard Worker /**
1387*4dc78e53SAndroid Build Coastguard Worker * Get netlink IP ADDR miss notification status to use for VXLAN
1388*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1389*4dc78e53SAndroid Build Coastguard Worker *
1390*4dc78e53SAndroid Build Coastguard Worker * @return Status value on success or a negative error code
1391*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_get_l3miss(struct rtnl_link * link)1392*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_get_l3miss(struct rtnl_link *link)
1393*4dc78e53SAndroid Build Coastguard Worker {
1394*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
1395*4dc78e53SAndroid Build Coastguard Worker
1396*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
1397*4dc78e53SAndroid Build Coastguard Worker
1398*4dc78e53SAndroid Build Coastguard Worker if (!(vxi->ce_mask & VXLAN_ATTR_L3MISS))
1399*4dc78e53SAndroid Build Coastguard Worker return -NLE_AGAIN;
1400*4dc78e53SAndroid Build Coastguard Worker
1401*4dc78e53SAndroid Build Coastguard Worker return vxi->vxi_l3miss;
1402*4dc78e53SAndroid Build Coastguard Worker }
1403*4dc78e53SAndroid Build Coastguard Worker
1404*4dc78e53SAndroid Build Coastguard Worker /**
1405*4dc78e53SAndroid Build Coastguard Worker * Enable netlink IP ADDR miss notifications
1406*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1407*4dc78e53SAndroid Build Coastguard Worker *
1408*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
1409*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_enable_l3miss(struct rtnl_link * link)1410*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_enable_l3miss(struct rtnl_link *link)
1411*4dc78e53SAndroid Build Coastguard Worker {
1412*4dc78e53SAndroid Build Coastguard Worker return rtnl_link_vxlan_set_l3miss(link, 1);
1413*4dc78e53SAndroid Build Coastguard Worker }
1414*4dc78e53SAndroid Build Coastguard Worker
1415*4dc78e53SAndroid Build Coastguard Worker /**
1416*4dc78e53SAndroid Build Coastguard Worker * Disable netlink IP ADDR miss notifications
1417*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1418*4dc78e53SAndroid Build Coastguard Worker *
1419*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
1420*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_disable_l3miss(struct rtnl_link * link)1421*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_disable_l3miss(struct rtnl_link *link)
1422*4dc78e53SAndroid Build Coastguard Worker {
1423*4dc78e53SAndroid Build Coastguard Worker return rtnl_link_vxlan_set_l3miss(link, 0);
1424*4dc78e53SAndroid Build Coastguard Worker }
1425*4dc78e53SAndroid Build Coastguard Worker
1426*4dc78e53SAndroid Build Coastguard Worker /**
1427*4dc78e53SAndroid Build Coastguard Worker * Set UDP destination port to use for VXLAN
1428*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1429*4dc78e53SAndroid Build Coastguard Worker * @arg port Destination port
1430*4dc78e53SAndroid Build Coastguard Worker *
1431*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
1432*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_set_port(struct rtnl_link * link,uint32_t port)1433*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_set_port(struct rtnl_link *link, uint32_t port)
1434*4dc78e53SAndroid Build Coastguard Worker {
1435*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
1436*4dc78e53SAndroid Build Coastguard Worker
1437*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
1438*4dc78e53SAndroid Build Coastguard Worker
1439*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_port = htons(port);
1440*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_PORT;
1441*4dc78e53SAndroid Build Coastguard Worker
1442*4dc78e53SAndroid Build Coastguard Worker return 0;
1443*4dc78e53SAndroid Build Coastguard Worker }
1444*4dc78e53SAndroid Build Coastguard Worker
1445*4dc78e53SAndroid Build Coastguard Worker /**
1446*4dc78e53SAndroid Build Coastguard Worker * Get UDP destination port to use for VXLAN
1447*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1448*4dc78e53SAndroid Build Coastguard Worker * @arg port Pointer to store destination port
1449*4dc78e53SAndroid Build Coastguard Worker *
1450*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
1451*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_get_port(struct rtnl_link * link,uint32_t * port)1452*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_get_port(struct rtnl_link *link, uint32_t *port)
1453*4dc78e53SAndroid Build Coastguard Worker {
1454*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
1455*4dc78e53SAndroid Build Coastguard Worker
1456*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
1457*4dc78e53SAndroid Build Coastguard Worker
1458*4dc78e53SAndroid Build Coastguard Worker if (!port)
1459*4dc78e53SAndroid Build Coastguard Worker return -NLE_INVAL;
1460*4dc78e53SAndroid Build Coastguard Worker
1461*4dc78e53SAndroid Build Coastguard Worker if (!(vxi->ce_mask & VXLAN_ATTR_PORT))
1462*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOATTR;
1463*4dc78e53SAndroid Build Coastguard Worker
1464*4dc78e53SAndroid Build Coastguard Worker *port = ntohs(vxi->vxi_port);
1465*4dc78e53SAndroid Build Coastguard Worker
1466*4dc78e53SAndroid Build Coastguard Worker return 0;
1467*4dc78e53SAndroid Build Coastguard Worker }
1468*4dc78e53SAndroid Build Coastguard Worker
1469*4dc78e53SAndroid Build Coastguard Worker /**
1470*4dc78e53SAndroid Build Coastguard Worker * Set UDP checksum status to use for VXLAN
1471*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1472*4dc78e53SAndroid Build Coastguard Worker * @arg csum Status value
1473*4dc78e53SAndroid Build Coastguard Worker *
1474*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
1475*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_set_udp_csum(struct rtnl_link * link,uint8_t csum)1476*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_set_udp_csum(struct rtnl_link *link, uint8_t csum)
1477*4dc78e53SAndroid Build Coastguard Worker {
1478*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
1479*4dc78e53SAndroid Build Coastguard Worker
1480*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
1481*4dc78e53SAndroid Build Coastguard Worker
1482*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_udp_csum = csum;
1483*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_UDP_CSUM;
1484*4dc78e53SAndroid Build Coastguard Worker
1485*4dc78e53SAndroid Build Coastguard Worker return 0;
1486*4dc78e53SAndroid Build Coastguard Worker }
1487*4dc78e53SAndroid Build Coastguard Worker
1488*4dc78e53SAndroid Build Coastguard Worker /**
1489*4dc78e53SAndroid Build Coastguard Worker * Get UDP checksum status to use for VXLAN
1490*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1491*4dc78e53SAndroid Build Coastguard Worker *
1492*4dc78e53SAndroid Build Coastguard Worker * @return Status value on success or a negative error code
1493*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_get_udp_csum(struct rtnl_link * link)1494*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_get_udp_csum(struct rtnl_link *link)
1495*4dc78e53SAndroid Build Coastguard Worker {
1496*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
1497*4dc78e53SAndroid Build Coastguard Worker
1498*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
1499*4dc78e53SAndroid Build Coastguard Worker
1500*4dc78e53SAndroid Build Coastguard Worker if (!(vxi->ce_mask & VXLAN_ATTR_UDP_CSUM))
1501*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOATTR;
1502*4dc78e53SAndroid Build Coastguard Worker
1503*4dc78e53SAndroid Build Coastguard Worker return vxi->vxi_udp_csum;
1504*4dc78e53SAndroid Build Coastguard Worker }
1505*4dc78e53SAndroid Build Coastguard Worker
1506*4dc78e53SAndroid Build Coastguard Worker /**
1507*4dc78e53SAndroid Build Coastguard Worker * Set skip UDP checksum transmitted over IPv6 status to use for VXLAN
1508*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1509*4dc78e53SAndroid Build Coastguard Worker * @arg csum Status value
1510*4dc78e53SAndroid Build Coastguard Worker *
1511*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
1512*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_set_udp_zero_csum6_tx(struct rtnl_link * link,uint8_t csum)1513*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_set_udp_zero_csum6_tx(struct rtnl_link *link, uint8_t csum)
1514*4dc78e53SAndroid Build Coastguard Worker {
1515*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
1516*4dc78e53SAndroid Build Coastguard Worker
1517*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
1518*4dc78e53SAndroid Build Coastguard Worker
1519*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_udp_zero_csum6_tx = csum;
1520*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_UDP_ZERO_CSUM6_TX;
1521*4dc78e53SAndroid Build Coastguard Worker
1522*4dc78e53SAndroid Build Coastguard Worker return 0;
1523*4dc78e53SAndroid Build Coastguard Worker }
1524*4dc78e53SAndroid Build Coastguard Worker
1525*4dc78e53SAndroid Build Coastguard Worker /**
1526*4dc78e53SAndroid Build Coastguard Worker * Get skip UDP checksum transmitted over IPv6 status to use for VXLAN
1527*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1528*4dc78e53SAndroid Build Coastguard Worker *
1529*4dc78e53SAndroid Build Coastguard Worker * @return Status value on success or a negative error code
1530*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_get_udp_zero_csum6_tx(struct rtnl_link * link)1531*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_get_udp_zero_csum6_tx(struct rtnl_link *link)
1532*4dc78e53SAndroid Build Coastguard Worker {
1533*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
1534*4dc78e53SAndroid Build Coastguard Worker
1535*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
1536*4dc78e53SAndroid Build Coastguard Worker
1537*4dc78e53SAndroid Build Coastguard Worker if (!(vxi->ce_mask & VXLAN_ATTR_UDP_ZERO_CSUM6_TX))
1538*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOATTR;
1539*4dc78e53SAndroid Build Coastguard Worker
1540*4dc78e53SAndroid Build Coastguard Worker return vxi->vxi_udp_zero_csum6_tx;
1541*4dc78e53SAndroid Build Coastguard Worker }
1542*4dc78e53SAndroid Build Coastguard Worker
1543*4dc78e53SAndroid Build Coastguard Worker /**
1544*4dc78e53SAndroid Build Coastguard Worker * Set skip UDP checksum received over IPv6 status to use for VXLAN
1545*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1546*4dc78e53SAndroid Build Coastguard Worker * @arg csum Status value
1547*4dc78e53SAndroid Build Coastguard Worker *
1548*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
1549*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_set_udp_zero_csum6_rx(struct rtnl_link * link,uint8_t csum)1550*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_set_udp_zero_csum6_rx(struct rtnl_link *link, uint8_t csum)
1551*4dc78e53SAndroid Build Coastguard Worker {
1552*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
1553*4dc78e53SAndroid Build Coastguard Worker
1554*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
1555*4dc78e53SAndroid Build Coastguard Worker
1556*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_udp_zero_csum6_rx = csum;
1557*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_UDP_ZERO_CSUM6_RX;
1558*4dc78e53SAndroid Build Coastguard Worker
1559*4dc78e53SAndroid Build Coastguard Worker return 0;
1560*4dc78e53SAndroid Build Coastguard Worker }
1561*4dc78e53SAndroid Build Coastguard Worker
1562*4dc78e53SAndroid Build Coastguard Worker /**
1563*4dc78e53SAndroid Build Coastguard Worker * Get skip UDP checksum received over IPv6 status to use for VXLAN
1564*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1565*4dc78e53SAndroid Build Coastguard Worker *
1566*4dc78e53SAndroid Build Coastguard Worker * @return Status value on success or a negative error code
1567*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_get_udp_zero_csum6_rx(struct rtnl_link * link)1568*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_get_udp_zero_csum6_rx(struct rtnl_link *link)
1569*4dc78e53SAndroid Build Coastguard Worker {
1570*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
1571*4dc78e53SAndroid Build Coastguard Worker
1572*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
1573*4dc78e53SAndroid Build Coastguard Worker
1574*4dc78e53SAndroid Build Coastguard Worker if (!(vxi->ce_mask & VXLAN_ATTR_UDP_ZERO_CSUM6_RX))
1575*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOATTR;
1576*4dc78e53SAndroid Build Coastguard Worker
1577*4dc78e53SAndroid Build Coastguard Worker return vxi->vxi_udp_zero_csum6_rx;
1578*4dc78e53SAndroid Build Coastguard Worker }
1579*4dc78e53SAndroid Build Coastguard Worker
1580*4dc78e53SAndroid Build Coastguard Worker /**
1581*4dc78e53SAndroid Build Coastguard Worker * Set remote offload transmit checksum status to use for VXLAN
1582*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1583*4dc78e53SAndroid Build Coastguard Worker * @arg csum Status value
1584*4dc78e53SAndroid Build Coastguard Worker *
1585*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
1586*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_set_remcsum_tx(struct rtnl_link * link,uint8_t csum)1587*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_set_remcsum_tx(struct rtnl_link *link, uint8_t csum)
1588*4dc78e53SAndroid Build Coastguard Worker {
1589*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
1590*4dc78e53SAndroid Build Coastguard Worker
1591*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
1592*4dc78e53SAndroid Build Coastguard Worker
1593*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_remcsum_tx = csum;
1594*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_REMCSUM_TX;
1595*4dc78e53SAndroid Build Coastguard Worker
1596*4dc78e53SAndroid Build Coastguard Worker return 0;
1597*4dc78e53SAndroid Build Coastguard Worker }
1598*4dc78e53SAndroid Build Coastguard Worker
1599*4dc78e53SAndroid Build Coastguard Worker /**
1600*4dc78e53SAndroid Build Coastguard Worker * Get remote offload transmit checksum status to use for VXLAN
1601*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1602*4dc78e53SAndroid Build Coastguard Worker *
1603*4dc78e53SAndroid Build Coastguard Worker * @return Status value on success or a negative error code
1604*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_get_remcsum_tx(struct rtnl_link * link)1605*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_get_remcsum_tx(struct rtnl_link *link)
1606*4dc78e53SAndroid Build Coastguard Worker {
1607*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
1608*4dc78e53SAndroid Build Coastguard Worker
1609*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
1610*4dc78e53SAndroid Build Coastguard Worker
1611*4dc78e53SAndroid Build Coastguard Worker if (!(vxi->ce_mask & VXLAN_ATTR_REMCSUM_TX))
1612*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOATTR;
1613*4dc78e53SAndroid Build Coastguard Worker
1614*4dc78e53SAndroid Build Coastguard Worker return vxi->vxi_remcsum_tx;
1615*4dc78e53SAndroid Build Coastguard Worker }
1616*4dc78e53SAndroid Build Coastguard Worker
1617*4dc78e53SAndroid Build Coastguard Worker /**
1618*4dc78e53SAndroid Build Coastguard Worker * Set remote offload receive checksum status to use for VXLAN
1619*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1620*4dc78e53SAndroid Build Coastguard Worker * @arg csum Status value
1621*4dc78e53SAndroid Build Coastguard Worker *
1622*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
1623*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_set_remcsum_rx(struct rtnl_link * link,uint8_t csum)1624*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_set_remcsum_rx(struct rtnl_link *link, uint8_t csum)
1625*4dc78e53SAndroid Build Coastguard Worker {
1626*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
1627*4dc78e53SAndroid Build Coastguard Worker
1628*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
1629*4dc78e53SAndroid Build Coastguard Worker
1630*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_remcsum_rx = csum;
1631*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_REMCSUM_RX;
1632*4dc78e53SAndroid Build Coastguard Worker
1633*4dc78e53SAndroid Build Coastguard Worker return 0;
1634*4dc78e53SAndroid Build Coastguard Worker }
1635*4dc78e53SAndroid Build Coastguard Worker
1636*4dc78e53SAndroid Build Coastguard Worker /**
1637*4dc78e53SAndroid Build Coastguard Worker * Get remote offload receive checksum status to use for VXLAN
1638*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1639*4dc78e53SAndroid Build Coastguard Worker *
1640*4dc78e53SAndroid Build Coastguard Worker * @return Status value on success or a negative error code
1641*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_get_remcsum_rx(struct rtnl_link * link)1642*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_get_remcsum_rx(struct rtnl_link *link)
1643*4dc78e53SAndroid Build Coastguard Worker {
1644*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
1645*4dc78e53SAndroid Build Coastguard Worker
1646*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
1647*4dc78e53SAndroid Build Coastguard Worker
1648*4dc78e53SAndroid Build Coastguard Worker if (!(vxi->ce_mask & VXLAN_ATTR_REMCSUM_RX))
1649*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOATTR;
1650*4dc78e53SAndroid Build Coastguard Worker
1651*4dc78e53SAndroid Build Coastguard Worker return vxi->vxi_remcsum_rx;
1652*4dc78e53SAndroid Build Coastguard Worker }
1653*4dc78e53SAndroid Build Coastguard Worker
1654*4dc78e53SAndroid Build Coastguard Worker /**
1655*4dc78e53SAndroid Build Coastguard Worker * Set collect metadata status to use for VXLAN
1656*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1657*4dc78e53SAndroid Build Coastguard Worker * @arg collect Status value
1658*4dc78e53SAndroid Build Coastguard Worker *
1659*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
1660*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_set_collect_metadata(struct rtnl_link * link,uint8_t collect)1661*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_set_collect_metadata(struct rtnl_link *link, uint8_t collect)
1662*4dc78e53SAndroid Build Coastguard Worker {
1663*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
1664*4dc78e53SAndroid Build Coastguard Worker
1665*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
1666*4dc78e53SAndroid Build Coastguard Worker
1667*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_collect_metadata = collect;
1668*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_COLLECT_METADATA;
1669*4dc78e53SAndroid Build Coastguard Worker
1670*4dc78e53SAndroid Build Coastguard Worker return 0;
1671*4dc78e53SAndroid Build Coastguard Worker }
1672*4dc78e53SAndroid Build Coastguard Worker
1673*4dc78e53SAndroid Build Coastguard Worker /**
1674*4dc78e53SAndroid Build Coastguard Worker * Get collect metadata status to use for VXLAN
1675*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1676*4dc78e53SAndroid Build Coastguard Worker *
1677*4dc78e53SAndroid Build Coastguard Worker * @return Status value on success or a negative error code
1678*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_get_collect_metadata(struct rtnl_link * link)1679*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_get_collect_metadata(struct rtnl_link *link)
1680*4dc78e53SAndroid Build Coastguard Worker {
1681*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
1682*4dc78e53SAndroid Build Coastguard Worker
1683*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
1684*4dc78e53SAndroid Build Coastguard Worker
1685*4dc78e53SAndroid Build Coastguard Worker if (!(vxi->ce_mask & VXLAN_ATTR_COLLECT_METADATA))
1686*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOATTR;
1687*4dc78e53SAndroid Build Coastguard Worker
1688*4dc78e53SAndroid Build Coastguard Worker return vxi->vxi_collect_metadata;
1689*4dc78e53SAndroid Build Coastguard Worker }
1690*4dc78e53SAndroid Build Coastguard Worker
1691*4dc78e53SAndroid Build Coastguard Worker /**
1692*4dc78e53SAndroid Build Coastguard Worker * Set flow label to use for VXLAN
1693*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1694*4dc78e53SAndroid Build Coastguard Worker * @arg label Destination label
1695*4dc78e53SAndroid Build Coastguard Worker *
1696*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
1697*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_set_label(struct rtnl_link * link,uint32_t label)1698*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_set_label(struct rtnl_link *link, uint32_t label)
1699*4dc78e53SAndroid Build Coastguard Worker {
1700*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
1701*4dc78e53SAndroid Build Coastguard Worker
1702*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
1703*4dc78e53SAndroid Build Coastguard Worker
1704*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_label = htonl(label);
1705*4dc78e53SAndroid Build Coastguard Worker vxi->ce_mask |= VXLAN_ATTR_LABEL;
1706*4dc78e53SAndroid Build Coastguard Worker
1707*4dc78e53SAndroid Build Coastguard Worker return 0;
1708*4dc78e53SAndroid Build Coastguard Worker }
1709*4dc78e53SAndroid Build Coastguard Worker
1710*4dc78e53SAndroid Build Coastguard Worker /**
1711*4dc78e53SAndroid Build Coastguard Worker * Get flow label to use for VXLAN
1712*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1713*4dc78e53SAndroid Build Coastguard Worker * @arg label Pointer to store destination label
1714*4dc78e53SAndroid Build Coastguard Worker *
1715*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
1716*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_get_label(struct rtnl_link * link,uint32_t * label)1717*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_get_label(struct rtnl_link *link, uint32_t *label)
1718*4dc78e53SAndroid Build Coastguard Worker {
1719*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
1720*4dc78e53SAndroid Build Coastguard Worker
1721*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
1722*4dc78e53SAndroid Build Coastguard Worker
1723*4dc78e53SAndroid Build Coastguard Worker if (!label)
1724*4dc78e53SAndroid Build Coastguard Worker return -NLE_INVAL;
1725*4dc78e53SAndroid Build Coastguard Worker
1726*4dc78e53SAndroid Build Coastguard Worker if (!(vxi->ce_mask & VXLAN_ATTR_LABEL))
1727*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOATTR;
1728*4dc78e53SAndroid Build Coastguard Worker
1729*4dc78e53SAndroid Build Coastguard Worker *label = ntohl(vxi->vxi_label);
1730*4dc78e53SAndroid Build Coastguard Worker
1731*4dc78e53SAndroid Build Coastguard Worker return 0;
1732*4dc78e53SAndroid Build Coastguard Worker }
1733*4dc78e53SAndroid Build Coastguard Worker
1734*4dc78e53SAndroid Build Coastguard Worker /**
1735*4dc78e53SAndroid Build Coastguard Worker * Set VXLAN flags RTNL_LINK_VXLAN_F_*
1736*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1737*4dc78e53SAndroid Build Coastguard Worker * @flags Which flags to set
1738*4dc78e53SAndroid Build Coastguard Worker * @arg enable Boolean enabling or disabling flag
1739*4dc78e53SAndroid Build Coastguard Worker *
1740*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
1741*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_set_flags(struct rtnl_link * link,uint32_t flags,int enable)1742*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_set_flags(struct rtnl_link *link, uint32_t flags, int enable)
1743*4dc78e53SAndroid Build Coastguard Worker {
1744*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
1745*4dc78e53SAndroid Build Coastguard Worker
1746*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
1747*4dc78e53SAndroid Build Coastguard Worker
1748*4dc78e53SAndroid Build Coastguard Worker if (flags & ~(RTNL_LINK_VXLAN_F_GBP | RTNL_LINK_VXLAN_F_GPE | RTNL_LINK_VXLAN_F_REMCSUM_NOPARTIAL))
1749*4dc78e53SAndroid Build Coastguard Worker return -NLE_INVAL;
1750*4dc78e53SAndroid Build Coastguard Worker
1751*4dc78e53SAndroid Build Coastguard Worker if (enable)
1752*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_flags |= flags;
1753*4dc78e53SAndroid Build Coastguard Worker else
1754*4dc78e53SAndroid Build Coastguard Worker vxi->vxi_flags &= ~flags;
1755*4dc78e53SAndroid Build Coastguard Worker
1756*4dc78e53SAndroid Build Coastguard Worker return 0;
1757*4dc78e53SAndroid Build Coastguard Worker }
1758*4dc78e53SAndroid Build Coastguard Worker
1759*4dc78e53SAndroid Build Coastguard Worker /**
1760*4dc78e53SAndroid Build Coastguard Worker * Get VXLAN flags RTNL_LINK_VXLAN_F_*
1761*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
1762*4dc78e53SAndroid Build Coastguard Worker * @arg out_flags Output value for flags. Must be present.
1763*4dc78e53SAndroid Build Coastguard Worker *
1764*4dc78e53SAndroid Build Coastguard Worker * @return Zero on success or a negative error code
1765*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_vxlan_get_flags(struct rtnl_link * link,uint32_t * out_flags)1766*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_vxlan_get_flags(struct rtnl_link *link, uint32_t *out_flags)
1767*4dc78e53SAndroid Build Coastguard Worker {
1768*4dc78e53SAndroid Build Coastguard Worker struct vxlan_info *vxi = link->l_info;
1769*4dc78e53SAndroid Build Coastguard Worker
1770*4dc78e53SAndroid Build Coastguard Worker IS_VXLAN_LINK_ASSERT(link);
1771*4dc78e53SAndroid Build Coastguard Worker
1772*4dc78e53SAndroid Build Coastguard Worker *out_flags = vxi->vxi_flags;
1773*4dc78e53SAndroid Build Coastguard Worker return 0;
1774*4dc78e53SAndroid Build Coastguard Worker }
1775*4dc78e53SAndroid Build Coastguard Worker
1776*4dc78e53SAndroid Build Coastguard Worker /** @} */
1777*4dc78e53SAndroid Build Coastguard Worker
vxlan_init(void)1778*4dc78e53SAndroid Build Coastguard Worker static void _nl_init vxlan_init(void)
1779*4dc78e53SAndroid Build Coastguard Worker {
1780*4dc78e53SAndroid Build Coastguard Worker rtnl_link_register_info(&vxlan_info_ops);
1781*4dc78e53SAndroid Build Coastguard Worker }
1782*4dc78e53SAndroid Build Coastguard Worker
vxlan_exit(void)1783*4dc78e53SAndroid Build Coastguard Worker static void _nl_exit vxlan_exit(void)
1784*4dc78e53SAndroid Build Coastguard Worker {
1785*4dc78e53SAndroid Build Coastguard Worker rtnl_link_unregister_info(&vxlan_info_ops);
1786*4dc78e53SAndroid Build Coastguard Worker }
1787*4dc78e53SAndroid Build Coastguard Worker
1788*4dc78e53SAndroid Build Coastguard Worker /** @} */
1789