svn commit: r194866 - in projects/mesh11s: sbin/ifconfig
sys/net80211
Rui Paulo
rpaulo at FreeBSD.org
Wed Jun 24 18:00:35 UTC 2009
Author: rpaulo
Date: Wed Jun 24 18:00:34 2009
New Revision: 194866
URL: http://svn.freebsd.org/changeset/base/194866
Log:
Move the rootmode var to vap and let ifconfig control it.
Sponsored by: The FreeBSD Foundation
Modified:
projects/mesh11s/sbin/ifconfig/ifieee80211.c
projects/mesh11s/sys/net80211/ieee80211_hwmp.c
projects/mesh11s/sys/net80211/ieee80211_ioctl.h
Modified: projects/mesh11s/sbin/ifconfig/ifieee80211.c
==============================================================================
--- projects/mesh11s/sbin/ifconfig/ifieee80211.c Wed Jun 24 17:41:29 2009 (r194865)
+++ projects/mesh11s/sbin/ifconfig/ifieee80211.c Wed Jun 24 18:00:34 2009 (r194866)
@@ -1845,6 +1845,12 @@ DECL_CMD_FUNC(set80211meshpeering, val,
set80211(s, IEEE80211_IOC_MESH_AP, atoi(val), 0, NULL);
}
+static
+DECL_CMD_FUNC(set80211hwmprootmode, val, d)
+{
+ set80211(s, IEEE80211_IOC_HWMP_ROOTMODE, atoi(val), 0, NULL);
+}
+
static int
regdomain_sort(const void *a, const void *b)
{
@@ -4793,6 +4799,25 @@ end:
else
LINE_CHECK("-meshforward");
}
+ if (get80211val(s, IEEE80211_IOC_HWMP_ROOTMODE, &val) != -1) {
+ switch (val) {
+ case IEEE80211_HWMP_ROOTMODE_DISABLED:
+ LINE_CHECK("rootmode DISABLED");
+ break;
+ case IEEE80211_HWMP_ROOTMODE_NORMAL:
+ LINE_CHECK("rootmode NORMAL");
+ break;
+ case IEEE80211_HWMP_ROOTMODE_PROACTIVE:
+ LINE_CHECK("rootmode PROACTIVE");
+ break;
+ case IEEE80211_HWMP_ROOTMODE_RANN:
+ LINE_CHECK("rootmode RANN");
+ break;
+ default:
+ LINE_CHECK("rootmode UNKNOWN(%d)", val);
+ break;
+ }
+ }
}
LINE_BREAK();
@@ -5199,6 +5224,7 @@ static struct cmd ieee80211_cmds[] = {
DEF_CMD("-meshforward", 0, set80211meshforward),
DEF_CMD("meshpeering", 1, set80211meshpeering),
DEF_CMD("-meshpeering", 0, set80211meshpeering),
+ DEF_CMD_ARG("rootmode", set80211hwmprootmode),
/* vap cloning support */
DEF_CLONE_CMD_ARG("wlanaddr", set80211clone_wlanaddr),
Modified: projects/mesh11s/sys/net80211/ieee80211_hwmp.c
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_hwmp.c Wed Jun 24 17:41:29 2009 (r194865)
+++ projects/mesh11s/sys/net80211/ieee80211_hwmp.c Wed Jun 24 18:00:34 2009 (r194866)
@@ -103,7 +103,6 @@ static inline int hwmp_send_rann(struct
struct ieee80211_meshrann_ie *);
static int ieee80211_hwmp_maxhops = 31;
-static int ieee80211_hwmp_rootmode = 0; /* XXX move to vap */
static int ieee80211_hwmp_targetonly = 0;
static int ieee80211_hwmp_replyforward = 1;
static const int ieee80211_hwmp_maxprepretries = 3;
@@ -143,10 +142,6 @@ SYSCTL_INT(_net_wlan_hwmp, OID_AUTO, tar
&ieee80211_hwmp_targetonly, 0, "Set TO bit on generated PREQs");
SYSCTL_INT(_net_wlan_hwmp, OID_AUTO, replyforward, CTLTYPE_INT | CTLFLAG_RW,
&ieee80211_hwmp_replyforward, 0, "Set RF bit on generated PREQs");
-SYSCTL_INT(_net_wlan_hwmp, OID_AUTO, rootmode, CTLTYPE_INT | CTLFLAG_RW,
- &ieee80211_hwmp_rootmode, 0, "0 = Not a Root, "
- "2 = Root with normal PREPs, 3 = Root with proactive PREPs, "
- "3 = Root with RANNs");
MALLOC_DEFINE(M_80211_HWMP, "80211hwmp", "802.11 HWMP routing table");
@@ -1087,44 +1082,49 @@ hwmp_ioctl_get80211(struct ieee80211vap
uint8_t *p;
int error;
- if (vap->iv_opmode != IEEE80211_M_MBSS ||
- ireq->i_type != IEEE80211_IOC_HWMP_CMD)
+ if (vap->iv_opmode != IEEE80211_M_MBSS)
return ENOSYS;
error = 0;
- switch (ireq->i_val) {
- case IEEE80211_HWMP_CMD_LIST:
- len = 0;
- HWMP_LOCK(hs);
- TAILQ_FOREACH(fi, &hs->hs_head, fi_next) {
- len += sizeof(*fi);
- }
- HWMP_UNLOCK(hs);
- if (len > ireq->i_len || ireq->i_len < sizeof(*fi))
- return ENOMEM;
- ireq->i_len = len;
- p = malloc(len, M_TEMP, M_NOWAIT | M_ZERO);
- if (p == NULL)
- return ENOMEM;
- off = 0;
- HWMP_LOCK(hs);
- TAILQ_FOREACH(fi, &hs->hs_head, fi_next) {
- if (off >= len)
- break;
- memcpy(p + off, fi, sizeof(*fi));
- off += sizeof(*fi);
+ switch (ireq->i_type) {
+ case IEEE80211_IOC_HWMP_CMD:
+ switch (ireq->i_val) {
+ case IEEE80211_HWMP_CMD_LIST:
+ len = 0;
+ HWMP_LOCK(hs);
+ TAILQ_FOREACH(fi, &hs->hs_head, fi_next) {
+ len += sizeof(*fi);
+ }
+ HWMP_UNLOCK(hs);
+ if (len > ireq->i_len || ireq->i_len < sizeof(*fi))
+ return ENOMEM;
+ ireq->i_len = len;
+ p = malloc(len, M_TEMP, M_NOWAIT | M_ZERO);
+ if (p == NULL)
+ return ENOMEM;
+ off = 0;
+ HWMP_LOCK(hs);
+ TAILQ_FOREACH(fi, &hs->hs_head, fi_next) {
+ if (off >= len)
+ break;
+ memcpy(p + off, fi, sizeof(*fi));
+ off += sizeof(*fi);
+ }
+ HWMP_UNLOCK(hs);
+ error = copyout(p, (uint8_t *)ireq->i_data,
+ ireq->i_len);
+ free(p, M_TEMP);
+ break;
+ case IEEE80211_HWMP_CMD_FLUSH:
+ case IEEE80211_HWMP_CMD_ADD:
+ case IEEE80211_HWMP_CMD_DELETE:
+ return EINVAL;
+ default:
+ return ENOSYS;
}
- HWMP_UNLOCK(hs);
- error = copyout(p, (uint8_t *) ireq->i_data, ireq->i_len);
- free(p, M_TEMP);
+ case IEEE80211_IOC_HWMP_ROOTMODE:
+ ireq->i_val = hs->hs_rootmode;
break;
- case IEEE80211_HWMP_CMD_FLUSH:
- case IEEE80211_HWMP_CMD_ADD:
- case IEEE80211_HWMP_CMD_DELETE:
- return EINVAL;
- default:
- return ENOSYS;
}
-
return error;
}
IEEE80211_IOCTL_GET(hwmp, hwmp_ioctl_get80211);
@@ -1136,38 +1136,49 @@ hwmp_ioctl_set80211(struct ieee80211vap
struct ieee80211_hwmp_fi *fi, *next;
int error;
- if (vap->iv_opmode != IEEE80211_M_MBSS ||
- ireq->i_type != IEEE80211_IOC_HWMP_CMD)
+ if (vap->iv_opmode != IEEE80211_M_MBSS)
return ENOSYS;
error = 0;
- switch (ireq->i_val) {
- case IEEE80211_HWMP_CMD_LIST:
- return EINVAL;
- case IEEE80211_HWMP_CMD_FLUSH:
- hwmp_rt_flush(vap);
- break;
- case IEEE80211_HWMP_CMD_ADD:
- HWMP_LOCK(hs);
- TAILQ_FOREACH(fi, &hs->hs_head, fi_next) {
- if (IEEE80211_ADDR_EQ(fi->fi_dest, ireq->i_data))
- return EINVAL;
- }
- HWMP_UNLOCK(hs);
- break;
- case IEEE80211_HWMP_CMD_DELETE:
- HWMP_LOCK(hs);
- TAILQ_FOREACH_SAFE(fi, &hs->hs_head, fi_next, next) {
- if (IEEE80211_ADDR_EQ(fi->fi_dest, ireq->i_data)) {
- TAILQ_REMOVE(&hs->hs_head, fi, fi_next);
- free(fi, M_80211_HWMP);
+ switch (ireq->i_type) {
+ case IEEE80211_IOC_HWMP_CMD:
+ switch (ireq->i_val) {
+ case IEEE80211_HWMP_CMD_LIST:
+ return EINVAL;
+ case IEEE80211_HWMP_CMD_FLUSH:
+ hwmp_rt_flush(vap);
+ break;
+ case IEEE80211_HWMP_CMD_ADD:
+ HWMP_LOCK(hs);
+ TAILQ_FOREACH(fi, &hs->hs_head, fi_next) {
+ if (IEEE80211_ADDR_EQ(fi->fi_dest,
+ ireq->i_data))
+ return EINVAL;
+ }
+ HWMP_UNLOCK(hs);
+ break;
+ case IEEE80211_HWMP_CMD_DELETE:
+ HWMP_LOCK(hs);
+ TAILQ_FOREACH_SAFE(fi, &hs->hs_head, fi_next, next) {
+ if (IEEE80211_ADDR_EQ(fi->fi_dest,
+ ireq->i_data)) {
+ TAILQ_REMOVE(&hs->hs_head, fi, fi_next);
+ free(fi, M_80211_HWMP);
+ }
}
+ HWMP_UNLOCK(hs);
+ break;
+ default:
+ return ENOSYS;
}
- HWMP_UNLOCK(hs);
+ break;
+ case IEEE80211_IOC_HWMP_ROOTMODE:
+ if (ireq->i_val < 0 || ireq->i_val > 3)
+ return EINVAL;
+ hs->hs_rootmode = ireq->i_val;
break;
default:
return ENOSYS;
}
-
return error;
}
IEEE80211_IOCTL_SET(hwmp, hwmp_ioctl_set80211);
Modified: projects/mesh11s/sys/net80211/ieee80211_ioctl.h
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_ioctl.h Wed Jun 24 17:41:29 2009 (r194865)
+++ projects/mesh11s/sys/net80211/ieee80211_ioctl.h Wed Jun 24 18:00:34 2009 (r194866)
@@ -313,6 +313,15 @@ enum {
IEEE80211_HWMP_CMD_ADD = 2, /* add entry to the table */
IEEE80211_HWMP_CMD_DELETE = 3, /* delete an entry from the table */
};
+/*
+ * HWMP root modes
+ */
+enum {
+ IEEE80211_HWMP_ROOTMODE_DISABLED = 0, /* disabled */
+ IEEE80211_HWMP_ROOTMODE_NORMAL = 1, /* normal PREPs */
+ IEEE80211_HWMP_ROOTMODE_PROACTIVE = 2, /* proactive PREPS */
+ IEEE80211_HWMP_ROOTMODE_RANN = 3, /* use RANN elemid */
+};
/*
@@ -658,6 +667,7 @@ struct ieee80211req {
#define IEEE80211_IOC_MESH_PROTO 193 /* mesh protocols */
#define IEEE80211_IOC_MESH_TTL 194 /* mesh TTL */
#define IEEE80211_IOC_HWMP_CMD 195 /* HWMP table commands */
+#define IEEE80211_IOC_HWMP_ROOTMODE 196 /* HWMP root mode */
#define IEEE80211_IOC_TDMA_SLOT 201 /* TDMA: assigned slot */
#define IEEE80211_IOC_TDMA_SLOTCNT 202 /* TDMA: slots in bss */
More information about the svn-src-projects
mailing list