summaryrefslogtreecommitdiffstats
path: root/sys/net80211
diff options
context:
space:
mode:
authormonthadar <monthadar@FreeBSD.org>2012-05-01 15:58:10 +0000
committermonthadar <monthadar@FreeBSD.org>2012-05-01 15:58:10 +0000
commitc2bc330cbba4560b85974b6849d90b5e67559a84 (patch)
tree6f68ef64c1743bfaaeebef880c19076254694f44 /sys/net80211
parent66eb02c1dc5e68076bf50a497792f81f047e74ea (diff)
downloadFreeBSD-src-c2bc330cbba4560b85974b6849d90b5e67559a84.zip
FreeBSD-src-c2bc330cbba4560b85974b6849d90b5e67559a84.tar.gz
Added route lifetime update for destination and source mesh along a mesh path;
* In mesh_recv_indiv_data_to_fwd update route entry for both meshDA and meshSA; * In mesh_recv_indiv_data_to_me update route entry for meshSA; * in ieee80211_mesh_rt_update put code so that a proxy entry that is gated by us (number of hops == 0) is never invalidated; * Fixed so that we always call ieee80211_mesh_rt_update with lifetime in ms; Approved by: adrian
Diffstat (limited to 'sys/net80211')
-rw-r--r--sys/net80211/ieee80211_mesh.c37
1 files changed, 33 insertions, 4 deletions
diff --git a/sys/net80211/ieee80211_mesh.c b/sys/net80211/ieee80211_mesh.c
index de844ab..036d01d 100644
--- a/sys/net80211/ieee80211_mesh.c
+++ b/sys/net80211/ieee80211_mesh.c
@@ -241,6 +241,13 @@ ieee80211_mesh_rt_update(struct ieee80211_mesh_route *rt, int new_lifetime)
now = ticks;
RT_ENTRY_LOCK(rt);
+
+ /* dont clobber a proxy entry gated by us */
+ if (rt->rt_flags & IEEE80211_MESHRT_FLAGS_PROXY && rt->rt_nhops == 0) {
+ RT_ENTRY_UNLOCK(rt);
+ return rt->rt_lifetime;
+ }
+
timesince = ticks_to_msecs(now - rt->rt_updtime);
rt->rt_updtime = now;
if (timesince >= rt->rt_lifetime) {
@@ -1115,16 +1122,31 @@ static int
mesh_recv_indiv_data_to_fwrd(struct ieee80211vap *vap, struct mbuf *m,
struct ieee80211_frame *wh, const struct ieee80211_meshcntl *mc)
{
+ struct ieee80211_qosframe_addr4 *qwh;
+ struct ieee80211_mesh_state *ms = vap->iv_mesh;
+ struct ieee80211_mesh_route *rt_meshda, *rt_meshsa;
+
+ qwh = (struct ieee80211_qosframe_addr4 *)wh;
/*
* TODO:
* o verify addr2 is a legitimate transmitter
- * o set lifetime of addr3 to initial value
- * o set lifetime of addr4 to initial value
* o lifetime of precursor of addr3 (addr2) is max(init, curr)
* o lifetime of precursor of addr4 (nexthop) is max(init, curr)
*/
+ /* set lifetime of addr3 (meshDA) to initial value */
+ rt_meshda = ieee80211_mesh_rt_find(vap, qwh->i_addr3);
+ KASSERT(rt_meshda != NULL, ("no route"));
+ ieee80211_mesh_rt_update(rt_meshda, ticks_to_msecs(
+ ms->ms_ppath->mpp_inact));
+
+ /* set lifetime of addr4 (meshSA) to initial value */
+ rt_meshsa = ieee80211_mesh_rt_find(vap, qwh->i_addr4);
+ KASSERT(rt_meshsa != NULL, ("no route"));
+ ieee80211_mesh_rt_update(rt_meshsa, ticks_to_msecs(
+ ms->ms_ppath->mpp_inact));
+
mesh_forward(vap, m, mc);
return (1); /* dont process locally */
}
@@ -1144,6 +1166,7 @@ mesh_recv_indiv_data_to_me(struct ieee80211vap *vap, struct mbuf *m,
{
struct ieee80211_qosframe_addr4 *qwh;
const struct ieee80211_meshcntl_ae10 *mc10;
+ struct ieee80211_mesh_state *ms = vap->iv_mesh;
struct ieee80211_mesh_route *rt;
int ae;
@@ -1153,10 +1176,15 @@ mesh_recv_indiv_data_to_me(struct ieee80211vap *vap, struct mbuf *m,
/*
* TODO:
* o verify addr2 is a legitimate transmitter
- * o set lifetime of addr4 to initial value
* o lifetime of precursor entry is max(init, curr)
*/
+ /* set lifetime of addr4 (meshSA) to initial value */
+ rt = ieee80211_mesh_rt_find(vap, qwh->i_addr4);
+ KASSERT(rt != NULL, ("no route"));
+ ieee80211_mesh_rt_update(rt, ticks_to_msecs(ms->ms_ppath->mpp_inact));
+ rt = NULL;
+
ae = mc10->mc_flags & IEEE80211_MESH_AE_MASK;
KASSERT(ae == IEEE80211_MESH_AE_00 ||
ae == IEEE80211_MESH_AE_10, ("bad AE %d", ae));
@@ -1673,7 +1701,8 @@ mesh_recv_mgmt(struct ieee80211_node *ni, struct mbuf *m0, int subtype,
rt = ieee80211_mesh_rt_find(vap, wh->i_addr2);
if(rt != NULL) {
ieee80211_mesh_rt_update(rt,
- ms->ms_ppath->mpp_inact);
+ ticks_to_msecs(
+ ms->ms_ppath->mpp_inact));
}
break;
}
OpenPOWER on IntegriCloud