Page MenuHomeFreeBSD

D45283.id138846.diff
No OneTemporary

D45283.id138846.diff

diff --git a/sbin/ifconfig/ifvlan.c b/sbin/ifconfig/ifvlan.c
--- a/sbin/ifconfig/ifvlan.c
+++ b/sbin/ifconfig/ifvlan.c
@@ -60,6 +60,7 @@
#include "ifconfig.h"
#define NOTAG ((u_short) -1)
+#define NOPROTO ((u_short) -1)
static const char proto_8021Q[] = "802.1q";
static const char proto_8021ad[] = "802.1ad";
@@ -67,7 +68,7 @@
static struct vlanreq params = {
.vlr_tag = NOTAG,
- .vlr_proto = ETHERTYPE_VLAN,
+ .vlr_proto = NOPROTO,
};
static void
@@ -157,6 +158,8 @@
errx(1, "must specify a tag for vlan create");
if (params.vlr_parent[0] == '\0')
errx(1, "must specify a parent device for vlan create");
+ if (params.vlr_proto == NOPROTO)
+ params.vlr_proto = ETHERTYPE_VLAN;
ifr->ifr_data = (caddr_t) &params;
}
ifcreate_ioctl(ctx, ifr);
@@ -173,6 +176,8 @@
vlan_set(int s, struct ifreq *ifr)
{
if (params.vlr_tag != NOTAG && params.vlr_parent[0] != '\0') {
+ if (params.vlr_proto == NOPROTO)
+ params.vlr_proto = ETHERTYPE_VLAN;
ifr->ifr_data = (caddr_t) &params;
if (ioctl(s, SIOCSETVLAN, (caddr_t)ifr) == -1)
err(1, "SIOCSETVLAN");
@@ -196,8 +201,16 @@
errx(1, "value for vlan out of range");
if (ioctl_ctx_ifr(ctx, SIOCGETVLAN, &ifr) != -1) {
- vreq.vlr_tag = params.vlr_tag;
- memcpy(&params, &vreq, sizeof(params));
+ /*
+ * Retrieve the current settings if the interface has already
+ * been configured.
+ */
+ if (vreq.vlr_parent[0] != '\0') {
+ if (params.vlr_parent[0] == '\0')
+ strlcpy(params.vlr_parent, vreq.vlr_parent, IFNAMSIZ);
+ if (params.vlr_proto == NOPROTO)
+ params.vlr_proto = vreq.vlr_proto;
+ }
vlan_set(ctx->io_s, &ifr);
}
}
@@ -230,8 +243,16 @@
errx(1, "invalid value for vlanproto");
if (ioctl_ctx_ifr(ctx, SIOCGETVLAN, &ifr) != -1) {
- vreq.vlr_proto = params.vlr_proto;
- memcpy(&params, &vreq, sizeof(params));
+ /*
+ * Retrieve the current settings if the interface has already
+ * been configured.
+ */
+ if (vreq.vlr_parent[0] != '\0') {
+ if (params.vlr_parent[0] == '\0')
+ strlcpy(params.vlr_parent, vreq.vlr_parent, IFNAMSIZ);
+ if (params.vlr_tag == NOTAG)
+ params.vlr_tag = vreq.vlr_tag;
+ }
vlan_set(ctx->io_s, &ifr);
}
}
diff --git a/tests/sys/net/if_vlan.sh b/tests/sys/net/if_vlan.sh
--- a/tests/sys/net/if_vlan.sh
+++ b/tests/sys/net/if_vlan.sh
@@ -22,8 +22,12 @@
jexec alcatraz ifconfig ${epair_vlan}a up
jexec alcatraz ifconfig ${vlan0} 10.0.0.1/24 up
- vlan1=$(jexec singsing ifconfig vlan create vlandev ${epair_vlan}b \
- vlan 42)
+ vlan1=$(jexec singsing ifconfig vlan create)
+
+ # Test associating the physical interface
+ atf_check -s exit:0 \
+ jexec singsing ifconfig ${vlan1} vlandev ${epair_vlan}b vlan 42
+
jexec singsing ifconfig ${epair_vlan}b up
jexec singsing ifconfig ${vlan1} 10.0.0.2/24 up
@@ -37,7 +41,7 @@
# And change back
# Test changing the vlan ID
atf_check -s exit:0 \
- jexec singsing ifconfig ${vlan1} vlandev ${epair_vlan}b vlan 42
+ jexec singsing ifconfig ${vlan1} vlan 42 vlandev ${epair_vlan}b
atf_check -s exit:0 -o ignore jexec singsing ping -c 1 10.0.0.1
}

File Metadata

Mime Type
text/plain
Expires
Tue, Oct 1, 12:06 AM (10 h, 46 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
13214064
Default Alt Text
D45283.id138846.diff (3 KB)

Event Timeline