svn commit: r194862 - projects/mesh11s/sys/net80211
Rui Paulo
rpaulo at FreeBSD.org
Wed Jun 24 17:16:14 UTC 2009
Author: rpaulo
Date: Wed Jun 24 17:16:13 2009
New Revision: 194862
URL: http://svn.freebsd.org/changeset/base/194862
Log:
Add functions to manipulate the HWMP routing table and use them.
Sponsored by: The FreeBSD Foundation
Modified:
projects/mesh11s/sys/net80211/ieee80211_hwmp.c
Modified: projects/mesh11s/sys/net80211/ieee80211_hwmp.c
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_hwmp.c Wed Jun 24 17:03:06 2009 (r194861)
+++ projects/mesh11s/sys/net80211/ieee80211_hwmp.c Wed Jun 24 17:16:13 2009 (r194862)
@@ -63,9 +63,16 @@ __FBSDID("$FreeBSD$");
#include <net80211/ieee80211_hwmp.h>
#include <net80211/ieee80211_input.h>
+static struct ieee80211_hwmp_fi *
+ hwmp_rt_find(struct ieee80211vap *,
+ const uint8_t [IEEE80211_ADDR_LEN]);
+static struct ieee80211_hwmp_fi *
+ hwmp_rt_add(struct ieee80211vap *,
+ const uint8_t [IEEE80211_ADDR_LEN]);
+static void hwmp_rt_flush(struct ieee80211vap *);
static int ieee80211_hwmp_send_action(struct ieee80211_node *,
- const uint8_t [IEEE80211_ADDR_LEN], const uint8_t [IEEE80211_ADDR_LEN],
- uint8_t *, size_t);
+ const uint8_t [IEEE80211_ADDR_LEN], const uint8_t [IEEE80211_ADDR_LEN],
+ uint8_t *, size_t);
static uint8_t *hwmp_add_meshpreq(uint8_t *,
const struct ieee80211_meshpreq_ie *);
static uint8_t *hwmp_add_meshprep(uint8_t *,
@@ -145,6 +152,62 @@ MALLOC_DEFINE(M_80211_HWMP, "80211hwmp",
extern int ieee80211_mesh_ttl;
+/*
+ * Helper functions to manipulate the HWMP routing table.
+ */
+static struct ieee80211_hwmp_fi *
+hwmp_rt_find(struct ieee80211vap *vap, const uint8_t dest[IEEE80211_ADDR_LEN])
+{
+ struct ieee80211_hwmp_state *hs = vap->iv_hwmp;
+ struct ieee80211_hwmp_fi *fi;
+
+ HWMP_LOCK(hs);
+ TAILQ_FOREACH(fi, &hs->hs_head, fi_next) {
+ if (IEEE80211_ADDR_EQ(dest, fi->fi_dest)) {
+ HWMP_UNLOCK(hs);
+ return fi;
+ }
+ }
+ HWMP_UNLOCK(hs);
+ return NULL;
+}
+
+static struct ieee80211_hwmp_fi *
+hwmp_rt_add(struct ieee80211vap *vap, const uint8_t dest[IEEE80211_ADDR_LEN])
+{
+ struct ieee80211_hwmp_state *hs = vap->iv_hwmp;
+ struct ieee80211_hwmp_fi *fi;
+
+ KASSERT(hwmp_rt_find(vap, dest) == NULL,
+ ("%s: duplicate entry in the routing table", __func__));
+
+ fi = malloc(sizeof(struct ieee80211_hwmp_fi), M_80211_HWMP,
+ M_NOWAIT | M_ZERO);
+ memset(fi, 0, sizeof(*fi));
+ IEEE80211_ADDR_COPY(fi->fi_dest, dest);
+ HWMP_LOCK(hs);
+ TAILQ_INSERT_TAIL(&hs->hs_head, fi, fi_next);
+ HWMP_UNLOCK(hs);
+
+ return fi;
+}
+
+static void
+hwmp_rt_flush(struct ieee80211vap *vap)
+{
+ struct ieee80211_hwmp_state *hs = vap->iv_hwmp;
+ struct ieee80211_hwmp_fi *fi, *next;
+
+ if (hs == NULL)
+ return;
+ HWMP_LOCK(hs);
+ TAILQ_FOREACH_SAFE(fi, &hs->hs_head, fi_next, next) {
+ TAILQ_REMOVE(&hs->hs_head, fi, fi_next);
+ free(fi, M_80211_HWMP);
+ }
+ HWMP_UNLOCK(hs);
+}
+
void
ieee80211_hwmp_vattach(struct ieee80211vap *vap)
{
@@ -168,12 +231,8 @@ void
ieee80211_hwmp_vdetach(struct ieee80211vap *vap)
{
struct ieee80211_hwmp_state *hs = vap->iv_hwmp;
- struct ieee80211_hwmp_fi *fi, *next;
- TAILQ_FOREACH_SAFE(fi, &hs->hs_head, fi_next, next) {
- TAILQ_REMOVE(&hs->hs_head, fi, fi_next);
- free(fi, M_80211_HWMP);
- }
+ hwmp_rt_flush(vap);
mtx_destroy(&hs->hs_lock);
free(vap->iv_hwmp, M_80211_HWMP);
}
@@ -182,22 +241,12 @@ int
ieee80211_hwmp_newstate(struct ieee80211vap *vap, enum ieee80211_state ostate, int arg)
{
enum ieee80211_state nstate = vap->iv_state;
- struct ieee80211_hwmp_state *hs = vap->iv_hwmp;
- struct ieee80211_hwmp_fi *fi, *next;
switch (nstate) {
case IEEE80211_S_SCAN:
switch (ostate) {
case IEEE80211_S_INIT:
- /*
- * Flush the HWMP routing table
- */
- if (hs == NULL)
- return 0;
- TAILQ_FOREACH_SAFE(fi, &hs->hs_head, fi_next, next) {
- TAILQ_REMOVE(&hs->hs_head, fi, fi_next);
- free(fi, M_80211_HWMP);
- }
+ hwmp_rt_flush(vap);
break;
default:
break;
@@ -537,27 +586,16 @@ hwmp_recv_preq(struct ieee80211vap *vap,
return;
}
- HWMP_LOCK(hs);
- TAILQ_FOREACH(fi, &hs->hs_head, fi_next) {
- if (IEEE80211_ADDR_EQ(PREQ_TADDR(0), fi->fi_dest))
- break;
- }
- HWMP_UNLOCK(hs);
+ fi = hwmp_rt_find(vap, PREQ_TADDR(0));
#if 0
/*
* Record the PREQ ID and the originator MAC address.
*/
if (fi == NULL) {
- fi = malloc(sizeof(struct ieee80211_hwmp_fi), M_80211_HWMP,
- M_NOWAIT | M_ZERO);
- memset(fi, 0, sizeof(*fi));
- IEEE80211_ADDR_COPY(fi->fi_dest, PREQ_TADDR(0));
+ fi = hwmp_rt_add(vap, PREQ_TADDR(0));
fi->fi_seq = preq->preq_origseq;
fi->fi_metric = preq->preq_metric;
fi->fi_lifetime = preq->preq_lifetime;
- HWMP_LOCK(hs);
- TAILQ_INSERT_TAIL(&hs->hs_head, fi, fi_next);
- HWMP_UNLOCK(hs);
}
fi->fi_preqid = preq->preq_id;
#endif
@@ -729,7 +767,6 @@ static void
hwmp_recv_prep(struct ieee80211vap *vap, struct ieee80211_node *ni,
const struct ieee80211_frame *wh, const struct ieee80211_meshprep_ie *prep)
{
- struct ieee80211_hwmp_state *hs = vap->iv_hwmp;
struct ieee80211_hwmp_fi *fi = NULL;
/*
@@ -743,12 +780,7 @@ hwmp_recv_prep(struct ieee80211vap *vap,
IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni,
"received PREP from %s", ether_sprintf(prep->prep_origaddr));
- HWMP_LOCK(hs);
- TAILQ_FOREACH(fi, &hs->hs_head, fi_next) {
- if (IEEE80211_ADDR_EQ(prep->prep_origaddr, fi->fi_dest))
- break;
- }
- HWMP_UNLOCK(hs);
+ fi = hwmp_rt_find(vap, prep->prep_origaddr);
/*
* If it's NOT for us, propagate the PREP if TTL is
@@ -834,7 +866,6 @@ static void
hwmp_recv_perr(struct ieee80211vap *vap, struct ieee80211_node *ni,
const struct ieee80211_frame *wh, const struct ieee80211_meshperr_ie *perr)
{
- struct ieee80211_hwmp_state *hs = vap->iv_hwmp;
struct ieee80211_hwmp_fi *fi = NULL;
/* struct ieee80211_meshperr_ie pperr;*/
@@ -847,12 +878,7 @@ hwmp_recv_perr(struct ieee80211vap *vap,
!(vap->iv_meshflags & IEEE80211_MFLAGS_FWRD))
return;
- HWMP_LOCK(hs);
- TAILQ_FOREACH(fi, &hs->hs_head, fi_next) {
- if (IEEE80211_ADDR_EQ(PERR_DADDR(0), fi->fi_dest))
- break;
- }
- HWMP_UNLOCK(hs);
+ fi = hwmp_rt_find(vap, PERR_DADDR(0));
if (fi == NULL)
return;
@@ -901,13 +927,10 @@ hwmp_recv_rann(struct ieee80211vap *vap,
/*
* Acceptance criteria: check the HWMP sequence number
* and the path metric is better than what we have.
+ * XXX: TBD
*/
- HWMP_LOCK(hs);
- TAILQ_FOREACH(fi, &hs->hs_head, fi_next) {
- if (IEEE80211_ADDR_EQ(rann->rann_addr, fi->fi_dest))
- break;
- }
- HWMP_UNLOCK(hs);
+
+ fi = hwmp_rt_find(vap, rann->rann_addr);
if (fi == NULL) {
struct ieee80211_meshpreq_ie preq;
@@ -985,30 +1008,17 @@ ieee80211_hwmp_discover(struct ieee80211
if (IEEE80211_IS_MULTICAST(dest))
return ieee80211_find_txnode(vap, dest);
- HWMP_LOCK(hs);
- 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;
- }
- }
- HWMP_UNLOCK(hs);
-
+ fi = hwmp_rt_find(vap, dest);
if (fi == NULL) {
- fi = malloc(sizeof(struct ieee80211_hwmp_fi), M_80211_HWMP,
- M_NOWAIT | M_ZERO);
- IEEE80211_ADDR_COPY(fi->fi_dest, dest);
+ fi = hwmp_rt_add(vap, dest);
fi->fi_seq = ++hs->hs_seq;
fi->fi_preqid = ++hs->hs_preqid;
fi->fi_metric = IEEE80211_MESHLMETRIC_INITIALVAL;
fi->fi_lifetime = timeval2msecs(ieee80211_hwmp_pathtimeout);
- HWMP_LOCK(hs);
- TAILQ_INSERT_TAIL(&hs->hs_head, fi, fi_next);
- HWMP_UNLOCK(hs);
+ sendpreq = 1;
+ unknowndst = 1;
+ } else if (IEEE80211_ADDR_EQ(fi->fi_nexthop, invalidaddr)) {
+ /* XXX check preq retries */
sendpreq = 1;
unknowndst = 1;
}
@@ -1062,15 +1072,9 @@ struct ieee80211_node *
ieee80211_hwmp_find_txnode(struct ieee80211vap *vap,
uint8_t dest[IEEE80211_ADDR_LEN])
{
- struct ieee80211_hwmp_state *hs = vap->iv_hwmp;
struct ieee80211_hwmp_fi *fi;
- HWMP_LOCK(hs);
- TAILQ_FOREACH(fi, &hs->hs_head, fi_next) {
- if (IEEE80211_ADDR_EQ(fi->fi_dest, dest))
- break;
- }
- HWMP_UNLOCK(hs);
+ fi = hwmp_rt_find(vap, dest);
if (fi == NULL)
return NULL;
return ieee80211_find_txnode(vap, fi->fi_nexthop);
@@ -1142,12 +1146,7 @@ hwmp_ioctl_set80211(struct ieee80211vap
case IEEE80211_HWMP_CMD_LIST:
return EINVAL;
case IEEE80211_HWMP_CMD_FLUSH:
- HWMP_LOCK(hs);
- TAILQ_FOREACH_SAFE(fi, &hs->hs_head, fi_next, next) {
- TAILQ_REMOVE(&hs->hs_head, fi, fi_next);
- free(fi, M_80211_HWMP);
- }
- HWMP_UNLOCK(hs);
+ hwmp_rt_flush(vap);
break;
case IEEE80211_HWMP_CMD_ADD:
HWMP_LOCK(hs);
More information about the svn-src-projects
mailing list