1*4dc78e53SAndroid Build Coastguard Worker /* SPDX-License-Identifier: LGPL-2.1-only */
2*4dc78e53SAndroid Build Coastguard Worker
3*4dc78e53SAndroid Build Coastguard Worker /**
4*4dc78e53SAndroid Build Coastguard Worker * @ingroup link
5*4dc78e53SAndroid Build Coastguard Worker * @defgroup ip6gre IP6GRE
6*4dc78e53SAndroid Build Coastguard Worker * ip6gre link module
7*4dc78e53SAndroid Build Coastguard Worker *
8*4dc78e53SAndroid Build Coastguard Worker * @details
9*4dc78e53SAndroid Build Coastguard Worker * \b Link Type Name: "ip6gre"
10*4dc78e53SAndroid Build Coastguard Worker *
11*4dc78e53SAndroid Build Coastguard Worker * @route_doc{link_ip6gre, IP6GRE Documentation}
12*4dc78e53SAndroid Build Coastguard Worker *
13*4dc78e53SAndroid Build Coastguard Worker * @{
14*4dc78e53SAndroid Build Coastguard Worker */
15*4dc78e53SAndroid Build Coastguard Worker
16*4dc78e53SAndroid Build Coastguard Worker #include "nl-default.h"
17*4dc78e53SAndroid Build Coastguard Worker
18*4dc78e53SAndroid Build Coastguard Worker #include <linux/if_tunnel.h>
19*4dc78e53SAndroid Build Coastguard Worker
20*4dc78e53SAndroid Build Coastguard Worker #include <netlink/netlink.h>
21*4dc78e53SAndroid Build Coastguard Worker #include <netlink/attr.h>
22*4dc78e53SAndroid Build Coastguard Worker #include <netlink/utils.h>
23*4dc78e53SAndroid Build Coastguard Worker #include <netlink/object.h>
24*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/rtnl.h>
25*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/link/ip6gre.h>
26*4dc78e53SAndroid Build Coastguard Worker
27*4dc78e53SAndroid Build Coastguard Worker #include "nl-route.h"
28*4dc78e53SAndroid Build Coastguard Worker #include "link-api.h"
29*4dc78e53SAndroid Build Coastguard Worker
30*4dc78e53SAndroid Build Coastguard Worker #define IP6GRE_ATTR_LINK (1 << 0)
31*4dc78e53SAndroid Build Coastguard Worker #define IP6GRE_ATTR_IFLAGS (1 << 1)
32*4dc78e53SAndroid Build Coastguard Worker #define IP6GRE_ATTR_OFLAGS (1 << 2)
33*4dc78e53SAndroid Build Coastguard Worker #define IP6GRE_ATTR_IKEY (1 << 3)
34*4dc78e53SAndroid Build Coastguard Worker #define IP6GRE_ATTR_OKEY (1 << 4)
35*4dc78e53SAndroid Build Coastguard Worker #define IP6GRE_ATTR_LOCAL (1 << 5)
36*4dc78e53SAndroid Build Coastguard Worker #define IP6GRE_ATTR_REMOTE (1 << 6)
37*4dc78e53SAndroid Build Coastguard Worker #define IP6GRE_ATTR_TTL (1 << 7)
38*4dc78e53SAndroid Build Coastguard Worker #define IP6GRE_ATTR_ENCAPLIMIT (1 << 8)
39*4dc78e53SAndroid Build Coastguard Worker #define IP6GRE_ATTR_FLOWINFO (1 << 9)
40*4dc78e53SAndroid Build Coastguard Worker #define IP6GRE_ATTR_FLAGS (1 << 10)
41*4dc78e53SAndroid Build Coastguard Worker #define IP6GRE_ATTR_FWMARK (1 << 11)
42*4dc78e53SAndroid Build Coastguard Worker
43*4dc78e53SAndroid Build Coastguard Worker struct ip6gre_info
44*4dc78e53SAndroid Build Coastguard Worker {
45*4dc78e53SAndroid Build Coastguard Worker uint8_t ttl;
46*4dc78e53SAndroid Build Coastguard Worker uint8_t encaplimit;
47*4dc78e53SAndroid Build Coastguard Worker uint16_t iflags;
48*4dc78e53SAndroid Build Coastguard Worker uint16_t oflags;
49*4dc78e53SAndroid Build Coastguard Worker uint32_t ikey;
50*4dc78e53SAndroid Build Coastguard Worker uint32_t okey;
51*4dc78e53SAndroid Build Coastguard Worker uint32_t link;
52*4dc78e53SAndroid Build Coastguard Worker uint32_t flowinfo;
53*4dc78e53SAndroid Build Coastguard Worker uint32_t flags;
54*4dc78e53SAndroid Build Coastguard Worker struct in6_addr local;
55*4dc78e53SAndroid Build Coastguard Worker struct in6_addr remote;
56*4dc78e53SAndroid Build Coastguard Worker uint32_t fwmark;
57*4dc78e53SAndroid Build Coastguard Worker uint32_t ip6gre_mask;
58*4dc78e53SAndroid Build Coastguard Worker };
59*4dc78e53SAndroid Build Coastguard Worker
60*4dc78e53SAndroid Build Coastguard Worker static struct nla_policy ip6gre_policy[IFLA_GRE_MAX + 1] = {
61*4dc78e53SAndroid Build Coastguard Worker [IFLA_GRE_LINK] = { .type = NLA_U32 },
62*4dc78e53SAndroid Build Coastguard Worker [IFLA_GRE_IFLAGS] = { .type = NLA_U16 },
63*4dc78e53SAndroid Build Coastguard Worker [IFLA_GRE_OFLAGS] = { .type = NLA_U16 },
64*4dc78e53SAndroid Build Coastguard Worker [IFLA_GRE_IKEY] = { .type = NLA_U32 },
65*4dc78e53SAndroid Build Coastguard Worker [IFLA_GRE_OKEY] = { .type = NLA_U32 },
66*4dc78e53SAndroid Build Coastguard Worker [IFLA_GRE_LOCAL] = { .minlen = sizeof(struct in6_addr) },
67*4dc78e53SAndroid Build Coastguard Worker [IFLA_GRE_REMOTE] = { .minlen = sizeof(struct in6_addr) },
68*4dc78e53SAndroid Build Coastguard Worker [IFLA_GRE_TTL] = { .type = NLA_U8 },
69*4dc78e53SAndroid Build Coastguard Worker [IFLA_GRE_ENCAP_LIMIT] = { .type = NLA_U8 },
70*4dc78e53SAndroid Build Coastguard Worker [IFLA_GRE_FLOWINFO] = { .type = NLA_U32 },
71*4dc78e53SAndroid Build Coastguard Worker [IFLA_GRE_FLAGS] = { .type = NLA_U32 },
72*4dc78e53SAndroid Build Coastguard Worker [IFLA_GRE_FWMARK] = { .type = NLA_U32 },
73*4dc78e53SAndroid Build Coastguard Worker };
74*4dc78e53SAndroid Build Coastguard Worker
ip6gre_alloc(struct rtnl_link * link)75*4dc78e53SAndroid Build Coastguard Worker static int ip6gre_alloc(struct rtnl_link *link)
76*4dc78e53SAndroid Build Coastguard Worker {
77*4dc78e53SAndroid Build Coastguard Worker struct ip6gre_info *ip6gre;
78*4dc78e53SAndroid Build Coastguard Worker
79*4dc78e53SAndroid Build Coastguard Worker if (link->l_info)
80*4dc78e53SAndroid Build Coastguard Worker memset(link->l_info, 0, sizeof(*ip6gre));
81*4dc78e53SAndroid Build Coastguard Worker else {
82*4dc78e53SAndroid Build Coastguard Worker ip6gre = calloc(1, sizeof(*ip6gre));
83*4dc78e53SAndroid Build Coastguard Worker if (!ip6gre)
84*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
85*4dc78e53SAndroid Build Coastguard Worker
86*4dc78e53SAndroid Build Coastguard Worker link->l_info = ip6gre;
87*4dc78e53SAndroid Build Coastguard Worker }
88*4dc78e53SAndroid Build Coastguard Worker
89*4dc78e53SAndroid Build Coastguard Worker return 0;
90*4dc78e53SAndroid Build Coastguard Worker }
91*4dc78e53SAndroid Build Coastguard Worker
ip6gre_parse(struct rtnl_link * link,struct nlattr * data,struct nlattr * xstats)92*4dc78e53SAndroid Build Coastguard Worker static int ip6gre_parse(struct rtnl_link *link, struct nlattr *data,
93*4dc78e53SAndroid Build Coastguard Worker struct nlattr *xstats)
94*4dc78e53SAndroid Build Coastguard Worker {
95*4dc78e53SAndroid Build Coastguard Worker struct nlattr *tb[IFLA_GRE_MAX + 1];
96*4dc78e53SAndroid Build Coastguard Worker struct ip6gre_info *ip6gre;
97*4dc78e53SAndroid Build Coastguard Worker int err;
98*4dc78e53SAndroid Build Coastguard Worker
99*4dc78e53SAndroid Build Coastguard Worker NL_DBG(3, "Parsing IP6GRE link info\n");
100*4dc78e53SAndroid Build Coastguard Worker
101*4dc78e53SAndroid Build Coastguard Worker err = nla_parse_nested(tb, IFLA_GRE_MAX, data, ip6gre_policy);
102*4dc78e53SAndroid Build Coastguard Worker if (err < 0)
103*4dc78e53SAndroid Build Coastguard Worker goto errout;
104*4dc78e53SAndroid Build Coastguard Worker
105*4dc78e53SAndroid Build Coastguard Worker err = ip6gre_alloc(link);
106*4dc78e53SAndroid Build Coastguard Worker if (err < 0)
107*4dc78e53SAndroid Build Coastguard Worker goto errout;
108*4dc78e53SAndroid Build Coastguard Worker
109*4dc78e53SAndroid Build Coastguard Worker ip6gre = link->l_info;
110*4dc78e53SAndroid Build Coastguard Worker
111*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_GRE_LINK]) {
112*4dc78e53SAndroid Build Coastguard Worker ip6gre->link = nla_get_u32(tb[IFLA_GRE_LINK]);
113*4dc78e53SAndroid Build Coastguard Worker ip6gre->ip6gre_mask |= IP6GRE_ATTR_LINK;
114*4dc78e53SAndroid Build Coastguard Worker }
115*4dc78e53SAndroid Build Coastguard Worker
116*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_GRE_IFLAGS]) {
117*4dc78e53SAndroid Build Coastguard Worker ip6gre->iflags = nla_get_u16(tb[IFLA_GRE_IFLAGS]);
118*4dc78e53SAndroid Build Coastguard Worker ip6gre->ip6gre_mask |= IP6GRE_ATTR_IFLAGS;
119*4dc78e53SAndroid Build Coastguard Worker }
120*4dc78e53SAndroid Build Coastguard Worker
121*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_GRE_OFLAGS]) {
122*4dc78e53SAndroid Build Coastguard Worker ip6gre->oflags = nla_get_u16(tb[IFLA_GRE_OFLAGS]);
123*4dc78e53SAndroid Build Coastguard Worker ip6gre->ip6gre_mask |= IP6GRE_ATTR_OFLAGS;
124*4dc78e53SAndroid Build Coastguard Worker }
125*4dc78e53SAndroid Build Coastguard Worker
126*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_GRE_IKEY]) {
127*4dc78e53SAndroid Build Coastguard Worker ip6gre->ikey = nla_get_u32(tb[IFLA_GRE_IKEY]);
128*4dc78e53SAndroid Build Coastguard Worker ip6gre->ip6gre_mask |= IP6GRE_ATTR_IKEY;
129*4dc78e53SAndroid Build Coastguard Worker }
130*4dc78e53SAndroid Build Coastguard Worker
131*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_GRE_OKEY]) {
132*4dc78e53SAndroid Build Coastguard Worker ip6gre->okey = nla_get_u32(tb[IFLA_GRE_OKEY]);
133*4dc78e53SAndroid Build Coastguard Worker ip6gre->ip6gre_mask |= IP6GRE_ATTR_OKEY;
134*4dc78e53SAndroid Build Coastguard Worker }
135*4dc78e53SAndroid Build Coastguard Worker
136*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_GRE_LOCAL]) {
137*4dc78e53SAndroid Build Coastguard Worker nla_memcpy(&ip6gre->local, tb[IFLA_GRE_LOCAL], sizeof(struct in6_addr));
138*4dc78e53SAndroid Build Coastguard Worker ip6gre->ip6gre_mask |= IP6GRE_ATTR_LOCAL;
139*4dc78e53SAndroid Build Coastguard Worker }
140*4dc78e53SAndroid Build Coastguard Worker
141*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_GRE_REMOTE]) {
142*4dc78e53SAndroid Build Coastguard Worker nla_memcpy(&ip6gre->remote, tb[IFLA_GRE_REMOTE], sizeof(struct in6_addr));
143*4dc78e53SAndroid Build Coastguard Worker ip6gre->ip6gre_mask |= IP6GRE_ATTR_REMOTE;
144*4dc78e53SAndroid Build Coastguard Worker }
145*4dc78e53SAndroid Build Coastguard Worker
146*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_GRE_TTL]) {
147*4dc78e53SAndroid Build Coastguard Worker ip6gre->ttl = nla_get_u8(tb[IFLA_GRE_TTL]);
148*4dc78e53SAndroid Build Coastguard Worker ip6gre->ip6gre_mask |= IP6GRE_ATTR_TTL;
149*4dc78e53SAndroid Build Coastguard Worker }
150*4dc78e53SAndroid Build Coastguard Worker
151*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_GRE_ENCAP_LIMIT]) {
152*4dc78e53SAndroid Build Coastguard Worker ip6gre->encaplimit = nla_get_u8(tb[IFLA_GRE_ENCAP_LIMIT]);
153*4dc78e53SAndroid Build Coastguard Worker ip6gre->ip6gre_mask |= IP6GRE_ATTR_ENCAPLIMIT;
154*4dc78e53SAndroid Build Coastguard Worker }
155*4dc78e53SAndroid Build Coastguard Worker
156*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_GRE_FLOWINFO]) {
157*4dc78e53SAndroid Build Coastguard Worker ip6gre->flowinfo = nla_get_u32(tb[IFLA_GRE_FLOWINFO]);
158*4dc78e53SAndroid Build Coastguard Worker ip6gre->ip6gre_mask |= IP6GRE_ATTR_FLOWINFO;
159*4dc78e53SAndroid Build Coastguard Worker }
160*4dc78e53SAndroid Build Coastguard Worker
161*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_GRE_FLAGS]) {
162*4dc78e53SAndroid Build Coastguard Worker ip6gre->flags = nla_get_u32(tb[IFLA_GRE_FLAGS]);
163*4dc78e53SAndroid Build Coastguard Worker ip6gre->ip6gre_mask |= IP6GRE_ATTR_FLAGS;
164*4dc78e53SAndroid Build Coastguard Worker }
165*4dc78e53SAndroid Build Coastguard Worker
166*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_GRE_FWMARK]) {
167*4dc78e53SAndroid Build Coastguard Worker ip6gre->fwmark = nla_get_u32(tb[IFLA_GRE_FWMARK]);
168*4dc78e53SAndroid Build Coastguard Worker ip6gre->ip6gre_mask |= IP6GRE_ATTR_FWMARK;
169*4dc78e53SAndroid Build Coastguard Worker }
170*4dc78e53SAndroid Build Coastguard Worker
171*4dc78e53SAndroid Build Coastguard Worker err = 0;
172*4dc78e53SAndroid Build Coastguard Worker
173*4dc78e53SAndroid Build Coastguard Worker errout:
174*4dc78e53SAndroid Build Coastguard Worker return err;
175*4dc78e53SAndroid Build Coastguard Worker }
176*4dc78e53SAndroid Build Coastguard Worker
ip6gre_put_attrs(struct nl_msg * msg,struct rtnl_link * link)177*4dc78e53SAndroid Build Coastguard Worker static int ip6gre_put_attrs(struct nl_msg *msg, struct rtnl_link *link)
178*4dc78e53SAndroid Build Coastguard Worker {
179*4dc78e53SAndroid Build Coastguard Worker struct ip6gre_info *ip6gre = link->l_info;
180*4dc78e53SAndroid Build Coastguard Worker struct nlattr *data;
181*4dc78e53SAndroid Build Coastguard Worker
182*4dc78e53SAndroid Build Coastguard Worker data = nla_nest_start(msg, IFLA_INFO_DATA);
183*4dc78e53SAndroid Build Coastguard Worker if (!data)
184*4dc78e53SAndroid Build Coastguard Worker return -NLE_MSGSIZE;
185*4dc78e53SAndroid Build Coastguard Worker
186*4dc78e53SAndroid Build Coastguard Worker if (ip6gre->ip6gre_mask & IP6GRE_ATTR_LINK)
187*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U32(msg, IFLA_GRE_LINK, ip6gre->link);
188*4dc78e53SAndroid Build Coastguard Worker
189*4dc78e53SAndroid Build Coastguard Worker if (ip6gre->ip6gre_mask & IP6GRE_ATTR_IFLAGS)
190*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U16(msg, IFLA_GRE_IFLAGS, ip6gre->iflags);
191*4dc78e53SAndroid Build Coastguard Worker
192*4dc78e53SAndroid Build Coastguard Worker if (ip6gre->ip6gre_mask & IP6GRE_ATTR_OFLAGS)
193*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U16(msg, IFLA_GRE_OFLAGS, ip6gre->oflags);
194*4dc78e53SAndroid Build Coastguard Worker
195*4dc78e53SAndroid Build Coastguard Worker if (ip6gre->ip6gre_mask & IP6GRE_ATTR_IKEY)
196*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U32(msg, IFLA_GRE_IKEY, ip6gre->ikey);
197*4dc78e53SAndroid Build Coastguard Worker
198*4dc78e53SAndroid Build Coastguard Worker if (ip6gre->ip6gre_mask & IP6GRE_ATTR_OKEY)
199*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U32(msg, IFLA_GRE_OKEY, ip6gre->okey);
200*4dc78e53SAndroid Build Coastguard Worker
201*4dc78e53SAndroid Build Coastguard Worker if (ip6gre->ip6gre_mask & IP6GRE_ATTR_LOCAL)
202*4dc78e53SAndroid Build Coastguard Worker NLA_PUT(msg, IFLA_GRE_LOCAL, sizeof(struct in6_addr), &ip6gre->local);
203*4dc78e53SAndroid Build Coastguard Worker
204*4dc78e53SAndroid Build Coastguard Worker if (ip6gre->ip6gre_mask & IP6GRE_ATTR_REMOTE)
205*4dc78e53SAndroid Build Coastguard Worker NLA_PUT(msg, IFLA_GRE_REMOTE, sizeof(struct in6_addr), &ip6gre->remote);
206*4dc78e53SAndroid Build Coastguard Worker
207*4dc78e53SAndroid Build Coastguard Worker if (ip6gre->ip6gre_mask & IP6GRE_ATTR_TTL)
208*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U8(msg, IFLA_GRE_TTL, ip6gre->ttl);
209*4dc78e53SAndroid Build Coastguard Worker
210*4dc78e53SAndroid Build Coastguard Worker if (ip6gre->ip6gre_mask & IP6GRE_ATTR_ENCAPLIMIT)
211*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U8(msg, IFLA_GRE_ENCAP_LIMIT, ip6gre->encaplimit);
212*4dc78e53SAndroid Build Coastguard Worker
213*4dc78e53SAndroid Build Coastguard Worker if (ip6gre->ip6gre_mask & IP6GRE_ATTR_FLOWINFO)
214*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U32(msg, IFLA_GRE_FLOWINFO, ip6gre->flowinfo);
215*4dc78e53SAndroid Build Coastguard Worker
216*4dc78e53SAndroid Build Coastguard Worker if (ip6gre->ip6gre_mask & IP6GRE_ATTR_FLAGS)
217*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U32(msg, IFLA_GRE_FLAGS, ip6gre->flags);
218*4dc78e53SAndroid Build Coastguard Worker
219*4dc78e53SAndroid Build Coastguard Worker if (ip6gre->ip6gre_mask & IP6GRE_ATTR_FWMARK)
220*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U32(msg, IFLA_GRE_FWMARK, ip6gre->fwmark);
221*4dc78e53SAndroid Build Coastguard Worker
222*4dc78e53SAndroid Build Coastguard Worker nla_nest_end(msg, data);
223*4dc78e53SAndroid Build Coastguard Worker
224*4dc78e53SAndroid Build Coastguard Worker nla_put_failure:
225*4dc78e53SAndroid Build Coastguard Worker
226*4dc78e53SAndroid Build Coastguard Worker return 0;
227*4dc78e53SAndroid Build Coastguard Worker }
228*4dc78e53SAndroid Build Coastguard Worker
ip6gre_free(struct rtnl_link * link)229*4dc78e53SAndroid Build Coastguard Worker static void ip6gre_free(struct rtnl_link *link)
230*4dc78e53SAndroid Build Coastguard Worker {
231*4dc78e53SAndroid Build Coastguard Worker struct ip6gre_info *ip6gre = link->l_info;
232*4dc78e53SAndroid Build Coastguard Worker
233*4dc78e53SAndroid Build Coastguard Worker free(ip6gre);
234*4dc78e53SAndroid Build Coastguard Worker link->l_info = NULL;
235*4dc78e53SAndroid Build Coastguard Worker }
236*4dc78e53SAndroid Build Coastguard Worker
ip6gre_dump_line(struct rtnl_link * link,struct nl_dump_params * p)237*4dc78e53SAndroid Build Coastguard Worker static void ip6gre_dump_line(struct rtnl_link *link, struct nl_dump_params *p)
238*4dc78e53SAndroid Build Coastguard Worker {
239*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "ip6gre : %s", link->l_name);
240*4dc78e53SAndroid Build Coastguard Worker }
241*4dc78e53SAndroid Build Coastguard Worker
ip6gre_dump_details(struct rtnl_link * link,struct nl_dump_params * p)242*4dc78e53SAndroid Build Coastguard Worker static void ip6gre_dump_details(struct rtnl_link *link, struct nl_dump_params *p)
243*4dc78e53SAndroid Build Coastguard Worker {
244*4dc78e53SAndroid Build Coastguard Worker struct ip6gre_info *ip6gre = link->l_info;
245*4dc78e53SAndroid Build Coastguard Worker char *name;
246*4dc78e53SAndroid Build Coastguard Worker char addr[INET6_ADDRSTRLEN];
247*4dc78e53SAndroid Build Coastguard Worker
248*4dc78e53SAndroid Build Coastguard Worker if (ip6gre->ip6gre_mask & IP6GRE_ATTR_LINK) {
249*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " link ");
250*4dc78e53SAndroid Build Coastguard Worker name = rtnl_link_get_name(link);
251*4dc78e53SAndroid Build Coastguard Worker if (name)
252*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%s\n", name);
253*4dc78e53SAndroid Build Coastguard Worker else
254*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%u\n", ip6gre->link);
255*4dc78e53SAndroid Build Coastguard Worker }
256*4dc78e53SAndroid Build Coastguard Worker
257*4dc78e53SAndroid Build Coastguard Worker if (ip6gre->ip6gre_mask & IP6GRE_ATTR_IFLAGS) {
258*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " iflags ");
259*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%x\n", ip6gre->iflags);
260*4dc78e53SAndroid Build Coastguard Worker }
261*4dc78e53SAndroid Build Coastguard Worker
262*4dc78e53SAndroid Build Coastguard Worker if (ip6gre->ip6gre_mask & IP6GRE_ATTR_OFLAGS) {
263*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " oflags ");
264*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%x\n", ip6gre->oflags);
265*4dc78e53SAndroid Build Coastguard Worker }
266*4dc78e53SAndroid Build Coastguard Worker
267*4dc78e53SAndroid Build Coastguard Worker if (ip6gre->ip6gre_mask & IP6GRE_ATTR_IKEY) {
268*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " ikey ");
269*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%x\n",ip6gre->ikey);
270*4dc78e53SAndroid Build Coastguard Worker }
271*4dc78e53SAndroid Build Coastguard Worker
272*4dc78e53SAndroid Build Coastguard Worker if (ip6gre->ip6gre_mask & IP6GRE_ATTR_OKEY) {
273*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " okey ");
274*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%x\n", ip6gre->okey);
275*4dc78e53SAndroid Build Coastguard Worker }
276*4dc78e53SAndroid Build Coastguard Worker
277*4dc78e53SAndroid Build Coastguard Worker if (ip6gre->ip6gre_mask & IP6GRE_ATTR_LOCAL) {
278*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " local ");
279*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%s\n",
280*4dc78e53SAndroid Build Coastguard Worker _nl_inet_ntop(AF_INET6, &ip6gre->local, addr));
281*4dc78e53SAndroid Build Coastguard Worker }
282*4dc78e53SAndroid Build Coastguard Worker
283*4dc78e53SAndroid Build Coastguard Worker if (ip6gre->ip6gre_mask & IP6GRE_ATTR_REMOTE) {
284*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " remote ");
285*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%s\n",
286*4dc78e53SAndroid Build Coastguard Worker _nl_inet_ntop(AF_INET6, &ip6gre->remote, addr));
287*4dc78e53SAndroid Build Coastguard Worker }
288*4dc78e53SAndroid Build Coastguard Worker
289*4dc78e53SAndroid Build Coastguard Worker if (ip6gre->ip6gre_mask & IP6GRE_ATTR_TTL) {
290*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " ttl ");
291*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%u\n", ip6gre->ttl);
292*4dc78e53SAndroid Build Coastguard Worker }
293*4dc78e53SAndroid Build Coastguard Worker
294*4dc78e53SAndroid Build Coastguard Worker if (ip6gre->ip6gre_mask & IP6GRE_ATTR_ENCAPLIMIT) {
295*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " encaplimit ");
296*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%u\n", ip6gre->encaplimit);
297*4dc78e53SAndroid Build Coastguard Worker }
298*4dc78e53SAndroid Build Coastguard Worker
299*4dc78e53SAndroid Build Coastguard Worker if (ip6gre->ip6gre_mask & IP6GRE_ATTR_FLOWINFO) {
300*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " flowinfo ");
301*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%x\n", ip6gre->flowinfo);
302*4dc78e53SAndroid Build Coastguard Worker }
303*4dc78e53SAndroid Build Coastguard Worker
304*4dc78e53SAndroid Build Coastguard Worker if (ip6gre->ip6gre_mask & IP6GRE_ATTR_FLAGS) {
305*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " flags ");
306*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%x\n", ip6gre->flags);
307*4dc78e53SAndroid Build Coastguard Worker }
308*4dc78e53SAndroid Build Coastguard Worker
309*4dc78e53SAndroid Build Coastguard Worker if (ip6gre->ip6gre_mask & IP6GRE_ATTR_FWMARK) {
310*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " fwmark ");
311*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%x\n", ip6gre->fwmark);
312*4dc78e53SAndroid Build Coastguard Worker }
313*4dc78e53SAndroid Build Coastguard Worker }
314*4dc78e53SAndroid Build Coastguard Worker
ip6gre_clone(struct rtnl_link * dst,struct rtnl_link * src)315*4dc78e53SAndroid Build Coastguard Worker static int ip6gre_clone(struct rtnl_link *dst, struct rtnl_link *src)
316*4dc78e53SAndroid Build Coastguard Worker {
317*4dc78e53SAndroid Build Coastguard Worker struct ip6gre_info *ip6gre_dst, *ip6gre_src = src->l_info;
318*4dc78e53SAndroid Build Coastguard Worker int err;
319*4dc78e53SAndroid Build Coastguard Worker
320*4dc78e53SAndroid Build Coastguard Worker dst->l_info = NULL;
321*4dc78e53SAndroid Build Coastguard Worker
322*4dc78e53SAndroid Build Coastguard Worker err = rtnl_link_set_type(dst, "ip6gre");
323*4dc78e53SAndroid Build Coastguard Worker if (err < 0)
324*4dc78e53SAndroid Build Coastguard Worker return err;
325*4dc78e53SAndroid Build Coastguard Worker
326*4dc78e53SAndroid Build Coastguard Worker ip6gre_dst = dst->l_info;
327*4dc78e53SAndroid Build Coastguard Worker
328*4dc78e53SAndroid Build Coastguard Worker if (!ip6gre_dst || !ip6gre_src)
329*4dc78e53SAndroid Build Coastguard Worker BUG();
330*4dc78e53SAndroid Build Coastguard Worker
331*4dc78e53SAndroid Build Coastguard Worker memcpy(ip6gre_dst, ip6gre_src, sizeof(struct ip6gre_info));
332*4dc78e53SAndroid Build Coastguard Worker
333*4dc78e53SAndroid Build Coastguard Worker return 0;
334*4dc78e53SAndroid Build Coastguard Worker }
335*4dc78e53SAndroid Build Coastguard Worker
336*4dc78e53SAndroid Build Coastguard Worker static struct rtnl_link_info_ops ip6gre_info_ops = {
337*4dc78e53SAndroid Build Coastguard Worker .io_name = "ip6gre",
338*4dc78e53SAndroid Build Coastguard Worker .io_alloc = ip6gre_alloc,
339*4dc78e53SAndroid Build Coastguard Worker .io_parse = ip6gre_parse,
340*4dc78e53SAndroid Build Coastguard Worker .io_dump = {
341*4dc78e53SAndroid Build Coastguard Worker [NL_DUMP_LINE] = ip6gre_dump_line,
342*4dc78e53SAndroid Build Coastguard Worker [NL_DUMP_DETAILS] = ip6gre_dump_details,
343*4dc78e53SAndroid Build Coastguard Worker },
344*4dc78e53SAndroid Build Coastguard Worker .io_clone = ip6gre_clone,
345*4dc78e53SAndroid Build Coastguard Worker .io_put_attrs = ip6gre_put_attrs,
346*4dc78e53SAndroid Build Coastguard Worker .io_free = ip6gre_free,
347*4dc78e53SAndroid Build Coastguard Worker };
348*4dc78e53SAndroid Build Coastguard Worker
349*4dc78e53SAndroid Build Coastguard Worker #define IS_IP6GRE_LINK_ASSERT(link) \
350*4dc78e53SAndroid Build Coastguard Worker if ((link)->l_info_ops != &ip6gre_info_ops) { \
351*4dc78e53SAndroid Build Coastguard Worker APPBUG("Link is not a ip6gre link. set type \"ip6gre\" first.");\
352*4dc78e53SAndroid Build Coastguard Worker return -NLE_OPNOTSUPP; \
353*4dc78e53SAndroid Build Coastguard Worker }
354*4dc78e53SAndroid Build Coastguard Worker
355*4dc78e53SAndroid Build Coastguard Worker #define HAS_IP6GRE_ATTR_ASSERT(link,attr) \
356*4dc78e53SAndroid Build Coastguard Worker if (!((link)->ip6gre_mask & (attr))) \
357*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOATTR;
358*4dc78e53SAndroid Build Coastguard Worker
rtnl_link_ip6gre_alloc(void)359*4dc78e53SAndroid Build Coastguard Worker struct rtnl_link *rtnl_link_ip6gre_alloc(void)
360*4dc78e53SAndroid Build Coastguard Worker {
361*4dc78e53SAndroid Build Coastguard Worker struct rtnl_link *link;
362*4dc78e53SAndroid Build Coastguard Worker int err;
363*4dc78e53SAndroid Build Coastguard Worker
364*4dc78e53SAndroid Build Coastguard Worker link = rtnl_link_alloc();
365*4dc78e53SAndroid Build Coastguard Worker if (!link)
366*4dc78e53SAndroid Build Coastguard Worker return NULL;
367*4dc78e53SAndroid Build Coastguard Worker
368*4dc78e53SAndroid Build Coastguard Worker err = rtnl_link_set_type(link, "ip6gre");
369*4dc78e53SAndroid Build Coastguard Worker if (err < 0) {
370*4dc78e53SAndroid Build Coastguard Worker rtnl_link_put(link);
371*4dc78e53SAndroid Build Coastguard Worker return NULL;
372*4dc78e53SAndroid Build Coastguard Worker }
373*4dc78e53SAndroid Build Coastguard Worker
374*4dc78e53SAndroid Build Coastguard Worker return link;
375*4dc78e53SAndroid Build Coastguard Worker }
376*4dc78e53SAndroid Build Coastguard Worker
377*4dc78e53SAndroid Build Coastguard Worker /**
378*4dc78e53SAndroid Build Coastguard Worker * Check if link is a IP6GRE link
379*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
380*4dc78e53SAndroid Build Coastguard Worker *
381*4dc78e53SAndroid Build Coastguard Worker * @return True if link is a IP6GRE link, otherwise 0 is returned.
382*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_is_ip6gre(struct rtnl_link * link)383*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_is_ip6gre(struct rtnl_link *link)
384*4dc78e53SAndroid Build Coastguard Worker {
385*4dc78e53SAndroid Build Coastguard Worker return link->l_info_ops && !strcmp(link->l_info_ops->io_name, "ip6gre");
386*4dc78e53SAndroid Build Coastguard Worker }
387*4dc78e53SAndroid Build Coastguard Worker
388*4dc78e53SAndroid Build Coastguard Worker /**
389*4dc78e53SAndroid Build Coastguard Worker * Create a new IP6GRE tunnel device
390*4dc78e53SAndroid Build Coastguard Worker * @arg sock netlink socket
391*4dc78e53SAndroid Build Coastguard Worker * @arg name name of the tunnel deviceL
392*4dc78e53SAndroid Build Coastguard Worker *
393*4dc78e53SAndroid Build Coastguard Worker * Creates a new ip6gre tunnel device in the kernel
394*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
395*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6gre_add(struct nl_sock * sk,const char * name)396*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6gre_add(struct nl_sock *sk, const char *name)
397*4dc78e53SAndroid Build Coastguard Worker {
398*4dc78e53SAndroid Build Coastguard Worker struct rtnl_link *link;
399*4dc78e53SAndroid Build Coastguard Worker int err;
400*4dc78e53SAndroid Build Coastguard Worker
401*4dc78e53SAndroid Build Coastguard Worker link = rtnl_link_ip6gre_alloc();
402*4dc78e53SAndroid Build Coastguard Worker if (!link)
403*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
404*4dc78e53SAndroid Build Coastguard Worker
405*4dc78e53SAndroid Build Coastguard Worker if(name)
406*4dc78e53SAndroid Build Coastguard Worker rtnl_link_set_name(link, name);
407*4dc78e53SAndroid Build Coastguard Worker
408*4dc78e53SAndroid Build Coastguard Worker err = rtnl_link_add(sk, link, NLM_F_CREATE);
409*4dc78e53SAndroid Build Coastguard Worker rtnl_link_put(link);
410*4dc78e53SAndroid Build Coastguard Worker
411*4dc78e53SAndroid Build Coastguard Worker return err;
412*4dc78e53SAndroid Build Coastguard Worker }
413*4dc78e53SAndroid Build Coastguard Worker
414*4dc78e53SAndroid Build Coastguard Worker /**
415*4dc78e53SAndroid Build Coastguard Worker * Set IP6GRE tunnel interface index
416*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
417*4dc78e53SAndroid Build Coastguard Worker * @arg index interface index
418*4dc78e53SAndroid Build Coastguard Worker *
419*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
420*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6gre_set_link(struct rtnl_link * link,uint32_t index)421*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6gre_set_link(struct rtnl_link *link, uint32_t index)
422*4dc78e53SAndroid Build Coastguard Worker {
423*4dc78e53SAndroid Build Coastguard Worker struct ip6gre_info *ip6gre = link->l_info;
424*4dc78e53SAndroid Build Coastguard Worker
425*4dc78e53SAndroid Build Coastguard Worker IS_IP6GRE_LINK_ASSERT(link);
426*4dc78e53SAndroid Build Coastguard Worker
427*4dc78e53SAndroid Build Coastguard Worker ip6gre->link = index;
428*4dc78e53SAndroid Build Coastguard Worker ip6gre->ip6gre_mask |= IP6GRE_ATTR_LINK;
429*4dc78e53SAndroid Build Coastguard Worker
430*4dc78e53SAndroid Build Coastguard Worker return 0;
431*4dc78e53SAndroid Build Coastguard Worker }
432*4dc78e53SAndroid Build Coastguard Worker
433*4dc78e53SAndroid Build Coastguard Worker /**
434*4dc78e53SAndroid Build Coastguard Worker * Get IP6GRE tunnel interface index
435*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
436*4dc78e53SAndroid Build Coastguard Worker * @arg index addr to fill in with the interface index
437*4dc78e53SAndroid Build Coastguard Worker *
438*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
439*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6gre_get_link(struct rtnl_link * link,uint32_t * index)440*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6gre_get_link(struct rtnl_link *link, uint32_t *index)
441*4dc78e53SAndroid Build Coastguard Worker {
442*4dc78e53SAndroid Build Coastguard Worker struct ip6gre_info *ip6gre = link->l_info;
443*4dc78e53SAndroid Build Coastguard Worker
444*4dc78e53SAndroid Build Coastguard Worker IS_IP6GRE_LINK_ASSERT(link);
445*4dc78e53SAndroid Build Coastguard Worker
446*4dc78e53SAndroid Build Coastguard Worker HAS_IP6GRE_ATTR_ASSERT(ip6gre, IP6GRE_ATTR_LINK);
447*4dc78e53SAndroid Build Coastguard Worker
448*4dc78e53SAndroid Build Coastguard Worker *index = ip6gre->link;
449*4dc78e53SAndroid Build Coastguard Worker
450*4dc78e53SAndroid Build Coastguard Worker return 0;
451*4dc78e53SAndroid Build Coastguard Worker }
452*4dc78e53SAndroid Build Coastguard Worker
453*4dc78e53SAndroid Build Coastguard Worker /**
454*4dc78e53SAndroid Build Coastguard Worker * Set IP6GRE tunnel set iflags
455*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
456*4dc78e53SAndroid Build Coastguard Worker * @arg iflags ip6gre iflags
457*4dc78e53SAndroid Build Coastguard Worker *
458*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
459*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6gre_set_iflags(struct rtnl_link * link,uint16_t iflags)460*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6gre_set_iflags(struct rtnl_link *link, uint16_t iflags)
461*4dc78e53SAndroid Build Coastguard Worker {
462*4dc78e53SAndroid Build Coastguard Worker struct ip6gre_info *ip6gre = link->l_info;
463*4dc78e53SAndroid Build Coastguard Worker
464*4dc78e53SAndroid Build Coastguard Worker IS_IP6GRE_LINK_ASSERT(link);
465*4dc78e53SAndroid Build Coastguard Worker
466*4dc78e53SAndroid Build Coastguard Worker ip6gre->iflags = iflags;
467*4dc78e53SAndroid Build Coastguard Worker ip6gre->ip6gre_mask |= IP6GRE_ATTR_IFLAGS;
468*4dc78e53SAndroid Build Coastguard Worker
469*4dc78e53SAndroid Build Coastguard Worker return 0;
470*4dc78e53SAndroid Build Coastguard Worker }
471*4dc78e53SAndroid Build Coastguard Worker
472*4dc78e53SAndroid Build Coastguard Worker /**
473*4dc78e53SAndroid Build Coastguard Worker * Get IP6GRE tunnel iflags
474*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
475*4dc78e53SAndroid Build Coastguard Worker * @arg iflags addr to fill in with the iflags
476*4dc78e53SAndroid Build Coastguard Worker *
477*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
478*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6gre_get_iflags(struct rtnl_link * link,uint16_t * iflags)479*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6gre_get_iflags(struct rtnl_link *link, uint16_t *iflags)
480*4dc78e53SAndroid Build Coastguard Worker {
481*4dc78e53SAndroid Build Coastguard Worker struct ip6gre_info *ip6gre = link->l_info;
482*4dc78e53SAndroid Build Coastguard Worker
483*4dc78e53SAndroid Build Coastguard Worker IS_IP6GRE_LINK_ASSERT(link);
484*4dc78e53SAndroid Build Coastguard Worker
485*4dc78e53SAndroid Build Coastguard Worker HAS_IP6GRE_ATTR_ASSERT(ip6gre, IP6GRE_ATTR_IFLAGS);
486*4dc78e53SAndroid Build Coastguard Worker
487*4dc78e53SAndroid Build Coastguard Worker *iflags = ip6gre->iflags;
488*4dc78e53SAndroid Build Coastguard Worker
489*4dc78e53SAndroid Build Coastguard Worker return 0;
490*4dc78e53SAndroid Build Coastguard Worker }
491*4dc78e53SAndroid Build Coastguard Worker
492*4dc78e53SAndroid Build Coastguard Worker /**
493*4dc78e53SAndroid Build Coastguard Worker * Set IP6GRE tunnel set oflags
494*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
495*4dc78e53SAndroid Build Coastguard Worker * @arg oflags ip6gre oflags
496*4dc78e53SAndroid Build Coastguard Worker *
497*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
498*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6gre_set_oflags(struct rtnl_link * link,uint16_t oflags)499*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6gre_set_oflags(struct rtnl_link *link, uint16_t oflags)
500*4dc78e53SAndroid Build Coastguard Worker {
501*4dc78e53SAndroid Build Coastguard Worker struct ip6gre_info *ip6gre = link->l_info;
502*4dc78e53SAndroid Build Coastguard Worker
503*4dc78e53SAndroid Build Coastguard Worker IS_IP6GRE_LINK_ASSERT(link);
504*4dc78e53SAndroid Build Coastguard Worker
505*4dc78e53SAndroid Build Coastguard Worker ip6gre->oflags = oflags;
506*4dc78e53SAndroid Build Coastguard Worker ip6gre->ip6gre_mask |= IP6GRE_ATTR_OFLAGS;
507*4dc78e53SAndroid Build Coastguard Worker
508*4dc78e53SAndroid Build Coastguard Worker return 0;
509*4dc78e53SAndroid Build Coastguard Worker }
510*4dc78e53SAndroid Build Coastguard Worker
511*4dc78e53SAndroid Build Coastguard Worker /**
512*4dc78e53SAndroid Build Coastguard Worker * Get IP6GRE tunnel oflags
513*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
514*4dc78e53SAndroid Build Coastguard Worker * @arg oflags addr to fill in with the oflags
515*4dc78e53SAndroid Build Coastguard Worker *
516*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
517*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6gre_get_oflags(struct rtnl_link * link,uint16_t * oflags)518*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6gre_get_oflags(struct rtnl_link *link, uint16_t *oflags)
519*4dc78e53SAndroid Build Coastguard Worker {
520*4dc78e53SAndroid Build Coastguard Worker struct ip6gre_info *ip6gre = link->l_info;
521*4dc78e53SAndroid Build Coastguard Worker
522*4dc78e53SAndroid Build Coastguard Worker IS_IP6GRE_LINK_ASSERT(link);
523*4dc78e53SAndroid Build Coastguard Worker
524*4dc78e53SAndroid Build Coastguard Worker HAS_IP6GRE_ATTR_ASSERT(ip6gre, IP6GRE_ATTR_OFLAGS);
525*4dc78e53SAndroid Build Coastguard Worker
526*4dc78e53SAndroid Build Coastguard Worker *oflags = ip6gre->oflags;
527*4dc78e53SAndroid Build Coastguard Worker
528*4dc78e53SAndroid Build Coastguard Worker return 0;
529*4dc78e53SAndroid Build Coastguard Worker }
530*4dc78e53SAndroid Build Coastguard Worker
531*4dc78e53SAndroid Build Coastguard Worker /**
532*4dc78e53SAndroid Build Coastguard Worker * Set IP6GRE tunnel set ikey
533*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
534*4dc78e53SAndroid Build Coastguard Worker * @arg ikey ip6gre ikey
535*4dc78e53SAndroid Build Coastguard Worker *
536*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
537*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6gre_set_ikey(struct rtnl_link * link,uint32_t ikey)538*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6gre_set_ikey(struct rtnl_link *link, uint32_t ikey)
539*4dc78e53SAndroid Build Coastguard Worker {
540*4dc78e53SAndroid Build Coastguard Worker struct ip6gre_info *ip6gre = link->l_info;
541*4dc78e53SAndroid Build Coastguard Worker
542*4dc78e53SAndroid Build Coastguard Worker IS_IP6GRE_LINK_ASSERT(link);
543*4dc78e53SAndroid Build Coastguard Worker
544*4dc78e53SAndroid Build Coastguard Worker ip6gre->ikey = ikey;
545*4dc78e53SAndroid Build Coastguard Worker ip6gre->ip6gre_mask |= IP6GRE_ATTR_IKEY;
546*4dc78e53SAndroid Build Coastguard Worker
547*4dc78e53SAndroid Build Coastguard Worker return 0;
548*4dc78e53SAndroid Build Coastguard Worker }
549*4dc78e53SAndroid Build Coastguard Worker
550*4dc78e53SAndroid Build Coastguard Worker /**
551*4dc78e53SAndroid Build Coastguard Worker * Get IP6GRE tunnel ikey
552*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
553*4dc78e53SAndroid Build Coastguard Worker * @arg ikey addr to fill in with the ikey
554*4dc78e53SAndroid Build Coastguard Worker *
555*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
556*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6gre_get_ikey(struct rtnl_link * link,uint32_t * ikey)557*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6gre_get_ikey(struct rtnl_link *link, uint32_t *ikey)
558*4dc78e53SAndroid Build Coastguard Worker {
559*4dc78e53SAndroid Build Coastguard Worker struct ip6gre_info *ip6gre = link->l_info;
560*4dc78e53SAndroid Build Coastguard Worker
561*4dc78e53SAndroid Build Coastguard Worker IS_IP6GRE_LINK_ASSERT(link);
562*4dc78e53SAndroid Build Coastguard Worker
563*4dc78e53SAndroid Build Coastguard Worker HAS_IP6GRE_ATTR_ASSERT(ip6gre, IP6GRE_ATTR_IKEY);
564*4dc78e53SAndroid Build Coastguard Worker
565*4dc78e53SAndroid Build Coastguard Worker *ikey = ip6gre->ikey;
566*4dc78e53SAndroid Build Coastguard Worker
567*4dc78e53SAndroid Build Coastguard Worker return 0;
568*4dc78e53SAndroid Build Coastguard Worker }
569*4dc78e53SAndroid Build Coastguard Worker
570*4dc78e53SAndroid Build Coastguard Worker /**
571*4dc78e53SAndroid Build Coastguard Worker * Set IP6GRE tunnel set okey
572*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
573*4dc78e53SAndroid Build Coastguard Worker * @arg okey ip6gre okey
574*4dc78e53SAndroid Build Coastguard Worker *
575*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
576*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6gre_set_okey(struct rtnl_link * link,uint32_t okey)577*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6gre_set_okey(struct rtnl_link *link, uint32_t okey)
578*4dc78e53SAndroid Build Coastguard Worker {
579*4dc78e53SAndroid Build Coastguard Worker struct ip6gre_info *ip6gre = link->l_info;
580*4dc78e53SAndroid Build Coastguard Worker
581*4dc78e53SAndroid Build Coastguard Worker IS_IP6GRE_LINK_ASSERT(link);
582*4dc78e53SAndroid Build Coastguard Worker
583*4dc78e53SAndroid Build Coastguard Worker ip6gre->okey = okey;
584*4dc78e53SAndroid Build Coastguard Worker ip6gre->ip6gre_mask |= IP6GRE_ATTR_OKEY;
585*4dc78e53SAndroid Build Coastguard Worker
586*4dc78e53SAndroid Build Coastguard Worker return 0;
587*4dc78e53SAndroid Build Coastguard Worker }
588*4dc78e53SAndroid Build Coastguard Worker
589*4dc78e53SAndroid Build Coastguard Worker /**
590*4dc78e53SAndroid Build Coastguard Worker * Get IP6GRE tunnel okey
591*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
592*4dc78e53SAndroid Build Coastguard Worker * @arg okey addr to fill in with the okey
593*4dc78e53SAndroid Build Coastguard Worker *
594*4dc78e53SAndroid Build Coastguard Worker * @return okey value
595*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6gre_get_okey(struct rtnl_link * link,uint32_t * okey)596*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6gre_get_okey(struct rtnl_link *link, uint32_t *okey)
597*4dc78e53SAndroid Build Coastguard Worker {
598*4dc78e53SAndroid Build Coastguard Worker struct ip6gre_info *ip6gre = link->l_info;
599*4dc78e53SAndroid Build Coastguard Worker
600*4dc78e53SAndroid Build Coastguard Worker IS_IP6GRE_LINK_ASSERT(link);
601*4dc78e53SAndroid Build Coastguard Worker
602*4dc78e53SAndroid Build Coastguard Worker HAS_IP6GRE_ATTR_ASSERT(ip6gre, IP6GRE_ATTR_OKEY);
603*4dc78e53SAndroid Build Coastguard Worker
604*4dc78e53SAndroid Build Coastguard Worker *okey = ip6gre->okey;
605*4dc78e53SAndroid Build Coastguard Worker
606*4dc78e53SAndroid Build Coastguard Worker return 0;
607*4dc78e53SAndroid Build Coastguard Worker }
608*4dc78e53SAndroid Build Coastguard Worker
609*4dc78e53SAndroid Build Coastguard Worker /**
610*4dc78e53SAndroid Build Coastguard Worker * Set IP6GRE tunnel local address
611*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
612*4dc78e53SAndroid Build Coastguard Worker * @arg local local address
613*4dc78e53SAndroid Build Coastguard Worker *
614*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
615*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6gre_set_local(struct rtnl_link * link,struct in6_addr * local)616*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6gre_set_local(struct rtnl_link *link, struct in6_addr *local)
617*4dc78e53SAndroid Build Coastguard Worker {
618*4dc78e53SAndroid Build Coastguard Worker struct ip6gre_info *ip6gre = link->l_info;
619*4dc78e53SAndroid Build Coastguard Worker
620*4dc78e53SAndroid Build Coastguard Worker IS_IP6GRE_LINK_ASSERT(link);
621*4dc78e53SAndroid Build Coastguard Worker
622*4dc78e53SAndroid Build Coastguard Worker memcpy(&ip6gre->local, local, sizeof(struct in6_addr));
623*4dc78e53SAndroid Build Coastguard Worker ip6gre->ip6gre_mask |= IP6GRE_ATTR_LOCAL;
624*4dc78e53SAndroid Build Coastguard Worker
625*4dc78e53SAndroid Build Coastguard Worker return 0;
626*4dc78e53SAndroid Build Coastguard Worker }
627*4dc78e53SAndroid Build Coastguard Worker
628*4dc78e53SAndroid Build Coastguard Worker /**
629*4dc78e53SAndroid Build Coastguard Worker * Get IP6GRE tunnel local address
630*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
631*4dc78e53SAndroid Build Coastguard Worker * @arg local addr to fill in with local address
632*4dc78e53SAndroid Build Coastguard Worker *
633*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
634*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6gre_get_local(struct rtnl_link * link,struct in6_addr * local)635*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6gre_get_local(struct rtnl_link *link, struct in6_addr *local)
636*4dc78e53SAndroid Build Coastguard Worker {
637*4dc78e53SAndroid Build Coastguard Worker struct ip6gre_info *ip6gre = link->l_info;
638*4dc78e53SAndroid Build Coastguard Worker
639*4dc78e53SAndroid Build Coastguard Worker IS_IP6GRE_LINK_ASSERT(link);
640*4dc78e53SAndroid Build Coastguard Worker
641*4dc78e53SAndroid Build Coastguard Worker HAS_IP6GRE_ATTR_ASSERT(ip6gre, IP6GRE_ATTR_LOCAL);
642*4dc78e53SAndroid Build Coastguard Worker
643*4dc78e53SAndroid Build Coastguard Worker memcpy(local, &ip6gre->local, sizeof(struct in6_addr));
644*4dc78e53SAndroid Build Coastguard Worker
645*4dc78e53SAndroid Build Coastguard Worker return 0;
646*4dc78e53SAndroid Build Coastguard Worker }
647*4dc78e53SAndroid Build Coastguard Worker
648*4dc78e53SAndroid Build Coastguard Worker /**
649*4dc78e53SAndroid Build Coastguard Worker * Set IP6GRE tunnel remote address
650*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
651*4dc78e53SAndroid Build Coastguard Worker * @arg remote remote address
652*4dc78e53SAndroid Build Coastguard Worker *
653*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
654*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6gre_set_remote(struct rtnl_link * link,struct in6_addr * remote)655*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6gre_set_remote(struct rtnl_link *link, struct in6_addr *remote)
656*4dc78e53SAndroid Build Coastguard Worker {
657*4dc78e53SAndroid Build Coastguard Worker struct ip6gre_info *ip6gre = link->l_info;
658*4dc78e53SAndroid Build Coastguard Worker
659*4dc78e53SAndroid Build Coastguard Worker IS_IP6GRE_LINK_ASSERT(link);
660*4dc78e53SAndroid Build Coastguard Worker
661*4dc78e53SAndroid Build Coastguard Worker memcpy(&ip6gre->remote, remote, sizeof(struct in6_addr));
662*4dc78e53SAndroid Build Coastguard Worker ip6gre->ip6gre_mask |= IP6GRE_ATTR_REMOTE;
663*4dc78e53SAndroid Build Coastguard Worker
664*4dc78e53SAndroid Build Coastguard Worker return 0;
665*4dc78e53SAndroid Build Coastguard Worker }
666*4dc78e53SAndroid Build Coastguard Worker
667*4dc78e53SAndroid Build Coastguard Worker /**
668*4dc78e53SAndroid Build Coastguard Worker * Get IP6GRE tunnel remote address
669*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
670*4dc78e53SAndroid Build Coastguard Worker * @arg remote addr to fill in with remote address
671*4dc78e53SAndroid Build Coastguard Worker *
672*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
673*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6gre_get_remote(struct rtnl_link * link,struct in6_addr * remote)674*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6gre_get_remote(struct rtnl_link *link, struct in6_addr *remote)
675*4dc78e53SAndroid Build Coastguard Worker {
676*4dc78e53SAndroid Build Coastguard Worker struct ip6gre_info *ip6gre = link->l_info;
677*4dc78e53SAndroid Build Coastguard Worker
678*4dc78e53SAndroid Build Coastguard Worker IS_IP6GRE_LINK_ASSERT(link);
679*4dc78e53SAndroid Build Coastguard Worker
680*4dc78e53SAndroid Build Coastguard Worker HAS_IP6GRE_ATTR_ASSERT(ip6gre, IP6GRE_ATTR_REMOTE);
681*4dc78e53SAndroid Build Coastguard Worker
682*4dc78e53SAndroid Build Coastguard Worker memcpy(remote, &ip6gre->remote, sizeof(struct in6_addr));
683*4dc78e53SAndroid Build Coastguard Worker
684*4dc78e53SAndroid Build Coastguard Worker return 0;
685*4dc78e53SAndroid Build Coastguard Worker }
686*4dc78e53SAndroid Build Coastguard Worker
687*4dc78e53SAndroid Build Coastguard Worker /**
688*4dc78e53SAndroid Build Coastguard Worker * Set IP6GRE tunnel ttl
689*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
690*4dc78e53SAndroid Build Coastguard Worker * @arg ttl tunnel ttl
691*4dc78e53SAndroid Build Coastguard Worker *
692*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
693*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6gre_set_ttl(struct rtnl_link * link,uint8_t ttl)694*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6gre_set_ttl(struct rtnl_link *link, uint8_t ttl)
695*4dc78e53SAndroid Build Coastguard Worker {
696*4dc78e53SAndroid Build Coastguard Worker struct ip6gre_info *ip6gre = link->l_info;
697*4dc78e53SAndroid Build Coastguard Worker
698*4dc78e53SAndroid Build Coastguard Worker IS_IP6GRE_LINK_ASSERT(link);
699*4dc78e53SAndroid Build Coastguard Worker
700*4dc78e53SAndroid Build Coastguard Worker ip6gre->ttl = ttl;
701*4dc78e53SAndroid Build Coastguard Worker ip6gre->ip6gre_mask |= IP6GRE_ATTR_TTL;
702*4dc78e53SAndroid Build Coastguard Worker
703*4dc78e53SAndroid Build Coastguard Worker return 0;
704*4dc78e53SAndroid Build Coastguard Worker }
705*4dc78e53SAndroid Build Coastguard Worker
706*4dc78e53SAndroid Build Coastguard Worker /**
707*4dc78e53SAndroid Build Coastguard Worker * Set IP6GRE tunnel ttl
708*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
709*4dc78e53SAndroid Build Coastguard Worker * @arg ttl addr to fill in with the ttl
710*4dc78e53SAndroid Build Coastguard Worker *
711*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
712*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6gre_get_ttl(struct rtnl_link * link,uint8_t * ttl)713*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6gre_get_ttl(struct rtnl_link *link, uint8_t *ttl)
714*4dc78e53SAndroid Build Coastguard Worker {
715*4dc78e53SAndroid Build Coastguard Worker struct ip6gre_info *ip6gre = link->l_info;
716*4dc78e53SAndroid Build Coastguard Worker
717*4dc78e53SAndroid Build Coastguard Worker IS_IP6GRE_LINK_ASSERT(link);
718*4dc78e53SAndroid Build Coastguard Worker
719*4dc78e53SAndroid Build Coastguard Worker HAS_IP6GRE_ATTR_ASSERT(ip6gre, IP6GRE_ATTR_TTL);
720*4dc78e53SAndroid Build Coastguard Worker
721*4dc78e53SAndroid Build Coastguard Worker *ttl = ip6gre->ttl;
722*4dc78e53SAndroid Build Coastguard Worker
723*4dc78e53SAndroid Build Coastguard Worker return 0;
724*4dc78e53SAndroid Build Coastguard Worker }
725*4dc78e53SAndroid Build Coastguard Worker
726*4dc78e53SAndroid Build Coastguard Worker /**
727*4dc78e53SAndroid Build Coastguard Worker * Set IP6GRE tunnel encap limit
728*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
729*4dc78e53SAndroid Build Coastguard Worker * @arg encaplimit tunnel encap limit value
730*4dc78e53SAndroid Build Coastguard Worker *
731*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
732*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6gre_set_encaplimit(struct rtnl_link * link,uint8_t encaplimit)733*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6gre_set_encaplimit(struct rtnl_link *link, uint8_t encaplimit)
734*4dc78e53SAndroid Build Coastguard Worker {
735*4dc78e53SAndroid Build Coastguard Worker struct ip6gre_info *ip6gre = link->l_info;
736*4dc78e53SAndroid Build Coastguard Worker
737*4dc78e53SAndroid Build Coastguard Worker IS_IP6GRE_LINK_ASSERT(link);
738*4dc78e53SAndroid Build Coastguard Worker
739*4dc78e53SAndroid Build Coastguard Worker ip6gre->encaplimit = encaplimit;
740*4dc78e53SAndroid Build Coastguard Worker ip6gre->ip6gre_mask |= IP6GRE_ATTR_ENCAPLIMIT;
741*4dc78e53SAndroid Build Coastguard Worker
742*4dc78e53SAndroid Build Coastguard Worker return 0;
743*4dc78e53SAndroid Build Coastguard Worker }
744*4dc78e53SAndroid Build Coastguard Worker
745*4dc78e53SAndroid Build Coastguard Worker /**
746*4dc78e53SAndroid Build Coastguard Worker * Get IP6GRE tunnel encap limit
747*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
748*4dc78e53SAndroid Build Coastguard Worker * @arg encaplimit addr to fill in with the encaplimit
749*4dc78e53SAndroid Build Coastguard Worker *
750*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
751*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6gre_get_encaplimit(struct rtnl_link * link,uint8_t * encaplimit)752*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6gre_get_encaplimit(struct rtnl_link *link, uint8_t *encaplimit)
753*4dc78e53SAndroid Build Coastguard Worker {
754*4dc78e53SAndroid Build Coastguard Worker struct ip6gre_info *ip6gre = link->l_info;
755*4dc78e53SAndroid Build Coastguard Worker
756*4dc78e53SAndroid Build Coastguard Worker IS_IP6GRE_LINK_ASSERT(link);
757*4dc78e53SAndroid Build Coastguard Worker
758*4dc78e53SAndroid Build Coastguard Worker HAS_IP6GRE_ATTR_ASSERT(ip6gre, IP6GRE_ATTR_ENCAPLIMIT);
759*4dc78e53SAndroid Build Coastguard Worker
760*4dc78e53SAndroid Build Coastguard Worker *encaplimit = ip6gre->encaplimit;
761*4dc78e53SAndroid Build Coastguard Worker
762*4dc78e53SAndroid Build Coastguard Worker return 0;
763*4dc78e53SAndroid Build Coastguard Worker }
764*4dc78e53SAndroid Build Coastguard Worker
765*4dc78e53SAndroid Build Coastguard Worker /**
766*4dc78e53SAndroid Build Coastguard Worker * Set IP6GRE tunnel flowinfo
767*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
768*4dc78e53SAndroid Build Coastguard Worker * @arg flowinfo flowinfo value
769*4dc78e53SAndroid Build Coastguard Worker *
770*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
771*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6gre_set_flowinfo(struct rtnl_link * link,uint32_t flowinfo)772*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6gre_set_flowinfo(struct rtnl_link *link, uint32_t flowinfo)
773*4dc78e53SAndroid Build Coastguard Worker {
774*4dc78e53SAndroid Build Coastguard Worker struct ip6gre_info *ip6gre = link->l_info;
775*4dc78e53SAndroid Build Coastguard Worker
776*4dc78e53SAndroid Build Coastguard Worker IS_IP6GRE_LINK_ASSERT(link);
777*4dc78e53SAndroid Build Coastguard Worker
778*4dc78e53SAndroid Build Coastguard Worker ip6gre->flowinfo = flowinfo;
779*4dc78e53SAndroid Build Coastguard Worker ip6gre->ip6gre_mask |= IP6GRE_ATTR_FLOWINFO;
780*4dc78e53SAndroid Build Coastguard Worker
781*4dc78e53SAndroid Build Coastguard Worker return 0;
782*4dc78e53SAndroid Build Coastguard Worker }
783*4dc78e53SAndroid Build Coastguard Worker
784*4dc78e53SAndroid Build Coastguard Worker /**
785*4dc78e53SAndroid Build Coastguard Worker * Get IP6GRE flowinfo
786*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
787*4dc78e53SAndroid Build Coastguard Worker * @arg flowinfo addr to fill in with the flowinfo
788*4dc78e53SAndroid Build Coastguard Worker *
789*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
790*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6gre_get_flowinfo(struct rtnl_link * link,uint32_t * flowinfo)791*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6gre_get_flowinfo(struct rtnl_link *link, uint32_t *flowinfo)
792*4dc78e53SAndroid Build Coastguard Worker {
793*4dc78e53SAndroid Build Coastguard Worker struct ip6gre_info *ip6gre = link->l_info;
794*4dc78e53SAndroid Build Coastguard Worker
795*4dc78e53SAndroid Build Coastguard Worker IS_IP6GRE_LINK_ASSERT(link);
796*4dc78e53SAndroid Build Coastguard Worker
797*4dc78e53SAndroid Build Coastguard Worker HAS_IP6GRE_ATTR_ASSERT(ip6gre, IP6GRE_ATTR_FLOWINFO);
798*4dc78e53SAndroid Build Coastguard Worker
799*4dc78e53SAndroid Build Coastguard Worker *flowinfo = ip6gre->flowinfo;
800*4dc78e53SAndroid Build Coastguard Worker
801*4dc78e53SAndroid Build Coastguard Worker return 0;
802*4dc78e53SAndroid Build Coastguard Worker }
803*4dc78e53SAndroid Build Coastguard Worker
804*4dc78e53SAndroid Build Coastguard Worker /**
805*4dc78e53SAndroid Build Coastguard Worker * Set IP6GRE tunnel flags
806*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
807*4dc78e53SAndroid Build Coastguard Worker * @arg flags tunnel flags
808*4dc78e53SAndroid Build Coastguard Worker *
809*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
810*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6gre_set_flags(struct rtnl_link * link,uint32_t flags)811*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6gre_set_flags(struct rtnl_link *link, uint32_t flags)
812*4dc78e53SAndroid Build Coastguard Worker {
813*4dc78e53SAndroid Build Coastguard Worker struct ip6gre_info *ip6gre = link->l_info;
814*4dc78e53SAndroid Build Coastguard Worker
815*4dc78e53SAndroid Build Coastguard Worker IS_IP6GRE_LINK_ASSERT(link);
816*4dc78e53SAndroid Build Coastguard Worker
817*4dc78e53SAndroid Build Coastguard Worker ip6gre->flags = flags;
818*4dc78e53SAndroid Build Coastguard Worker ip6gre->ip6gre_mask |= IP6GRE_ATTR_FLAGS;
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 * Get IP6GRE flags
825*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
826*4dc78e53SAndroid Build Coastguard Worker * @arg flags addr to fill in with the tunnel flags
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_ip6gre_get_flags(struct rtnl_link * link,uint32_t * flags)830*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6gre_get_flags(struct rtnl_link *link, uint32_t *flags)
831*4dc78e53SAndroid Build Coastguard Worker {
832*4dc78e53SAndroid Build Coastguard Worker struct ip6gre_info *ip6gre = link->l_info;
833*4dc78e53SAndroid Build Coastguard Worker
834*4dc78e53SAndroid Build Coastguard Worker IS_IP6GRE_LINK_ASSERT(link);
835*4dc78e53SAndroid Build Coastguard Worker
836*4dc78e53SAndroid Build Coastguard Worker HAS_IP6GRE_ATTR_ASSERT(ip6gre, IP6GRE_ATTR_FLAGS);
837*4dc78e53SAndroid Build Coastguard Worker
838*4dc78e53SAndroid Build Coastguard Worker *flags = ip6gre->flags;
839*4dc78e53SAndroid Build Coastguard Worker
840*4dc78e53SAndroid Build Coastguard Worker return 0;
841*4dc78e53SAndroid Build Coastguard Worker }
842*4dc78e53SAndroid Build Coastguard Worker
843*4dc78e53SAndroid Build Coastguard Worker /**
844*4dc78e53SAndroid Build Coastguard Worker * Set IP6GRE tunnel fwmark
845*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
846*4dc78e53SAndroid Build Coastguard Worker * @arg fwmark fwmark
847*4dc78e53SAndroid Build Coastguard Worker *
848*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
849*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6gre_set_fwmark(struct rtnl_link * link,uint32_t fwmark)850*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6gre_set_fwmark(struct rtnl_link *link, uint32_t fwmark)
851*4dc78e53SAndroid Build Coastguard Worker {
852*4dc78e53SAndroid Build Coastguard Worker struct ip6gre_info *ip6gre = link->l_info;
853*4dc78e53SAndroid Build Coastguard Worker
854*4dc78e53SAndroid Build Coastguard Worker IS_IP6GRE_LINK_ASSERT(link);
855*4dc78e53SAndroid Build Coastguard Worker
856*4dc78e53SAndroid Build Coastguard Worker ip6gre->fwmark = fwmark;
857*4dc78e53SAndroid Build Coastguard Worker ip6gre->ip6gre_mask |= IP6GRE_ATTR_FWMARK;
858*4dc78e53SAndroid Build Coastguard Worker
859*4dc78e53SAndroid Build Coastguard Worker return 0;
860*4dc78e53SAndroid Build Coastguard Worker }
861*4dc78e53SAndroid Build Coastguard Worker
862*4dc78e53SAndroid Build Coastguard Worker /**
863*4dc78e53SAndroid Build Coastguard Worker * Get IP6GRE tunnel fwmark
864*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
865*4dc78e53SAndroid Build Coastguard Worker * @arg fwmark addr to fill in with the fwmark
866*4dc78e53SAndroid Build Coastguard Worker *
867*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
868*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6gre_get_fwmark(struct rtnl_link * link,uint32_t * fwmark)869*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6gre_get_fwmark(struct rtnl_link *link, uint32_t *fwmark)
870*4dc78e53SAndroid Build Coastguard Worker {
871*4dc78e53SAndroid Build Coastguard Worker struct ip6gre_info *ip6gre = link->l_info;
872*4dc78e53SAndroid Build Coastguard Worker
873*4dc78e53SAndroid Build Coastguard Worker IS_IP6GRE_LINK_ASSERT(link);
874*4dc78e53SAndroid Build Coastguard Worker
875*4dc78e53SAndroid Build Coastguard Worker HAS_IP6GRE_ATTR_ASSERT(ip6gre, IP6GRE_ATTR_FWMARK);
876*4dc78e53SAndroid Build Coastguard Worker
877*4dc78e53SAndroid Build Coastguard Worker *fwmark = ip6gre->fwmark;
878*4dc78e53SAndroid Build Coastguard Worker
879*4dc78e53SAndroid Build Coastguard Worker return 0;
880*4dc78e53SAndroid Build Coastguard Worker }
881*4dc78e53SAndroid Build Coastguard Worker
ip6gre_init(void)882*4dc78e53SAndroid Build Coastguard Worker static void _nl_init ip6gre_init(void)
883*4dc78e53SAndroid Build Coastguard Worker {
884*4dc78e53SAndroid Build Coastguard Worker rtnl_link_register_info(&ip6gre_info_ops);
885*4dc78e53SAndroid Build Coastguard Worker }
886*4dc78e53SAndroid Build Coastguard Worker
ip6gre_exit(void)887*4dc78e53SAndroid Build Coastguard Worker static void _nl_exit ip6gre_exit(void)
888*4dc78e53SAndroid Build Coastguard Worker {
889*4dc78e53SAndroid Build Coastguard Worker rtnl_link_unregister_info(&ip6gre_info_ops);
890*4dc78e53SAndroid Build Coastguard Worker }
891