1*4dc78e53SAndroid Build Coastguard Worker /* SPDX-License-Identifier: LGPL-2.1-only */
2*4dc78e53SAndroid Build Coastguard Worker /*
3*4dc78e53SAndroid Build Coastguard Worker * Copyright (c) 2014 Susant Sahani <[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 ip6tnl IP6TNL
9*4dc78e53SAndroid Build Coastguard Worker * ip6tnl link module
10*4dc78e53SAndroid Build Coastguard Worker *
11*4dc78e53SAndroid Build Coastguard Worker * @details
12*4dc78e53SAndroid Build Coastguard Worker * \b Link Type Name: "ip6tnl"
13*4dc78e53SAndroid Build Coastguard Worker *
14*4dc78e53SAndroid Build Coastguard Worker * @route_doc{link_ip6tnl, IP6TNL 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_tunnel.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/ip6tnl.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 #define IP6_TNL_ATTR_LINK (1 << 0)
34*4dc78e53SAndroid Build Coastguard Worker #define IP6_TNL_ATTR_LOCAL (1 << 1)
35*4dc78e53SAndroid Build Coastguard Worker #define IP6_TNL_ATTR_REMOTE (1 << 2)
36*4dc78e53SAndroid Build Coastguard Worker #define IP6_TNL_ATTR_TTL (1 << 3)
37*4dc78e53SAndroid Build Coastguard Worker #define IP6_TNL_ATTR_TOS (1 << 4)
38*4dc78e53SAndroid Build Coastguard Worker #define IP6_TNL_ATTR_ENCAPLIMIT (1 << 5)
39*4dc78e53SAndroid Build Coastguard Worker #define IP6_TNL_ATTR_FLAGS (1 << 6)
40*4dc78e53SAndroid Build Coastguard Worker #define IP6_TNL_ATTR_PROTO (1 << 7)
41*4dc78e53SAndroid Build Coastguard Worker #define IP6_TNL_ATTR_FLOWINFO (1 << 8)
42*4dc78e53SAndroid Build Coastguard Worker #define IP6_TNL_ATTR_FWMARK (1 << 9)
43*4dc78e53SAndroid Build Coastguard Worker
44*4dc78e53SAndroid Build Coastguard Worker struct ip6_tnl_info
45*4dc78e53SAndroid Build Coastguard Worker {
46*4dc78e53SAndroid Build Coastguard Worker uint8_t ttl;
47*4dc78e53SAndroid Build Coastguard Worker uint8_t tos;
48*4dc78e53SAndroid Build Coastguard Worker uint8_t encap_limit;
49*4dc78e53SAndroid Build Coastguard Worker uint8_t proto;
50*4dc78e53SAndroid Build Coastguard Worker uint32_t flags;
51*4dc78e53SAndroid Build Coastguard Worker uint32_t link;
52*4dc78e53SAndroid Build Coastguard Worker uint32_t flowinfo;
53*4dc78e53SAndroid Build Coastguard Worker struct in6_addr local;
54*4dc78e53SAndroid Build Coastguard Worker struct in6_addr remote;
55*4dc78e53SAndroid Build Coastguard Worker uint32_t fwmark;
56*4dc78e53SAndroid Build Coastguard Worker uint32_t ip6_tnl_mask;
57*4dc78e53SAndroid Build Coastguard Worker };
58*4dc78e53SAndroid Build Coastguard Worker
59*4dc78e53SAndroid Build Coastguard Worker static struct nla_policy ip6_tnl_policy[IFLA_IPTUN_MAX + 1] = {
60*4dc78e53SAndroid Build Coastguard Worker [IFLA_IPTUN_LINK] = { .type = NLA_U32 },
61*4dc78e53SAndroid Build Coastguard Worker [IFLA_IPTUN_LOCAL] = { .minlen = sizeof(struct in6_addr) },
62*4dc78e53SAndroid Build Coastguard Worker [IFLA_IPTUN_REMOTE] = { .minlen = sizeof(struct in6_addr) },
63*4dc78e53SAndroid Build Coastguard Worker [IFLA_IPTUN_TTL] = { .type = NLA_U8 },
64*4dc78e53SAndroid Build Coastguard Worker [IFLA_IPTUN_TOS] = { .type = NLA_U8 },
65*4dc78e53SAndroid Build Coastguard Worker [IFLA_IPTUN_ENCAP_LIMIT] = { .type = NLA_U8 },
66*4dc78e53SAndroid Build Coastguard Worker [IFLA_IPTUN_FLOWINFO] = { .type = NLA_U32 },
67*4dc78e53SAndroid Build Coastguard Worker [IFLA_IPTUN_FLAGS] = { .type = NLA_U32 },
68*4dc78e53SAndroid Build Coastguard Worker [IFLA_IPTUN_PROTO] = { .type = NLA_U8 },
69*4dc78e53SAndroid Build Coastguard Worker [IFLA_IPTUN_FWMARK] = { .type = NLA_U32 },
70*4dc78e53SAndroid Build Coastguard Worker };
71*4dc78e53SAndroid Build Coastguard Worker
ip6_tnl_alloc(struct rtnl_link * link)72*4dc78e53SAndroid Build Coastguard Worker static int ip6_tnl_alloc(struct rtnl_link *link)
73*4dc78e53SAndroid Build Coastguard Worker {
74*4dc78e53SAndroid Build Coastguard Worker struct ip6_tnl_info *ip6_tnl;
75*4dc78e53SAndroid Build Coastguard Worker
76*4dc78e53SAndroid Build Coastguard Worker if (link->l_info)
77*4dc78e53SAndroid Build Coastguard Worker memset(link->l_info, 0, sizeof(*ip6_tnl));
78*4dc78e53SAndroid Build Coastguard Worker else {
79*4dc78e53SAndroid Build Coastguard Worker ip6_tnl = calloc(1, sizeof(*ip6_tnl));
80*4dc78e53SAndroid Build Coastguard Worker if (!ip6_tnl)
81*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
82*4dc78e53SAndroid Build Coastguard Worker
83*4dc78e53SAndroid Build Coastguard Worker link->l_info = ip6_tnl;
84*4dc78e53SAndroid Build Coastguard Worker }
85*4dc78e53SAndroid Build Coastguard Worker
86*4dc78e53SAndroid Build Coastguard Worker return 0;
87*4dc78e53SAndroid Build Coastguard Worker }
88*4dc78e53SAndroid Build Coastguard Worker
ip6_tnl_parse(struct rtnl_link * link,struct nlattr * data,struct nlattr * xstats)89*4dc78e53SAndroid Build Coastguard Worker static int ip6_tnl_parse(struct rtnl_link *link, struct nlattr *data,
90*4dc78e53SAndroid Build Coastguard Worker struct nlattr *xstats)
91*4dc78e53SAndroid Build Coastguard Worker {
92*4dc78e53SAndroid Build Coastguard Worker struct nlattr *tb[IFLA_IPTUN_MAX + 1];
93*4dc78e53SAndroid Build Coastguard Worker struct ip6_tnl_info *ip6_tnl;
94*4dc78e53SAndroid Build Coastguard Worker int err;
95*4dc78e53SAndroid Build Coastguard Worker
96*4dc78e53SAndroid Build Coastguard Worker NL_DBG(3, "Parsing IP6_TNL link info\n");
97*4dc78e53SAndroid Build Coastguard Worker
98*4dc78e53SAndroid Build Coastguard Worker err = nla_parse_nested(tb, IFLA_IPTUN_MAX, data, ip6_tnl_policy);
99*4dc78e53SAndroid Build Coastguard Worker if (err < 0)
100*4dc78e53SAndroid Build Coastguard Worker goto errout;
101*4dc78e53SAndroid Build Coastguard Worker
102*4dc78e53SAndroid Build Coastguard Worker err = ip6_tnl_alloc(link);
103*4dc78e53SAndroid Build Coastguard Worker if (err < 0)
104*4dc78e53SAndroid Build Coastguard Worker goto errout;
105*4dc78e53SAndroid Build Coastguard Worker
106*4dc78e53SAndroid Build Coastguard Worker ip6_tnl = link->l_info;
107*4dc78e53SAndroid Build Coastguard Worker
108*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_IPTUN_LINK]) {
109*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->link = nla_get_u32(tb[IFLA_IPTUN_LINK]);
110*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->ip6_tnl_mask |= IP6_TNL_ATTR_LINK;
111*4dc78e53SAndroid Build Coastguard Worker }
112*4dc78e53SAndroid Build Coastguard Worker
113*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_IPTUN_LOCAL]) {
114*4dc78e53SAndroid Build Coastguard Worker nla_memcpy(&ip6_tnl->local, tb[IFLA_IPTUN_LOCAL], sizeof(struct in6_addr));
115*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->ip6_tnl_mask |= IP6_TNL_ATTR_LOCAL;
116*4dc78e53SAndroid Build Coastguard Worker }
117*4dc78e53SAndroid Build Coastguard Worker
118*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_IPTUN_REMOTE]) {
119*4dc78e53SAndroid Build Coastguard Worker nla_memcpy(&ip6_tnl->remote, tb[IFLA_IPTUN_REMOTE], sizeof(struct in6_addr));
120*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->ip6_tnl_mask |= IP6_TNL_ATTR_REMOTE;
121*4dc78e53SAndroid Build Coastguard Worker }
122*4dc78e53SAndroid Build Coastguard Worker
123*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_IPTUN_TTL]) {
124*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->ttl = nla_get_u8(tb[IFLA_IPTUN_TTL]);
125*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->ip6_tnl_mask |= IP6_TNL_ATTR_TTL;
126*4dc78e53SAndroid Build Coastguard Worker }
127*4dc78e53SAndroid Build Coastguard Worker
128*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_IPTUN_TOS]) {
129*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->tos = nla_get_u8(tb[IFLA_IPTUN_TOS]);
130*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->ip6_tnl_mask |= IP6_TNL_ATTR_TOS;
131*4dc78e53SAndroid Build Coastguard Worker }
132*4dc78e53SAndroid Build Coastguard Worker
133*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_IPTUN_ENCAP_LIMIT]) {
134*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->encap_limit = nla_get_u8(tb[IFLA_IPTUN_ENCAP_LIMIT]);
135*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->ip6_tnl_mask |= IP6_TNL_ATTR_ENCAPLIMIT;
136*4dc78e53SAndroid Build Coastguard Worker }
137*4dc78e53SAndroid Build Coastguard Worker
138*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_IPTUN_FLAGS]) {
139*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->flags = nla_get_u32(tb[IFLA_IPTUN_FLAGS]);
140*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->ip6_tnl_mask |= IP6_TNL_ATTR_FLAGS;
141*4dc78e53SAndroid Build Coastguard Worker }
142*4dc78e53SAndroid Build Coastguard Worker
143*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_IPTUN_FLOWINFO]) {
144*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->flowinfo = nla_get_u32(tb[IFLA_IPTUN_FLOWINFO]);
145*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->ip6_tnl_mask |= IP6_TNL_ATTR_FLOWINFO;
146*4dc78e53SAndroid Build Coastguard Worker }
147*4dc78e53SAndroid Build Coastguard Worker
148*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_IPTUN_PROTO]) {
149*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->proto = nla_get_u8(tb[IFLA_IPTUN_PROTO]);
150*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->ip6_tnl_mask |= IP6_TNL_ATTR_PROTO;
151*4dc78e53SAndroid Build Coastguard Worker }
152*4dc78e53SAndroid Build Coastguard Worker
153*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_IPTUN_FWMARK]) {
154*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->fwmark = nla_get_u32(tb[IFLA_IPTUN_FWMARK]);
155*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->ip6_tnl_mask |= IP6_TNL_ATTR_FWMARK;
156*4dc78e53SAndroid Build Coastguard Worker }
157*4dc78e53SAndroid Build Coastguard Worker
158*4dc78e53SAndroid Build Coastguard Worker err = 0;
159*4dc78e53SAndroid Build Coastguard Worker
160*4dc78e53SAndroid Build Coastguard Worker errout:
161*4dc78e53SAndroid Build Coastguard Worker return err;
162*4dc78e53SAndroid Build Coastguard Worker }
163*4dc78e53SAndroid Build Coastguard Worker
ip6_tnl_put_attrs(struct nl_msg * msg,struct rtnl_link * link)164*4dc78e53SAndroid Build Coastguard Worker static int ip6_tnl_put_attrs(struct nl_msg *msg, struct rtnl_link *link)
165*4dc78e53SAndroid Build Coastguard Worker {
166*4dc78e53SAndroid Build Coastguard Worker struct ip6_tnl_info *ip6_tnl = link->l_info;
167*4dc78e53SAndroid Build Coastguard Worker struct nlattr *data;
168*4dc78e53SAndroid Build Coastguard Worker
169*4dc78e53SAndroid Build Coastguard Worker data = nla_nest_start(msg, IFLA_INFO_DATA);
170*4dc78e53SAndroid Build Coastguard Worker if (!data)
171*4dc78e53SAndroid Build Coastguard Worker return -NLE_MSGSIZE;
172*4dc78e53SAndroid Build Coastguard Worker
173*4dc78e53SAndroid Build Coastguard Worker if (ip6_tnl->ip6_tnl_mask & IP6_TNL_ATTR_LINK)
174*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U32(msg, IFLA_IPTUN_LINK, ip6_tnl->link);
175*4dc78e53SAndroid Build Coastguard Worker
176*4dc78e53SAndroid Build Coastguard Worker if (ip6_tnl->ip6_tnl_mask & IP6_TNL_ATTR_LOCAL)
177*4dc78e53SAndroid Build Coastguard Worker NLA_PUT(msg, IFLA_IPTUN_LOCAL, sizeof(struct in6_addr), &ip6_tnl->local);
178*4dc78e53SAndroid Build Coastguard Worker
179*4dc78e53SAndroid Build Coastguard Worker if (ip6_tnl->ip6_tnl_mask & IP6_TNL_ATTR_REMOTE)
180*4dc78e53SAndroid Build Coastguard Worker NLA_PUT(msg, IFLA_IPTUN_REMOTE, sizeof(struct in6_addr), &ip6_tnl->remote);
181*4dc78e53SAndroid Build Coastguard Worker
182*4dc78e53SAndroid Build Coastguard Worker if (ip6_tnl->ip6_tnl_mask & IP6_TNL_ATTR_TTL)
183*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U8(msg, IFLA_IPTUN_TTL, ip6_tnl->ttl);
184*4dc78e53SAndroid Build Coastguard Worker
185*4dc78e53SAndroid Build Coastguard Worker if (ip6_tnl->ip6_tnl_mask & IP6_TNL_ATTR_TOS)
186*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U8(msg, IFLA_IPTUN_TOS, ip6_tnl->tos);
187*4dc78e53SAndroid Build Coastguard Worker
188*4dc78e53SAndroid Build Coastguard Worker if (ip6_tnl->ip6_tnl_mask & IP6_TNL_ATTR_ENCAPLIMIT)
189*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U8(msg, IFLA_IPTUN_ENCAP_LIMIT, ip6_tnl->encap_limit);
190*4dc78e53SAndroid Build Coastguard Worker
191*4dc78e53SAndroid Build Coastguard Worker if (ip6_tnl->ip6_tnl_mask & IP6_TNL_ATTR_FLAGS)
192*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U32(msg, IFLA_IPTUN_FLAGS, ip6_tnl->flags);
193*4dc78e53SAndroid Build Coastguard Worker
194*4dc78e53SAndroid Build Coastguard Worker if (ip6_tnl->ip6_tnl_mask & IP6_TNL_ATTR_FLOWINFO)
195*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U32(msg, IFLA_IPTUN_FLOWINFO, ip6_tnl->flowinfo);
196*4dc78e53SAndroid Build Coastguard Worker
197*4dc78e53SAndroid Build Coastguard Worker /* kernel crashes if this attribure is missing temporary fix */
198*4dc78e53SAndroid Build Coastguard Worker if (ip6_tnl->ip6_tnl_mask & IP6_TNL_ATTR_PROTO)
199*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U8(msg, IFLA_IPTUN_PROTO, ip6_tnl->proto);
200*4dc78e53SAndroid Build Coastguard Worker else
201*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U8(msg, IFLA_IPTUN_PROTO, 0);
202*4dc78e53SAndroid Build Coastguard Worker
203*4dc78e53SAndroid Build Coastguard Worker if (ip6_tnl->ip6_tnl_mask & IP6_TNL_ATTR_FWMARK)
204*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U32(msg, IFLA_IPTUN_FWMARK, ip6_tnl->fwmark);
205*4dc78e53SAndroid Build Coastguard Worker
206*4dc78e53SAndroid Build Coastguard Worker nla_nest_end(msg, data);
207*4dc78e53SAndroid Build Coastguard Worker
208*4dc78e53SAndroid Build Coastguard Worker nla_put_failure:
209*4dc78e53SAndroid Build Coastguard Worker return 0;
210*4dc78e53SAndroid Build Coastguard Worker }
211*4dc78e53SAndroid Build Coastguard Worker
ip6_tnl_free(struct rtnl_link * link)212*4dc78e53SAndroid Build Coastguard Worker static void ip6_tnl_free(struct rtnl_link *link)
213*4dc78e53SAndroid Build Coastguard Worker {
214*4dc78e53SAndroid Build Coastguard Worker struct ip6_tnl_info *ip6_tnl = link->l_info;
215*4dc78e53SAndroid Build Coastguard Worker
216*4dc78e53SAndroid Build Coastguard Worker free(ip6_tnl);
217*4dc78e53SAndroid Build Coastguard Worker link->l_info = NULL;
218*4dc78e53SAndroid Build Coastguard Worker }
219*4dc78e53SAndroid Build Coastguard Worker
ip6_tnl_dump_line(struct rtnl_link * link,struct nl_dump_params * p)220*4dc78e53SAndroid Build Coastguard Worker static void ip6_tnl_dump_line(struct rtnl_link *link, struct nl_dump_params *p)
221*4dc78e53SAndroid Build Coastguard Worker {
222*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "ip6_tnl : %s", link->l_name);
223*4dc78e53SAndroid Build Coastguard Worker }
224*4dc78e53SAndroid Build Coastguard Worker
ip6_tnl_dump_details(struct rtnl_link * link,struct nl_dump_params * p)225*4dc78e53SAndroid Build Coastguard Worker static void ip6_tnl_dump_details(struct rtnl_link *link, struct nl_dump_params *p)
226*4dc78e53SAndroid Build Coastguard Worker {
227*4dc78e53SAndroid Build Coastguard Worker struct ip6_tnl_info *ip6_tnl = link->l_info;
228*4dc78e53SAndroid Build Coastguard Worker char *name, addr[INET6_ADDRSTRLEN];
229*4dc78e53SAndroid Build Coastguard Worker struct rtnl_link *parent;
230*4dc78e53SAndroid Build Coastguard Worker
231*4dc78e53SAndroid Build Coastguard Worker if (ip6_tnl->ip6_tnl_mask & IP6_TNL_ATTR_LINK) {
232*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " link ");
233*4dc78e53SAndroid Build Coastguard Worker
234*4dc78e53SAndroid Build Coastguard Worker name = NULL;
235*4dc78e53SAndroid Build Coastguard Worker parent = link_lookup(link->ce_cache, ip6_tnl->link);
236*4dc78e53SAndroid Build Coastguard Worker if (parent)
237*4dc78e53SAndroid Build Coastguard Worker name = rtnl_link_get_name(parent);
238*4dc78e53SAndroid Build Coastguard Worker
239*4dc78e53SAndroid Build Coastguard Worker if (name)
240*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%s\n", name);
241*4dc78e53SAndroid Build Coastguard Worker else
242*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%u\n", ip6_tnl->link);
243*4dc78e53SAndroid Build Coastguard Worker }
244*4dc78e53SAndroid Build Coastguard Worker
245*4dc78e53SAndroid Build Coastguard Worker if (ip6_tnl->ip6_tnl_mask & IP6_TNL_ATTR_LOCAL) {
246*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " local ");
247*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%s\n",
248*4dc78e53SAndroid Build Coastguard Worker _nl_inet_ntop(AF_INET6, &ip6_tnl->local, addr));
249*4dc78e53SAndroid Build Coastguard Worker }
250*4dc78e53SAndroid Build Coastguard Worker
251*4dc78e53SAndroid Build Coastguard Worker if (ip6_tnl->ip6_tnl_mask & IP6_TNL_ATTR_REMOTE) {
252*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " remote ");
253*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%s\n",
254*4dc78e53SAndroid Build Coastguard Worker _nl_inet_ntop(AF_INET6, &ip6_tnl->remote, addr));
255*4dc78e53SAndroid Build Coastguard Worker }
256*4dc78e53SAndroid Build Coastguard Worker
257*4dc78e53SAndroid Build Coastguard Worker if (ip6_tnl->ip6_tnl_mask & IP6_TNL_ATTR_TTL) {
258*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " ttl ");
259*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%d\n", ip6_tnl->ttl);
260*4dc78e53SAndroid Build Coastguard Worker }
261*4dc78e53SAndroid Build Coastguard Worker
262*4dc78e53SAndroid Build Coastguard Worker if (ip6_tnl->ip6_tnl_mask & IP6_TNL_ATTR_TOS) {
263*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " tos ");
264*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%d\n", ip6_tnl->tos);
265*4dc78e53SAndroid Build Coastguard Worker }
266*4dc78e53SAndroid Build Coastguard Worker
267*4dc78e53SAndroid Build Coastguard Worker if (ip6_tnl->ip6_tnl_mask & IP6_TNL_ATTR_ENCAPLIMIT) {
268*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " encaplimit ");
269*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%d\n", ip6_tnl->encap_limit);
270*4dc78e53SAndroid Build Coastguard Worker }
271*4dc78e53SAndroid Build Coastguard Worker
272*4dc78e53SAndroid Build Coastguard Worker if (ip6_tnl->ip6_tnl_mask & IP6_TNL_ATTR_FLAGS) {
273*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " flags ");
274*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, " (%x)\n", ip6_tnl->flags);
275*4dc78e53SAndroid Build Coastguard Worker }
276*4dc78e53SAndroid Build Coastguard Worker
277*4dc78e53SAndroid Build Coastguard Worker if (ip6_tnl->ip6_tnl_mask & IP6_TNL_ATTR_FLOWINFO) {
278*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " flowinfo ");
279*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, " (%x)\n", ip6_tnl->flowinfo);
280*4dc78e53SAndroid Build Coastguard Worker }
281*4dc78e53SAndroid Build Coastguard Worker
282*4dc78e53SAndroid Build Coastguard Worker if (ip6_tnl->ip6_tnl_mask & IP6_TNL_ATTR_PROTO) {
283*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " proto ");
284*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, " (%x)\n", ip6_tnl->proto);
285*4dc78e53SAndroid Build Coastguard Worker }
286*4dc78e53SAndroid Build Coastguard Worker
287*4dc78e53SAndroid Build Coastguard Worker if (ip6_tnl->ip6_tnl_mask & IP6_TNL_ATTR_FWMARK) {
288*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " fwmark ");
289*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%x\n", ip6_tnl->fwmark);
290*4dc78e53SAndroid Build Coastguard Worker }
291*4dc78e53SAndroid Build Coastguard Worker }
292*4dc78e53SAndroid Build Coastguard Worker
ip6_tnl_clone(struct rtnl_link * dst,struct rtnl_link * src)293*4dc78e53SAndroid Build Coastguard Worker static int ip6_tnl_clone(struct rtnl_link *dst, struct rtnl_link *src)
294*4dc78e53SAndroid Build Coastguard Worker {
295*4dc78e53SAndroid Build Coastguard Worker struct ip6_tnl_info *ip6_tnl_dst, *ip6_tnl_src = src->l_info;
296*4dc78e53SAndroid Build Coastguard Worker int err;
297*4dc78e53SAndroid Build Coastguard Worker
298*4dc78e53SAndroid Build Coastguard Worker dst->l_info = NULL;
299*4dc78e53SAndroid Build Coastguard Worker
300*4dc78e53SAndroid Build Coastguard Worker err = rtnl_link_set_type(dst, "ip6tnl");
301*4dc78e53SAndroid Build Coastguard Worker if (err < 0)
302*4dc78e53SAndroid Build Coastguard Worker return err;
303*4dc78e53SAndroid Build Coastguard Worker
304*4dc78e53SAndroid Build Coastguard Worker ip6_tnl_dst = dst->l_info;
305*4dc78e53SAndroid Build Coastguard Worker
306*4dc78e53SAndroid Build Coastguard Worker if (!ip6_tnl_dst || !ip6_tnl_src)
307*4dc78e53SAndroid Build Coastguard Worker BUG();
308*4dc78e53SAndroid Build Coastguard Worker
309*4dc78e53SAndroid Build Coastguard Worker memcpy(ip6_tnl_dst, ip6_tnl_src, sizeof(struct ip6_tnl_info));
310*4dc78e53SAndroid Build Coastguard Worker
311*4dc78e53SAndroid Build Coastguard Worker return 0;
312*4dc78e53SAndroid Build Coastguard Worker }
313*4dc78e53SAndroid Build Coastguard Worker
314*4dc78e53SAndroid Build Coastguard Worker static struct rtnl_link_info_ops ip6_tnl_info_ops = {
315*4dc78e53SAndroid Build Coastguard Worker .io_name = "ip6tnl",
316*4dc78e53SAndroid Build Coastguard Worker .io_alloc = ip6_tnl_alloc,
317*4dc78e53SAndroid Build Coastguard Worker .io_parse = ip6_tnl_parse,
318*4dc78e53SAndroid Build Coastguard Worker .io_dump = {
319*4dc78e53SAndroid Build Coastguard Worker [NL_DUMP_LINE] = ip6_tnl_dump_line,
320*4dc78e53SAndroid Build Coastguard Worker [NL_DUMP_DETAILS] = ip6_tnl_dump_details,
321*4dc78e53SAndroid Build Coastguard Worker },
322*4dc78e53SAndroid Build Coastguard Worker .io_clone = ip6_tnl_clone,
323*4dc78e53SAndroid Build Coastguard Worker .io_put_attrs = ip6_tnl_put_attrs,
324*4dc78e53SAndroid Build Coastguard Worker .io_free = ip6_tnl_free,
325*4dc78e53SAndroid Build Coastguard Worker };
326*4dc78e53SAndroid Build Coastguard Worker
327*4dc78e53SAndroid Build Coastguard Worker #define IS_IP6_TNL_LINK_ASSERT(link)\
328*4dc78e53SAndroid Build Coastguard Worker if ((link)->l_info_ops != &ip6_tnl_info_ops) {\
329*4dc78e53SAndroid Build Coastguard Worker APPBUG("Link is not a ip6_tnl link. set type \"ip6tnl\" first.");\
330*4dc78e53SAndroid Build Coastguard Worker return -NLE_OPNOTSUPP;\
331*4dc78e53SAndroid Build Coastguard Worker }
332*4dc78e53SAndroid Build Coastguard Worker
rtnl_link_ip6_tnl_alloc(void)333*4dc78e53SAndroid Build Coastguard Worker struct rtnl_link *rtnl_link_ip6_tnl_alloc(void)
334*4dc78e53SAndroid Build Coastguard Worker {
335*4dc78e53SAndroid Build Coastguard Worker struct rtnl_link *link;
336*4dc78e53SAndroid Build Coastguard Worker int err;
337*4dc78e53SAndroid Build Coastguard Worker
338*4dc78e53SAndroid Build Coastguard Worker link = rtnl_link_alloc();
339*4dc78e53SAndroid Build Coastguard Worker if (!link)
340*4dc78e53SAndroid Build Coastguard Worker return NULL;
341*4dc78e53SAndroid Build Coastguard Worker
342*4dc78e53SAndroid Build Coastguard Worker err = rtnl_link_set_type(link, "ip6tnl");
343*4dc78e53SAndroid Build Coastguard Worker if (err < 0) {
344*4dc78e53SAndroid Build Coastguard Worker rtnl_link_put(link);
345*4dc78e53SAndroid Build Coastguard Worker return NULL;
346*4dc78e53SAndroid Build Coastguard Worker }
347*4dc78e53SAndroid Build Coastguard Worker
348*4dc78e53SAndroid Build Coastguard Worker return link;
349*4dc78e53SAndroid Build Coastguard Worker }
350*4dc78e53SAndroid Build Coastguard Worker
351*4dc78e53SAndroid Build Coastguard Worker /**
352*4dc78e53SAndroid Build Coastguard Worker * Check if link is a IP6_TNL link
353*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
354*4dc78e53SAndroid Build Coastguard Worker *
355*4dc78e53SAndroid Build Coastguard Worker * @return True if link is a IP6_TNL link, otherwise false is returned.
356*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_is_ip6_tnl(struct rtnl_link * link)357*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_is_ip6_tnl(struct rtnl_link *link)
358*4dc78e53SAndroid Build Coastguard Worker {
359*4dc78e53SAndroid Build Coastguard Worker return link->l_info_ops && !strcmp(link->l_info_ops->io_name, "ip6tnl");
360*4dc78e53SAndroid Build Coastguard Worker }
361*4dc78e53SAndroid Build Coastguard Worker
362*4dc78e53SAndroid Build Coastguard Worker /**
363*4dc78e53SAndroid Build Coastguard Worker * Create a new ip6_tnl tunnel device
364*4dc78e53SAndroid Build Coastguard Worker * @arg sock netlink socket
365*4dc78e53SAndroid Build Coastguard Worker * @arg name name of the tunnel device
366*4dc78e53SAndroid Build Coastguard Worker *
367*4dc78e53SAndroid Build Coastguard Worker * Creates a new ip6_tnl tunnel device in the kernel
368*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
369*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6_tnl_add(struct nl_sock * sk,const char * name)370*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6_tnl_add(struct nl_sock *sk, const char *name)
371*4dc78e53SAndroid Build Coastguard Worker {
372*4dc78e53SAndroid Build Coastguard Worker struct rtnl_link *link;
373*4dc78e53SAndroid Build Coastguard Worker int err;
374*4dc78e53SAndroid Build Coastguard Worker
375*4dc78e53SAndroid Build Coastguard Worker link = rtnl_link_ip6_tnl_alloc();
376*4dc78e53SAndroid Build Coastguard Worker if (!link)
377*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
378*4dc78e53SAndroid Build Coastguard Worker
379*4dc78e53SAndroid Build Coastguard Worker if(name)
380*4dc78e53SAndroid Build Coastguard Worker rtnl_link_set_name(link, name);
381*4dc78e53SAndroid Build Coastguard Worker
382*4dc78e53SAndroid Build Coastguard Worker err = rtnl_link_add(sk, link, NLM_F_CREATE);
383*4dc78e53SAndroid Build Coastguard Worker rtnl_link_put(link);
384*4dc78e53SAndroid Build Coastguard Worker
385*4dc78e53SAndroid Build Coastguard Worker return err;
386*4dc78e53SAndroid Build Coastguard Worker }
387*4dc78e53SAndroid Build Coastguard Worker
388*4dc78e53SAndroid Build Coastguard Worker /**
389*4dc78e53SAndroid Build Coastguard Worker * Set IP6_TNL tunnel interface index
390*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
391*4dc78e53SAndroid Build Coastguard Worker * @arg index interface index
392*4dc78e53SAndroid Build Coastguard Worker *
393*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
394*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6_tnl_set_link(struct rtnl_link * link,uint32_t index)395*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6_tnl_set_link(struct rtnl_link *link, uint32_t index)
396*4dc78e53SAndroid Build Coastguard Worker {
397*4dc78e53SAndroid Build Coastguard Worker struct ip6_tnl_info *ip6_tnl = link->l_info;
398*4dc78e53SAndroid Build Coastguard Worker
399*4dc78e53SAndroid Build Coastguard Worker IS_IP6_TNL_LINK_ASSERT(link);
400*4dc78e53SAndroid Build Coastguard Worker
401*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->link = index;
402*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->ip6_tnl_mask |= IP6_TNL_ATTR_LINK;
403*4dc78e53SAndroid Build Coastguard Worker
404*4dc78e53SAndroid Build Coastguard Worker return 0;
405*4dc78e53SAndroid Build Coastguard Worker }
406*4dc78e53SAndroid Build Coastguard Worker
407*4dc78e53SAndroid Build Coastguard Worker /**
408*4dc78e53SAndroid Build Coastguard Worker * Get IP6_TNL tunnel interface index
409*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
410*4dc78e53SAndroid Build Coastguard Worker *
411*4dc78e53SAndroid Build Coastguard Worker * @return interface index value
412*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6_tnl_get_link(struct rtnl_link * link)413*4dc78e53SAndroid Build Coastguard Worker uint32_t rtnl_link_ip6_tnl_get_link(struct rtnl_link *link)
414*4dc78e53SAndroid Build Coastguard Worker {
415*4dc78e53SAndroid Build Coastguard Worker struct ip6_tnl_info *ip6_tnl = link->l_info;
416*4dc78e53SAndroid Build Coastguard Worker
417*4dc78e53SAndroid Build Coastguard Worker IS_IP6_TNL_LINK_ASSERT(link);
418*4dc78e53SAndroid Build Coastguard Worker
419*4dc78e53SAndroid Build Coastguard Worker return ip6_tnl->link;
420*4dc78e53SAndroid Build Coastguard Worker }
421*4dc78e53SAndroid Build Coastguard Worker
422*4dc78e53SAndroid Build Coastguard Worker /**
423*4dc78e53SAndroid Build Coastguard Worker * Set IP6_TNL tunnel local address
424*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
425*4dc78e53SAndroid Build Coastguard Worker * @arg addr local address
426*4dc78e53SAndroid Build Coastguard Worker *
427*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
428*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6_tnl_set_local(struct rtnl_link * link,struct in6_addr * addr)429*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6_tnl_set_local(struct rtnl_link *link, struct in6_addr *addr)
430*4dc78e53SAndroid Build Coastguard Worker {
431*4dc78e53SAndroid Build Coastguard Worker struct ip6_tnl_info *ip6_tnl = link->l_info;
432*4dc78e53SAndroid Build Coastguard Worker
433*4dc78e53SAndroid Build Coastguard Worker IS_IP6_TNL_LINK_ASSERT(link);
434*4dc78e53SAndroid Build Coastguard Worker
435*4dc78e53SAndroid Build Coastguard Worker memcpy(&ip6_tnl->local, addr, sizeof(struct in6_addr));
436*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->ip6_tnl_mask |= IP6_TNL_ATTR_LOCAL;
437*4dc78e53SAndroid Build Coastguard Worker
438*4dc78e53SAndroid Build Coastguard Worker return 0;
439*4dc78e53SAndroid Build Coastguard Worker }
440*4dc78e53SAndroid Build Coastguard Worker
441*4dc78e53SAndroid Build Coastguard Worker /**
442*4dc78e53SAndroid Build Coastguard Worker * Get IP6_TNL tunnel local address
443*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
444*4dc78e53SAndroid Build Coastguard Worker *
445*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
446*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6_tnl_get_local(struct rtnl_link * link,struct in6_addr * addr)447*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6_tnl_get_local(struct rtnl_link *link, struct in6_addr *addr)
448*4dc78e53SAndroid Build Coastguard Worker {
449*4dc78e53SAndroid Build Coastguard Worker struct ip6_tnl_info *ip6_tnl = link->l_info;
450*4dc78e53SAndroid Build Coastguard Worker
451*4dc78e53SAndroid Build Coastguard Worker IS_IP6_TNL_LINK_ASSERT(link);
452*4dc78e53SAndroid Build Coastguard Worker
453*4dc78e53SAndroid Build Coastguard Worker memcpy(addr, &ip6_tnl->local, sizeof(struct in6_addr));
454*4dc78e53SAndroid Build Coastguard Worker
455*4dc78e53SAndroid Build Coastguard Worker return 0;
456*4dc78e53SAndroid Build Coastguard Worker }
457*4dc78e53SAndroid Build Coastguard Worker
458*4dc78e53SAndroid Build Coastguard Worker /**
459*4dc78e53SAndroid Build Coastguard Worker * Set IP6_TNL tunnel remote address
460*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
461*4dc78e53SAndroid Build Coastguard Worker * @arg remote remote address
462*4dc78e53SAndroid Build Coastguard Worker *
463*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
464*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6_tnl_set_remote(struct rtnl_link * link,struct in6_addr * addr)465*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6_tnl_set_remote(struct rtnl_link *link, struct in6_addr *addr)
466*4dc78e53SAndroid Build Coastguard Worker {
467*4dc78e53SAndroid Build Coastguard Worker struct ip6_tnl_info *ip6_tnl = link->l_info;
468*4dc78e53SAndroid Build Coastguard Worker
469*4dc78e53SAndroid Build Coastguard Worker IS_IP6_TNL_LINK_ASSERT(link);
470*4dc78e53SAndroid Build Coastguard Worker
471*4dc78e53SAndroid Build Coastguard Worker memcpy(&ip6_tnl->remote, addr, sizeof(struct in6_addr));
472*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->ip6_tnl_mask |= IP6_TNL_ATTR_REMOTE;
473*4dc78e53SAndroid Build Coastguard Worker
474*4dc78e53SAndroid Build Coastguard Worker return 0;
475*4dc78e53SAndroid Build Coastguard Worker }
476*4dc78e53SAndroid Build Coastguard Worker
477*4dc78e53SAndroid Build Coastguard Worker /**
478*4dc78e53SAndroid Build Coastguard Worker * Get IP6_TNL tunnel remote address
479*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
480*4dc78e53SAndroid Build Coastguard Worker *
481*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
482*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6_tnl_get_remote(struct rtnl_link * link,struct in6_addr * addr)483*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6_tnl_get_remote(struct rtnl_link *link, struct in6_addr *addr)
484*4dc78e53SAndroid Build Coastguard Worker {
485*4dc78e53SAndroid Build Coastguard Worker struct ip6_tnl_info *ip6_tnl = link->l_info;
486*4dc78e53SAndroid Build Coastguard Worker
487*4dc78e53SAndroid Build Coastguard Worker IS_IP6_TNL_LINK_ASSERT(link);
488*4dc78e53SAndroid Build Coastguard Worker
489*4dc78e53SAndroid Build Coastguard Worker memcpy(addr, &ip6_tnl->remote, sizeof(struct in6_addr));
490*4dc78e53SAndroid Build Coastguard Worker
491*4dc78e53SAndroid Build Coastguard Worker return 0;
492*4dc78e53SAndroid Build Coastguard Worker }
493*4dc78e53SAndroid Build Coastguard Worker
494*4dc78e53SAndroid Build Coastguard Worker /**
495*4dc78e53SAndroid Build Coastguard Worker * Set IP6_TNL tunnel ttl
496*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
497*4dc78e53SAndroid Build Coastguard Worker * @arg ttl tunnel ttl
498*4dc78e53SAndroid Build Coastguard Worker *
499*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
500*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6_tnl_set_ttl(struct rtnl_link * link,uint8_t ttl)501*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6_tnl_set_ttl(struct rtnl_link *link, uint8_t ttl)
502*4dc78e53SAndroid Build Coastguard Worker {
503*4dc78e53SAndroid Build Coastguard Worker struct ip6_tnl_info *ip6_tnl = link->l_info;
504*4dc78e53SAndroid Build Coastguard Worker
505*4dc78e53SAndroid Build Coastguard Worker IS_IP6_TNL_LINK_ASSERT(link);
506*4dc78e53SAndroid Build Coastguard Worker
507*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->ttl = ttl;
508*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->ip6_tnl_mask |= IP6_TNL_ATTR_TTL;
509*4dc78e53SAndroid Build Coastguard Worker
510*4dc78e53SAndroid Build Coastguard Worker return 0;
511*4dc78e53SAndroid Build Coastguard Worker }
512*4dc78e53SAndroid Build Coastguard Worker
513*4dc78e53SAndroid Build Coastguard Worker /**
514*4dc78e53SAndroid Build Coastguard Worker * Get IP6_TNL tunnel ttl
515*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
516*4dc78e53SAndroid Build Coastguard Worker *
517*4dc78e53SAndroid Build Coastguard Worker * @return ttl value
518*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6_tnl_get_ttl(struct rtnl_link * link)519*4dc78e53SAndroid Build Coastguard Worker uint8_t rtnl_link_ip6_tnl_get_ttl(struct rtnl_link *link)
520*4dc78e53SAndroid Build Coastguard Worker {
521*4dc78e53SAndroid Build Coastguard Worker struct ip6_tnl_info *ip6_tnl = link->l_info;
522*4dc78e53SAndroid Build Coastguard Worker
523*4dc78e53SAndroid Build Coastguard Worker IS_IP6_TNL_LINK_ASSERT(link);
524*4dc78e53SAndroid Build Coastguard Worker
525*4dc78e53SAndroid Build Coastguard Worker return ip6_tnl->ttl;
526*4dc78e53SAndroid Build Coastguard Worker }
527*4dc78e53SAndroid Build Coastguard Worker
528*4dc78e53SAndroid Build Coastguard Worker /**
529*4dc78e53SAndroid Build Coastguard Worker * Set IP6_TNL tunnel tos
530*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
531*4dc78e53SAndroid Build Coastguard Worker * @arg tos tunnel tos
532*4dc78e53SAndroid Build Coastguard Worker *
533*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
534*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6_tnl_set_tos(struct rtnl_link * link,uint8_t tos)535*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6_tnl_set_tos(struct rtnl_link *link, uint8_t tos)
536*4dc78e53SAndroid Build Coastguard Worker {
537*4dc78e53SAndroid Build Coastguard Worker struct ip6_tnl_info *ip6_tnl = link->l_info;
538*4dc78e53SAndroid Build Coastguard Worker
539*4dc78e53SAndroid Build Coastguard Worker IS_IP6_TNL_LINK_ASSERT(link);
540*4dc78e53SAndroid Build Coastguard Worker
541*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->tos = tos;
542*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->ip6_tnl_mask |= IP6_TNL_ATTR_TOS;
543*4dc78e53SAndroid Build Coastguard Worker
544*4dc78e53SAndroid Build Coastguard Worker return 0;
545*4dc78e53SAndroid Build Coastguard Worker }
546*4dc78e53SAndroid Build Coastguard Worker
547*4dc78e53SAndroid Build Coastguard Worker /**
548*4dc78e53SAndroid Build Coastguard Worker * Get IP6_TNL tunnel tos
549*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
550*4dc78e53SAndroid Build Coastguard Worker *
551*4dc78e53SAndroid Build Coastguard Worker * @return tos value
552*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6_tnl_get_tos(struct rtnl_link * link)553*4dc78e53SAndroid Build Coastguard Worker uint8_t rtnl_link_ip6_tnl_get_tos(struct rtnl_link *link)
554*4dc78e53SAndroid Build Coastguard Worker {
555*4dc78e53SAndroid Build Coastguard Worker struct ip6_tnl_info *ip6_tnl = link->l_info;
556*4dc78e53SAndroid Build Coastguard Worker
557*4dc78e53SAndroid Build Coastguard Worker IS_IP6_TNL_LINK_ASSERT(link);
558*4dc78e53SAndroid Build Coastguard Worker
559*4dc78e53SAndroid Build Coastguard Worker return ip6_tnl->tos;
560*4dc78e53SAndroid Build Coastguard Worker }
561*4dc78e53SAndroid Build Coastguard Worker
562*4dc78e53SAndroid Build Coastguard Worker /**
563*4dc78e53SAndroid Build Coastguard Worker * Set IP6_TNL tunnel encap limit
564*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
565*4dc78e53SAndroid Build Coastguard Worker * @arg encap_limit encaplimit value
566*4dc78e53SAndroid Build Coastguard Worker *
567*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
568*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6_tnl_set_encaplimit(struct rtnl_link * link,uint8_t encap_limit)569*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6_tnl_set_encaplimit(struct rtnl_link *link, uint8_t encap_limit)
570*4dc78e53SAndroid Build Coastguard Worker {
571*4dc78e53SAndroid Build Coastguard Worker struct ip6_tnl_info *ip6_tnl = link->l_info;
572*4dc78e53SAndroid Build Coastguard Worker
573*4dc78e53SAndroid Build Coastguard Worker IS_IP6_TNL_LINK_ASSERT(link);
574*4dc78e53SAndroid Build Coastguard Worker
575*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->encap_limit = encap_limit;
576*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->ip6_tnl_mask |= IP6_TNL_ATTR_ENCAPLIMIT;
577*4dc78e53SAndroid Build Coastguard Worker
578*4dc78e53SAndroid Build Coastguard Worker return 0;
579*4dc78e53SAndroid Build Coastguard Worker }
580*4dc78e53SAndroid Build Coastguard Worker
581*4dc78e53SAndroid Build Coastguard Worker /**
582*4dc78e53SAndroid Build Coastguard Worker * Get IP6_TNL encaplimit
583*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
584*4dc78e53SAndroid Build Coastguard Worker *
585*4dc78e53SAndroid Build Coastguard Worker * @return encaplimit value
586*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6_tnl_get_encaplimit(struct rtnl_link * link)587*4dc78e53SAndroid Build Coastguard Worker uint8_t rtnl_link_ip6_tnl_get_encaplimit(struct rtnl_link *link)
588*4dc78e53SAndroid Build Coastguard Worker {
589*4dc78e53SAndroid Build Coastguard Worker struct ip6_tnl_info *ip6_tnl = link->l_info;
590*4dc78e53SAndroid Build Coastguard Worker
591*4dc78e53SAndroid Build Coastguard Worker IS_IP6_TNL_LINK_ASSERT(link);
592*4dc78e53SAndroid Build Coastguard Worker
593*4dc78e53SAndroid Build Coastguard Worker return ip6_tnl->encap_limit;
594*4dc78e53SAndroid Build Coastguard Worker }
595*4dc78e53SAndroid Build Coastguard Worker
596*4dc78e53SAndroid Build Coastguard Worker /**
597*4dc78e53SAndroid Build Coastguard Worker * Set IP6_TNL tunnel flowinfo
598*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
599*4dc78e53SAndroid Build Coastguard Worker * @arg flowinfo flowinfo value
600*4dc78e53SAndroid Build Coastguard Worker *
601*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
602*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6_tnl_set_flowinfo(struct rtnl_link * link,uint32_t flowinfo)603*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6_tnl_set_flowinfo(struct rtnl_link *link, uint32_t flowinfo)
604*4dc78e53SAndroid Build Coastguard Worker {
605*4dc78e53SAndroid Build Coastguard Worker struct ip6_tnl_info *ip6_tnl = link->l_info;
606*4dc78e53SAndroid Build Coastguard Worker
607*4dc78e53SAndroid Build Coastguard Worker IS_IP6_TNL_LINK_ASSERT(link);
608*4dc78e53SAndroid Build Coastguard Worker
609*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->flowinfo = flowinfo;
610*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->ip6_tnl_mask |= IP6_TNL_ATTR_FLOWINFO;
611*4dc78e53SAndroid Build Coastguard Worker
612*4dc78e53SAndroid Build Coastguard Worker return 0;
613*4dc78e53SAndroid Build Coastguard Worker }
614*4dc78e53SAndroid Build Coastguard Worker
615*4dc78e53SAndroid Build Coastguard Worker /**
616*4dc78e53SAndroid Build Coastguard Worker * Get IP6_TNL flowinfo
617*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
618*4dc78e53SAndroid Build Coastguard Worker *
619*4dc78e53SAndroid Build Coastguard Worker * @return flowinfo value
620*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6_tnl_get_flowinfo(struct rtnl_link * link)621*4dc78e53SAndroid Build Coastguard Worker uint32_t rtnl_link_ip6_tnl_get_flowinfo(struct rtnl_link *link)
622*4dc78e53SAndroid Build Coastguard Worker {
623*4dc78e53SAndroid Build Coastguard Worker struct ip6_tnl_info *ip6_tnl = link->l_info;
624*4dc78e53SAndroid Build Coastguard Worker
625*4dc78e53SAndroid Build Coastguard Worker IS_IP6_TNL_LINK_ASSERT(link);
626*4dc78e53SAndroid Build Coastguard Worker
627*4dc78e53SAndroid Build Coastguard Worker return ip6_tnl->flowinfo;
628*4dc78e53SAndroid Build Coastguard Worker }
629*4dc78e53SAndroid Build Coastguard Worker
630*4dc78e53SAndroid Build Coastguard Worker /**
631*4dc78e53SAndroid Build Coastguard Worker * Set IP6_TNL tunnel flags
632*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
633*4dc78e53SAndroid Build Coastguard Worker * @arg flags tunnel flags
634*4dc78e53SAndroid Build Coastguard Worker *
635*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
636*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6_tnl_set_flags(struct rtnl_link * link,uint32_t flags)637*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6_tnl_set_flags(struct rtnl_link *link, uint32_t flags)
638*4dc78e53SAndroid Build Coastguard Worker {
639*4dc78e53SAndroid Build Coastguard Worker struct ip6_tnl_info *ip6_tnl = link->l_info;
640*4dc78e53SAndroid Build Coastguard Worker
641*4dc78e53SAndroid Build Coastguard Worker IS_IP6_TNL_LINK_ASSERT(link);
642*4dc78e53SAndroid Build Coastguard Worker
643*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->flags = flags;
644*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->ip6_tnl_mask |= IP6_TNL_ATTR_FLAGS;
645*4dc78e53SAndroid Build Coastguard Worker
646*4dc78e53SAndroid Build Coastguard Worker return 0;
647*4dc78e53SAndroid Build Coastguard Worker }
648*4dc78e53SAndroid Build Coastguard Worker
649*4dc78e53SAndroid Build Coastguard Worker /**
650*4dc78e53SAndroid Build Coastguard Worker * Get IP6_TNL path flags
651*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
652*4dc78e53SAndroid Build Coastguard Worker *
653*4dc78e53SAndroid Build Coastguard Worker * @return flags value
654*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6_tnl_get_flags(struct rtnl_link * link)655*4dc78e53SAndroid Build Coastguard Worker uint32_t rtnl_link_ip6_tnl_get_flags(struct rtnl_link *link)
656*4dc78e53SAndroid Build Coastguard Worker {
657*4dc78e53SAndroid Build Coastguard Worker struct ip6_tnl_info *ip6_tnl = link->l_info;
658*4dc78e53SAndroid Build Coastguard Worker
659*4dc78e53SAndroid Build Coastguard Worker IS_IP6_TNL_LINK_ASSERT(link);
660*4dc78e53SAndroid Build Coastguard Worker
661*4dc78e53SAndroid Build Coastguard Worker return ip6_tnl->flags;
662*4dc78e53SAndroid Build Coastguard Worker }
663*4dc78e53SAndroid Build Coastguard Worker
664*4dc78e53SAndroid Build Coastguard Worker /**
665*4dc78e53SAndroid Build Coastguard Worker * Set IP6_TNL tunnel proto
666*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
667*4dc78e53SAndroid Build Coastguard Worker * @arg proto tunnel proto
668*4dc78e53SAndroid Build Coastguard Worker *
669*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
670*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6_tnl_set_proto(struct rtnl_link * link,uint8_t proto)671*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6_tnl_set_proto(struct rtnl_link *link, uint8_t proto)
672*4dc78e53SAndroid Build Coastguard Worker {
673*4dc78e53SAndroid Build Coastguard Worker struct ip6_tnl_info *ip6_tnl = link->l_info;
674*4dc78e53SAndroid Build Coastguard Worker
675*4dc78e53SAndroid Build Coastguard Worker IS_IP6_TNL_LINK_ASSERT(link);
676*4dc78e53SAndroid Build Coastguard Worker
677*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->proto = proto;
678*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->ip6_tnl_mask |= IP6_TNL_ATTR_PROTO;
679*4dc78e53SAndroid Build Coastguard Worker
680*4dc78e53SAndroid Build Coastguard Worker return 0;
681*4dc78e53SAndroid Build Coastguard Worker }
682*4dc78e53SAndroid Build Coastguard Worker
683*4dc78e53SAndroid Build Coastguard Worker /**
684*4dc78e53SAndroid Build Coastguard Worker * Get IP6_TNL proto
685*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
686*4dc78e53SAndroid Build Coastguard Worker *
687*4dc78e53SAndroid Build Coastguard Worker * @return proto value
688*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6_tnl_get_proto(struct rtnl_link * link)689*4dc78e53SAndroid Build Coastguard Worker uint8_t rtnl_link_ip6_tnl_get_proto(struct rtnl_link *link)
690*4dc78e53SAndroid Build Coastguard Worker {
691*4dc78e53SAndroid Build Coastguard Worker struct ip6_tnl_info *ip6_tnl = link->l_info;
692*4dc78e53SAndroid Build Coastguard Worker
693*4dc78e53SAndroid Build Coastguard Worker IS_IP6_TNL_LINK_ASSERT(link);
694*4dc78e53SAndroid Build Coastguard Worker
695*4dc78e53SAndroid Build Coastguard Worker return ip6_tnl->proto;
696*4dc78e53SAndroid Build Coastguard Worker }
697*4dc78e53SAndroid Build Coastguard Worker
698*4dc78e53SAndroid Build Coastguard Worker /**
699*4dc78e53SAndroid Build Coastguard Worker * Set IP6_TNL tunnel fwmark
700*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
701*4dc78e53SAndroid Build Coastguard Worker * @arg fwmark fwmark
702*4dc78e53SAndroid Build Coastguard Worker *
703*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
704*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6_tnl_set_fwmark(struct rtnl_link * link,uint32_t fwmark)705*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6_tnl_set_fwmark(struct rtnl_link *link, uint32_t fwmark)
706*4dc78e53SAndroid Build Coastguard Worker {
707*4dc78e53SAndroid Build Coastguard Worker struct ip6_tnl_info *ip6_tnl = link->l_info;
708*4dc78e53SAndroid Build Coastguard Worker
709*4dc78e53SAndroid Build Coastguard Worker IS_IP6_TNL_LINK_ASSERT(link);
710*4dc78e53SAndroid Build Coastguard Worker
711*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->fwmark = fwmark;
712*4dc78e53SAndroid Build Coastguard Worker ip6_tnl->ip6_tnl_mask |= IP6_TNL_ATTR_FWMARK;
713*4dc78e53SAndroid Build Coastguard Worker
714*4dc78e53SAndroid Build Coastguard Worker return 0;
715*4dc78e53SAndroid Build Coastguard Worker }
716*4dc78e53SAndroid Build Coastguard Worker
717*4dc78e53SAndroid Build Coastguard Worker /**
718*4dc78e53SAndroid Build Coastguard Worker * Get IP6_TNL tunnel fwmark
719*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
720*4dc78e53SAndroid Build Coastguard Worker * @arg fwmark addr to fill in with the fwmark
721*4dc78e53SAndroid Build Coastguard Worker *
722*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
723*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_ip6_tnl_get_fwmark(struct rtnl_link * link,uint32_t * fwmark)724*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_ip6_tnl_get_fwmark(struct rtnl_link *link, uint32_t *fwmark)
725*4dc78e53SAndroid Build Coastguard Worker {
726*4dc78e53SAndroid Build Coastguard Worker struct ip6_tnl_info *ip6_tnl = link->l_info;
727*4dc78e53SAndroid Build Coastguard Worker
728*4dc78e53SAndroid Build Coastguard Worker IS_IP6_TNL_LINK_ASSERT(link);
729*4dc78e53SAndroid Build Coastguard Worker
730*4dc78e53SAndroid Build Coastguard Worker if (!(ip6_tnl->ip6_tnl_mask & IP6_TNL_ATTR_FWMARK))
731*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOATTR;
732*4dc78e53SAndroid Build Coastguard Worker
733*4dc78e53SAndroid Build Coastguard Worker *fwmark = ip6_tnl->fwmark;
734*4dc78e53SAndroid Build Coastguard Worker
735*4dc78e53SAndroid Build Coastguard Worker return 0;
736*4dc78e53SAndroid Build Coastguard Worker }
737*4dc78e53SAndroid Build Coastguard Worker
ip6_tnl_init(void)738*4dc78e53SAndroid Build Coastguard Worker static void _nl_init ip6_tnl_init(void)
739*4dc78e53SAndroid Build Coastguard Worker {
740*4dc78e53SAndroid Build Coastguard Worker rtnl_link_register_info(&ip6_tnl_info_ops);
741*4dc78e53SAndroid Build Coastguard Worker }
742*4dc78e53SAndroid Build Coastguard Worker
ip6_tnl_exit(void)743*4dc78e53SAndroid Build Coastguard Worker static void _nl_exit ip6_tnl_exit(void)
744*4dc78e53SAndroid Build Coastguard Worker {
745*4dc78e53SAndroid Build Coastguard Worker rtnl_link_unregister_info(&ip6_tnl_info_ops);
746*4dc78e53SAndroid Build Coastguard Worker }
747