[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