svn commit: r193866 - projects/mesh11s/sys/net80211
Rui Paulo
rpaulo at FreeBSD.org
Tue Jun 9 22:12:18 UTC 2009
Author: rpaulo
Date: Tue Jun 9 22:12:13 2009
New Revision: 193866
URL: http://svn.freebsd.org/changeset/base/193866
Log:
* fix a typo in previous commit
* add remaining bits of mesh peering
Sponsored by: The FreeBSD Foundation
Modified:
projects/mesh11s/sys/net80211/ieee80211_mesh.c
Modified: projects/mesh11s/sys/net80211/ieee80211_mesh.c
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_mesh.c Tue Jun 9 22:09:29 2009 (r193865)
+++ projects/mesh11s/sys/net80211/ieee80211_mesh.c Tue Jun 9 22:12:13 2009 (r193866)
@@ -164,8 +164,8 @@ mesh_newstate(struct ieee80211vap *vap,
switch (ostate) {
case IEEE80211_S_INIT:
if (vap->iv_des_chan != IEEE80211_CHAN_ANYC &&
- !IEEE80211_IS_CHAN_RADAR(vap->iv_des_chan &&
- vap->iv_meshidlen != 0)) {
+ !IEEE80211_IS_CHAN_RADAR(vap->iv_des_chan) &&
+ vap->iv_meshidlen != 0) {
/*
* Already have a channel and a mesh ID; bypass the
* scan and startup immediately.
@@ -439,7 +439,6 @@ static void
mesh_recv_mgmt(struct ieee80211_node *ni, struct mbuf *m0, int subtype,
int rssi, int noise)
{
- static const uint8_t zerobssid[IEEE80211_ADDR_LEN];
struct ieee80211vap *vap = ni->ni_vap;
struct ieee80211com *ic = ni->ni_ic;
struct ieee80211_frame *wh;
@@ -504,10 +503,9 @@ mesh_recv_mgmt(struct ieee80211_node *ni
/*
* More validation: make sure we are talking to a Mesh node.
*/
- if ((scan.capinfo & (IEEE80211_CAPINFO_ESS|IEEE80211_CAPINFO_IBSS)) == 0 &&
- !IEEE80211_ADDR_EQ(wh->i_addr2, ni->ni_macaddr) &&
- IEEE80211_ADDR_EQ(wh->i_addr3, zerobssid)) {
- union ieee80211_send_action_args vargs;
+ if ((scan.capinfo &
+ (IEEE80211_CAPINFO_ESS|IEEE80211_CAPINFO_IBSS)) == 0 &&
+ !IEEE80211_ADDR_EQ(wh->i_addr2, ni->ni_macaddr)) {
/*
* Create a new entry in the neighbor table.
*/
@@ -516,9 +514,14 @@ mesh_recv_mgmt(struct ieee80211_node *ni
* Mesh nodes must be QoS capable.
*/
ni->ni_flags |= IEEE80211_NODE_QOS;
- /*
- * Try to peer with this node.
- */
+ }
+ /*
+ * Try to peer with this node if possible.
+ */
+ if (ni != vap->iv_bss &&
+ vap->iv_meshflags & IEEE80211_MFLAGS_AP &&
+ ni->ni_mlstate == IEEE80211_NODE_MESH_IDLE) {
+ union ieee80211_send_action_args vargs;
get_random_bytes(&ni->ni_mlpid, 2);
ni->ni_mlstate = IEEE80211_NODE_MESH_OPENSNT;
IEEE80211_NOTE(vap,
@@ -532,11 +535,8 @@ mesh_recv_mgmt(struct ieee80211_node *ni
ni->ni_mlrcnt = 0;
mesh_peer_timeout_setup(ni);
}
- if (ni != NULL) {
- IEEE80211_RSSI_LPF(ni->ni_avgrssi, rssi);
- ni->ni_noise = noise;
- }
-
+ IEEE80211_RSSI_LPF(ni->ni_avgrssi, rssi);
+ ni->ni_noise = noise;
break;
}
case IEEE80211_FC0_SUBTYPE_PROBE_REQ:
@@ -716,6 +716,28 @@ mesh_recv_action(struct ieee80211_node *
IEEE80211_MSG_ACTION | IEEE80211_MSG_MESH,
wh, NULL, "%s", "action frame not for our mesh");
vap->iv_stats.is_rx_mgtdiscard++;
+ switch (ni->ni_mlstate) {
+ case IEEE80211_NODE_MESH_IDLE:
+ break;
+ case IEEE80211_NODE_MESH_OPENSNT:
+ case IEEE80211_NODE_MESH_OPENRCV:
+ case IEEE80211_NODE_MESH_CONFIRMRCV:
+ vargs.fixedarg[0] = ni->ni_mlid;
+ vargs.fixedarg[1] = ni->ni_plid;
+ vargs.fixedarg[2] =
+ IEEE80211_REASON_PEER_LINK_CANCELED;
+ ieee80211_send_action(ni,
+ IEEE80211_ACTION_CAT_MESHPEERING,
+ IEEE80211_ACTION_MESHPEERING_CLOSE,
+ vargs);
+ ni->ni_mlstate = IEEE80211_NODE_MESH_HOLDING;
+ IEEE80211_NOTE(vap,
+ IEEE80211_MSG_MESH,
+ ni, "peer link: switching to state %s",
+ nodemeshstates[ni->ni_mlstate]);
+ mesh_peer_timeout_setup(ni);
+ break;
+ }
return;
}
switch (ia->ia_action) {
@@ -833,7 +855,8 @@ mesh_recv_action(struct ieee80211_node *
case IEEE80211_NODE_MESH_HOLDING:
vargs.fixedarg[0] = ni->ni_mllid;
vargs.fixedarg[1] = ni->ni_mlpid;
- vargs.fixedarg[2] = IEEE80211_REASON_MESH_MAX_RETRIES;
+ vargs.fixedarg[2] =
+ IEEE80211_REASON_MESH_MAX_RETRIES;
ieee80211_send_action(ni,
IEEE80211_ACTION_CAT_MESHPEERING,
IEEE80211_ACTION_MESHPEERING_CLOSE,
@@ -853,16 +876,34 @@ mesh_recv_action(struct ieee80211_node *
"%s", "recv PEER CLOSE");
switch (ni->ni_mlstate) {
case IEEE80211_NODE_MESH_IDLE:
- case IEEE80211_NODE_MESH_CONFIRMRECV:
- case IEEE80211_NODE_MESH_ESTABLISHED:
+ /* ignore */
break;
case IEEE80211_NODE_MESH_OPENRCV:
+ case IEEE80211_NODE_MESH_OPENSNT:
+ case IEEE80211_NODE_MESH_CONFIRMRECV:
+ case IEEE80211_NODE_MESH_ESTABLISHED:
+ vargs.fixedarg[0] = ni->ni_mlid;
+ vargs.fixedarg[1] = 0;
+ vargs.fixedarg[2] =
+ IEEE80211_REASON_MESH_CLOSE_RCVD;
+ ieee80211_send_action(ni,
+ IEEE80211_ACTION_CAT_MESHPEERING,
+ IEEE80211_ACTION_MESHPEERING_CLOSE,
+ vargs);
ni->ni_mlstate = IEEE80211_NODE_MESH_HOLDING;
+ IEEE80211_NOTE(vap,
+ IEEE80211_MSG_MESH,
+ ni, "peer link: switching to state %s",
+ nodemeshstates[ni->ni_mlstate]);
mesh_peer_timeout_setup(ni);
break;
- case IEEE80211_NODE_MESH_OPENSNT:
- break;
case IEEE80211_NODE_MESH_HOLDING:
+ ni->ni_mlstate = IEEE80211_NODE_MESH_IDLE;
+ IEEE80211_NOTE(vap,
+ IEEE80211_MSG_MESH,
+ ni, "peer link: switching to state %s",
+ nodemeshstates[ni->ni_mlstate]);
+ mesh_peer_timeout_setup(ni);
break;
}
break;
@@ -921,11 +962,15 @@ mesh_peer_timeout_setup(struct ieee80211
case IEEE80211_NODE_MESH_CONFIRMRECV:
ni->ni_mltval = CONFIRM_TIMEOUT;
break;
+ case IEEE80211_NODE_MESH_IDLE:
+ ni->ni_mltval = 0;
+ break;
default:
ni->ni_mltval = RETRY_TIMEOUT;
}
- callout_reset(&ni->ni_mltimer, ni->ni_mltval, mesh_peer_timeout_cb,
- ni);
+ if (ni->ni_mltval)
+ callout_reset(&ni->ni_mltimer, ni->ni_mltval,
+ mesh_peer_timeout_cb, ni);
}
/*
More information about the svn-src-projects
mailing list