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