1*de1e4e89SAndroid Build Coastguard Worker /*
2*de1e4e89SAndroid Build Coastguard Worker * media.c TIPC link 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 <errno.h>
16*de1e4e89SAndroid Build Coastguard Worker
17*de1e4e89SAndroid Build Coastguard Worker #include <linux/tipc_netlink.h>
18*de1e4e89SAndroid Build Coastguard Worker #include <linux/tipc.h>
19*de1e4e89SAndroid Build Coastguard Worker #include <linux/genetlink.h>
20*de1e4e89SAndroid Build Coastguard Worker #include <libmnl/libmnl.h>
21*de1e4e89SAndroid Build Coastguard Worker
22*de1e4e89SAndroid Build Coastguard Worker #include "cmdl.h"
23*de1e4e89SAndroid Build Coastguard Worker #include "msg.h"
24*de1e4e89SAndroid Build Coastguard Worker #include "media.h"
25*de1e4e89SAndroid Build Coastguard Worker
media_list_cb(const struct nlmsghdr * nlh,void * data)26*de1e4e89SAndroid Build Coastguard Worker static int media_list_cb(const struct nlmsghdr *nlh, void *data)
27*de1e4e89SAndroid Build Coastguard Worker {
28*de1e4e89SAndroid Build Coastguard Worker struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh);
29*de1e4e89SAndroid Build Coastguard Worker struct nlattr *info[TIPC_NLA_MAX + 1] = {};
30*de1e4e89SAndroid Build Coastguard Worker struct nlattr *attrs[TIPC_NLA_MEDIA_MAX + 1] = {};
31*de1e4e89SAndroid Build Coastguard Worker
32*de1e4e89SAndroid Build Coastguard Worker mnl_attr_parse(nlh, sizeof(*genl), parse_attrs, info);
33*de1e4e89SAndroid Build Coastguard Worker if (!info[TIPC_NLA_MEDIA])
34*de1e4e89SAndroid Build Coastguard Worker return MNL_CB_ERROR;
35*de1e4e89SAndroid Build Coastguard Worker
36*de1e4e89SAndroid Build Coastguard Worker mnl_attr_parse_nested(info[TIPC_NLA_MEDIA], parse_attrs, attrs);
37*de1e4e89SAndroid Build Coastguard Worker if (!attrs[TIPC_NLA_MEDIA_NAME])
38*de1e4e89SAndroid Build Coastguard Worker return MNL_CB_ERROR;
39*de1e4e89SAndroid Build Coastguard Worker
40*de1e4e89SAndroid Build Coastguard Worker printf("%s\n", mnl_attr_get_str(attrs[TIPC_NLA_MEDIA_NAME]));
41*de1e4e89SAndroid Build Coastguard Worker
42*de1e4e89SAndroid Build Coastguard Worker return MNL_CB_OK;
43*de1e4e89SAndroid Build Coastguard Worker }
44*de1e4e89SAndroid Build Coastguard Worker
cmd_media_list(struct nlmsghdr * nlh,const struct cmd * cmd,struct cmdl * cmdl,void * data)45*de1e4e89SAndroid Build Coastguard Worker static int cmd_media_list(struct nlmsghdr *nlh, const struct cmd *cmd,
46*de1e4e89SAndroid Build Coastguard Worker struct cmdl *cmdl, void *data)
47*de1e4e89SAndroid Build Coastguard Worker {
48*de1e4e89SAndroid Build Coastguard Worker char buf[MNL_SOCKET_BUFFER_SIZE];
49*de1e4e89SAndroid Build Coastguard Worker
50*de1e4e89SAndroid Build Coastguard Worker if (help_flag) {
51*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "Usage: %s media list\n", cmdl->argv[0]);
52*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
53*de1e4e89SAndroid Build Coastguard Worker }
54*de1e4e89SAndroid Build Coastguard Worker
55*de1e4e89SAndroid Build Coastguard Worker if (!(nlh = msg_init(buf, TIPC_NL_MEDIA_GET))) {
56*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "error, message initialisation failed\n");
57*de1e4e89SAndroid Build Coastguard Worker return -1;
58*de1e4e89SAndroid Build Coastguard Worker }
59*de1e4e89SAndroid Build Coastguard Worker
60*de1e4e89SAndroid Build Coastguard Worker return msg_dumpit(nlh, media_list_cb, NULL);
61*de1e4e89SAndroid Build Coastguard Worker }
62*de1e4e89SAndroid Build Coastguard Worker
media_get_cb(const struct nlmsghdr * nlh,void * data)63*de1e4e89SAndroid Build Coastguard Worker static int media_get_cb(const struct nlmsghdr *nlh, void *data)
64*de1e4e89SAndroid Build Coastguard Worker {
65*de1e4e89SAndroid Build Coastguard Worker int *prop = data;
66*de1e4e89SAndroid Build Coastguard Worker struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh);
67*de1e4e89SAndroid Build Coastguard Worker struct nlattr *info[TIPC_NLA_MAX + 1] = {};
68*de1e4e89SAndroid Build Coastguard Worker struct nlattr *attrs[TIPC_NLA_MEDIA_MAX + 1] = {};
69*de1e4e89SAndroid Build Coastguard Worker struct nlattr *props[TIPC_NLA_PROP_MAX + 1] = {};
70*de1e4e89SAndroid Build Coastguard Worker
71*de1e4e89SAndroid Build Coastguard Worker mnl_attr_parse(nlh, sizeof(*genl), parse_attrs, info);
72*de1e4e89SAndroid Build Coastguard Worker if (!info[TIPC_NLA_MEDIA])
73*de1e4e89SAndroid Build Coastguard Worker return MNL_CB_ERROR;
74*de1e4e89SAndroid Build Coastguard Worker
75*de1e4e89SAndroid Build Coastguard Worker mnl_attr_parse_nested(info[TIPC_NLA_MEDIA], parse_attrs, attrs);
76*de1e4e89SAndroid Build Coastguard Worker if (!attrs[TIPC_NLA_MEDIA_PROP])
77*de1e4e89SAndroid Build Coastguard Worker return MNL_CB_ERROR;
78*de1e4e89SAndroid Build Coastguard Worker
79*de1e4e89SAndroid Build Coastguard Worker mnl_attr_parse_nested(attrs[TIPC_NLA_MEDIA_PROP], parse_attrs, props);
80*de1e4e89SAndroid Build Coastguard Worker if (!props[*prop])
81*de1e4e89SAndroid Build Coastguard Worker return MNL_CB_ERROR;
82*de1e4e89SAndroid Build Coastguard Worker
83*de1e4e89SAndroid Build Coastguard Worker printf("%u\n", mnl_attr_get_u32(props[*prop]));
84*de1e4e89SAndroid Build Coastguard Worker
85*de1e4e89SAndroid Build Coastguard Worker return MNL_CB_OK;
86*de1e4e89SAndroid Build Coastguard Worker }
87*de1e4e89SAndroid Build Coastguard Worker
cmd_media_get_prop(struct nlmsghdr * nlh,const struct cmd * cmd,struct cmdl * cmdl,void * data)88*de1e4e89SAndroid Build Coastguard Worker static int cmd_media_get_prop(struct nlmsghdr *nlh, const struct cmd *cmd,
89*de1e4e89SAndroid Build Coastguard Worker struct cmdl *cmdl, void *data)
90*de1e4e89SAndroid Build Coastguard Worker {
91*de1e4e89SAndroid Build Coastguard Worker int prop;
92*de1e4e89SAndroid Build Coastguard Worker char buf[MNL_SOCKET_BUFFER_SIZE];
93*de1e4e89SAndroid Build Coastguard Worker struct nlattr *nest;
94*de1e4e89SAndroid Build Coastguard Worker struct opt *opt;
95*de1e4e89SAndroid Build Coastguard Worker struct opt opts[] = {
96*de1e4e89SAndroid Build Coastguard Worker { "media", OPT_KEYVAL, NULL },
97*de1e4e89SAndroid Build Coastguard Worker { NULL }
98*de1e4e89SAndroid Build Coastguard Worker };
99*de1e4e89SAndroid Build Coastguard Worker
100*de1e4e89SAndroid Build Coastguard Worker if (strcmp(cmd->cmd, "priority") == 0)
101*de1e4e89SAndroid Build Coastguard Worker prop = TIPC_NLA_PROP_PRIO;
102*de1e4e89SAndroid Build Coastguard Worker else if ((strcmp(cmd->cmd, "tolerance") == 0))
103*de1e4e89SAndroid Build Coastguard Worker prop = TIPC_NLA_PROP_TOL;
104*de1e4e89SAndroid Build Coastguard Worker else if ((strcmp(cmd->cmd, "window") == 0))
105*de1e4e89SAndroid Build Coastguard Worker prop = TIPC_NLA_PROP_WIN;
106*de1e4e89SAndroid Build Coastguard Worker else
107*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
108*de1e4e89SAndroid Build Coastguard Worker
109*de1e4e89SAndroid Build Coastguard Worker if (help_flag) {
110*de1e4e89SAndroid Build Coastguard Worker (cmd->help)(cmdl);
111*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
112*de1e4e89SAndroid Build Coastguard Worker }
113*de1e4e89SAndroid Build Coastguard Worker
114*de1e4e89SAndroid Build Coastguard Worker if (parse_opts(opts, cmdl) < 0)
115*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
116*de1e4e89SAndroid Build Coastguard Worker
117*de1e4e89SAndroid Build Coastguard Worker if (!(nlh = msg_init(buf, TIPC_NL_MEDIA_GET))) {
118*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "error, message initialisation failed\n");
119*de1e4e89SAndroid Build Coastguard Worker return -1;
120*de1e4e89SAndroid Build Coastguard Worker }
121*de1e4e89SAndroid Build Coastguard Worker
122*de1e4e89SAndroid Build Coastguard Worker if (!(opt = get_opt(opts, "media"))) {
123*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "error, missing media\n");
124*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
125*de1e4e89SAndroid Build Coastguard Worker }
126*de1e4e89SAndroid Build Coastguard Worker nest = mnl_attr_nest_start(nlh, TIPC_NLA_MEDIA);
127*de1e4e89SAndroid Build Coastguard Worker mnl_attr_put_strz(nlh, TIPC_NLA_MEDIA_NAME, opt->val);
128*de1e4e89SAndroid Build Coastguard Worker mnl_attr_nest_end(nlh, nest);
129*de1e4e89SAndroid Build Coastguard Worker
130*de1e4e89SAndroid Build Coastguard Worker return msg_doit(nlh, media_get_cb, &prop);
131*de1e4e89SAndroid Build Coastguard Worker }
132*de1e4e89SAndroid Build Coastguard Worker
cmd_media_get_help(struct cmdl * cmdl)133*de1e4e89SAndroid Build Coastguard Worker static void cmd_media_get_help(struct cmdl *cmdl)
134*de1e4e89SAndroid Build Coastguard Worker {
135*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "Usage: %s media get PPROPERTY media MEDIA\n\n"
136*de1e4e89SAndroid Build Coastguard Worker "PROPERTIES\n"
137*de1e4e89SAndroid Build Coastguard Worker " tolerance - Get media tolerance\n"
138*de1e4e89SAndroid Build Coastguard Worker " priority - Get media priority\n"
139*de1e4e89SAndroid Build Coastguard Worker " window - Get media window\n",
140*de1e4e89SAndroid Build Coastguard Worker cmdl->argv[0]);
141*de1e4e89SAndroid Build Coastguard Worker }
142*de1e4e89SAndroid Build Coastguard Worker
cmd_media_get(struct nlmsghdr * nlh,const struct cmd * cmd,struct cmdl * cmdl,void * data)143*de1e4e89SAndroid Build Coastguard Worker static int cmd_media_get(struct nlmsghdr *nlh, const struct cmd *cmd,
144*de1e4e89SAndroid Build Coastguard Worker struct cmdl *cmdl, void *data)
145*de1e4e89SAndroid Build Coastguard Worker {
146*de1e4e89SAndroid Build Coastguard Worker const struct cmd cmds[] = {
147*de1e4e89SAndroid Build Coastguard Worker { "priority", cmd_media_get_prop, cmd_media_get_help },
148*de1e4e89SAndroid Build Coastguard Worker { "tolerance", cmd_media_get_prop, cmd_media_get_help },
149*de1e4e89SAndroid Build Coastguard Worker { "window", cmd_media_get_prop, cmd_media_get_help },
150*de1e4e89SAndroid Build Coastguard Worker { NULL }
151*de1e4e89SAndroid Build Coastguard Worker };
152*de1e4e89SAndroid Build Coastguard Worker
153*de1e4e89SAndroid Build Coastguard Worker return run_cmd(nlh, cmd, cmds, cmdl, NULL);
154*de1e4e89SAndroid Build Coastguard Worker }
155*de1e4e89SAndroid Build Coastguard Worker
cmd_media_set_help(struct cmdl * cmdl)156*de1e4e89SAndroid Build Coastguard Worker static void cmd_media_set_help(struct cmdl *cmdl)
157*de1e4e89SAndroid Build Coastguard Worker {
158*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "Usage: %s media set PPROPERTY media MEDIA\n\n"
159*de1e4e89SAndroid Build Coastguard Worker "PROPERTIES\n"
160*de1e4e89SAndroid Build Coastguard Worker " tolerance TOLERANCE - Set media tolerance\n"
161*de1e4e89SAndroid Build Coastguard Worker " priority PRIORITY - Set media priority\n"
162*de1e4e89SAndroid Build Coastguard Worker " window WINDOW - Set media window\n",
163*de1e4e89SAndroid Build Coastguard Worker cmdl->argv[0]);
164*de1e4e89SAndroid Build Coastguard Worker }
165*de1e4e89SAndroid Build Coastguard Worker
cmd_media_set_prop(struct nlmsghdr * nlh,const struct cmd * cmd,struct cmdl * cmdl,void * data)166*de1e4e89SAndroid Build Coastguard Worker static int cmd_media_set_prop(struct nlmsghdr *nlh, const struct cmd *cmd,
167*de1e4e89SAndroid Build Coastguard Worker struct cmdl *cmdl, void *data)
168*de1e4e89SAndroid Build Coastguard Worker {
169*de1e4e89SAndroid Build Coastguard Worker int val;
170*de1e4e89SAndroid Build Coastguard Worker int prop;
171*de1e4e89SAndroid Build Coastguard Worker char buf[MNL_SOCKET_BUFFER_SIZE];
172*de1e4e89SAndroid Build Coastguard Worker struct nlattr *props;
173*de1e4e89SAndroid Build Coastguard Worker struct nlattr *attrs;
174*de1e4e89SAndroid Build Coastguard Worker struct opt *opt;
175*de1e4e89SAndroid Build Coastguard Worker struct opt opts[] = {
176*de1e4e89SAndroid Build Coastguard Worker { "media", OPT_KEYVAL, NULL },
177*de1e4e89SAndroid Build Coastguard Worker { NULL }
178*de1e4e89SAndroid Build Coastguard Worker };
179*de1e4e89SAndroid Build Coastguard Worker
180*de1e4e89SAndroid Build Coastguard Worker if (strcmp(cmd->cmd, "priority") == 0)
181*de1e4e89SAndroid Build Coastguard Worker prop = TIPC_NLA_PROP_PRIO;
182*de1e4e89SAndroid Build Coastguard Worker else if ((strcmp(cmd->cmd, "tolerance") == 0))
183*de1e4e89SAndroid Build Coastguard Worker prop = TIPC_NLA_PROP_TOL;
184*de1e4e89SAndroid Build Coastguard Worker else if ((strcmp(cmd->cmd, "window") == 0))
185*de1e4e89SAndroid Build Coastguard Worker prop = TIPC_NLA_PROP_WIN;
186*de1e4e89SAndroid Build Coastguard Worker else
187*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
188*de1e4e89SAndroid Build Coastguard Worker
189*de1e4e89SAndroid Build Coastguard Worker if (help_flag) {
190*de1e4e89SAndroid Build Coastguard Worker (cmd->help)(cmdl);
191*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
192*de1e4e89SAndroid Build Coastguard Worker }
193*de1e4e89SAndroid Build Coastguard Worker
194*de1e4e89SAndroid Build Coastguard Worker if (cmdl->optind >= cmdl->argc) {
195*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "error, missing value\n");
196*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
197*de1e4e89SAndroid Build Coastguard Worker }
198*de1e4e89SAndroid Build Coastguard Worker val = atoi(shift_cmdl(cmdl));
199*de1e4e89SAndroid Build Coastguard Worker
200*de1e4e89SAndroid Build Coastguard Worker if (parse_opts(opts, cmdl) < 0)
201*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
202*de1e4e89SAndroid Build Coastguard Worker
203*de1e4e89SAndroid Build Coastguard Worker if (!(nlh = msg_init(buf, TIPC_NL_MEDIA_SET))) {
204*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "error, message initialisation failed\n");
205*de1e4e89SAndroid Build Coastguard Worker return -1;
206*de1e4e89SAndroid Build Coastguard Worker }
207*de1e4e89SAndroid Build Coastguard Worker attrs = mnl_attr_nest_start(nlh, TIPC_NLA_MEDIA);
208*de1e4e89SAndroid Build Coastguard Worker
209*de1e4e89SAndroid Build Coastguard Worker if (!(opt = get_opt(opts, "media"))) {
210*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "error, missing media\n");
211*de1e4e89SAndroid Build Coastguard Worker return -EINVAL;
212*de1e4e89SAndroid Build Coastguard Worker }
213*de1e4e89SAndroid Build Coastguard Worker mnl_attr_put_strz(nlh, TIPC_NLA_MEDIA_NAME, opt->val);
214*de1e4e89SAndroid Build Coastguard Worker
215*de1e4e89SAndroid Build Coastguard Worker props = mnl_attr_nest_start(nlh, TIPC_NLA_MEDIA_PROP);
216*de1e4e89SAndroid Build Coastguard Worker mnl_attr_put_u32(nlh, prop, val);
217*de1e4e89SAndroid Build Coastguard Worker mnl_attr_nest_end(nlh, props);
218*de1e4e89SAndroid Build Coastguard Worker
219*de1e4e89SAndroid Build Coastguard Worker mnl_attr_nest_end(nlh, attrs);
220*de1e4e89SAndroid Build Coastguard Worker
221*de1e4e89SAndroid Build Coastguard Worker return msg_doit(nlh, NULL, NULL);
222*de1e4e89SAndroid Build Coastguard Worker }
223*de1e4e89SAndroid Build Coastguard Worker
cmd_media_set(struct nlmsghdr * nlh,const struct cmd * cmd,struct cmdl * cmdl,void * data)224*de1e4e89SAndroid Build Coastguard Worker static int cmd_media_set(struct nlmsghdr *nlh, const struct cmd *cmd,
225*de1e4e89SAndroid Build Coastguard Worker struct cmdl *cmdl, void *data)
226*de1e4e89SAndroid Build Coastguard Worker {
227*de1e4e89SAndroid Build Coastguard Worker const struct cmd cmds[] = {
228*de1e4e89SAndroid Build Coastguard Worker { "priority", cmd_media_set_prop, cmd_media_set_help },
229*de1e4e89SAndroid Build Coastguard Worker { "tolerance", cmd_media_set_prop, cmd_media_set_help },
230*de1e4e89SAndroid Build Coastguard Worker { "window", cmd_media_set_prop, cmd_media_set_help },
231*de1e4e89SAndroid Build Coastguard Worker { NULL }
232*de1e4e89SAndroid Build Coastguard Worker };
233*de1e4e89SAndroid Build Coastguard Worker
234*de1e4e89SAndroid Build Coastguard Worker return run_cmd(nlh, cmd, cmds, cmdl, NULL);
235*de1e4e89SAndroid Build Coastguard Worker }
236*de1e4e89SAndroid Build Coastguard Worker
cmd_media_help(struct cmdl * cmdl)237*de1e4e89SAndroid Build Coastguard Worker void cmd_media_help(struct cmdl *cmdl)
238*de1e4e89SAndroid Build Coastguard Worker {
239*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr,
240*de1e4e89SAndroid Build Coastguard Worker "Usage: %s media COMMAND [ARGS] ...\n"
241*de1e4e89SAndroid Build Coastguard Worker "\n"
242*de1e4e89SAndroid Build Coastguard Worker "Commands:\n"
243*de1e4e89SAndroid Build Coastguard Worker " list - List active media types\n"
244*de1e4e89SAndroid Build Coastguard Worker " get - Get various media properties\n"
245*de1e4e89SAndroid Build Coastguard Worker " set - Set various media properties\n",
246*de1e4e89SAndroid Build Coastguard Worker cmdl->argv[0]);
247*de1e4e89SAndroid Build Coastguard Worker }
248*de1e4e89SAndroid Build Coastguard Worker
cmd_media(struct nlmsghdr * nlh,const struct cmd * cmd,struct cmdl * cmdl,void * data)249*de1e4e89SAndroid Build Coastguard Worker int cmd_media(struct nlmsghdr *nlh, const struct cmd *cmd, struct cmdl *cmdl,
250*de1e4e89SAndroid Build Coastguard Worker void *data)
251*de1e4e89SAndroid Build Coastguard Worker {
252*de1e4e89SAndroid Build Coastguard Worker const struct cmd cmds[] = {
253*de1e4e89SAndroid Build Coastguard Worker { "get", cmd_media_get, cmd_media_get_help },
254*de1e4e89SAndroid Build Coastguard Worker { "list", cmd_media_list, NULL },
255*de1e4e89SAndroid Build Coastguard Worker { "set", cmd_media_set, cmd_media_set_help },
256*de1e4e89SAndroid Build Coastguard Worker { NULL }
257*de1e4e89SAndroid Build Coastguard Worker };
258*de1e4e89SAndroid Build Coastguard Worker
259*de1e4e89SAndroid Build Coastguard Worker return run_cmd(nlh, cmd, cmds, cmdl, NULL);
260*de1e4e89SAndroid Build Coastguard Worker }
261