svn commit: r193261 - projects/mesh11s/sys/net80211
Rui Paulo
rpaulo at FreeBSD.org
Mon Jun 1 20:41:34 UTC 2009
Author: rpaulo
Date: Mon Jun 1 20:41:33 2009
New Revision: 193261
URL: http://svn.freebsd.org/changeset/base/193261
Log:
Initial try at implementing path discovery from our node.
Sponsored by: The FreeBSD Foundation
Modified:
projects/mesh11s/sys/net80211/ieee80211_hwmp.c
projects/mesh11s/sys/net80211/ieee80211_hwmp.h
projects/mesh11s/sys/net80211/ieee80211_output.c
Modified: projects/mesh11s/sys/net80211/ieee80211_hwmp.c
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_hwmp.c Mon Jun 1 20:35:39 2009 (r193260)
+++ projects/mesh11s/sys/net80211/ieee80211_hwmp.c Mon Jun 1 20:41:33 2009 (r193261)
@@ -103,15 +103,15 @@ static int ieee80211_hwmp_prepminint = 1
static int ieee80211_hwmp_perrminint = 100;
#endif
static int ieee80211_hwmp_roottimeout = 5000;
-#ifdef notyet
static int ieee80211_hwmp_pathtimeout = 5000;
+#ifdef notyet
static int ieee80211_hwmp_rootmode = 0; /* XXX move to vap */
static int ieee80211_hwmp_pathtoroottimeout = 5000;
static int ieee80211_hmwp_rootint = 2000;
static int ieee80211_hwmp_rannint = 1000;
#endif
-static int ieee80211_hwmp_targetonly = 1;/* reply to PREQs automatically */
-static int ieee80211_hwmp_replyforward = 1; /* propagate PREQs */
+static int ieee80211_hwmp_targetonly = 1;
+static int ieee80211_hwmp_replyforward = 1;
#ifdef notyet
static int ieee80211_hwmp_pathmaintenance = 2000;
static int ieee80211_hwmp_confirmint = 2000;
@@ -131,9 +131,9 @@ SYSCTL_NODE(_net_wlan, OID_AUTO, hwmp, C
SYSCTL_INT(_net_wlan_hwmp, OID_AUTO, maxhops, CTLTYPE_INT | CTLFLAG_RW,
&ieee80211_hwmp_maxhops, 0, "Maximum number of hops for paths");
SYSCTL_INT(_net_wlan_hwmp, OID_AUTO, targetonly, CTLTYPE_INT | CTLFLAG_RW,
- &ieee80211_hwmp_targetonly, 0, "TBD");
+ &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, "TBD");
+ &ieee80211_hwmp_replyforward, 0, "Set RF bit on generated PREQs");
#ifdef notyet
SYSCTL_INT(_net_wlan_hwmp, OID_AUTO, rootmode, CTLTYPE_INT | CTLFLAG_RW,
&ieee80211_hwmp_rootmode, 0, "0 = Not a Root, "
@@ -827,6 +827,73 @@ hwmp_send_rann(struct ieee80211_node *ni
sizeof(*rann));
}
+#define PREQ_TFLAGS(n) preq.preq_targets[n].target_flags
+#define PREQ_TADDR(n) preq.preq_targets[n].target_addr
+#define PREQ_TSEQ(n) preq.preq_targets[n].target_seq
+struct ieee80211_node *
+ieee80211_hwmp_discover_dest(struct ieee80211vap *vap,
+ uint8_t dest[IEEE80211_ADDR_LEN])
+{
+ struct ieee80211_hwmp_state *hs = vap->iv_hwmp;
+ struct ieee80211_hwmp_fi *fi = NULL;
+ static const uint8_t invalidaddr[] = { 0, 0, 0, 0, 0, 0 };
+ struct ieee80211_meshpreq_ie preq;
+ int sendpreq = 0, unknowndst = 0;
+
+ KASSERT(vap->iv_opmode == IEEE80211_M_MBSS,
+ ("not a mesh vap, opmode %d", vap->iv_opmode));
+
+ mtx_lock(&hs->hs_lock);
+ TAILQ_FOREACH(fi, &hs->hs_head, fi_next) {
+ if (IEEE80211_ADDR_EQ(fi->fi_dest, dest)) {
+ if (IEEE80211_ADDR_EQ(fi->fi_nexthop, invalidaddr)) {
+ /* XXX check preq retries */
+ sendpreq = 1;
+ unknowndst = 1;
+ break;
+ }
+ }
+ }
+ mtx_unlock(&hs->hs_lock);
+
+ if (sendpreq) {
+ /*
+ * Try to discover the path for this
+ * node.
+ */
+ preq.preq_hopcount = 0;
+ preq.preq_ttl = ieee80211_mesh_ttl;
+ preq.preq_id = ++hs->hs_preqid;
+ IEEE80211_ADDR_COPY(preq.preq_origaddr,
+ vap->iv_myaddr);
+ preq.preq_origseq = ++hs->hs_seq;
+ preq.preq_lifetime =
+ ieee80211_hwmp_pathtimeout;
+ preq.preq_metric =
+ IEEE80211_MESHLMETRIC_INITIALVAL;
+ preq.preq_tcount = 1;
+ IEEE80211_ADDR_COPY(PREQ_TADDR(0), dest);
+ if (ieee80211_hwmp_targetonly)
+ PREQ_TFLAGS(0) |= IEEE80211_MESHPREQ_TFLAGS_TO;
+ if (ieee80211_hwmp_replyforward)
+ PREQ_TFLAGS(0) |= IEEE80211_MESHPREQ_TFLAGS_RF;
+ if (unknowndst)
+ PREQ_TFLAGS(0) |= IEEE80211_MESHPREQ_TFLAGS_USN;
+ else
+ PREQ_TSEQ(0) = fi->fi_seq;
+ hwmp_send_preq(vap->iv_bss, vap->iv_myaddr, broadcastaddr,
+ &preq);
+ } else
+ return ieee80211_find_txnode(vap, fi->fi_nexthop);
+
+ /* XXX */
+ return vap->iv_bss;
+}
+#undef PREQ_TFLAGS
+#undef PREQ_TADDR
+#undef PREQ_TSEQ
+
+
static int
hwmp_ioctl_get80211(struct ieee80211vap *vap, struct ieee80211req *ireq)
{
Modified: projects/mesh11s/sys/net80211/ieee80211_hwmp.h
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_hwmp.h Mon Jun 1 20:35:39 2009 (r193260)
+++ projects/mesh11s/sys/net80211/ieee80211_hwmp.h Mon Jun 1 20:41:33 2009 (r193261)
@@ -48,14 +48,18 @@ struct ieee80211_hwmp_fi {
#ifdef _KERNEL
struct ieee80211_hwmp_state {
TAILQ_HEAD(, ieee80211_hwmp_fi) hs_head;
- ieee80211_seq hs_seq; /* next seq to be used */
- struct mtx hs_lock; /* lock for the fi table */
+ ieee80211_seq hs_seq; /* next seq to be used */
+ ieee80211_seq hs_preqid; /* next PREQ ID to be used */
+ struct mtx hs_lock; /* lock for the fi table */
};
void ieee80211_hwmp_vattach(struct ieee80211vap *);
void ieee80211_hwmp_vdetach(struct ieee80211vap *);
void ieee80211_hwmp_recv_action(struct ieee80211vap *,
struct ieee80211_node *, struct mbuf *);
+struct ieee80211_node *
+ ieee80211_hwmp_discover_dest(struct ieee80211vap *,
+ uint8_t [IEEE80211_ADDR_LEN]);
#endif /* _KERNEL */
#endif /* _NET80211_IEEE80211_HWMP_H_ */
Modified: projects/mesh11s/sys/net80211/ieee80211_output.c
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_output.c Mon Jun 1 20:35:39 2009 (r193260)
+++ projects/mesh11s/sys/net80211/ieee80211_output.c Mon Jun 1 20:41:33 2009 (r193261)
@@ -207,7 +207,10 @@ ieee80211_start(struct ifnet *ifp)
}
}
- ni = ieee80211_find_txnode(vap, eh->ether_dhost);
+ if (vap->iv_opmode == IEEE80211_M_MBSS)
+ ni = ieee80211_hwmp_discover_dest(vap, eh->ether_dhost);
+ else
+ ni = ieee80211_find_txnode(vap, eh->ether_dhost);
if (ni == NULL) {
/* NB: ieee80211_find_txnode does stat+msg */
ifp->if_oerrors++;
More information about the svn-src-projects
mailing list