svn commit: r186101 - head/sbin/ifconfig

Sam Leffler sam at FreeBSD.org
Mon Dec 15 01:06:49 UTC 2008


Author: sam
Date: Mon Dec 15 01:06:49 2008
New Revision: 186101
URL: http://svn.freebsd.org/changeset/base/186101

Log:
  o distinguish between adhoc and ahdemo modes
  o do not require 1/2 and 1/4 rate channels be present in the
    calibration list when doing a gsm regulatory change; the
    existing 900MHz cards are not self-identifying so there is
    no way (using the calibration channel list) to check

Modified:
  head/sbin/ifconfig/ifieee80211.c
  head/sbin/ifconfig/ifvlan.c

Modified: head/sbin/ifconfig/ifieee80211.c
==============================================================================
--- head/sbin/ifconfig/ifieee80211.c	Mon Dec 15 01:00:18 2008	(r186100)
+++ head/sbin/ifconfig/ifieee80211.c	Mon Dec 15 01:06:49 2008	(r186101)
@@ -1770,14 +1770,21 @@ regdomain_addchans(struct ieee80211req_c
 					printf("%u: skip, flags 0x%x not available\n", freq, chanFlags);
 				continue;
 			}
+			/*
+			 * NB: don't enforce 1/2 and 1/4 rate channels being
+			 * specified in the device's calibration list for
+			 * 900MHz cards because most are not self-identifying.
+			 */
 			if ((flags & IEEE80211_CHAN_HALF) &&
-			    (chanFlags & IEEE80211_CHAN_HALF) == 0) {
+			    ((chanFlags & IEEE80211_CHAN_HALF) == 0 &&
+			     (flags & IEEE80211_CHAN_GSM) == 0)) {
 				if (verbose)
 					printf("%u: skip, device does not support half-rate channels\n", freq);
 				continue;
 			}
 			if ((flags & IEEE80211_CHAN_QUARTER) &&
-			    (chanFlags & IEEE80211_CHAN_QUARTER) == 0) {
+			    ((chanFlags & IEEE80211_CHAN_HALF) == 0 &&
+			     (flags & IEEE80211_CHAN_GSM) == 0)) {
 				if (verbose)
 					printf("%u: skip, device does not support quarter-rate channels\n", freq);
 				continue;
@@ -3534,8 +3541,12 @@ get80211opmode(int s)
 	(void) strncpy(ifmr.ifm_name, name, sizeof(ifmr.ifm_name));
 
 	if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) >= 0) {
-		if (ifmr.ifm_current & IFM_IEEE80211_ADHOC)
-			return IEEE80211_M_IBSS;	/* XXX ahdemo */
+		if (ifmr.ifm_current & IFM_IEEE80211_ADHOC) {
+			if (ifmr.ifm_current & IFM_FLAG0)
+				return IEEE80211_M_AHDEMO;
+			else
+				return IEEE80211_M_IBSS;
+		}
 		if (ifmr.ifm_current & IFM_IEEE80211_HOSTAP)
 			return IEEE80211_M_HOSTAP;
 		if (ifmr.ifm_current & IFM_IEEE80211_MONITOR)
@@ -4244,6 +4255,7 @@ end:
 			}
 		}
 	}
+
 	if (get80211val(s, IEEE80211_IOC_BEACON_INTERVAL, &val) != -1) {
 		/* XXX default define not visible */
 		if (val != 100 || verbose)

Modified: head/sbin/ifconfig/ifvlan.c
==============================================================================
--- head/sbin/ifconfig/ifvlan.c	Mon Dec 15 01:00:18 2008	(r186100)
+++ head/sbin/ifconfig/ifvlan.c	Mon Dec 15 01:06:49 2008	(r186101)
@@ -119,10 +119,9 @@ vlan_set(int s, struct ifreq *ifr)
 	}
 }
 
-static
-DECL_CMD_FUNC(setvlantag, val, d)
+static void
+getvlantag(const char *val)
 {
-	struct vlanreq vreq;
 	u_long ul;
 	char *endp;
 
@@ -133,24 +132,42 @@ DECL_CMD_FUNC(setvlantag, val, d)
 	/* check if the value can be represented in vlr_tag */
 	if (params.vlr_tag != ul)
 		errx(1, "value for vlan out of range");
+}
 
-	if (getvlan(s, &ifr, &vreq) != -1)
-		vlan_set(s, &ifr);
-	else
-		clone_setcallback(vlan_create);
+static
+DECL_CMD_FUNC(setvlantag_clone, val, d)
+{
+	getvlantag(val);
+	clone_setcallback(vlan_create);
 }
 
 static
-DECL_CMD_FUNC(setvlandev, val, d)
+DECL_CMD_FUNC(setvlantag, val, d)
 {
 	struct vlanreq vreq;
 
+	getvlantag(val);
+	if (getvlan(s, &ifr, &vreq) == -1)
+		errx(1, "no existing vlan");
+	vlan_set(s, &ifr);
+}
+
+static
+DECL_CMD_FUNC(setvlandev_clone, val, d)
+{
 	strlcpy(params.vlr_parent, val, sizeof(params.vlr_parent));
+	clone_setcallback(vlan_create);
+}
+
+static
+DECL_CMD_FUNC(setvlandev, val, d)
+{
+	struct vlanreq vreq;
 
+	strlcpy(params.vlr_parent, val, sizeof(params.vlr_parent));
 	if (getvlan(s, &ifr, &vreq) != -1)
-		vlan_set(s, &ifr);
-	else
-		clone_setcallback(vlan_create);
+		errx(1, "no existing vlan");
+	vlan_set(s, &ifr);
 }
 
 static
@@ -172,8 +189,8 @@ DECL_CMD_FUNC(unsetvlandev, val, d)
 }
 
 static struct cmd vlan_cmds[] = {
-	DEF_CLONE_CMD_ARG("vlan",			setvlantag),
-	DEF_CLONE_CMD_ARG("vlandev",			setvlandev),
+	DEF_CLONE_CMD_ARG("vlan",			setvlantag_clone),
+	DEF_CLONE_CMD_ARG("vlandev",			setvlandev_clone),
 	/* NB: non-clone cmds */
 	DEF_CMD_ARG("vlan",				setvlantag),
 	DEF_CMD_ARG("vlandev",				setvlandev),


More information about the svn-src-all mailing list