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),
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to