aboutsummaryrefslogtreecommitdiff
path: root/toys/other/vconfig.c
diff options
context:
space:
mode:
Diffstat (limited to 'toys/other/vconfig.c')
-rw-r--r--toys/other/vconfig.c98
1 files changed, 42 insertions, 56 deletions
diff --git a/toys/other/vconfig.c b/toys/other/vconfig.c
index 4013a792..d2422529 100644
--- a/toys/other/vconfig.c
+++ b/toys/other/vconfig.c
@@ -27,86 +27,72 @@ config VCONFIG
#include <linux/if_vlan.h>
#include <linux/sockios.h>
-static int strtorange(char *str, int min, int max)
+static long strtorange(char *str, long min, long max)
{
char *end = 0;
long val = strtol(str, &end, 10);
if (end && *end && end != str && val >= min && val <= max) return val;
- perror_exit("%s not %d-%d\n", str, min, max);
+ perror_exit("%s not %ld-%ld\n", str, min, max);
}
void vconfig_main(void)
{
-#define MAX_VLAN_ID 4094
struct vlan_ioctl_args request;
- char *interface_name = NULL;
- unsigned int name_type = VLAN_NAME_TYPE_PLUS_VID;
char *cmd;
- int fd = 0;
- int vlan_id = 0;
-
- if((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) perror_exit("Can't open socket"); //Use socket instead of open
- memset(&request, 0, sizeof(struct vlan_ioctl_args)); // Null set all the VLAN info's.
- cmd = toys.optargs[0]; // Fetch cmd and proceed.
- if(strcmp(cmd, "set_name_type") == 0) {
- if(strcmp(toys.optargs[1], "VLAN_PLUS_VID") == 0) {
- name_type = VLAN_NAME_TYPE_PLUS_VID;
- } else if(strcmp(toys.optargs[1], "VLAN_PLUS_VID_NO_PAD") == 0) {
- name_type = VLAN_NAME_TYPE_PLUS_VID_NO_PAD;
- } else if(strcmp(toys.optargs[1], "DEV_PLUS_VID") == 0) {
- name_type = VLAN_NAME_TYPE_RAW_PLUS_VID;
- } else if(strcmp(toys.optargs[1], "DEV_PLUS_VID_NO_PAD") == 0) {
- name_type = VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD;
- } else perror_exit("ERROR: Invalid name type");
-
- request.u.name_type = name_type;
- request.cmd = SET_VLAN_NAME_TYPE_CMD;
- if(ioctl(fd, SIOCSIFVLAN, &request) == 0) {
- xprintf("Successful set_name_type for VLAN subsystem\n");
- exit(EXIT_SUCCESS);
+ int fd;
+
+ fd = xsocket(AF_INET, SOCK_STREAM, 0);
+ memset(&request, 0, sizeof(struct vlan_ioctl_args));
+ cmd = toys.optargs[0];
+
+ if (!strcmp(cmd, "set_name_type")) {
+ char *types[] = {"VLAN_PLUS_VID", "DEV_PLUS_VID", "VLAN_PLUS_VID_NO_PAD",
+ "DEV_PLUS_VID_NO_PAD"};
+ int i, j = sizeof(types)/sizeof(*types);
+
+ for (i=0; i<j; i++) if (!strcmp(toys.optargs[1], types[i])) break;
+ if (i == j) {
+ for (i=0; i<j; i++) puts(types[i]);
+ error_exit("%s: unknown '%s'", cmd, toys.optargs[1]);
}
- else perror_exit("Failed to set set_name_type:");
- } else {
- interface_name = toys.optargs[1]; // Store interface name.
- if(strlen(interface_name) > 15) perror_exit("ERROR:if_name length can not be greater than 15");
- strcpy(request.device1, interface_name); //we had exited if interface_name length greater than 15, so here it never overflows.
+
+ request.u.name_type = i;
+ request.cmd = SET_VLAN_NAME_TYPE_CMD;
+ xioctl(fd, SIOCSIFVLAN, &request);
+ return;
}
- if(strcmp(cmd, "add") == 0) {
+ // Store interface name
+ xstrncpy(request.device1, toys.optargs[1], 16);
+
+ if (!strcmp(cmd, "add")) {
request.cmd = ADD_VLAN_CMD;
- if(toys.optargs[2]) vlan_id = strtorange(toys.optargs[2], 0, MAX_VLAN_ID);
- else vlan_id = 0;
- request.u.VID = vlan_id;
- } else if(strcmp(cmd, "rem") == 0) {
- request.cmd = DEL_VLAN_CMD;
- } else if(strcmp(cmd, "set_flag") == 0) {
+ if (toys.optargs[2]) request.u.VID = strtorange(toys.optargs[2], 0, 4094);
+ if (request.u.VID == 1)
+ xprintf("WARNING: VLAN 1 does not work with many switches.\n");
+ } else if (!strcmp(cmd, "rem")) request.cmd = DEL_VLAN_CMD;
+ else if (!strcmp(cmd, "set_flag")) {
request.cmd = SET_VLAN_FLAG_CMD;
- if(toys.optargs[2]) request.u.flag = strtorange(toys.optargs[2], 0, 1);
- else request.u.flag = 0;
- if(toys.optargs[3]) request.vlan_qos = strtorange(toys.optargs[3], 0, 7);
- else request.vlan_qos = 0;
+ if (toys.optargs[2]) request.u.flag = strtorange(toys.optargs[2], 0, 1);
+ if (toys.optargs[3]) request.vlan_qos = strtorange(toys.optargs[3], 0, 7);
} else if(strcmp(cmd, "set_egress_map") == 0) {
request.cmd = SET_VLAN_EGRESS_PRIORITY_CMD;
- if(toys.optargs[2]) request.u.skb_priority = strtorange(toys.optargs[2], 0, INT_MAX);
- else request.u.skb_priority = 0;
- if(toys.optargs[3]) request.vlan_qos = strtorange(toys.optargs[3], 0, 7);
- else request.vlan_qos = 0;
+ if (toys.optargs[2])
+ request.u.skb_priority = strtorange(toys.optargs[2], 0, INT_MAX);
+ if (toys.optargs[3]) request.vlan_qos = strtorange(toys.optargs[3], 0, 7);
} else if(strcmp(cmd, "set_ingress_map") == 0) {
request.cmd = SET_VLAN_INGRESS_PRIORITY_CMD;
- if(toys.optargs[2]) request.u.skb_priority = strtorange(toys.optargs[2], 0, INT_MAX);
- else request.u.skb_priority = 0;
+ if (toys.optargs[2])
+ request.u.skb_priority = strtorange(toys.optargs[2], 0, INT_MAX);
//To set flag we must have to set vlan_qos
- if(toys.optargs[3]) request.vlan_qos = strtorange(toys.optargs[3], 0, 7);
- else request.vlan_qos = 0;
+ if (toys.optargs[3]) request.vlan_qos = strtorange(toys.optargs[3], 0, 7);
} else {
xclose(fd);
perror_exit("Unknown command %s", cmd);
}
- if(ioctl(fd, SIOCSIFVLAN, &request) == 0) {
- if(strcmp(cmd, "add") == 0 && vlan_id == 1)
- xprintf("WARNING: VLAN 1 does not work with many switches,consider another number if you have problems.\n");
- xprintf("Successful %s on device %s\n", cmd, interface_name);
- } else perror_exit("Failed to %s, on vlan subsystem %s.", cmd, interface_name);
+
+ xioctl(fd, SIOCSIFVLAN, &request);
+ xprintf("Successful %s on device %s\n", cmd, toys.optargs[1]);
}