xref: /aosp_15_r20/external/toybox/toys/other/vconfig.c (revision cf5a6c84e2b8763fc1a7db14496fd4742913b199)
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