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
This commit is contained in:
sam 2008-12-15 01:06:49 +00:00
parent 3b86465e44
commit 0e7403cc3f
2 changed files with 46 additions and 17 deletions

View File

@ -1770,14 +1770,21 @@ regdomain_addchans(struct ieee80211req_chaninfo *ci,
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)

View File

@ -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,11 +132,31 @@ 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(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
@ -146,11 +165,9 @@ 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),