1*de1e4e89SAndroid Build Coastguard Worker /*
2*de1e4e89SAndroid Build Coastguard Worker * link_vti.c VTI driver module
3*de1e4e89SAndroid Build Coastguard Worker *
4*de1e4e89SAndroid Build Coastguard Worker * This program is free software; you can redistribute it and/or
5*de1e4e89SAndroid Build Coastguard Worker * modify it under the terms of the GNU General Public License
6*de1e4e89SAndroid Build Coastguard Worker * as published by the Free Software Foundation; either version
7*de1e4e89SAndroid Build Coastguard Worker * 2 of the License, or (at your option) any later version.
8*de1e4e89SAndroid Build Coastguard Worker *
9*de1e4e89SAndroid Build Coastguard Worker * Authors: Herbert Xu <[email protected]>
10*de1e4e89SAndroid Build Coastguard Worker * Saurabh Mohan <[email protected]> Modified link_gre.c for VTI
11*de1e4e89SAndroid Build Coastguard Worker */
12*de1e4e89SAndroid Build Coastguard Worker
13*de1e4e89SAndroid Build Coastguard Worker #include <string.h>
14*de1e4e89SAndroid Build Coastguard Worker #include <net/if.h>
15*de1e4e89SAndroid Build Coastguard Worker #include <sys/types.h>
16*de1e4e89SAndroid Build Coastguard Worker #include <sys/socket.h>
17*de1e4e89SAndroid Build Coastguard Worker #include <arpa/inet.h>
18*de1e4e89SAndroid Build Coastguard Worker
19*de1e4e89SAndroid Build Coastguard Worker #include <linux/ip.h>
20*de1e4e89SAndroid Build Coastguard Worker #include <linux/if_tunnel.h>
21*de1e4e89SAndroid Build Coastguard Worker #include "rt_names.h"
22*de1e4e89SAndroid Build Coastguard Worker #include "utils.h"
23*de1e4e89SAndroid Build Coastguard Worker #include "ip_common.h"
24*de1e4e89SAndroid Build Coastguard Worker #include "tunnel.h"
25*de1e4e89SAndroid Build Coastguard Worker
26*de1e4e89SAndroid Build Coastguard Worker
print_usage(FILE * f)27*de1e4e89SAndroid Build Coastguard Worker static void print_usage(FILE *f)
28*de1e4e89SAndroid Build Coastguard Worker {
29*de1e4e89SAndroid Build Coastguard Worker fprintf(f,
30*de1e4e89SAndroid Build Coastguard Worker "Usage: ... vti [ remote ADDR ]\n"
31*de1e4e89SAndroid Build Coastguard Worker " [ local ADDR ]\n"
32*de1e4e89SAndroid Build Coastguard Worker " [ [i|o]key KEY ]\n"
33*de1e4e89SAndroid Build Coastguard Worker " [ dev PHYS_DEV ]\n"
34*de1e4e89SAndroid Build Coastguard Worker " [ fwmark MARK ]\n"
35*de1e4e89SAndroid Build Coastguard Worker "\n"
36*de1e4e89SAndroid Build Coastguard Worker "Where: ADDR := { IP_ADDRESS }\n"
37*de1e4e89SAndroid Build Coastguard Worker " KEY := { DOTTED_QUAD | NUMBER }\n"
38*de1e4e89SAndroid Build Coastguard Worker " MARK := { 0x0..0xffffffff }\n"
39*de1e4e89SAndroid Build Coastguard Worker );
40*de1e4e89SAndroid Build Coastguard Worker }
41*de1e4e89SAndroid Build Coastguard Worker
42*de1e4e89SAndroid Build Coastguard Worker static void usage(void) __attribute__((noreturn));
usage(void)43*de1e4e89SAndroid Build Coastguard Worker static void usage(void)
44*de1e4e89SAndroid Build Coastguard Worker {
45*de1e4e89SAndroid Build Coastguard Worker print_usage(stderr);
46*de1e4e89SAndroid Build Coastguard Worker exit(-1);
47*de1e4e89SAndroid Build Coastguard Worker }
48*de1e4e89SAndroid Build Coastguard Worker
vti_parse_opt(struct link_util * lu,int argc,char ** argv,struct nlmsghdr * n)49*de1e4e89SAndroid Build Coastguard Worker static int vti_parse_opt(struct link_util *lu, int argc, char **argv,
50*de1e4e89SAndroid Build Coastguard Worker struct nlmsghdr *n)
51*de1e4e89SAndroid Build Coastguard Worker {
52*de1e4e89SAndroid Build Coastguard Worker struct ifinfomsg *ifi = (struct ifinfomsg *)(n + 1);
53*de1e4e89SAndroid Build Coastguard Worker struct {
54*de1e4e89SAndroid Build Coastguard Worker struct nlmsghdr n;
55*de1e4e89SAndroid Build Coastguard Worker struct ifinfomsg i;
56*de1e4e89SAndroid Build Coastguard Worker char buf[1024];
57*de1e4e89SAndroid Build Coastguard Worker } req = {
58*de1e4e89SAndroid Build Coastguard Worker .n.nlmsg_len = NLMSG_LENGTH(sizeof(*ifi)),
59*de1e4e89SAndroid Build Coastguard Worker .n.nlmsg_flags = NLM_F_REQUEST,
60*de1e4e89SAndroid Build Coastguard Worker .n.nlmsg_type = RTM_GETLINK,
61*de1e4e89SAndroid Build Coastguard Worker .i.ifi_family = preferred_family,
62*de1e4e89SAndroid Build Coastguard Worker .i.ifi_index = ifi->ifi_index,
63*de1e4e89SAndroid Build Coastguard Worker };
64*de1e4e89SAndroid Build Coastguard Worker struct rtattr *tb[IFLA_MAX + 1];
65*de1e4e89SAndroid Build Coastguard Worker struct rtattr *linkinfo[IFLA_INFO_MAX+1];
66*de1e4e89SAndroid Build Coastguard Worker struct rtattr *vtiinfo[IFLA_VTI_MAX + 1];
67*de1e4e89SAndroid Build Coastguard Worker unsigned int ikey = 0;
68*de1e4e89SAndroid Build Coastguard Worker unsigned int okey = 0;
69*de1e4e89SAndroid Build Coastguard Worker unsigned int saddr = 0;
70*de1e4e89SAndroid Build Coastguard Worker unsigned int daddr = 0;
71*de1e4e89SAndroid Build Coastguard Worker unsigned int link = 0;
72*de1e4e89SAndroid Build Coastguard Worker unsigned int fwmark = 0;
73*de1e4e89SAndroid Build Coastguard Worker int len;
74*de1e4e89SAndroid Build Coastguard Worker
75*de1e4e89SAndroid Build Coastguard Worker if (!(n->nlmsg_flags & NLM_F_CREATE)) {
76*de1e4e89SAndroid Build Coastguard Worker if (rtnl_talk(&rth, &req.n, &req.n, sizeof(req)) < 0) {
77*de1e4e89SAndroid Build Coastguard Worker get_failed:
78*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr,
79*de1e4e89SAndroid Build Coastguard Worker "Failed to get existing tunnel info.\n");
80*de1e4e89SAndroid Build Coastguard Worker return -1;
81*de1e4e89SAndroid Build Coastguard Worker }
82*de1e4e89SAndroid Build Coastguard Worker
83*de1e4e89SAndroid Build Coastguard Worker len = req.n.nlmsg_len;
84*de1e4e89SAndroid Build Coastguard Worker len -= NLMSG_LENGTH(sizeof(*ifi));
85*de1e4e89SAndroid Build Coastguard Worker if (len < 0)
86*de1e4e89SAndroid Build Coastguard Worker goto get_failed;
87*de1e4e89SAndroid Build Coastguard Worker
88*de1e4e89SAndroid Build Coastguard Worker parse_rtattr(tb, IFLA_MAX, IFLA_RTA(&req.i), len);
89*de1e4e89SAndroid Build Coastguard Worker
90*de1e4e89SAndroid Build Coastguard Worker if (!tb[IFLA_LINKINFO])
91*de1e4e89SAndroid Build Coastguard Worker goto get_failed;
92*de1e4e89SAndroid Build Coastguard Worker
93*de1e4e89SAndroid Build Coastguard Worker parse_rtattr_nested(linkinfo, IFLA_INFO_MAX, tb[IFLA_LINKINFO]);
94*de1e4e89SAndroid Build Coastguard Worker
95*de1e4e89SAndroid Build Coastguard Worker if (!linkinfo[IFLA_INFO_DATA])
96*de1e4e89SAndroid Build Coastguard Worker goto get_failed;
97*de1e4e89SAndroid Build Coastguard Worker
98*de1e4e89SAndroid Build Coastguard Worker parse_rtattr_nested(vtiinfo, IFLA_VTI_MAX,
99*de1e4e89SAndroid Build Coastguard Worker linkinfo[IFLA_INFO_DATA]);
100*de1e4e89SAndroid Build Coastguard Worker
101*de1e4e89SAndroid Build Coastguard Worker if (vtiinfo[IFLA_VTI_IKEY])
102*de1e4e89SAndroid Build Coastguard Worker ikey = rta_getattr_u32(vtiinfo[IFLA_VTI_IKEY]);
103*de1e4e89SAndroid Build Coastguard Worker
104*de1e4e89SAndroid Build Coastguard Worker if (vtiinfo[IFLA_VTI_OKEY])
105*de1e4e89SAndroid Build Coastguard Worker okey = rta_getattr_u32(vtiinfo[IFLA_VTI_OKEY]);
106*de1e4e89SAndroid Build Coastguard Worker
107*de1e4e89SAndroid Build Coastguard Worker if (vtiinfo[IFLA_VTI_LOCAL])
108*de1e4e89SAndroid Build Coastguard Worker saddr = rta_getattr_u32(vtiinfo[IFLA_VTI_LOCAL]);
109*de1e4e89SAndroid Build Coastguard Worker
110*de1e4e89SAndroid Build Coastguard Worker if (vtiinfo[IFLA_VTI_REMOTE])
111*de1e4e89SAndroid Build Coastguard Worker daddr = rta_getattr_u32(vtiinfo[IFLA_VTI_REMOTE]);
112*de1e4e89SAndroid Build Coastguard Worker
113*de1e4e89SAndroid Build Coastguard Worker if (vtiinfo[IFLA_VTI_LINK])
114*de1e4e89SAndroid Build Coastguard Worker link = rta_getattr_u8(vtiinfo[IFLA_VTI_LINK]);
115*de1e4e89SAndroid Build Coastguard Worker
116*de1e4e89SAndroid Build Coastguard Worker if (vtiinfo[IFLA_VTI_FWMARK])
117*de1e4e89SAndroid Build Coastguard Worker fwmark = rta_getattr_u32(vtiinfo[IFLA_VTI_FWMARK]);
118*de1e4e89SAndroid Build Coastguard Worker }
119*de1e4e89SAndroid Build Coastguard Worker
120*de1e4e89SAndroid Build Coastguard Worker while (argc > 0) {
121*de1e4e89SAndroid Build Coastguard Worker if (!matches(*argv, "key")) {
122*de1e4e89SAndroid Build Coastguard Worker unsigned int uval;
123*de1e4e89SAndroid Build Coastguard Worker
124*de1e4e89SAndroid Build Coastguard Worker NEXT_ARG();
125*de1e4e89SAndroid Build Coastguard Worker if (strchr(*argv, '.'))
126*de1e4e89SAndroid Build Coastguard Worker uval = get_addr32(*argv);
127*de1e4e89SAndroid Build Coastguard Worker else {
128*de1e4e89SAndroid Build Coastguard Worker if (get_unsigned(&uval, *argv, 0) < 0) {
129*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr,
130*de1e4e89SAndroid Build Coastguard Worker "Invalid value for \"key\": \"%s\"; it should be an unsigned integer\n", *argv);
131*de1e4e89SAndroid Build Coastguard Worker exit(-1);
132*de1e4e89SAndroid Build Coastguard Worker }
133*de1e4e89SAndroid Build Coastguard Worker uval = htonl(uval);
134*de1e4e89SAndroid Build Coastguard Worker }
135*de1e4e89SAndroid Build Coastguard Worker
136*de1e4e89SAndroid Build Coastguard Worker ikey = okey = uval;
137*de1e4e89SAndroid Build Coastguard Worker } else if (!matches(*argv, "ikey")) {
138*de1e4e89SAndroid Build Coastguard Worker unsigned int uval;
139*de1e4e89SAndroid Build Coastguard Worker
140*de1e4e89SAndroid Build Coastguard Worker NEXT_ARG();
141*de1e4e89SAndroid Build Coastguard Worker if (strchr(*argv, '.'))
142*de1e4e89SAndroid Build Coastguard Worker uval = get_addr32(*argv);
143*de1e4e89SAndroid Build Coastguard Worker else {
144*de1e4e89SAndroid Build Coastguard Worker if (get_unsigned(&uval, *argv, 0) < 0) {
145*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "invalid value for \"ikey\": \"%s\"; it should be an unsigned integer\n", *argv);
146*de1e4e89SAndroid Build Coastguard Worker exit(-1);
147*de1e4e89SAndroid Build Coastguard Worker }
148*de1e4e89SAndroid Build Coastguard Worker uval = htonl(uval);
149*de1e4e89SAndroid Build Coastguard Worker }
150*de1e4e89SAndroid Build Coastguard Worker ikey = uval;
151*de1e4e89SAndroid Build Coastguard Worker } else if (!matches(*argv, "okey")) {
152*de1e4e89SAndroid Build Coastguard Worker unsigned int uval;
153*de1e4e89SAndroid Build Coastguard Worker
154*de1e4e89SAndroid Build Coastguard Worker NEXT_ARG();
155*de1e4e89SAndroid Build Coastguard Worker if (strchr(*argv, '.'))
156*de1e4e89SAndroid Build Coastguard Worker uval = get_addr32(*argv);
157*de1e4e89SAndroid Build Coastguard Worker else {
158*de1e4e89SAndroid Build Coastguard Worker if (get_unsigned(&uval, *argv, 0) < 0) {
159*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "invalid value for \"okey\": \"%s\"; it should be an unsigned integer\n", *argv);
160*de1e4e89SAndroid Build Coastguard Worker exit(-1);
161*de1e4e89SAndroid Build Coastguard Worker }
162*de1e4e89SAndroid Build Coastguard Worker uval = htonl(uval);
163*de1e4e89SAndroid Build Coastguard Worker }
164*de1e4e89SAndroid Build Coastguard Worker okey = uval;
165*de1e4e89SAndroid Build Coastguard Worker } else if (!matches(*argv, "remote")) {
166*de1e4e89SAndroid Build Coastguard Worker NEXT_ARG();
167*de1e4e89SAndroid Build Coastguard Worker if (!strcmp(*argv, "any")) {
168*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "invalid value for \"remote\": \"%s\"\n", *argv);
169*de1e4e89SAndroid Build Coastguard Worker exit(-1);
170*de1e4e89SAndroid Build Coastguard Worker } else {
171*de1e4e89SAndroid Build Coastguard Worker daddr = get_addr32(*argv);
172*de1e4e89SAndroid Build Coastguard Worker }
173*de1e4e89SAndroid Build Coastguard Worker } else if (!matches(*argv, "local")) {
174*de1e4e89SAndroid Build Coastguard Worker NEXT_ARG();
175*de1e4e89SAndroid Build Coastguard Worker if (!strcmp(*argv, "any")) {
176*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "invalid value for \"local\": \"%s\"\n", *argv);
177*de1e4e89SAndroid Build Coastguard Worker exit(-1);
178*de1e4e89SAndroid Build Coastguard Worker } else {
179*de1e4e89SAndroid Build Coastguard Worker saddr = get_addr32(*argv);
180*de1e4e89SAndroid Build Coastguard Worker }
181*de1e4e89SAndroid Build Coastguard Worker } else if (!matches(*argv, "dev")) {
182*de1e4e89SAndroid Build Coastguard Worker NEXT_ARG();
183*de1e4e89SAndroid Build Coastguard Worker link = if_nametoindex(*argv);
184*de1e4e89SAndroid Build Coastguard Worker if (link == 0) {
185*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "Cannot find device \"%s\"\n",
186*de1e4e89SAndroid Build Coastguard Worker *argv);
187*de1e4e89SAndroid Build Coastguard Worker exit(-1);
188*de1e4e89SAndroid Build Coastguard Worker }
189*de1e4e89SAndroid Build Coastguard Worker } else if (strcmp(*argv, "fwmark") == 0) {
190*de1e4e89SAndroid Build Coastguard Worker NEXT_ARG();
191*de1e4e89SAndroid Build Coastguard Worker if (get_u32(&fwmark, *argv, 0))
192*de1e4e89SAndroid Build Coastguard Worker invarg("invalid fwmark\n", *argv);
193*de1e4e89SAndroid Build Coastguard Worker } else
194*de1e4e89SAndroid Build Coastguard Worker usage();
195*de1e4e89SAndroid Build Coastguard Worker argc--; argv++;
196*de1e4e89SAndroid Build Coastguard Worker }
197*de1e4e89SAndroid Build Coastguard Worker
198*de1e4e89SAndroid Build Coastguard Worker addattr32(n, 1024, IFLA_VTI_IKEY, ikey);
199*de1e4e89SAndroid Build Coastguard Worker addattr32(n, 1024, IFLA_VTI_OKEY, okey);
200*de1e4e89SAndroid Build Coastguard Worker addattr_l(n, 1024, IFLA_VTI_LOCAL, &saddr, 4);
201*de1e4e89SAndroid Build Coastguard Worker addattr_l(n, 1024, IFLA_VTI_REMOTE, &daddr, 4);
202*de1e4e89SAndroid Build Coastguard Worker addattr32(n, 1024, IFLA_VTI_FWMARK, fwmark);
203*de1e4e89SAndroid Build Coastguard Worker if (link)
204*de1e4e89SAndroid Build Coastguard Worker addattr32(n, 1024, IFLA_VTI_LINK, link);
205*de1e4e89SAndroid Build Coastguard Worker
206*de1e4e89SAndroid Build Coastguard Worker return 0;
207*de1e4e89SAndroid Build Coastguard Worker }
208*de1e4e89SAndroid Build Coastguard Worker
vti_print_opt(struct link_util * lu,FILE * f,struct rtattr * tb[])209*de1e4e89SAndroid Build Coastguard Worker static void vti_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
210*de1e4e89SAndroid Build Coastguard Worker {
211*de1e4e89SAndroid Build Coastguard Worker const char *local = "any";
212*de1e4e89SAndroid Build Coastguard Worker const char *remote = "any";
213*de1e4e89SAndroid Build Coastguard Worker __u32 key;
214*de1e4e89SAndroid Build Coastguard Worker unsigned int link;
215*de1e4e89SAndroid Build Coastguard Worker char s2[IFNAMSIZ];
216*de1e4e89SAndroid Build Coastguard Worker
217*de1e4e89SAndroid Build Coastguard Worker if (!tb)
218*de1e4e89SAndroid Build Coastguard Worker return;
219*de1e4e89SAndroid Build Coastguard Worker
220*de1e4e89SAndroid Build Coastguard Worker if (tb[IFLA_VTI_REMOTE]) {
221*de1e4e89SAndroid Build Coastguard Worker unsigned int addr = rta_getattr_u32(tb[IFLA_VTI_REMOTE]);
222*de1e4e89SAndroid Build Coastguard Worker
223*de1e4e89SAndroid Build Coastguard Worker if (addr)
224*de1e4e89SAndroid Build Coastguard Worker remote = format_host(AF_INET, 4, &addr);
225*de1e4e89SAndroid Build Coastguard Worker }
226*de1e4e89SAndroid Build Coastguard Worker
227*de1e4e89SAndroid Build Coastguard Worker print_string(PRINT_ANY, "remote", "remote %s ", remote);
228*de1e4e89SAndroid Build Coastguard Worker
229*de1e4e89SAndroid Build Coastguard Worker if (tb[IFLA_VTI_LOCAL]) {
230*de1e4e89SAndroid Build Coastguard Worker unsigned int addr = rta_getattr_u32(tb[IFLA_VTI_LOCAL]);
231*de1e4e89SAndroid Build Coastguard Worker
232*de1e4e89SAndroid Build Coastguard Worker if (addr)
233*de1e4e89SAndroid Build Coastguard Worker local = format_host(AF_INET, 4, &addr);
234*de1e4e89SAndroid Build Coastguard Worker }
235*de1e4e89SAndroid Build Coastguard Worker
236*de1e4e89SAndroid Build Coastguard Worker print_string(PRINT_ANY, "local", "local %s ", local);
237*de1e4e89SAndroid Build Coastguard Worker
238*de1e4e89SAndroid Build Coastguard Worker if (tb[IFLA_VTI_LINK] &&
239*de1e4e89SAndroid Build Coastguard Worker (link = rta_getattr_u32(tb[IFLA_VTI_LINK]))) {
240*de1e4e89SAndroid Build Coastguard Worker const char *n = if_indextoname(link, s2);
241*de1e4e89SAndroid Build Coastguard Worker
242*de1e4e89SAndroid Build Coastguard Worker if (n)
243*de1e4e89SAndroid Build Coastguard Worker print_string(PRINT_ANY, "link", "dev %s ", n);
244*de1e4e89SAndroid Build Coastguard Worker else
245*de1e4e89SAndroid Build Coastguard Worker print_uint(PRINT_ANY, "link_index", "dev %u ", link);
246*de1e4e89SAndroid Build Coastguard Worker }
247*de1e4e89SAndroid Build Coastguard Worker
248*de1e4e89SAndroid Build Coastguard Worker if (tb[IFLA_VTI_IKEY] &&
249*de1e4e89SAndroid Build Coastguard Worker (key = rta_getattr_u32(tb[IFLA_VTI_IKEY])))
250*de1e4e89SAndroid Build Coastguard Worker print_0xhex(PRINT_ANY, "ikey", "ikey %#x ", ntohl(key));
251*de1e4e89SAndroid Build Coastguard Worker
252*de1e4e89SAndroid Build Coastguard Worker
253*de1e4e89SAndroid Build Coastguard Worker if (tb[IFLA_VTI_OKEY] &&
254*de1e4e89SAndroid Build Coastguard Worker (key = rta_getattr_u32(tb[IFLA_VTI_OKEY])))
255*de1e4e89SAndroid Build Coastguard Worker print_0xhex(PRINT_ANY, "okey", "okey %#x ", ntohl(key));
256*de1e4e89SAndroid Build Coastguard Worker
257*de1e4e89SAndroid Build Coastguard Worker if (tb[IFLA_VTI_FWMARK]) {
258*de1e4e89SAndroid Build Coastguard Worker __u32 fwmark = rta_getattr_u32(tb[IFLA_VTI_FWMARK]);
259*de1e4e89SAndroid Build Coastguard Worker
260*de1e4e89SAndroid Build Coastguard Worker if (fwmark) {
261*de1e4e89SAndroid Build Coastguard Worker SPRINT_BUF(b1);
262*de1e4e89SAndroid Build Coastguard Worker
263*de1e4e89SAndroid Build Coastguard Worker snprintf(b1, sizeof(b1), "0x%x", fwmark);
264*de1e4e89SAndroid Build Coastguard Worker print_string(PRINT_ANY, "fwmark", "fwmark %s ", s2);
265*de1e4e89SAndroid Build Coastguard Worker }
266*de1e4e89SAndroid Build Coastguard Worker }
267*de1e4e89SAndroid Build Coastguard Worker }
268*de1e4e89SAndroid Build Coastguard Worker
vti_print_help(struct link_util * lu,int argc,char ** argv,FILE * f)269*de1e4e89SAndroid Build Coastguard Worker static void vti_print_help(struct link_util *lu, int argc, char **argv,
270*de1e4e89SAndroid Build Coastguard Worker FILE *f)
271*de1e4e89SAndroid Build Coastguard Worker {
272*de1e4e89SAndroid Build Coastguard Worker print_usage(f);
273*de1e4e89SAndroid Build Coastguard Worker }
274*de1e4e89SAndroid Build Coastguard Worker
275*de1e4e89SAndroid Build Coastguard Worker struct link_util vti_link_util = {
276*de1e4e89SAndroid Build Coastguard Worker .id = "vti",
277*de1e4e89SAndroid Build Coastguard Worker .maxattr = IFLA_VTI_MAX,
278*de1e4e89SAndroid Build Coastguard Worker .parse_opt = vti_parse_opt,
279*de1e4e89SAndroid Build Coastguard Worker .print_opt = vti_print_opt,
280*de1e4e89SAndroid Build Coastguard Worker .print_help = vti_print_help,
281*de1e4e89SAndroid Build Coastguard Worker };
282