Date: Tue, 9 Jun 2009 22:12:13 +0000 (UTC) From: Rui Paulo <rpaulo@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r193866 - projects/mesh11s/sys/net80211 Message-ID: <200906092212.n59MCD3E085530@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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); } /*
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200906092212.n59MCD3E085530>