1*de1e4e89SAndroid Build Coastguard Worker /*
2*de1e4e89SAndroid Build Coastguard Worker * bearer.c TIPC bearer functionality.
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: Richard Alpe <[email protected]>
10*de1e4e89SAndroid Build Coastguard Worker */
11*de1e4e89SAndroid Build Coastguard Worker
12*de1e4e89SAndroid Build Coastguard Worker #include <stdio.h>
13*de1e4e89SAndroid Build Coastguard Worker #include <stdlib.h>
14*de1e4e89SAndroid Build Coastguard Worker #include <string.h>
15*de1e4e89SAndroid Build Coastguard Worker #include <netdb.h>
16*de1e4e89SAndroid Build Coastguard Worker #include <errno.h>
17*de1e4e89SAndroid Build Coastguard Worker #include <arpa/inet.h>
18*de1e4e89SAndroid Build Coastguard Worker
19*de1e4e89SAndroid Build Coastguard Worker #include <linux/tipc_netlink.h>
20*de1e4e89SAndroid Build Coastguard Worker #include <linux/tipc.h>
21*de1e4e89SAndroid Build Coastguard Worker #include <linux/genetlink.h>
22*de1e4e89SAndroid Build Coastguard Worker
23*de1e4e89SAndroid Build Coastguard Worker #include <libmnl/libmnl.h>
24*de1e4e89SAndroid Build Coastguard Worker #include <sys/socket.h>
25*de1e4e89SAndroid Build Coastguard Worker
26*de1e4e89SAndroid Build Coastguard Worker #include "cmdl.h"
27*de1e4e89SAndroid Build Coastguard Worker #include "msg.h"
28*de1e4e89SAndroid Build Coastguard Worker #include "bearer.h"
29*de1e4e89SAndroid Build Coastguard Worker
30*de1e4e89SAndroid Build Coastguard Worker #define UDP_PROP_IP 1
31*de1e4e89SAndroid Build Coastguard Worker #define UDP_PROP_PORT 2
32*de1e4e89SAndroid Build Coastguard Worker
33*de1e4e89SAndroid Build Coastguard Worker struct cb_data {
34*de1e4e89SAndroid Build Coastguard Worker int attr;
35*de1e4e89SAndroid Build Coastguard Worker int prop;
36*de1e4e89SAndroid Build Coastguard Worker struct nlmsghdr *nlh;
37*de1e4e89SAndroid Build Coastguard Worker };
38*de1e4e89SAndroid Build Coastguard Worker
_print_bearer_opts(void)39*de1e4e89SAndroid Build Coastguard Worker static void _print_bearer_opts(void)
40*de1e4e89SAndroid Build Coastguard Worker {
41*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr,
42*de1e4e89SAndroid Build Coastguard Worker "OPTIONS\n"
43*de1e4e89SAndroid Build Coastguard Worker " priority - Bearer link priority\n"
44*de1e4e89SAndroid Build Coastguard Worker " tolerance - Bearer link tolerance\n"
45*de1e4e89SAndroid Build Coastguard Worker " window - Bearer link window\n");
46*de1e4e89SAndroid Build Coastguard Worker }
47*de1e4e89SAndroid Build Coastguard Worker
print_bearer_media(void)48*de1e4e89SAndroid Build Coastguard Worker void print_bearer_media(void)
49*de1e4e89SAndroid Build Coastguard Worker {
50*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr,
51*de1e4e89SAndroid Build Coastguard Worker "\nMEDIA\n"
52*de1e4e89SAndroid Build Coastguard Worker " udp - User Datagram Protocol\n"
53*de1e4e89SAndroid Build Coastguard Worker " ib - Infiniband\n"
54*de1e4e89SAndroid Build Coastguard Worker " eth - Ethernet\n");
55*de1e4e89SAndroid Build Coastguard Worker }
56*de1e4e89SAndroid Build Coastguard Worker
cmd_bearer_enable_l2_help(struct cmdl * cmdl,char * media)57*de1e4e89SAndroid Build Coastguard Worker static void cmd_bearer_enable_l2_help(struct cmdl *cmdl, char *media)
58*de1e4e89SAndroid Build Coastguard Worker {
59*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr,
60*de1e4e89SAndroid Build Coastguard Worker "Usage: %s bearer enable media %s device DEVICE [OPTIONS]\n"
61*de1e4e89SAndroid Build Coastguard Worker "\nOPTIONS\n"
62*de1e4e89SAndroid Build Coastguard Worker " domain DOMAIN - Discovery domain\n"
63*de1e4e89SAndroid Build Coastguard Worker " priority PRIORITY - Bearer priority\n",
64*de1e4e89SAndroid Build Coastguard Worker cmdl->argv[0], media);
65*de1e4e89SAndroid Build Coastguard Worker }
66*de1e4e89SAndroid Build Coastguard Worker
cmd_bearer_enable_udp_help(struct cmdl * cmdl,char * media)67*de1e4e89SAndroid Build Coastguard Worker static void cmd_bearer_enable_udp_help(struct cmdl *cmdl, char *media)
68*de1e4e89SAndroid Build Coastguard Worker {
69*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr,
70*de1e4e89SAndroid Build Coastguard Worker "Usage: %s bearer enable [OPTIONS] media %s name NAME localip IP [UDP OPTIONS]\n\n",
71*de1e4e89SAndroid Build Coastguard Worker cmdl->argv[0], media);
72*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr,
73*de1e4e89SAndroid Build Coastguard Worker "OPTIONS\n"
74*de1e4e89SAndroid Build Coastguard Worker " domain DOMAIN - Discovery domain\n"
75*de1e4e89SAndroid Build Coastguard Worker " priority PRIORITY - Bearer priority\n\n");
76*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr,
77*de1e4e89SAndroid Build Coastguard Worker "UDP OPTIONS\n"
78*de1e4e89SAndroid Build Coastguard Worker " localport PORT - Local UDP port (default 6118)\n"
79*de1e4e89SAndroid Build Coastguard Worker " remoteip IP - Remote IP address\n"
80*de1e4e89SAndroid Build Coastguard Worker " remoteport PORT - Remote UDP port (default 6118)\n");
81*de1e4e89SAndroid Build Coastguard Worker }
82*de1e4e89SAndroid Build Coastguard Worker
get_netid_cb(const struct nlmsghdr * nlh,void * data)83*de1e4e89SAndroid Build Coastguard Worker static int get_netid_cb(const struct nlmsghdr *nlh, void *data)
84*de1e4e89SAndroid Build Coastguard Worker {
85*de1e4e89SAndroid Build Coastguard Worker struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh);
86*de1e4e89SAndroid Build Coastguard Worker struct nlattr *info[TIPC_NLA_MAX + 1] = {};
87*de1e4e89SAndroid Build Coastguard Worker struct nlattr *attrs[TIPC_NLA_NET_MAX + 1] = {};
88*de1e4e89SAndroid Build Coastguard Worker int *netid = (int*)data;
89*de1e4e89SAndroid Build Coastguard Worker
90*de1e4e89SAndroid Build Coastguard Worker mnl_attr_parse(nlh, sizeof(*genl), parse_attrs, info);
91*de1e4e89SAndroid Build Coastguard Worker if (!info[TIPC_NLA_NET])
92*de1e4e89SAndroid Build Coastguard Worker return MNL_CB_ERROR;
93*de1e4e89SAndroid Build Coastguard Worker mnl_attr_parse_nested(info[TIPC_NLA_NET], parse_attrs, attrs);
94*de1e4e89SAndroid Build Coastguard Worker if (!attrs[TIPC_NLA_NET_ID])
95*de1e4e89SAndroid Build Coastguard Worker return MNL_CB_ERROR;
96*de1e4e89SAndroid Build Coastguard Worker *netid = mnl_attr_get_u32(attrs[TIPC_NLA_NET_ID]);
97*de1e4e89SAndroid Build Coastguard Worker
98*de1e4e89SAndroid Build Coastguard Worker return MNL_CB_OK;
99*de1e4e89SAndroid Build Coastguard Worker }
100*de1e4e89SAndroid Build Coastguard Worker
generate_multicast(short af,char * buf,int bufsize)101*de1e4e89SAndroid Build Coastguard Worker static int generate_multicast(short af, char *buf, int bufsize)
102*de1e4e89SAndroid Build Coastguard Worker {
103*de1e4e89SAndroid Build Coastguard Worker int netid;
104*de1e4e89SAndroid Build Coastguard Worker char mnl_msg[MNL_SOCKET_BUFFER_SIZE];
105*de1e4e89SAndroid Build Coastguard Worker struct nlmsghdr *nlh;
106*de1e4e89SAndroid Build Coastguard Worker
107*de1e4e89SAndroid Build Coastguard Worker if (!(nlh = msg_init(mnl_msg, TIPC_NL_NET_GET))) {
108*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "error, message initialization failed\n");
109*de1e4e89SAndroid Build Coastguard Worker return -1;
110*de1e4e89SAndroid Build Coastguard Worker }
111*de1e4e89SAndroid Build Coastguard Worker if (msg_dumpit(nlh, get_netid_cb, &netid)) {
112*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "error, failed to fetch TIPC network id from kernel\n");
113*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
114*de1e4e89SAndroid Build Coastguard Worker }
115*de1e4e89SAndroid Build Coastguard Worker if (af == AF_INET)
116*de1e4e89SAndroid Build Coastguard Worker snprintf(buf, bufsize, "228.0.%u.%u", (netid>>8) & 0xFF, netid & 0xFF);
117*de1e4e89SAndroid Build Coastguard Worker else
118*de1e4e89SAndroid Build Coastguard Worker snprintf(buf, bufsize, "ff02::%u", netid);
119*de1e4e89SAndroid Build Coastguard Worker
120*de1e4e89SAndroid Build Coastguard Worker return 0;
121*de1e4e89SAndroid Build Coastguard Worker }
122*de1e4e89SAndroid Build Coastguard Worker
nl_add_udp_enable_opts(struct nlmsghdr * nlh,struct opt * opts,struct cmdl * cmdl)123*de1e4e89SAndroid Build Coastguard Worker static int nl_add_udp_enable_opts(struct nlmsghdr *nlh, struct opt *opts,
124*de1e4e89SAndroid Build Coastguard Worker struct cmdl *cmdl)
125*de1e4e89SAndroid Build Coastguard Worker {
126*de1e4e89SAndroid Build Coastguard Worker int err;
127*de1e4e89SAndroid Build Coastguard Worker struct opt *opt;
128*de1e4e89SAndroid Build Coastguard Worker struct nlattr *nest;
129*de1e4e89SAndroid Build Coastguard Worker char buf[INET6_ADDRSTRLEN];
130*de1e4e89SAndroid Build Coastguard Worker char *locport = "6118";
131*de1e4e89SAndroid Build Coastguard Worker char *remport = "6118";
132*de1e4e89SAndroid Build Coastguard Worker char *locip = NULL;
133*de1e4e89SAndroid Build Coastguard Worker char *remip = NULL;
134*de1e4e89SAndroid Build Coastguard Worker struct addrinfo *loc = NULL;
135*de1e4e89SAndroid Build Coastguard Worker struct addrinfo *rem = NULL;
136*de1e4e89SAndroid Build Coastguard Worker struct addrinfo hints = {
137*de1e4e89SAndroid Build Coastguard Worker .ai_family = AF_UNSPEC,
138*de1e4e89SAndroid Build Coastguard Worker .ai_socktype = SOCK_DGRAM
139*de1e4e89SAndroid Build Coastguard Worker };
140*de1e4e89SAndroid Build Coastguard Worker
141*de1e4e89SAndroid Build Coastguard Worker if (!(opt = get_opt(opts, "localip"))) {
142*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "error, udp bearer localip missing\n");
143*de1e4e89SAndroid Build Coastguard Worker cmd_bearer_enable_udp_help(cmdl, "udp");
144*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
145*de1e4e89SAndroid Build Coastguard Worker }
146*de1e4e89SAndroid Build Coastguard Worker locip = opt->val;
147*de1e4e89SAndroid Build Coastguard Worker
148*de1e4e89SAndroid Build Coastguard Worker if ((opt = get_opt(opts, "remoteip")))
149*de1e4e89SAndroid Build Coastguard Worker remip = opt->val;
150*de1e4e89SAndroid Build Coastguard Worker
151*de1e4e89SAndroid Build Coastguard Worker if ((opt = get_opt(opts, "localport")))
152*de1e4e89SAndroid Build Coastguard Worker locport = opt->val;
153*de1e4e89SAndroid Build Coastguard Worker
154*de1e4e89SAndroid Build Coastguard Worker if ((opt = get_opt(opts, "remoteport")))
155*de1e4e89SAndroid Build Coastguard Worker remport = opt->val;
156*de1e4e89SAndroid Build Coastguard Worker
157*de1e4e89SAndroid Build Coastguard Worker if ((err = getaddrinfo(locip, locport, &hints, &loc))) {
158*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "UDP local address error: %s\n",
159*de1e4e89SAndroid Build Coastguard Worker gai_strerror(err));
160*de1e4e89SAndroid Build Coastguard Worker return err;
161*de1e4e89SAndroid Build Coastguard Worker }
162*de1e4e89SAndroid Build Coastguard Worker
163*de1e4e89SAndroid Build Coastguard Worker if (!remip) {
164*de1e4e89SAndroid Build Coastguard Worker if (generate_multicast(loc->ai_family, buf, sizeof(buf))) {
165*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "Failed to generate multicast address\n");
166*de1e4e89SAndroid Build Coastguard Worker freeaddrinfo(loc);
167*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
168*de1e4e89SAndroid Build Coastguard Worker }
169*de1e4e89SAndroid Build Coastguard Worker remip = buf;
170*de1e4e89SAndroid Build Coastguard Worker }
171*de1e4e89SAndroid Build Coastguard Worker
172*de1e4e89SAndroid Build Coastguard Worker if ((err = getaddrinfo(remip, remport, &hints, &rem))) {
173*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "UDP remote address error: %s\n",
174*de1e4e89SAndroid Build Coastguard Worker gai_strerror(err));
175*de1e4e89SAndroid Build Coastguard Worker freeaddrinfo(loc);
176*de1e4e89SAndroid Build Coastguard Worker return err;
177*de1e4e89SAndroid Build Coastguard Worker }
178*de1e4e89SAndroid Build Coastguard Worker
179*de1e4e89SAndroid Build Coastguard Worker if (rem->ai_family != loc->ai_family) {
180*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "UDP local and remote AF mismatch\n");
181*de1e4e89SAndroid Build Coastguard Worker freeaddrinfo(rem);
182*de1e4e89SAndroid Build Coastguard Worker freeaddrinfo(loc);
183*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
184*de1e4e89SAndroid Build Coastguard Worker }
185*de1e4e89SAndroid Build Coastguard Worker
186*de1e4e89SAndroid Build Coastguard Worker nest = mnl_attr_nest_start(nlh, TIPC_NLA_BEARER_UDP_OPTS);
187*de1e4e89SAndroid Build Coastguard Worker mnl_attr_put(nlh, TIPC_NLA_UDP_LOCAL, loc->ai_addrlen, loc->ai_addr);
188*de1e4e89SAndroid Build Coastguard Worker mnl_attr_put(nlh, TIPC_NLA_UDP_REMOTE, rem->ai_addrlen, rem->ai_addr);
189*de1e4e89SAndroid Build Coastguard Worker mnl_attr_nest_end(nlh, nest);
190*de1e4e89SAndroid Build Coastguard Worker
191*de1e4e89SAndroid Build Coastguard Worker freeaddrinfo(rem);
192*de1e4e89SAndroid Build Coastguard Worker freeaddrinfo(loc);
193*de1e4e89SAndroid Build Coastguard Worker
194*de1e4e89SAndroid Build Coastguard Worker return 0;
195*de1e4e89SAndroid Build Coastguard Worker }
196*de1e4e89SAndroid Build Coastguard Worker
nl_add_bearer_name(struct nlmsghdr * nlh,const struct cmd * cmd,struct cmdl * cmdl,struct opt * opts,const struct tipc_sup_media * sup_media)197*de1e4e89SAndroid Build Coastguard Worker static int nl_add_bearer_name(struct nlmsghdr *nlh, const struct cmd *cmd,
198*de1e4e89SAndroid Build Coastguard Worker struct cmdl *cmdl, struct opt *opts,
199*de1e4e89SAndroid Build Coastguard Worker const struct tipc_sup_media *sup_media)
200*de1e4e89SAndroid Build Coastguard Worker {
201*de1e4e89SAndroid Build Coastguard Worker char bname[TIPC_MAX_BEARER_NAME];
202*de1e4e89SAndroid Build Coastguard Worker int err;
203*de1e4e89SAndroid Build Coastguard Worker
204*de1e4e89SAndroid Build Coastguard Worker if ((err = cmd_get_unique_bearer_name(cmd, cmdl, opts, bname, sup_media)))
205*de1e4e89SAndroid Build Coastguard Worker return err;
206*de1e4e89SAndroid Build Coastguard Worker
207*de1e4e89SAndroid Build Coastguard Worker mnl_attr_put_strz(nlh, TIPC_NLA_BEARER_NAME, bname);
208*de1e4e89SAndroid Build Coastguard Worker return 0;
209*de1e4e89SAndroid Build Coastguard Worker }
210*de1e4e89SAndroid Build Coastguard Worker
cmd_get_unique_bearer_name(const struct cmd * cmd,struct cmdl * cmdl,struct opt * opts,char * bname,const struct tipc_sup_media * sup_media)211*de1e4e89SAndroid Build Coastguard Worker int cmd_get_unique_bearer_name(const struct cmd *cmd, struct cmdl *cmdl,
212*de1e4e89SAndroid Build Coastguard Worker struct opt *opts, char *bname,
213*de1e4e89SAndroid Build Coastguard Worker const struct tipc_sup_media *sup_media)
214*de1e4e89SAndroid Build Coastguard Worker {
215*de1e4e89SAndroid Build Coastguard Worker char *media;
216*de1e4e89SAndroid Build Coastguard Worker char *identifier;
217*de1e4e89SAndroid Build Coastguard Worker struct opt *opt;
218*de1e4e89SAndroid Build Coastguard Worker const struct tipc_sup_media *entry;
219*de1e4e89SAndroid Build Coastguard Worker
220*de1e4e89SAndroid Build Coastguard Worker
221*de1e4e89SAndroid Build Coastguard Worker if (!(opt = get_opt(opts, "media"))) {
222*de1e4e89SAndroid Build Coastguard Worker if (help_flag)
223*de1e4e89SAndroid Build Coastguard Worker (cmd->help)(cmdl);
224*de1e4e89SAndroid Build Coastguard Worker else
225*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "error, missing bearer media\n");
226*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
227*de1e4e89SAndroid Build Coastguard Worker }
228*de1e4e89SAndroid Build Coastguard Worker media = opt->val;
229*de1e4e89SAndroid Build Coastguard Worker
230*de1e4e89SAndroid Build Coastguard Worker for (entry = sup_media; entry->media; entry++) {
231*de1e4e89SAndroid Build Coastguard Worker if (strcmp(entry->media, media))
232*de1e4e89SAndroid Build Coastguard Worker continue;
233*de1e4e89SAndroid Build Coastguard Worker
234*de1e4e89SAndroid Build Coastguard Worker if (!(opt = get_opt(opts, entry->identifier))) {
235*de1e4e89SAndroid Build Coastguard Worker if (help_flag)
236*de1e4e89SAndroid Build Coastguard Worker (entry->help)(cmdl, media);
237*de1e4e89SAndroid Build Coastguard Worker else
238*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "error, missing bearer %s\n",
239*de1e4e89SAndroid Build Coastguard Worker entry->identifier);
240*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
241*de1e4e89SAndroid Build Coastguard Worker }
242*de1e4e89SAndroid Build Coastguard Worker
243*de1e4e89SAndroid Build Coastguard Worker identifier = opt->val;
244*de1e4e89SAndroid Build Coastguard Worker snprintf(bname, TIPC_MAX_BEARER_NAME, "%s:%s", media, identifier);
245*de1e4e89SAndroid Build Coastguard Worker
246*de1e4e89SAndroid Build Coastguard Worker return 0;
247*de1e4e89SAndroid Build Coastguard Worker }
248*de1e4e89SAndroid Build Coastguard Worker
249*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "error, invalid media type %s\n", media);
250*de1e4e89SAndroid Build Coastguard Worker
251*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
252*de1e4e89SAndroid Build Coastguard Worker }
253*de1e4e89SAndroid Build Coastguard Worker
cmd_bearer_add_udp_help(struct cmdl * cmdl,char * media)254*de1e4e89SAndroid Build Coastguard Worker static void cmd_bearer_add_udp_help(struct cmdl *cmdl, char *media)
255*de1e4e89SAndroid Build Coastguard Worker {
256*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "Usage: %s bearer add media %s name NAME remoteip REMOTEIP\n\n",
257*de1e4e89SAndroid Build Coastguard Worker cmdl->argv[0], media);
258*de1e4e89SAndroid Build Coastguard Worker }
259*de1e4e89SAndroid Build Coastguard Worker
cmd_bearer_add_help(struct cmdl * cmdl)260*de1e4e89SAndroid Build Coastguard Worker static void cmd_bearer_add_help(struct cmdl *cmdl)
261*de1e4e89SAndroid Build Coastguard Worker {
262*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "Usage: %s bearer add media udp name NAME remoteip REMOTEIP\n",
263*de1e4e89SAndroid Build Coastguard Worker cmdl->argv[0]);
264*de1e4e89SAndroid Build Coastguard Worker }
265*de1e4e89SAndroid Build Coastguard Worker
udp_bearer_add(struct nlmsghdr * nlh,struct opt * opts,struct cmdl * cmdl)266*de1e4e89SAndroid Build Coastguard Worker static int udp_bearer_add(struct nlmsghdr *nlh, struct opt *opts,
267*de1e4e89SAndroid Build Coastguard Worker struct cmdl *cmdl)
268*de1e4e89SAndroid Build Coastguard Worker {
269*de1e4e89SAndroid Build Coastguard Worker int err;
270*de1e4e89SAndroid Build Coastguard Worker struct opt *opt;
271*de1e4e89SAndroid Build Coastguard Worker struct nlattr *opts_nest;
272*de1e4e89SAndroid Build Coastguard Worker char *remport = "6118";
273*de1e4e89SAndroid Build Coastguard Worker
274*de1e4e89SAndroid Build Coastguard Worker opts_nest = mnl_attr_nest_start(nlh, TIPC_NLA_BEARER_UDP_OPTS);
275*de1e4e89SAndroid Build Coastguard Worker
276*de1e4e89SAndroid Build Coastguard Worker if ((opt = get_opt(opts, "remoteport")))
277*de1e4e89SAndroid Build Coastguard Worker remport = opt->val;
278*de1e4e89SAndroid Build Coastguard Worker
279*de1e4e89SAndroid Build Coastguard Worker if ((opt = get_opt(opts, "remoteip"))) {
280*de1e4e89SAndroid Build Coastguard Worker char *ip = opt->val;
281*de1e4e89SAndroid Build Coastguard Worker struct addrinfo *addr = NULL;
282*de1e4e89SAndroid Build Coastguard Worker struct addrinfo hints = {
283*de1e4e89SAndroid Build Coastguard Worker .ai_family = AF_UNSPEC,
284*de1e4e89SAndroid Build Coastguard Worker .ai_socktype = SOCK_DGRAM
285*de1e4e89SAndroid Build Coastguard Worker };
286*de1e4e89SAndroid Build Coastguard Worker
287*de1e4e89SAndroid Build Coastguard Worker if ((err = getaddrinfo(ip, remport, &hints, &addr))) {
288*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "UDP address error: %s\n",
289*de1e4e89SAndroid Build Coastguard Worker gai_strerror(err));
290*de1e4e89SAndroid Build Coastguard Worker freeaddrinfo(addr);
291*de1e4e89SAndroid Build Coastguard Worker return err;
292*de1e4e89SAndroid Build Coastguard Worker }
293*de1e4e89SAndroid Build Coastguard Worker
294*de1e4e89SAndroid Build Coastguard Worker mnl_attr_put(nlh, TIPC_NLA_UDP_REMOTE, addr->ai_addrlen,
295*de1e4e89SAndroid Build Coastguard Worker addr->ai_addr);
296*de1e4e89SAndroid Build Coastguard Worker freeaddrinfo(addr);
297*de1e4e89SAndroid Build Coastguard Worker } else {
298*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "error, missing remoteip\n");
299*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
300*de1e4e89SAndroid Build Coastguard Worker }
301*de1e4e89SAndroid Build Coastguard Worker mnl_attr_nest_end(nlh, opts_nest);
302*de1e4e89SAndroid Build Coastguard Worker
303*de1e4e89SAndroid Build Coastguard Worker return 0;
304*de1e4e89SAndroid Build Coastguard Worker }
305*de1e4e89SAndroid Build Coastguard Worker
cmd_bearer_add_media(struct nlmsghdr * nlh,const struct cmd * cmd,struct cmdl * cmdl,void * data)306*de1e4e89SAndroid Build Coastguard Worker static int cmd_bearer_add_media(struct nlmsghdr *nlh, const struct cmd *cmd,
307*de1e4e89SAndroid Build Coastguard Worker struct cmdl *cmdl, void *data)
308*de1e4e89SAndroid Build Coastguard Worker {
309*de1e4e89SAndroid Build Coastguard Worker int err;
310*de1e4e89SAndroid Build Coastguard Worker char *media;
311*de1e4e89SAndroid Build Coastguard Worker char buf[MNL_SOCKET_BUFFER_SIZE];
312*de1e4e89SAndroid Build Coastguard Worker struct opt *opt;
313*de1e4e89SAndroid Build Coastguard Worker struct nlattr *attrs;
314*de1e4e89SAndroid Build Coastguard Worker struct opt opts[] = {
315*de1e4e89SAndroid Build Coastguard Worker { "remoteip", OPT_KEYVAL, NULL },
316*de1e4e89SAndroid Build Coastguard Worker { "remoteport", OPT_KEYVAL, NULL },
317*de1e4e89SAndroid Build Coastguard Worker { "name", OPT_KEYVAL, NULL },
318*de1e4e89SAndroid Build Coastguard Worker { "media", OPT_KEYVAL, NULL },
319*de1e4e89SAndroid Build Coastguard Worker { NULL }
320*de1e4e89SAndroid Build Coastguard Worker };
321*de1e4e89SAndroid Build Coastguard Worker const struct tipc_sup_media sup_media[] = {
322*de1e4e89SAndroid Build Coastguard Worker { "udp", "name", cmd_bearer_add_udp_help},
323*de1e4e89SAndroid Build Coastguard Worker { NULL, },
324*de1e4e89SAndroid Build Coastguard Worker };
325*de1e4e89SAndroid Build Coastguard Worker
326*de1e4e89SAndroid Build Coastguard Worker /* Rewind optind to include media in the option list */
327*de1e4e89SAndroid Build Coastguard Worker cmdl->optind--;
328*de1e4e89SAndroid Build Coastguard Worker if (parse_opts(opts, cmdl) < 0)
329*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
330*de1e4e89SAndroid Build Coastguard Worker
331*de1e4e89SAndroid Build Coastguard Worker if (!(opt = get_opt(opts, "media"))) {
332*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "error, missing media value\n");
333*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
334*de1e4e89SAndroid Build Coastguard Worker }
335*de1e4e89SAndroid Build Coastguard Worker media = opt->val;
336*de1e4e89SAndroid Build Coastguard Worker
337*de1e4e89SAndroid Build Coastguard Worker if (strcmp(media, "udp") != 0) {
338*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "error, no \"%s\" media specific options available\n",
339*de1e4e89SAndroid Build Coastguard Worker media);
340*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
341*de1e4e89SAndroid Build Coastguard Worker }
342*de1e4e89SAndroid Build Coastguard Worker if (!(opt = get_opt(opts, "name"))) {
343*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "error, missing media name\n");
344*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
345*de1e4e89SAndroid Build Coastguard Worker }
346*de1e4e89SAndroid Build Coastguard Worker
347*de1e4e89SAndroid Build Coastguard Worker if (!(nlh = msg_init(buf, TIPC_NL_BEARER_ADD))) {
348*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "error, message initialisation failed\n");
349*de1e4e89SAndroid Build Coastguard Worker return -1;
350*de1e4e89SAndroid Build Coastguard Worker }
351*de1e4e89SAndroid Build Coastguard Worker
352*de1e4e89SAndroid Build Coastguard Worker attrs = mnl_attr_nest_start(nlh, TIPC_NLA_BEARER);
353*de1e4e89SAndroid Build Coastguard Worker err = nl_add_bearer_name(nlh, cmd, cmdl, opts, sup_media);
354*de1e4e89SAndroid Build Coastguard Worker if (err)
355*de1e4e89SAndroid Build Coastguard Worker return err;
356*de1e4e89SAndroid Build Coastguard Worker
357*de1e4e89SAndroid Build Coastguard Worker err = udp_bearer_add(nlh, opts, cmdl);
358*de1e4e89SAndroid Build Coastguard Worker if (err)
359*de1e4e89SAndroid Build Coastguard Worker return err;
360*de1e4e89SAndroid Build Coastguard Worker
361*de1e4e89SAndroid Build Coastguard Worker mnl_attr_nest_end(nlh, attrs);
362*de1e4e89SAndroid Build Coastguard Worker
363*de1e4e89SAndroid Build Coastguard Worker return msg_doit(nlh, NULL, NULL);
364*de1e4e89SAndroid Build Coastguard Worker }
365*de1e4e89SAndroid Build Coastguard Worker
cmd_bearer_add(struct nlmsghdr * nlh,const struct cmd * cmd,struct cmdl * cmdl,void * data)366*de1e4e89SAndroid Build Coastguard Worker static int cmd_bearer_add(struct nlmsghdr *nlh, const struct cmd *cmd,
367*de1e4e89SAndroid Build Coastguard Worker struct cmdl *cmdl, void *data)
368*de1e4e89SAndroid Build Coastguard Worker {
369*de1e4e89SAndroid Build Coastguard Worker const struct cmd cmds[] = {
370*de1e4e89SAndroid Build Coastguard Worker { "media", cmd_bearer_add_media, cmd_bearer_add_help },
371*de1e4e89SAndroid Build Coastguard Worker { NULL }
372*de1e4e89SAndroid Build Coastguard Worker };
373*de1e4e89SAndroid Build Coastguard Worker
374*de1e4e89SAndroid Build Coastguard Worker return run_cmd(nlh, cmd, cmds, cmdl, NULL);
375*de1e4e89SAndroid Build Coastguard Worker }
376*de1e4e89SAndroid Build Coastguard Worker
cmd_bearer_enable_help(struct cmdl * cmdl)377*de1e4e89SAndroid Build Coastguard Worker static void cmd_bearer_enable_help(struct cmdl *cmdl)
378*de1e4e89SAndroid Build Coastguard Worker {
379*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr,
380*de1e4e89SAndroid Build Coastguard Worker "Usage: %s bearer enable [OPTIONS] media MEDIA ARGS...\n\n"
381*de1e4e89SAndroid Build Coastguard Worker "OPTIONS\n"
382*de1e4e89SAndroid Build Coastguard Worker " domain DOMAIN - Discovery domain\n"
383*de1e4e89SAndroid Build Coastguard Worker " priority PRIORITY - Bearer priority\n",
384*de1e4e89SAndroid Build Coastguard Worker cmdl->argv[0]);
385*de1e4e89SAndroid Build Coastguard Worker print_bearer_media();
386*de1e4e89SAndroid Build Coastguard Worker }
387*de1e4e89SAndroid Build Coastguard Worker
cmd_bearer_enable(struct nlmsghdr * nlh,const struct cmd * cmd,struct cmdl * cmdl,void * data)388*de1e4e89SAndroid Build Coastguard Worker static int cmd_bearer_enable(struct nlmsghdr *nlh, const struct cmd *cmd,
389*de1e4e89SAndroid Build Coastguard Worker struct cmdl *cmdl, void *data)
390*de1e4e89SAndroid Build Coastguard Worker {
391*de1e4e89SAndroid Build Coastguard Worker int err;
392*de1e4e89SAndroid Build Coastguard Worker struct opt *opt;
393*de1e4e89SAndroid Build Coastguard Worker struct nlattr *nest;
394*de1e4e89SAndroid Build Coastguard Worker char buf[MNL_SOCKET_BUFFER_SIZE];
395*de1e4e89SAndroid Build Coastguard Worker struct opt opts[] = {
396*de1e4e89SAndroid Build Coastguard Worker { "device", OPT_KEYVAL, NULL },
397*de1e4e89SAndroid Build Coastguard Worker { "domain", OPT_KEYVAL, NULL },
398*de1e4e89SAndroid Build Coastguard Worker { "localip", OPT_KEYVAL, NULL },
399*de1e4e89SAndroid Build Coastguard Worker { "localport", OPT_KEYVAL, NULL },
400*de1e4e89SAndroid Build Coastguard Worker { "media", OPT_KEYVAL, NULL },
401*de1e4e89SAndroid Build Coastguard Worker { "name", OPT_KEYVAL, NULL },
402*de1e4e89SAndroid Build Coastguard Worker { "priority", OPT_KEYVAL, NULL },
403*de1e4e89SAndroid Build Coastguard Worker { "remoteip", OPT_KEYVAL, NULL },
404*de1e4e89SAndroid Build Coastguard Worker { "remoteport", OPT_KEYVAL, NULL },
405*de1e4e89SAndroid Build Coastguard Worker { NULL }
406*de1e4e89SAndroid Build Coastguard Worker };
407*de1e4e89SAndroid Build Coastguard Worker struct tipc_sup_media sup_media[] = {
408*de1e4e89SAndroid Build Coastguard Worker { "udp", "name", cmd_bearer_enable_udp_help},
409*de1e4e89SAndroid Build Coastguard Worker { "eth", "device", cmd_bearer_enable_l2_help },
410*de1e4e89SAndroid Build Coastguard Worker { "ib", "device", cmd_bearer_enable_l2_help },
411*de1e4e89SAndroid Build Coastguard Worker { NULL, },
412*de1e4e89SAndroid Build Coastguard Worker };
413*de1e4e89SAndroid Build Coastguard Worker
414*de1e4e89SAndroid Build Coastguard Worker if (parse_opts(opts, cmdl) < 0) {
415*de1e4e89SAndroid Build Coastguard Worker if (help_flag)
416*de1e4e89SAndroid Build Coastguard Worker (cmd->help)(cmdl);
417*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
418*de1e4e89SAndroid Build Coastguard Worker }
419*de1e4e89SAndroid Build Coastguard Worker
420*de1e4e89SAndroid Build Coastguard Worker if (!(nlh = msg_init(buf, TIPC_NL_BEARER_ENABLE))) {
421*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "error: message initialisation failed\n");
422*de1e4e89SAndroid Build Coastguard Worker return -1;
423*de1e4e89SAndroid Build Coastguard Worker }
424*de1e4e89SAndroid Build Coastguard Worker nest = mnl_attr_nest_start(nlh, TIPC_NLA_BEARER);
425*de1e4e89SAndroid Build Coastguard Worker
426*de1e4e89SAndroid Build Coastguard Worker if ((opt = get_opt(opts, "domain")))
427*de1e4e89SAndroid Build Coastguard Worker mnl_attr_put_u32(nlh, TIPC_NLA_BEARER_DOMAIN, atoi(opt->val));
428*de1e4e89SAndroid Build Coastguard Worker
429*de1e4e89SAndroid Build Coastguard Worker if ((opt = get_opt(opts, "priority"))) {
430*de1e4e89SAndroid Build Coastguard Worker struct nlattr *props;
431*de1e4e89SAndroid Build Coastguard Worker
432*de1e4e89SAndroid Build Coastguard Worker props = mnl_attr_nest_start(nlh, TIPC_NLA_BEARER_PROP);
433*de1e4e89SAndroid Build Coastguard Worker mnl_attr_put_u32(nlh, TIPC_NLA_PROP_PRIO, atoi(opt->val));
434*de1e4e89SAndroid Build Coastguard Worker mnl_attr_nest_end(nlh, props);
435*de1e4e89SAndroid Build Coastguard Worker }
436*de1e4e89SAndroid Build Coastguard Worker
437*de1e4e89SAndroid Build Coastguard Worker err = nl_add_bearer_name(nlh, cmd, cmdl, opts, sup_media);
438*de1e4e89SAndroid Build Coastguard Worker if (err)
439*de1e4e89SAndroid Build Coastguard Worker return err;
440*de1e4e89SAndroid Build Coastguard Worker
441*de1e4e89SAndroid Build Coastguard Worker opt = get_opt(opts, "media");
442*de1e4e89SAndroid Build Coastguard Worker if (opt && strcmp(opt->val, "udp") == 0) {
443*de1e4e89SAndroid Build Coastguard Worker err = nl_add_udp_enable_opts(nlh, opts, cmdl);
444*de1e4e89SAndroid Build Coastguard Worker if (err)
445*de1e4e89SAndroid Build Coastguard Worker return err;
446*de1e4e89SAndroid Build Coastguard Worker }
447*de1e4e89SAndroid Build Coastguard Worker mnl_attr_nest_end(nlh, nest);
448*de1e4e89SAndroid Build Coastguard Worker
449*de1e4e89SAndroid Build Coastguard Worker return msg_doit(nlh, NULL, NULL);
450*de1e4e89SAndroid Build Coastguard Worker }
451*de1e4e89SAndroid Build Coastguard Worker
cmd_bearer_disable_l2_help(struct cmdl * cmdl,char * media)452*de1e4e89SAndroid Build Coastguard Worker static void cmd_bearer_disable_l2_help(struct cmdl *cmdl, char *media)
453*de1e4e89SAndroid Build Coastguard Worker {
454*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "Usage: %s bearer disable media %s device DEVICE\n",
455*de1e4e89SAndroid Build Coastguard Worker cmdl->argv[0], media);
456*de1e4e89SAndroid Build Coastguard Worker }
457*de1e4e89SAndroid Build Coastguard Worker
cmd_bearer_disable_udp_help(struct cmdl * cmdl,char * media)458*de1e4e89SAndroid Build Coastguard Worker static void cmd_bearer_disable_udp_help(struct cmdl *cmdl, char *media)
459*de1e4e89SAndroid Build Coastguard Worker {
460*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "Usage: %s bearer disable media %s name NAME\n",
461*de1e4e89SAndroid Build Coastguard Worker cmdl->argv[0], media);
462*de1e4e89SAndroid Build Coastguard Worker }
463*de1e4e89SAndroid Build Coastguard Worker
cmd_bearer_disable_help(struct cmdl * cmdl)464*de1e4e89SAndroid Build Coastguard Worker static void cmd_bearer_disable_help(struct cmdl *cmdl)
465*de1e4e89SAndroid Build Coastguard Worker {
466*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "Usage: %s bearer disable media MEDIA ARGS...\n",
467*de1e4e89SAndroid Build Coastguard Worker cmdl->argv[0]);
468*de1e4e89SAndroid Build Coastguard Worker print_bearer_media();
469*de1e4e89SAndroid Build Coastguard Worker }
470*de1e4e89SAndroid Build Coastguard Worker
cmd_bearer_disable(struct nlmsghdr * nlh,const struct cmd * cmd,struct cmdl * cmdl,void * data)471*de1e4e89SAndroid Build Coastguard Worker static int cmd_bearer_disable(struct nlmsghdr *nlh, const struct cmd *cmd,
472*de1e4e89SAndroid Build Coastguard Worker struct cmdl *cmdl, void *data)
473*de1e4e89SAndroid Build Coastguard Worker {
474*de1e4e89SAndroid Build Coastguard Worker int err;
475*de1e4e89SAndroid Build Coastguard Worker char buf[MNL_SOCKET_BUFFER_SIZE];
476*de1e4e89SAndroid Build Coastguard Worker struct nlattr *nest;
477*de1e4e89SAndroid Build Coastguard Worker struct opt opts[] = {
478*de1e4e89SAndroid Build Coastguard Worker { "device", OPT_KEYVAL, NULL },
479*de1e4e89SAndroid Build Coastguard Worker { "name", OPT_KEYVAL, NULL },
480*de1e4e89SAndroid Build Coastguard Worker { "media", OPT_KEYVAL, NULL },
481*de1e4e89SAndroid Build Coastguard Worker { NULL }
482*de1e4e89SAndroid Build Coastguard Worker };
483*de1e4e89SAndroid Build Coastguard Worker struct tipc_sup_media sup_media[] = {
484*de1e4e89SAndroid Build Coastguard Worker { "udp", "name", cmd_bearer_disable_udp_help},
485*de1e4e89SAndroid Build Coastguard Worker { "eth", "device", cmd_bearer_disable_l2_help },
486*de1e4e89SAndroid Build Coastguard Worker { "ib", "device", cmd_bearer_disable_l2_help },
487*de1e4e89SAndroid Build Coastguard Worker { NULL, },
488*de1e4e89SAndroid Build Coastguard Worker };
489*de1e4e89SAndroid Build Coastguard Worker
490*de1e4e89SAndroid Build Coastguard Worker if (parse_opts(opts, cmdl) < 0) {
491*de1e4e89SAndroid Build Coastguard Worker if (help_flag)
492*de1e4e89SAndroid Build Coastguard Worker (cmd->help)(cmdl);
493*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
494*de1e4e89SAndroid Build Coastguard Worker }
495*de1e4e89SAndroid Build Coastguard Worker
496*de1e4e89SAndroid Build Coastguard Worker if (!(nlh = msg_init(buf, TIPC_NL_BEARER_DISABLE))) {
497*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "error, message initialisation failed\n");
498*de1e4e89SAndroid Build Coastguard Worker return -1;
499*de1e4e89SAndroid Build Coastguard Worker }
500*de1e4e89SAndroid Build Coastguard Worker
501*de1e4e89SAndroid Build Coastguard Worker nest = mnl_attr_nest_start(nlh, TIPC_NLA_BEARER);
502*de1e4e89SAndroid Build Coastguard Worker err = nl_add_bearer_name(nlh, cmd, cmdl, opts, sup_media);
503*de1e4e89SAndroid Build Coastguard Worker if (err)
504*de1e4e89SAndroid Build Coastguard Worker return err;
505*de1e4e89SAndroid Build Coastguard Worker mnl_attr_nest_end(nlh, nest);
506*de1e4e89SAndroid Build Coastguard Worker
507*de1e4e89SAndroid Build Coastguard Worker return msg_doit(nlh, NULL, NULL);
508*de1e4e89SAndroid Build Coastguard Worker
509*de1e4e89SAndroid Build Coastguard Worker }
510*de1e4e89SAndroid Build Coastguard Worker
cmd_bearer_set_help(struct cmdl * cmdl)511*de1e4e89SAndroid Build Coastguard Worker static void cmd_bearer_set_help(struct cmdl *cmdl)
512*de1e4e89SAndroid Build Coastguard Worker {
513*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "Usage: %s bearer set OPTION media MEDIA ARGS...\n",
514*de1e4e89SAndroid Build Coastguard Worker cmdl->argv[0]);
515*de1e4e89SAndroid Build Coastguard Worker _print_bearer_opts();
516*de1e4e89SAndroid Build Coastguard Worker print_bearer_media();
517*de1e4e89SAndroid Build Coastguard Worker }
518*de1e4e89SAndroid Build Coastguard Worker
cmd_bearer_set_udp_help(struct cmdl * cmdl,char * media)519*de1e4e89SAndroid Build Coastguard Worker static void cmd_bearer_set_udp_help(struct cmdl *cmdl, char *media)
520*de1e4e89SAndroid Build Coastguard Worker {
521*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "Usage: %s bearer set OPTION media %s name NAME\n\n",
522*de1e4e89SAndroid Build Coastguard Worker cmdl->argv[0], media);
523*de1e4e89SAndroid Build Coastguard Worker _print_bearer_opts();
524*de1e4e89SAndroid Build Coastguard Worker }
525*de1e4e89SAndroid Build Coastguard Worker
cmd_bearer_set_l2_help(struct cmdl * cmdl,char * media)526*de1e4e89SAndroid Build Coastguard Worker static void cmd_bearer_set_l2_help(struct cmdl *cmdl, char *media)
527*de1e4e89SAndroid Build Coastguard Worker {
528*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr,
529*de1e4e89SAndroid Build Coastguard Worker "Usage: %s bearer set [OPTION]... media %s device DEVICE\n",
530*de1e4e89SAndroid Build Coastguard Worker cmdl->argv[0], media);
531*de1e4e89SAndroid Build Coastguard Worker _print_bearer_opts();
532*de1e4e89SAndroid Build Coastguard Worker }
533*de1e4e89SAndroid Build Coastguard Worker
cmd_bearer_set_prop(struct nlmsghdr * nlh,const struct cmd * cmd,struct cmdl * cmdl,void * data)534*de1e4e89SAndroid Build Coastguard Worker static int cmd_bearer_set_prop(struct nlmsghdr *nlh, const struct cmd *cmd,
535*de1e4e89SAndroid Build Coastguard Worker struct cmdl *cmdl, void *data)
536*de1e4e89SAndroid Build Coastguard Worker {
537*de1e4e89SAndroid Build Coastguard Worker int err;
538*de1e4e89SAndroid Build Coastguard Worker int val;
539*de1e4e89SAndroid Build Coastguard Worker int prop;
540*de1e4e89SAndroid Build Coastguard Worker char buf[MNL_SOCKET_BUFFER_SIZE];
541*de1e4e89SAndroid Build Coastguard Worker struct nlattr *props;
542*de1e4e89SAndroid Build Coastguard Worker struct nlattr *attrs;
543*de1e4e89SAndroid Build Coastguard Worker struct opt opts[] = {
544*de1e4e89SAndroid Build Coastguard Worker { "device", OPT_KEYVAL, NULL },
545*de1e4e89SAndroid Build Coastguard Worker { "media", OPT_KEYVAL, NULL },
546*de1e4e89SAndroid Build Coastguard Worker { "name", OPT_KEYVAL, NULL },
547*de1e4e89SAndroid Build Coastguard Worker { NULL }
548*de1e4e89SAndroid Build Coastguard Worker };
549*de1e4e89SAndroid Build Coastguard Worker struct tipc_sup_media sup_media[] = {
550*de1e4e89SAndroid Build Coastguard Worker { "udp", "name", cmd_bearer_set_udp_help},
551*de1e4e89SAndroid Build Coastguard Worker { "eth", "device", cmd_bearer_set_l2_help },
552*de1e4e89SAndroid Build Coastguard Worker { "ib", "device", cmd_bearer_set_l2_help },
553*de1e4e89SAndroid Build Coastguard Worker { NULL, },
554*de1e4e89SAndroid Build Coastguard Worker };
555*de1e4e89SAndroid Build Coastguard Worker
556*de1e4e89SAndroid Build Coastguard Worker if (strcmp(cmd->cmd, "priority") == 0)
557*de1e4e89SAndroid Build Coastguard Worker prop = TIPC_NLA_PROP_PRIO;
558*de1e4e89SAndroid Build Coastguard Worker else if ((strcmp(cmd->cmd, "tolerance") == 0))
559*de1e4e89SAndroid Build Coastguard Worker prop = TIPC_NLA_PROP_TOL;
560*de1e4e89SAndroid Build Coastguard Worker else if ((strcmp(cmd->cmd, "window") == 0))
561*de1e4e89SAndroid Build Coastguard Worker prop = TIPC_NLA_PROP_WIN;
562*de1e4e89SAndroid Build Coastguard Worker else
563*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
564*de1e4e89SAndroid Build Coastguard Worker
565*de1e4e89SAndroid Build Coastguard Worker if (cmdl->optind >= cmdl->argc) {
566*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "error, missing value\n");
567*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
568*de1e4e89SAndroid Build Coastguard Worker }
569*de1e4e89SAndroid Build Coastguard Worker val = atoi(shift_cmdl(cmdl));
570*de1e4e89SAndroid Build Coastguard Worker
571*de1e4e89SAndroid Build Coastguard Worker if (parse_opts(opts, cmdl) < 0)
572*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
573*de1e4e89SAndroid Build Coastguard Worker
574*de1e4e89SAndroid Build Coastguard Worker if (!(nlh = msg_init(buf, TIPC_NL_BEARER_SET))) {
575*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "error, message initialisation failed\n");
576*de1e4e89SAndroid Build Coastguard Worker return -1;
577*de1e4e89SAndroid Build Coastguard Worker }
578*de1e4e89SAndroid Build Coastguard Worker attrs = mnl_attr_nest_start(nlh, TIPC_NLA_BEARER);
579*de1e4e89SAndroid Build Coastguard Worker
580*de1e4e89SAndroid Build Coastguard Worker props = mnl_attr_nest_start(nlh, TIPC_NLA_BEARER_PROP);
581*de1e4e89SAndroid Build Coastguard Worker mnl_attr_put_u32(nlh, prop, val);
582*de1e4e89SAndroid Build Coastguard Worker mnl_attr_nest_end(nlh, props);
583*de1e4e89SAndroid Build Coastguard Worker
584*de1e4e89SAndroid Build Coastguard Worker err = nl_add_bearer_name(nlh, cmd, cmdl, opts, sup_media);
585*de1e4e89SAndroid Build Coastguard Worker if (err)
586*de1e4e89SAndroid Build Coastguard Worker return err;
587*de1e4e89SAndroid Build Coastguard Worker
588*de1e4e89SAndroid Build Coastguard Worker mnl_attr_nest_end(nlh, attrs);
589*de1e4e89SAndroid Build Coastguard Worker
590*de1e4e89SAndroid Build Coastguard Worker return msg_doit(nlh, NULL, NULL);
591*de1e4e89SAndroid Build Coastguard Worker }
592*de1e4e89SAndroid Build Coastguard Worker
cmd_bearer_set(struct nlmsghdr * nlh,const struct cmd * cmd,struct cmdl * cmdl,void * data)593*de1e4e89SAndroid Build Coastguard Worker static int cmd_bearer_set(struct nlmsghdr *nlh, const struct cmd *cmd,
594*de1e4e89SAndroid Build Coastguard Worker struct cmdl *cmdl, void *data)
595*de1e4e89SAndroid Build Coastguard Worker {
596*de1e4e89SAndroid Build Coastguard Worker const struct cmd cmds[] = {
597*de1e4e89SAndroid Build Coastguard Worker { "priority", cmd_bearer_set_prop, cmd_bearer_set_help },
598*de1e4e89SAndroid Build Coastguard Worker { "tolerance", cmd_bearer_set_prop, cmd_bearer_set_help },
599*de1e4e89SAndroid Build Coastguard Worker { "window", cmd_bearer_set_prop, cmd_bearer_set_help },
600*de1e4e89SAndroid Build Coastguard Worker { NULL }
601*de1e4e89SAndroid Build Coastguard Worker };
602*de1e4e89SAndroid Build Coastguard Worker
603*de1e4e89SAndroid Build Coastguard Worker return run_cmd(nlh, cmd, cmds, cmdl, NULL);
604*de1e4e89SAndroid Build Coastguard Worker }
605*de1e4e89SAndroid Build Coastguard Worker
cmd_bearer_get_help(struct cmdl * cmdl)606*de1e4e89SAndroid Build Coastguard Worker static void cmd_bearer_get_help(struct cmdl *cmdl)
607*de1e4e89SAndroid Build Coastguard Worker {
608*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "Usage: %s bearer get [OPTION] media MEDIA ARGS...\n",
609*de1e4e89SAndroid Build Coastguard Worker cmdl->argv[0]);
610*de1e4e89SAndroid Build Coastguard Worker _print_bearer_opts();
611*de1e4e89SAndroid Build Coastguard Worker print_bearer_media();
612*de1e4e89SAndroid Build Coastguard Worker }
613*de1e4e89SAndroid Build Coastguard Worker
cmd_bearer_get_udp_help(struct cmdl * cmdl,char * media)614*de1e4e89SAndroid Build Coastguard Worker static void cmd_bearer_get_udp_help(struct cmdl *cmdl, char *media)
615*de1e4e89SAndroid Build Coastguard Worker {
616*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "Usage: %s bearer get [OPTION] media %s name NAME [UDP OPTIONS]\n\n",
617*de1e4e89SAndroid Build Coastguard Worker cmdl->argv[0], media);
618*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr,
619*de1e4e89SAndroid Build Coastguard Worker "UDP OPTIONS\n"
620*de1e4e89SAndroid Build Coastguard Worker " remoteip - Remote ip address\n"
621*de1e4e89SAndroid Build Coastguard Worker " remoteport - Remote port\n"
622*de1e4e89SAndroid Build Coastguard Worker " localip - Local ip address\n"
623*de1e4e89SAndroid Build Coastguard Worker " localport - Local port\n\n");
624*de1e4e89SAndroid Build Coastguard Worker _print_bearer_opts();
625*de1e4e89SAndroid Build Coastguard Worker }
626*de1e4e89SAndroid Build Coastguard Worker
cmd_bearer_get_l2_help(struct cmdl * cmdl,char * media)627*de1e4e89SAndroid Build Coastguard Worker static void cmd_bearer_get_l2_help(struct cmdl *cmdl, char *media)
628*de1e4e89SAndroid Build Coastguard Worker {
629*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr,
630*de1e4e89SAndroid Build Coastguard Worker "Usage: %s bearer get OPTION media %s device DEVICE\n",
631*de1e4e89SAndroid Build Coastguard Worker cmdl->argv[0], media);
632*de1e4e89SAndroid Build Coastguard Worker _print_bearer_opts();
633*de1e4e89SAndroid Build Coastguard Worker }
634*de1e4e89SAndroid Build Coastguard Worker
635*de1e4e89SAndroid Build Coastguard Worker
bearer_dump_udp_cb(const struct nlmsghdr * nlh,void * data)636*de1e4e89SAndroid Build Coastguard Worker static int bearer_dump_udp_cb(const struct nlmsghdr *nlh, void *data)
637*de1e4e89SAndroid Build Coastguard Worker {
638*de1e4e89SAndroid Build Coastguard Worker struct sockaddr_storage *addr;
639*de1e4e89SAndroid Build Coastguard Worker struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh);
640*de1e4e89SAndroid Build Coastguard Worker struct nlattr *info[TIPC_NLA_UDP_MAX + 1] = {};
641*de1e4e89SAndroid Build Coastguard Worker
642*de1e4e89SAndroid Build Coastguard Worker mnl_attr_parse(nlh, sizeof(*genl), parse_attrs, info);
643*de1e4e89SAndroid Build Coastguard Worker
644*de1e4e89SAndroid Build Coastguard Worker if (!info[TIPC_NLA_UDP_REMOTE])
645*de1e4e89SAndroid Build Coastguard Worker return MNL_CB_ERROR;
646*de1e4e89SAndroid Build Coastguard Worker
647*de1e4e89SAndroid Build Coastguard Worker addr = mnl_attr_get_payload(info[TIPC_NLA_UDP_REMOTE]);
648*de1e4e89SAndroid Build Coastguard Worker
649*de1e4e89SAndroid Build Coastguard Worker if (addr->ss_family == AF_INET) {
650*de1e4e89SAndroid Build Coastguard Worker struct sockaddr_in *ipv4 = (struct sockaddr_in *) addr;
651*de1e4e89SAndroid Build Coastguard Worker
652*de1e4e89SAndroid Build Coastguard Worker printf("%s\n", inet_ntoa(ipv4->sin_addr));
653*de1e4e89SAndroid Build Coastguard Worker } else if (addr->ss_family == AF_INET6) {
654*de1e4e89SAndroid Build Coastguard Worker char straddr[INET6_ADDRSTRLEN];
655*de1e4e89SAndroid Build Coastguard Worker struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *) addr;
656*de1e4e89SAndroid Build Coastguard Worker
657*de1e4e89SAndroid Build Coastguard Worker if (!inet_ntop(AF_INET6, &ipv6->sin6_addr, straddr,
658*de1e4e89SAndroid Build Coastguard Worker sizeof(straddr))) {
659*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "error, parsing IPv6 addr\n");
660*de1e4e89SAndroid Build Coastguard Worker return MNL_CB_ERROR;
661*de1e4e89SAndroid Build Coastguard Worker }
662*de1e4e89SAndroid Build Coastguard Worker printf("%s\n", straddr);
663*de1e4e89SAndroid Build Coastguard Worker
664*de1e4e89SAndroid Build Coastguard Worker } else {
665*de1e4e89SAndroid Build Coastguard Worker return MNL_CB_ERROR;
666*de1e4e89SAndroid Build Coastguard Worker }
667*de1e4e89SAndroid Build Coastguard Worker
668*de1e4e89SAndroid Build Coastguard Worker return MNL_CB_OK;
669*de1e4e89SAndroid Build Coastguard Worker }
670*de1e4e89SAndroid Build Coastguard Worker
bearer_get_udp_cb(const struct nlmsghdr * nlh,void * data)671*de1e4e89SAndroid Build Coastguard Worker static int bearer_get_udp_cb(const struct nlmsghdr *nlh, void *data)
672*de1e4e89SAndroid Build Coastguard Worker {
673*de1e4e89SAndroid Build Coastguard Worker struct cb_data *cb_data = (struct cb_data *) data;
674*de1e4e89SAndroid Build Coastguard Worker struct sockaddr_storage *addr;
675*de1e4e89SAndroid Build Coastguard Worker struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh);
676*de1e4e89SAndroid Build Coastguard Worker struct nlattr *info[TIPC_NLA_MAX + 1] = {};
677*de1e4e89SAndroid Build Coastguard Worker struct nlattr *attrs[TIPC_NLA_BEARER_MAX + 1] = {};
678*de1e4e89SAndroid Build Coastguard Worker struct nlattr *opts[TIPC_NLA_UDP_MAX + 1] = {};
679*de1e4e89SAndroid Build Coastguard Worker
680*de1e4e89SAndroid Build Coastguard Worker mnl_attr_parse(nlh, sizeof(*genl), parse_attrs, info);
681*de1e4e89SAndroid Build Coastguard Worker if (!info[TIPC_NLA_BEARER])
682*de1e4e89SAndroid Build Coastguard Worker return MNL_CB_ERROR;
683*de1e4e89SAndroid Build Coastguard Worker
684*de1e4e89SAndroid Build Coastguard Worker mnl_attr_parse_nested(info[TIPC_NLA_BEARER], parse_attrs, attrs);
685*de1e4e89SAndroid Build Coastguard Worker if (!attrs[TIPC_NLA_BEARER_UDP_OPTS])
686*de1e4e89SAndroid Build Coastguard Worker return MNL_CB_ERROR;
687*de1e4e89SAndroid Build Coastguard Worker
688*de1e4e89SAndroid Build Coastguard Worker mnl_attr_parse_nested(attrs[TIPC_NLA_BEARER_UDP_OPTS], parse_attrs, opts);
689*de1e4e89SAndroid Build Coastguard Worker if (!opts[TIPC_NLA_UDP_LOCAL])
690*de1e4e89SAndroid Build Coastguard Worker return MNL_CB_ERROR;
691*de1e4e89SAndroid Build Coastguard Worker
692*de1e4e89SAndroid Build Coastguard Worker if ((cb_data->attr == TIPC_NLA_UDP_REMOTE) &&
693*de1e4e89SAndroid Build Coastguard Worker (cb_data->prop == UDP_PROP_IP) &&
694*de1e4e89SAndroid Build Coastguard Worker opts[TIPC_NLA_UDP_MULTI_REMOTEIP]) {
695*de1e4e89SAndroid Build Coastguard Worker struct genlmsghdr *genl = mnl_nlmsg_get_payload(cb_data->nlh);
696*de1e4e89SAndroid Build Coastguard Worker
697*de1e4e89SAndroid Build Coastguard Worker genl->cmd = TIPC_NL_UDP_GET_REMOTEIP;
698*de1e4e89SAndroid Build Coastguard Worker return msg_dumpit(cb_data->nlh, bearer_dump_udp_cb, NULL);
699*de1e4e89SAndroid Build Coastguard Worker }
700*de1e4e89SAndroid Build Coastguard Worker
701*de1e4e89SAndroid Build Coastguard Worker addr = mnl_attr_get_payload(opts[cb_data->attr]);
702*de1e4e89SAndroid Build Coastguard Worker
703*de1e4e89SAndroid Build Coastguard Worker if (addr->ss_family == AF_INET) {
704*de1e4e89SAndroid Build Coastguard Worker struct sockaddr_in *ipv4 = (struct sockaddr_in *) addr;
705*de1e4e89SAndroid Build Coastguard Worker
706*de1e4e89SAndroid Build Coastguard Worker switch (cb_data->prop) {
707*de1e4e89SAndroid Build Coastguard Worker case UDP_PROP_IP:
708*de1e4e89SAndroid Build Coastguard Worker printf("%s\n", inet_ntoa(ipv4->sin_addr));
709*de1e4e89SAndroid Build Coastguard Worker break;
710*de1e4e89SAndroid Build Coastguard Worker case UDP_PROP_PORT:
711*de1e4e89SAndroid Build Coastguard Worker printf("%u\n", ntohs(ipv4->sin_port));
712*de1e4e89SAndroid Build Coastguard Worker break;
713*de1e4e89SAndroid Build Coastguard Worker default:
714*de1e4e89SAndroid Build Coastguard Worker return MNL_CB_ERROR;
715*de1e4e89SAndroid Build Coastguard Worker }
716*de1e4e89SAndroid Build Coastguard Worker
717*de1e4e89SAndroid Build Coastguard Worker } else if (addr->ss_family == AF_INET6) {
718*de1e4e89SAndroid Build Coastguard Worker char straddr[INET6_ADDRSTRLEN];
719*de1e4e89SAndroid Build Coastguard Worker struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *) addr;
720*de1e4e89SAndroid Build Coastguard Worker
721*de1e4e89SAndroid Build Coastguard Worker switch (cb_data->prop) {
722*de1e4e89SAndroid Build Coastguard Worker case UDP_PROP_IP:
723*de1e4e89SAndroid Build Coastguard Worker if (!inet_ntop(AF_INET6, &ipv6->sin6_addr, straddr,
724*de1e4e89SAndroid Build Coastguard Worker sizeof(straddr))) {
725*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "error, parsing IPv6 addr\n");
726*de1e4e89SAndroid Build Coastguard Worker return MNL_CB_ERROR;
727*de1e4e89SAndroid Build Coastguard Worker }
728*de1e4e89SAndroid Build Coastguard Worker printf("%s\n", straddr);
729*de1e4e89SAndroid Build Coastguard Worker break;
730*de1e4e89SAndroid Build Coastguard Worker case UDP_PROP_PORT:
731*de1e4e89SAndroid Build Coastguard Worker printf("%u\n", ntohs(ipv6->sin6_port));
732*de1e4e89SAndroid Build Coastguard Worker break;
733*de1e4e89SAndroid Build Coastguard Worker default:
734*de1e4e89SAndroid Build Coastguard Worker return MNL_CB_ERROR;
735*de1e4e89SAndroid Build Coastguard Worker }
736*de1e4e89SAndroid Build Coastguard Worker
737*de1e4e89SAndroid Build Coastguard Worker } else {
738*de1e4e89SAndroid Build Coastguard Worker return MNL_CB_ERROR;
739*de1e4e89SAndroid Build Coastguard Worker }
740*de1e4e89SAndroid Build Coastguard Worker
741*de1e4e89SAndroid Build Coastguard Worker return MNL_CB_OK;
742*de1e4e89SAndroid Build Coastguard Worker }
743*de1e4e89SAndroid Build Coastguard Worker
bearer_get_cb(const struct nlmsghdr * nlh,void * data)744*de1e4e89SAndroid Build Coastguard Worker static int bearer_get_cb(const struct nlmsghdr *nlh, void *data)
745*de1e4e89SAndroid Build Coastguard Worker {
746*de1e4e89SAndroid Build Coastguard Worker int *prop = data;
747*de1e4e89SAndroid Build Coastguard Worker struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh);
748*de1e4e89SAndroid Build Coastguard Worker struct nlattr *info[TIPC_NLA_MAX + 1] = {};
749*de1e4e89SAndroid Build Coastguard Worker struct nlattr *attrs[TIPC_NLA_BEARER_MAX + 1] = {};
750*de1e4e89SAndroid Build Coastguard Worker struct nlattr *props[TIPC_NLA_PROP_MAX + 1] = {};
751*de1e4e89SAndroid Build Coastguard Worker
752*de1e4e89SAndroid Build Coastguard Worker mnl_attr_parse(nlh, sizeof(*genl), parse_attrs, info);
753*de1e4e89SAndroid Build Coastguard Worker if (!info[TIPC_NLA_BEARER])
754*de1e4e89SAndroid Build Coastguard Worker return MNL_CB_ERROR;
755*de1e4e89SAndroid Build Coastguard Worker
756*de1e4e89SAndroid Build Coastguard Worker mnl_attr_parse_nested(info[TIPC_NLA_BEARER], parse_attrs, attrs);
757*de1e4e89SAndroid Build Coastguard Worker if (!attrs[TIPC_NLA_BEARER_PROP])
758*de1e4e89SAndroid Build Coastguard Worker return MNL_CB_ERROR;
759*de1e4e89SAndroid Build Coastguard Worker
760*de1e4e89SAndroid Build Coastguard Worker mnl_attr_parse_nested(attrs[TIPC_NLA_BEARER_PROP], parse_attrs, props);
761*de1e4e89SAndroid Build Coastguard Worker if (!props[*prop])
762*de1e4e89SAndroid Build Coastguard Worker return MNL_CB_ERROR;
763*de1e4e89SAndroid Build Coastguard Worker
764*de1e4e89SAndroid Build Coastguard Worker printf("%u\n", mnl_attr_get_u32(props[*prop]));
765*de1e4e89SAndroid Build Coastguard Worker
766*de1e4e89SAndroid Build Coastguard Worker return MNL_CB_OK;
767*de1e4e89SAndroid Build Coastguard Worker }
768*de1e4e89SAndroid Build Coastguard Worker
cmd_bearer_get_media(struct nlmsghdr * nlh,const struct cmd * cmd,struct cmdl * cmdl,void * data)769*de1e4e89SAndroid Build Coastguard Worker static int cmd_bearer_get_media(struct nlmsghdr *nlh, const struct cmd *cmd,
770*de1e4e89SAndroid Build Coastguard Worker struct cmdl *cmdl, void *data)
771*de1e4e89SAndroid Build Coastguard Worker {
772*de1e4e89SAndroid Build Coastguard Worker int err;
773*de1e4e89SAndroid Build Coastguard Worker char *media;
774*de1e4e89SAndroid Build Coastguard Worker char buf[MNL_SOCKET_BUFFER_SIZE];
775*de1e4e89SAndroid Build Coastguard Worker struct opt *opt;
776*de1e4e89SAndroid Build Coastguard Worker struct cb_data cb_data = {0};
777*de1e4e89SAndroid Build Coastguard Worker struct nlattr *attrs;
778*de1e4e89SAndroid Build Coastguard Worker struct opt opts[] = {
779*de1e4e89SAndroid Build Coastguard Worker { "localip", OPT_KEY, NULL },
780*de1e4e89SAndroid Build Coastguard Worker { "localport", OPT_KEY, NULL },
781*de1e4e89SAndroid Build Coastguard Worker { "remoteip", OPT_KEY, NULL },
782*de1e4e89SAndroid Build Coastguard Worker { "remoteport", OPT_KEY, NULL },
783*de1e4e89SAndroid Build Coastguard Worker { "name", OPT_KEYVAL, NULL },
784*de1e4e89SAndroid Build Coastguard Worker { "media", OPT_KEYVAL, NULL },
785*de1e4e89SAndroid Build Coastguard Worker { NULL }
786*de1e4e89SAndroid Build Coastguard Worker };
787*de1e4e89SAndroid Build Coastguard Worker struct tipc_sup_media sup_media[] = {
788*de1e4e89SAndroid Build Coastguard Worker { "udp", "name", cmd_bearer_get_udp_help},
789*de1e4e89SAndroid Build Coastguard Worker { NULL, },
790*de1e4e89SAndroid Build Coastguard Worker };
791*de1e4e89SAndroid Build Coastguard Worker
792*de1e4e89SAndroid Build Coastguard Worker /* Rewind optind to include media in the option list */
793*de1e4e89SAndroid Build Coastguard Worker cmdl->optind--;
794*de1e4e89SAndroid Build Coastguard Worker if (parse_opts(opts, cmdl) < 0)
795*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
796*de1e4e89SAndroid Build Coastguard Worker
797*de1e4e89SAndroid Build Coastguard Worker if (!(opt = get_opt(opts, "media"))) {
798*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "error, missing media value\n");
799*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
800*de1e4e89SAndroid Build Coastguard Worker }
801*de1e4e89SAndroid Build Coastguard Worker media = opt->val;
802*de1e4e89SAndroid Build Coastguard Worker
803*de1e4e89SAndroid Build Coastguard Worker if (help_flag) {
804*de1e4e89SAndroid Build Coastguard Worker cmd_bearer_get_udp_help(cmdl, media);
805*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
806*de1e4e89SAndroid Build Coastguard Worker }
807*de1e4e89SAndroid Build Coastguard Worker if (strcmp(media, "udp") != 0) {
808*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "error, no \"%s\" media specific options\n", media);
809*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
810*de1e4e89SAndroid Build Coastguard Worker }
811*de1e4e89SAndroid Build Coastguard Worker if (!(opt = get_opt(opts, "name"))) {
812*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "error, missing media name\n");
813*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
814*de1e4e89SAndroid Build Coastguard Worker }
815*de1e4e89SAndroid Build Coastguard Worker
816*de1e4e89SAndroid Build Coastguard Worker if (!(nlh = msg_init(buf, TIPC_NL_BEARER_GET))) {
817*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "error, message initialisation failed\n");
818*de1e4e89SAndroid Build Coastguard Worker return -1;
819*de1e4e89SAndroid Build Coastguard Worker }
820*de1e4e89SAndroid Build Coastguard Worker
821*de1e4e89SAndroid Build Coastguard Worker attrs = mnl_attr_nest_start(nlh, TIPC_NLA_BEARER);
822*de1e4e89SAndroid Build Coastguard Worker err = nl_add_bearer_name(nlh, cmd, cmdl, opts, sup_media);
823*de1e4e89SAndroid Build Coastguard Worker if (err)
824*de1e4e89SAndroid Build Coastguard Worker return err;
825*de1e4e89SAndroid Build Coastguard Worker mnl_attr_nest_end(nlh, attrs);
826*de1e4e89SAndroid Build Coastguard Worker cb_data.nlh = nlh;
827*de1e4e89SAndroid Build Coastguard Worker
828*de1e4e89SAndroid Build Coastguard Worker if (has_opt(opts, "localip")) {
829*de1e4e89SAndroid Build Coastguard Worker cb_data.attr = TIPC_NLA_UDP_LOCAL;
830*de1e4e89SAndroid Build Coastguard Worker cb_data.prop = UDP_PROP_IP;
831*de1e4e89SAndroid Build Coastguard Worker return msg_doit(nlh, bearer_get_udp_cb, &cb_data);
832*de1e4e89SAndroid Build Coastguard Worker } else if (has_opt(opts, "localport")) {
833*de1e4e89SAndroid Build Coastguard Worker cb_data.attr = TIPC_NLA_UDP_LOCAL;
834*de1e4e89SAndroid Build Coastguard Worker cb_data.prop = UDP_PROP_PORT;
835*de1e4e89SAndroid Build Coastguard Worker return msg_doit(nlh, bearer_get_udp_cb, &cb_data);
836*de1e4e89SAndroid Build Coastguard Worker } else if (has_opt(opts, "remoteip")) {
837*de1e4e89SAndroid Build Coastguard Worker cb_data.attr = TIPC_NLA_UDP_REMOTE;
838*de1e4e89SAndroid Build Coastguard Worker cb_data.prop = UDP_PROP_IP;
839*de1e4e89SAndroid Build Coastguard Worker return msg_doit(nlh, bearer_get_udp_cb, &cb_data);
840*de1e4e89SAndroid Build Coastguard Worker } else if (has_opt(opts, "remoteport")) {
841*de1e4e89SAndroid Build Coastguard Worker cb_data.attr = TIPC_NLA_UDP_REMOTE;
842*de1e4e89SAndroid Build Coastguard Worker cb_data.prop = UDP_PROP_PORT;
843*de1e4e89SAndroid Build Coastguard Worker return msg_doit(nlh, bearer_get_udp_cb, &cb_data);
844*de1e4e89SAndroid Build Coastguard Worker }
845*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "error, missing UDP option\n");
846*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
847*de1e4e89SAndroid Build Coastguard Worker }
848*de1e4e89SAndroid Build Coastguard Worker
cmd_bearer_get_prop(struct nlmsghdr * nlh,const struct cmd * cmd,struct cmdl * cmdl,void * data)849*de1e4e89SAndroid Build Coastguard Worker static int cmd_bearer_get_prop(struct nlmsghdr *nlh, const struct cmd *cmd,
850*de1e4e89SAndroid Build Coastguard Worker struct cmdl *cmdl, void *data)
851*de1e4e89SAndroid Build Coastguard Worker {
852*de1e4e89SAndroid Build Coastguard Worker int err;
853*de1e4e89SAndroid Build Coastguard Worker int prop;
854*de1e4e89SAndroid Build Coastguard Worker char buf[MNL_SOCKET_BUFFER_SIZE];
855*de1e4e89SAndroid Build Coastguard Worker struct nlattr *attrs;
856*de1e4e89SAndroid Build Coastguard Worker struct opt opts[] = {
857*de1e4e89SAndroid Build Coastguard Worker { "device", OPT_KEYVAL, NULL },
858*de1e4e89SAndroid Build Coastguard Worker { "media", OPT_KEYVAL, NULL },
859*de1e4e89SAndroid Build Coastguard Worker { "name", OPT_KEYVAL, NULL },
860*de1e4e89SAndroid Build Coastguard Worker { NULL }
861*de1e4e89SAndroid Build Coastguard Worker };
862*de1e4e89SAndroid Build Coastguard Worker struct tipc_sup_media sup_media[] = {
863*de1e4e89SAndroid Build Coastguard Worker { "udp", "name", cmd_bearer_get_udp_help},
864*de1e4e89SAndroid Build Coastguard Worker { "eth", "device", cmd_bearer_get_l2_help },
865*de1e4e89SAndroid Build Coastguard Worker { "ib", "device", cmd_bearer_get_l2_help },
866*de1e4e89SAndroid Build Coastguard Worker { NULL, },
867*de1e4e89SAndroid Build Coastguard Worker };
868*de1e4e89SAndroid Build Coastguard Worker
869*de1e4e89SAndroid Build Coastguard Worker if (help_flag) {
870*de1e4e89SAndroid Build Coastguard Worker (cmd->help)(cmdl);
871*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
872*de1e4e89SAndroid Build Coastguard Worker }
873*de1e4e89SAndroid Build Coastguard Worker
874*de1e4e89SAndroid Build Coastguard Worker if (strcmp(cmd->cmd, "priority") == 0)
875*de1e4e89SAndroid Build Coastguard Worker prop = TIPC_NLA_PROP_PRIO;
876*de1e4e89SAndroid Build Coastguard Worker else if ((strcmp(cmd->cmd, "tolerance") == 0))
877*de1e4e89SAndroid Build Coastguard Worker prop = TIPC_NLA_PROP_TOL;
878*de1e4e89SAndroid Build Coastguard Worker else if ((strcmp(cmd->cmd, "window") == 0))
879*de1e4e89SAndroid Build Coastguard Worker prop = TIPC_NLA_PROP_WIN;
880*de1e4e89SAndroid Build Coastguard Worker else
881*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
882*de1e4e89SAndroid Build Coastguard Worker
883*de1e4e89SAndroid Build Coastguard Worker if (parse_opts(opts, cmdl) < 0)
884*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
885*de1e4e89SAndroid Build Coastguard Worker
886*de1e4e89SAndroid Build Coastguard Worker if (!(nlh = msg_init(buf, TIPC_NL_BEARER_GET))) {
887*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "error, message initialisation failed\n");
888*de1e4e89SAndroid Build Coastguard Worker return -1;
889*de1e4e89SAndroid Build Coastguard Worker }
890*de1e4e89SAndroid Build Coastguard Worker
891*de1e4e89SAndroid Build Coastguard Worker attrs = mnl_attr_nest_start(nlh, TIPC_NLA_BEARER);
892*de1e4e89SAndroid Build Coastguard Worker err = nl_add_bearer_name(nlh, cmd, cmdl, opts, sup_media);
893*de1e4e89SAndroid Build Coastguard Worker if (err)
894*de1e4e89SAndroid Build Coastguard Worker return err;
895*de1e4e89SAndroid Build Coastguard Worker mnl_attr_nest_end(nlh, attrs);
896*de1e4e89SAndroid Build Coastguard Worker
897*de1e4e89SAndroid Build Coastguard Worker return msg_doit(nlh, bearer_get_cb, &prop);
898*de1e4e89SAndroid Build Coastguard Worker }
899*de1e4e89SAndroid Build Coastguard Worker
cmd_bearer_get(struct nlmsghdr * nlh,const struct cmd * cmd,struct cmdl * cmdl,void * data)900*de1e4e89SAndroid Build Coastguard Worker static int cmd_bearer_get(struct nlmsghdr *nlh, const struct cmd *cmd,
901*de1e4e89SAndroid Build Coastguard Worker struct cmdl *cmdl, void *data)
902*de1e4e89SAndroid Build Coastguard Worker {
903*de1e4e89SAndroid Build Coastguard Worker const struct cmd cmds[] = {
904*de1e4e89SAndroid Build Coastguard Worker { "priority", cmd_bearer_get_prop, cmd_bearer_get_help },
905*de1e4e89SAndroid Build Coastguard Worker { "tolerance", cmd_bearer_get_prop, cmd_bearer_get_help },
906*de1e4e89SAndroid Build Coastguard Worker { "window", cmd_bearer_get_prop, cmd_bearer_get_help },
907*de1e4e89SAndroid Build Coastguard Worker { "media", cmd_bearer_get_media, cmd_bearer_get_help },
908*de1e4e89SAndroid Build Coastguard Worker { NULL }
909*de1e4e89SAndroid Build Coastguard Worker };
910*de1e4e89SAndroid Build Coastguard Worker
911*de1e4e89SAndroid Build Coastguard Worker return run_cmd(nlh, cmd, cmds, cmdl, NULL);
912*de1e4e89SAndroid Build Coastguard Worker }
913*de1e4e89SAndroid Build Coastguard Worker
bearer_list_cb(const struct nlmsghdr * nlh,void * data)914*de1e4e89SAndroid Build Coastguard Worker static int bearer_list_cb(const struct nlmsghdr *nlh, void *data)
915*de1e4e89SAndroid Build Coastguard Worker {
916*de1e4e89SAndroid Build Coastguard Worker struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh);
917*de1e4e89SAndroid Build Coastguard Worker struct nlattr *info[TIPC_NLA_MAX + 1] = {};
918*de1e4e89SAndroid Build Coastguard Worker struct nlattr *attrs[TIPC_NLA_BEARER_MAX + 1] = {};
919*de1e4e89SAndroid Build Coastguard Worker
920*de1e4e89SAndroid Build Coastguard Worker mnl_attr_parse(nlh, sizeof(*genl), parse_attrs, info);
921*de1e4e89SAndroid Build Coastguard Worker if (!info[TIPC_NLA_BEARER]) {
922*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "No bearer in netlink response\n");
923*de1e4e89SAndroid Build Coastguard Worker return MNL_CB_ERROR;
924*de1e4e89SAndroid Build Coastguard Worker }
925*de1e4e89SAndroid Build Coastguard Worker
926*de1e4e89SAndroid Build Coastguard Worker mnl_attr_parse_nested(info[TIPC_NLA_BEARER], parse_attrs, attrs);
927*de1e4e89SAndroid Build Coastguard Worker if (!attrs[TIPC_NLA_BEARER_NAME]) {
928*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "Bearer name missing in netlink response\n");
929*de1e4e89SAndroid Build Coastguard Worker return MNL_CB_ERROR;
930*de1e4e89SAndroid Build Coastguard Worker }
931*de1e4e89SAndroid Build Coastguard Worker
932*de1e4e89SAndroid Build Coastguard Worker printf("%s\n", mnl_attr_get_str(attrs[TIPC_NLA_BEARER_NAME]));
933*de1e4e89SAndroid Build Coastguard Worker
934*de1e4e89SAndroid Build Coastguard Worker return MNL_CB_OK;
935*de1e4e89SAndroid Build Coastguard Worker }
936*de1e4e89SAndroid Build Coastguard Worker
cmd_bearer_list(struct nlmsghdr * nlh,const struct cmd * cmd,struct cmdl * cmdl,void * data)937*de1e4e89SAndroid Build Coastguard Worker static int cmd_bearer_list(struct nlmsghdr *nlh, const struct cmd *cmd,
938*de1e4e89SAndroid Build Coastguard Worker struct cmdl *cmdl, void *data)
939*de1e4e89SAndroid Build Coastguard Worker {
940*de1e4e89SAndroid Build Coastguard Worker char buf[MNL_SOCKET_BUFFER_SIZE];
941*de1e4e89SAndroid Build Coastguard Worker
942*de1e4e89SAndroid Build Coastguard Worker if (help_flag) {
943*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "Usage: %s bearer list\n", cmdl->argv[0]);
944*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
945*de1e4e89SAndroid Build Coastguard Worker }
946*de1e4e89SAndroid Build Coastguard Worker
947*de1e4e89SAndroid Build Coastguard Worker if (!(nlh = msg_init(buf, TIPC_NL_BEARER_GET))) {
948*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "error, message initialisation failed\n");
949*de1e4e89SAndroid Build Coastguard Worker return -1;
950*de1e4e89SAndroid Build Coastguard Worker }
951*de1e4e89SAndroid Build Coastguard Worker
952*de1e4e89SAndroid Build Coastguard Worker return msg_dumpit(nlh, bearer_list_cb, NULL);
953*de1e4e89SAndroid Build Coastguard Worker }
954*de1e4e89SAndroid Build Coastguard Worker
cmd_bearer_help(struct cmdl * cmdl)955*de1e4e89SAndroid Build Coastguard Worker void cmd_bearer_help(struct cmdl *cmdl)
956*de1e4e89SAndroid Build Coastguard Worker {
957*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr,
958*de1e4e89SAndroid Build Coastguard Worker "Usage: %s bearer COMMAND [ARGS] ...\n"
959*de1e4e89SAndroid Build Coastguard Worker "\n"
960*de1e4e89SAndroid Build Coastguard Worker "COMMANDS\n"
961*de1e4e89SAndroid Build Coastguard Worker " add - Add data to existing bearer\n"
962*de1e4e89SAndroid Build Coastguard Worker " enable - Enable a bearer\n"
963*de1e4e89SAndroid Build Coastguard Worker " disable - Disable a bearer\n"
964*de1e4e89SAndroid Build Coastguard Worker " set - Set various bearer properties\n"
965*de1e4e89SAndroid Build Coastguard Worker " get - Get various bearer properties\n"
966*de1e4e89SAndroid Build Coastguard Worker " list - List bearers\n", cmdl->argv[0]);
967*de1e4e89SAndroid Build Coastguard Worker }
968*de1e4e89SAndroid Build Coastguard Worker
cmd_bearer(struct nlmsghdr * nlh,const struct cmd * cmd,struct cmdl * cmdl,void * data)969*de1e4e89SAndroid Build Coastguard Worker int cmd_bearer(struct nlmsghdr *nlh, const struct cmd *cmd, struct cmdl *cmdl,
970*de1e4e89SAndroid Build Coastguard Worker void *data)
971*de1e4e89SAndroid Build Coastguard Worker {
972*de1e4e89SAndroid Build Coastguard Worker const struct cmd cmds[] = {
973*de1e4e89SAndroid Build Coastguard Worker { "add", cmd_bearer_add, cmd_bearer_add_help },
974*de1e4e89SAndroid Build Coastguard Worker { "disable", cmd_bearer_disable, cmd_bearer_disable_help },
975*de1e4e89SAndroid Build Coastguard Worker { "enable", cmd_bearer_enable, cmd_bearer_enable_help },
976*de1e4e89SAndroid Build Coastguard Worker { "get", cmd_bearer_get, cmd_bearer_get_help },
977*de1e4e89SAndroid Build Coastguard Worker { "list", cmd_bearer_list, NULL },
978*de1e4e89SAndroid Build Coastguard Worker { "set", cmd_bearer_set, cmd_bearer_set_help },
979*de1e4e89SAndroid Build Coastguard Worker { NULL }
980*de1e4e89SAndroid Build Coastguard Worker };
981*de1e4e89SAndroid Build Coastguard Worker
982*de1e4e89SAndroid Build Coastguard Worker return run_cmd(nlh, cmd, cmds, cmdl, NULL);
983*de1e4e89SAndroid Build Coastguard Worker }
984