[Zrouter-src-freebsd] ZRouter.org: push to FreeBSD HEAD tree
zrouter-src-freebsd at zrouter.org
zrouter-src-freebsd at zrouter.org
Sun Dec 11 13:29:30 UTC 2011
details: http://zrouter.org/hg/FreeBSD/head//rev/0ccae94db1b3
changeset: 243:0ccae94db1b3
user: ray at terran.dlink.ua
date: Sun Dec 11 15:27:17 2011 +0200
description:
fix port flags handling
diffstat:
head/sbin/switchctl/switchctl.c | 51 +++++++++++++++++++++++++++-------------
1 files changed, 34 insertions(+), 17 deletions(-)
diffs (101 lines):
diff -r 5aec9bcfd14f -r 0ccae94db1b3 head/sbin/switchctl/switchctl.c
--- a/head/sbin/switchctl/switchctl.c Wed Dec 07 00:37:42 2011 +0200
+++ b/head/sbin/switchctl/switchctl.c Sun Dec 11 15:27:17 2011 +0200
@@ -332,56 +332,71 @@
set_port(struct info *info, int fd, int argc, char **argv)
{
struct vlan_port_config vlan_port;
- int i;
+ uint32_t port_flags;
+ int i, port_flags_set;
+ port_flags = 0;
+ port_flags_set = 0;
bzero(&vlan_port, sizeof(vlan_port));
vlan_port.version = 0;
- vlan_port.cmd = 1;
+ vlan_port.cmd = 0;
vlan_port.vlan_type = VLAN_TYPE_DOT1Q;
+ /* Get current port config */
+ if (ioctl(fd, IOCTL_VLAN_PORT_CONFIG, &vlan_port) == -1)
+ err(1, "error from IOCTL_VLAN_PORT_CONFIG");
+
+ vlan_port.cmd = 1;
/* set port 7 pvid 17 flags WAN Q-in-Q IngressCheck */
if (argc >= 5) {
int idx = strtoul(argv[4], 0, 0);
vlan_port.index = idx;
for (i = 5; i < argc; i++) {
if (argv[i] && argv[i+1] && strcasecmp(argv[i], "pvid") == 0 && strtoul(argv[i+1], 0, 0)) {
- vlan_port.d.dot1q.vid = strtoul(argv[i+1], 0, 0);
- i += 2;
+ i ++; /* Skip to argument */
+ vlan_port.d.dot1q.vid = strtoul(argv[i], 0, 0);
+ /* XXX check parsing error */
} else if (argv[i] && argv[i+1] && strcasecmp(argv[i], "flags") == 0) {
- i ++;
+ i ++; /* Skip to argument */
while (i < argc && argv[i]) {
switch (argv[i][0]) {
case 'I': /* IngressCheck */
- vlan_port.d.dot1q.flags |= DOT1Q_VLAN_PORT_FLAG_INGRESS;
+ port_flags_set++;
+ port_flags |= DOT1Q_VLAN_PORT_FLAG_INGRESS;
break;
case 'Q': /* Q-in-Q */
- if (info->cap->vlan & SWITCH_CAPS_VLAN_DOUBLE_TAG)
- vlan_port.d.dot1q.flags |= DOT1Q_VLAN_PORT_FLAG_DOUBLE_TAG;
- else
+ if (info->cap->vlan & SWITCH_CAPS_VLAN_DOUBLE_TAG) {
+ port_flags_set++;
+ port_flags |= DOT1Q_VLAN_PORT_FLAG_DOUBLE_TAG;
+ } else
printf("This switch can`t do Q-in-Q\n");
break;
case 'L': /* LAN */
- if (info->cap->vlan & SWITCH_CAPS_VLAN_LAN_WAN)
- vlan_port.d.dot1q.flags |= DOT1Q_VLAN_PORT_FLAG_LAN;
- else
+ if (info->cap->vlan & SWITCH_CAPS_VLAN_LAN_WAN) {
+ port_flags_set++;
+ port_flags |= DOT1Q_VLAN_PORT_FLAG_LAN;
+ } else
printf("This switch can`t split ports for WAN/LAN\n");
break;
case 'W': /* WAN */
- if (info->cap->vlan & SWITCH_CAPS_VLAN_LAN_WAN)
- vlan_port.d.dot1q.flags |= DOT1Q_VLAN_PORT_FLAG_WAN;
- else
+ if (info->cap->vlan & SWITCH_CAPS_VLAN_LAN_WAN) {
+ port_flags_set++;
+ port_flags |= DOT1Q_VLAN_PORT_FLAG_WAN;
+ } else
printf("This switch can`t split ports for WAN/LAN\n");
break;
case 'T': /* Global Tagged */
if (info->cap->vlan & SWITCH_CAPS_VLAN_GLBL_UNTG) {
- vlan_port.d.dot1q.flags |= DOT1Q_VLAN_PORT_FLAG_TAGGED;
+ port_flags_set++;
+ port_flags |= DOT1Q_VLAN_PORT_FLAG_TAGGED;
printf("Set to Tagged\n");
} else
printf("This switch can`t do global tagging\n");
break;
case 'U': /* Global Untagged */
if (info->cap->vlan & SWITCH_CAPS_VLAN_GLBL_UNTG) {
- vlan_port.d.dot1q.flags |= DOT1Q_VLAN_PORT_FLAG_UNTAGGED;
+ port_flags_set++;
+ port_flags |= DOT1Q_VLAN_PORT_FLAG_UNTAGGED;
printf("Set to UnTagged\n");
} else
printf("This switch can`t do global tagging\n");
@@ -395,6 +410,8 @@
err(1, "Unknown field \"%s\"\n", argv[i]);
}
}
+ if (port_flags_set > 0)
+ vlan_port.d.dot1q.flags = port_flags;
if (ioctl(fd, IOCTL_VLAN_PORT_CONFIG, &vlan_port) == -1)
err(1, "error from IOCTL_VLAN_PORT_CONFIG");
More information about the Zrouter-src-freebsd
mailing list