summaryrefslogtreecommitdiffstats
path: root/sys/net80211/ieee80211_mesh.c
diff options
context:
space:
mode:
authorrpaulo <rpaulo@FreeBSD.org>2009-07-27 14:22:09 +0000
committerrpaulo <rpaulo@FreeBSD.org>2009-07-27 14:22:09 +0000
commit243b95729ca5c07a39bdb7e327868460a6884474 (patch)
treecb443c30550ddfac3a0cbff2cf9dc6f1efaf229d /sys/net80211/ieee80211_mesh.c
parent9b50a8b4b6400d84ba399ce6d5c5d9ff9a6ddb2c (diff)
downloadFreeBSD-src-243b95729ca5c07a39bdb7e327868460a6884474.zip
FreeBSD-src-243b95729ca5c07a39bdb7e327868460a6884474.tar.gz
Mesh fixes, namely:
* don't clobber proxy entries * HWMP seq number processing, including discard of old frames * flush routing table entries based on nexthop * print route flags in ifconfig * more debugging messages and comments Proxy changes submitted by sam. Approved by: re (kib)
Diffstat (limited to 'sys/net80211/ieee80211_mesh.c')
-rw-r--r--sys/net80211/ieee80211_mesh.c33
1 files changed, 27 insertions, 6 deletions
diff --git a/sys/net80211/ieee80211_mesh.c b/sys/net80211/ieee80211_mesh.c
index 4cbc9bd..7227495 100644
--- a/sys/net80211/ieee80211_mesh.c
+++ b/sys/net80211/ieee80211_mesh.c
@@ -236,6 +236,8 @@ ieee80211_mesh_proxy_check(struct ieee80211vap *vap,
"%s", "unable to add proxy entry");
vap->iv_stats.is_mesh_rtaddfailed++;
} else {
+ IEEE80211_NOTE_MAC(vap, IEEE80211_MSG_MESH, dest,
+ "%s", "add proxy entry");
IEEE80211_ADDR_COPY(rt->rt_nexthop, vap->iv_myaddr);
rt->rt_flags |= IEEE80211_MESHRT_FLAGS_VALID
| IEEE80211_MESHRT_FLAGS_PROXY;
@@ -301,6 +303,21 @@ ieee80211_mesh_rt_flush(struct ieee80211vap *vap)
MESH_RT_UNLOCK(ms);
}
+void
+ieee80211_mesh_rt_flush_peer(struct ieee80211vap *vap,
+ const uint8_t peer[IEEE80211_ADDR_LEN])
+{
+ struct ieee80211_mesh_state *ms = vap->iv_mesh;
+ struct ieee80211_mesh_route *rt, *next;
+
+ MESH_RT_LOCK(ms);
+ TAILQ_FOREACH_SAFE(rt, &ms->ms_routes, rt_next, next) {
+ if (IEEE80211_ADDR_EQ(rt->rt_nexthop, peer))
+ mesh_rt_del(ms, rt);
+ }
+ MESH_RT_UNLOCK(ms);
+}
+
/*
* Flush expired routing entries, i.e. those in invalid state for
* some time.
@@ -770,6 +787,7 @@ mesh_generateid(struct ieee80211vap *vap)
/*
* Verifies if we already received this packet by checking its
* sequence number.
+ * Returns 0 if the frame is to be accepted, 1 otherwise.
*/
static int
mesh_checkpseq(struct ieee80211vap *vap,
@@ -779,11 +797,16 @@ mesh_checkpseq(struct ieee80211vap *vap,
rt = ieee80211_mesh_rt_find(vap, source);
if (rt == NULL) {
+ rt = ieee80211_mesh_rt_add(vap, source);
+ if (rt == NULL) {
+ IEEE80211_NOTE_MAC(vap, IEEE80211_MSG_MESH, source,
+ "%s", "add mcast route failed");
+ vap->iv_stats.is_mesh_rtaddfailed++;
+ return 1;
+ }
IEEE80211_NOTE_MAC(vap, IEEE80211_MSG_MESH, source,
"add mcast route, mesh seqno %d", seq);
- rt = ieee80211_mesh_rt_add(vap, source);
- if (rt != NULL)
- rt->rt_lastmseq = seq;
+ rt->rt_lastmseq = seq;
return 0;
}
if (IEEE80211_MESH_SEQ_GEQ(rt->rt_lastmseq, seq)) {
@@ -1159,9 +1182,6 @@ mesh_input(struct ieee80211_node *ni, struct mbuf *m, int rssi, int nf)
goto out;
}
if (mesh_checkpseq(vap, addr, seq) != 0) {
- IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_MESH,
- addr, "data", "duplicate mesh seqno %u ttl %u",
- seq, mc->mc_ttl);
vap->iv_stats.is_rx_dup++;
goto out;
}
@@ -2642,6 +2662,7 @@ mesh_ioctl_get80211(struct ieee80211vap *vap, struct ieee80211req *ireq)
break;
imr = (struct ieee80211req_mesh_route *)
(p + off);
+ imr->imr_flags = rt->rt_flags;
IEEE80211_ADDR_COPY(imr->imr_dest,
rt->rt_dest);
IEEE80211_ADDR_COPY(imr->imr_nexthop,
OpenPOWER on IntegriCloud