1*cf5a6c84SAndroid Build Coastguard Worker /* vconfig.c - Creates virtual ethernet devices.
2*cf5a6c84SAndroid Build Coastguard Worker *
3*cf5a6c84SAndroid Build Coastguard Worker * Copyright 2012 Sandeep Sharma <[email protected]>
4*cf5a6c84SAndroid Build Coastguard Worker * Copyright 2012 Kyungwan Han <[email protected]>
5*cf5a6c84SAndroid Build Coastguard Worker *
6*cf5a6c84SAndroid Build Coastguard Worker * No standard
7*cf5a6c84SAndroid Build Coastguard Worker
8*cf5a6c84SAndroid Build Coastguard Worker USE_VCONFIG(NEWTOY(vconfig, "<2>4", TOYFLAG_NEEDROOT|TOYFLAG_SBIN))
9*cf5a6c84SAndroid Build Coastguard Worker
10*cf5a6c84SAndroid Build Coastguard Worker config VCONFIG
11*cf5a6c84SAndroid Build Coastguard Worker bool "vconfig"
12*cf5a6c84SAndroid Build Coastguard Worker default y
13*cf5a6c84SAndroid Build Coastguard Worker help
14*cf5a6c84SAndroid Build Coastguard Worker usage: vconfig COMMAND [OPTIONS]
15*cf5a6c84SAndroid Build Coastguard Worker
16*cf5a6c84SAndroid Build Coastguard Worker Create and remove virtual ethernet devices
17*cf5a6c84SAndroid Build Coastguard Worker
18*cf5a6c84SAndroid Build Coastguard Worker add [interface-name] [vlan_id]
19*cf5a6c84SAndroid Build Coastguard Worker rem [vlan-name]
20*cf5a6c84SAndroid Build Coastguard Worker set_flag [interface-name] [flag-num] [0 | 1]
21*cf5a6c84SAndroid Build Coastguard Worker set_egress_map [vlan-name] [skb_priority] [vlan_qos]
22*cf5a6c84SAndroid Build Coastguard Worker set_ingress_map [vlan-name] [skb_priority] [vlan_qos]
23*cf5a6c84SAndroid Build Coastguard Worker set_name_type [name-type]
24*cf5a6c84SAndroid Build Coastguard Worker */
25*cf5a6c84SAndroid Build Coastguard Worker
26*cf5a6c84SAndroid Build Coastguard Worker #include "toys.h"
27*cf5a6c84SAndroid Build Coastguard Worker #include <linux/if_vlan.h>
28*cf5a6c84SAndroid Build Coastguard Worker #include <linux/sockios.h>
29*cf5a6c84SAndroid Build Coastguard Worker
vconfig_main(void)30*cf5a6c84SAndroid Build Coastguard Worker void vconfig_main(void)
31*cf5a6c84SAndroid Build Coastguard Worker {
32*cf5a6c84SAndroid Build Coastguard Worker struct vlan_ioctl_args request;
33*cf5a6c84SAndroid Build Coastguard Worker char *cmd = *toys.optargs;
34*cf5a6c84SAndroid Build Coastguard Worker int fd = xsocket(AF_INET, SOCK_STREAM, 0);
35*cf5a6c84SAndroid Build Coastguard Worker
36*cf5a6c84SAndroid Build Coastguard Worker memset(&request, 0, sizeof(struct vlan_ioctl_args));
37*cf5a6c84SAndroid Build Coastguard Worker
38*cf5a6c84SAndroid Build Coastguard Worker if (!strcmp(cmd, "set_name_type")) {
39*cf5a6c84SAndroid Build Coastguard Worker char *types[] = {"VLAN_PLUS_VID", "DEV_PLUS_VID", "VLAN_PLUS_VID_NO_PAD",
40*cf5a6c84SAndroid Build Coastguard Worker "DEV_PLUS_VID_NO_PAD"};
41*cf5a6c84SAndroid Build Coastguard Worker int i, j = ARRAY_LEN(types);
42*cf5a6c84SAndroid Build Coastguard Worker
43*cf5a6c84SAndroid Build Coastguard Worker for (i=0; i<j; i++) if (!strcmp(toys.optargs[1], types[i])) break;
44*cf5a6c84SAndroid Build Coastguard Worker if (i == j) {
45*cf5a6c84SAndroid Build Coastguard Worker for (i=0; i<j; i++) puts(types[i]);
46*cf5a6c84SAndroid Build Coastguard Worker error_exit("%s: unknown '%s'", cmd, toys.optargs[1]);
47*cf5a6c84SAndroid Build Coastguard Worker }
48*cf5a6c84SAndroid Build Coastguard Worker
49*cf5a6c84SAndroid Build Coastguard Worker request.u.name_type = i;
50*cf5a6c84SAndroid Build Coastguard Worker request.cmd = SET_VLAN_NAME_TYPE_CMD;
51*cf5a6c84SAndroid Build Coastguard Worker xioctl(fd, SIOCSIFVLAN, &request);
52*cf5a6c84SAndroid Build Coastguard Worker
53*cf5a6c84SAndroid Build Coastguard Worker return;
54*cf5a6c84SAndroid Build Coastguard Worker }
55*cf5a6c84SAndroid Build Coastguard Worker
56*cf5a6c84SAndroid Build Coastguard Worker // Store interface name
57*cf5a6c84SAndroid Build Coastguard Worker xstrncpy(request.device1, toys.optargs[1], sizeof(request.device1));
58*cf5a6c84SAndroid Build Coastguard Worker
59*cf5a6c84SAndroid Build Coastguard Worker if (!strcmp(cmd, "add")) {
60*cf5a6c84SAndroid Build Coastguard Worker request.cmd = ADD_VLAN_CMD;
61*cf5a6c84SAndroid Build Coastguard Worker if (toys.optargs[2]) request.u.VID = atolx_range(toys.optargs[2], 0, 4094);
62*cf5a6c84SAndroid Build Coastguard Worker if (request.u.VID == 1)
63*cf5a6c84SAndroid Build Coastguard Worker xprintf("WARNING: VLAN 1 does not work with many switches.\n");
64*cf5a6c84SAndroid Build Coastguard Worker } else if (!strcmp(cmd, "rem")) request.cmd = DEL_VLAN_CMD;
65*cf5a6c84SAndroid Build Coastguard Worker else if (!strcmp(cmd, "set_flag")) {
66*cf5a6c84SAndroid Build Coastguard Worker request.cmd = SET_VLAN_FLAG_CMD;
67*cf5a6c84SAndroid Build Coastguard Worker if (toys.optargs[2]) request.u.flag = atolx_range(toys.optargs[2], 0, 1);
68*cf5a6c84SAndroid Build Coastguard Worker if (toys.optargs[3]) request.vlan_qos = atolx_range(toys.optargs[3], 0, 7);
69*cf5a6c84SAndroid Build Coastguard Worker } else if(strcmp(cmd, "set_egress_map") == 0) {
70*cf5a6c84SAndroid Build Coastguard Worker request.cmd = SET_VLAN_EGRESS_PRIORITY_CMD;
71*cf5a6c84SAndroid Build Coastguard Worker if (toys.optargs[2])
72*cf5a6c84SAndroid Build Coastguard Worker request.u.skb_priority = atolx_range(toys.optargs[2], 0, INT_MAX);
73*cf5a6c84SAndroid Build Coastguard Worker if (toys.optargs[3]) request.vlan_qos = atolx_range(toys.optargs[3], 0, 7);
74*cf5a6c84SAndroid Build Coastguard Worker } else if(strcmp(cmd, "set_ingress_map") == 0) {
75*cf5a6c84SAndroid Build Coastguard Worker request.cmd = SET_VLAN_INGRESS_PRIORITY_CMD;
76*cf5a6c84SAndroid Build Coastguard Worker if (toys.optargs[2])
77*cf5a6c84SAndroid Build Coastguard Worker request.u.skb_priority = atolx_range(toys.optargs[2], 0, INT_MAX);
78*cf5a6c84SAndroid Build Coastguard Worker //To set flag we must have to set vlan_qos
79*cf5a6c84SAndroid Build Coastguard Worker if (toys.optargs[3]) request.vlan_qos = atolx_range(toys.optargs[3], 0, 7);
80*cf5a6c84SAndroid Build Coastguard Worker } else {
81*cf5a6c84SAndroid Build Coastguard Worker xclose(fd);
82*cf5a6c84SAndroid Build Coastguard Worker perror_exit("Unknown command %s", cmd);
83*cf5a6c84SAndroid Build Coastguard Worker }
84*cf5a6c84SAndroid Build Coastguard Worker
85*cf5a6c84SAndroid Build Coastguard Worker xioctl(fd, SIOCSIFVLAN, &request);
86*cf5a6c84SAndroid Build Coastguard Worker xprintf("Successful %s on device %s\n", cmd, toys.optargs[1]);
87*cf5a6c84SAndroid Build Coastguard Worker }
88