From owner-svn-src-head@FreeBSD.ORG Tue May 1 15:35:10 2012 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id DA25B106566B; Tue, 1 May 2012 15:35:10 +0000 (UTC) (envelope-from monthadar@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id C36C28FC08; Tue, 1 May 2012 15:35:10 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q41FZA87032085; Tue, 1 May 2012 15:35:10 GMT (envelope-from monthadar@svn.freebsd.org) Received: (from monthadar@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q41FZAH1032079; Tue, 1 May 2012 15:35:10 GMT (envelope-from monthadar@svn.freebsd.org) Message-Id: <201205011535.q41FZAH1032079@svn.freebsd.org> From: Monthadar Al Jaberi Date: Tue, 1 May 2012 15:35:10 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r234874 - head/sys/net80211 X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 01 May 2012 15:35:10 -0000 Author: monthadar Date: Tue May 1 15:35:10 2012 New Revision: 234874 URL: http://svn.freebsd.org/changeset/base/234874 Log: Added Self-protected action category (including MPM). * Added new action category IEEE80211_ACTION_CAT_SELF_PROT which is used by 11s for Mesh Peering Management; * Updated Self protected enum Action codes to start from 1 instead of 0 according to the standard spec; * Removed old and wrong action categories IEEE80211_ACTION_CAT_MESHPEERING; * Modified ieee80211_mesh.c and ieee80211_action.c to use the new action category code; * Added earlier verification code in ieee80211_input; Approved by: adrian Modified: head/sys/net80211/ieee80211.h head/sys/net80211/ieee80211_action.c head/sys/net80211/ieee80211_input.c head/sys/net80211/ieee80211_mesh.c head/sys/net80211/ieee80211_mesh.h Modified: head/sys/net80211/ieee80211.h ============================================================================== --- head/sys/net80211/ieee80211.h Tue May 1 14:48:51 2012 (r234873) +++ head/sys/net80211/ieee80211.h Tue May 1 15:35:10 2012 (r234874) @@ -333,6 +333,8 @@ struct ieee80211_action { #define IEEE80211_ACTION_CAT_BA 3 /* BA */ #define IEEE80211_ACTION_CAT_HT 7 /* HT */ #define IEEE80211_ACTION_CAT_MESH 13 /* Mesh */ +#define IEEE80211_ACTION_CAT_SELF_PROT 15 /* Self-protected */ +/* 16 - 125 reserved */ #define IEEE80211_ACTION_CAT_VENDOR 127 /* Vendor Specific */ #define IEEE80211_ACTION_HT_TXCHWIDTH 0 /* recommended xmit chan width*/ Modified: head/sys/net80211/ieee80211_action.c ============================================================================== --- head/sys/net80211/ieee80211_action.c Tue May 1 14:48:51 2012 (r234873) +++ head/sys/net80211/ieee80211_action.c Tue May 1 15:35:10 2012 (r234874) @@ -94,7 +94,7 @@ ieee80211_send_action_register(int cat, break; ht_send_action[act] = f; return 0; - case IEEE80211_ACTION_CAT_MESHPEERING: + case IEEE80211_ACTION_CAT_SELF_PROT: if (act >= N(meshpl_send_action)) break; meshpl_send_action[act] = f; @@ -144,7 +144,7 @@ ieee80211_send_action(struct ieee80211_n if (act < N(ht_send_action)) f = ht_send_action[act]; break; - case IEEE80211_ACTION_CAT_MESHPEERING: + case IEEE80211_ACTION_CAT_SELF_PROT: if (act < N(meshpl_send_action)) f = meshpl_send_action[act]; break; @@ -215,7 +215,7 @@ ieee80211_recv_action_register(int cat, break; ht_recv_action[act] = f; return 0; - case IEEE80211_ACTION_CAT_MESHPEERING: + case IEEE80211_ACTION_CAT_SELF_PROT: if (act >= N(meshpl_recv_action)) break; meshpl_recv_action[act] = f; @@ -269,7 +269,7 @@ ieee80211_recv_action(struct ieee80211_n if (ia->ia_action < N(ht_recv_action)) f = ht_recv_action[ia->ia_action]; break; - case IEEE80211_ACTION_CAT_MESHPEERING: + case IEEE80211_ACTION_CAT_SELF_PROT: if (ia->ia_action < N(meshpl_recv_action)) f = meshpl_recv_action[ia->ia_action]; break; Modified: head/sys/net80211/ieee80211_input.c ============================================================================== --- head/sys/net80211/ieee80211_input.c Tue May 1 14:48:51 2012 (r234873) +++ head/sys/net80211/ieee80211_input.c Tue May 1 15:35:10 2012 (r234874) @@ -792,6 +792,24 @@ ieee80211_parse_action(struct ieee80211_ return EINVAL; } break; + case IEEE80211_ACTION_CAT_SELF_PROT: + /* If TA or RA group address discard silently */ + if (IEEE80211_IS_MULTICAST(wh->i_addr1) || + IEEE80211_IS_MULTICAST(wh->i_addr2)) + return EINVAL; + /* + * XXX: Should we verify complete length now or it is + * to varying in sizes? + */ + switch (ia->ia_action) { + case IEEE80211_ACTION_MESHPEERING_CONFIRM: + case IEEE80211_ACTION_MESHPEERING_CLOSE: + /* is not a peering candidate (yet) */ + if (ni == vap->iv_bss) + return EINVAL; + break; + } + break; #endif } return 0; Modified: head/sys/net80211/ieee80211_mesh.c ============================================================================== --- head/sys/net80211/ieee80211_mesh.c Tue May 1 14:48:51 2012 (r234873) +++ head/sys/net80211/ieee80211_mesh.c Tue May 1 15:35:10 2012 (r234874) @@ -430,25 +430,25 @@ ieee80211_mesh_init(void) /* * Register action frame handlers. */ - ieee80211_recv_action_register(IEEE80211_ACTION_CAT_MESHPEERING, + ieee80211_recv_action_register(IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_OPEN, mesh_recv_action_meshpeering_open); - ieee80211_recv_action_register(IEEE80211_ACTION_CAT_MESHPEERING, + ieee80211_recv_action_register(IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CONFIRM, mesh_recv_action_meshpeering_confirm); - ieee80211_recv_action_register(IEEE80211_ACTION_CAT_MESHPEERING, + ieee80211_recv_action_register(IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CLOSE, mesh_recv_action_meshpeering_close); ieee80211_recv_action_register(IEEE80211_ACTION_CAT_MESH, IEEE80211_ACTION_MESH_LMETRIC, mesh_recv_action_meshlmetric); - ieee80211_send_action_register(IEEE80211_ACTION_CAT_MESHPEERING, + ieee80211_send_action_register(IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_OPEN, mesh_send_action_meshpeering_open); - ieee80211_send_action_register(IEEE80211_ACTION_CAT_MESHPEERING, + ieee80211_send_action_register(IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CONFIRM, mesh_send_action_meshpeering_confirm); - ieee80211_send_action_register(IEEE80211_ACTION_CAT_MESHPEERING, + ieee80211_send_action_register(IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CLOSE, mesh_send_action_meshpeering_close); ieee80211_send_action_register(IEEE80211_ACTION_CAT_MESH, @@ -485,7 +485,7 @@ mesh_vdetach_peers(void *arg, struct iee args[1] = ni->ni_mllid; args[2] = IEEE80211_REASON_PEER_LINK_CANCELED; ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CLOSE, args); } @@ -1440,7 +1440,7 @@ mesh_recv_mgmt(struct ieee80211_node *ni mesh_linkchange(ni, IEEE80211_NODE_MESH_OPENSNT); args[0] = ni->ni_mlpid; ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_OPEN, args); ni->ni_mlrcnt = 0; mesh_peer_timeout_setup(ni); @@ -1602,7 +1602,7 @@ mesh_parse_meshpeering_action(struct iee memset(mp, 0, sizeof(*mp)); mp->peer_llinkid = LE_READ_2(&mpie->peer_llinkid); /* NB: peer link ID is optional on these frames */ - if (subtype == IEEE80211_MESH_PEER_LINK_CLOSE && + if (subtype == IEEE80211_ACTION_MESHPEERING_CLOSE && mpie->peer_len == 8) { mp->peer_linkid = 0; mp->peer_rcode = LE_READ_2(&mpie->peer_linkid); @@ -1646,7 +1646,7 @@ mesh_parse_meshpeering_action(struct iee args[1] = ni->ni_mllid; args[2] = IEEE80211_REASON_PEER_LINK_CANCELED; ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CLOSE, args); mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING); @@ -1689,13 +1689,13 @@ mesh_recv_action_meshpeering_open(struct args[0] = ni->ni_mlpid; /* Announce we're open too... */ ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_OPEN, args); /* ...and confirm the link. */ args[0] = ni->ni_mlpid; args[1] = ni->ni_mllid; ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CONFIRM, args); mesh_peer_timeout_setup(ni); @@ -1707,7 +1707,7 @@ mesh_recv_action_meshpeering_open(struct args[1] = ni->ni_mlpid; args[2] = IEEE80211_REASON_PEER_LINK_CANCELED; ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CLOSE, args); mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING); @@ -1718,7 +1718,7 @@ mesh_recv_action_meshpeering_open(struct args[0] = ni->ni_mlpid; args[1] = ni->ni_mllid; ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CONFIRM, args); break; @@ -1728,7 +1728,7 @@ mesh_recv_action_meshpeering_open(struct args[0] = ni->ni_mlpid; args[1] = ni->ni_mllid; ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CONFIRM, args); /* NB: don't setup/clear any timeout */ @@ -1740,7 +1740,7 @@ mesh_recv_action_meshpeering_open(struct args[1] = ni->ni_mllid; args[2] = IEEE80211_REASON_PEER_LINK_CANCELED; ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CLOSE, args); mesh_linkchange(ni, @@ -1753,7 +1753,7 @@ mesh_recv_action_meshpeering_open(struct args[0] = ni->ni_mlpid; args[1] = ni->ni_mllid; ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CONFIRM, args); mesh_peer_timeout_stop(ni); @@ -1764,7 +1764,7 @@ mesh_recv_action_meshpeering_open(struct args[1] = ni->ni_mlpid; args[2] = IEEE80211_REASON_PEER_LINK_CANCELED; ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CLOSE, args); mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING); @@ -1774,7 +1774,7 @@ mesh_recv_action_meshpeering_open(struct args[0] = ni->ni_mlpid; args[1] = ni->ni_mllid; ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CONFIRM, args); break; @@ -1783,7 +1783,7 @@ mesh_recv_action_meshpeering_open(struct args[1] = meshpeer->peer_llinkid; args[2] = IEEE80211_REASON_MESH_MAX_RETRIES; ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CLOSE, args); break; @@ -1825,7 +1825,7 @@ mesh_recv_action_meshpeering_confirm(str args[1] = meshpeer->peer_llinkid; args[2] = IEEE80211_REASON_MESH_MAX_RETRIES; ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CLOSE, args); break; @@ -1835,7 +1835,7 @@ mesh_recv_action_meshpeering_confirm(str args[1] = ni->ni_mllid; args[2] = IEEE80211_REASON_PEER_LINK_CANCELED; ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CLOSE, args); mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING); @@ -1875,7 +1875,7 @@ mesh_recv_action_meshpeering_close(struc args[1] = ni->ni_mllid; args[2] = IEEE80211_REASON_MESH_CLOSE_RCVD; ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CLOSE, args); mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING); @@ -1991,7 +1991,7 @@ mesh_send_action_meshpeering_open(struct frm = ieee80211_add_xrates(frm, rs); frm = ieee80211_add_meshid(frm, vap); frm = ieee80211_add_meshconf(frm, vap); - frm = ieee80211_add_meshpeer(frm, IEEE80211_MESH_PEER_LINK_OPEN, + frm = ieee80211_add_meshpeer(frm, IEEE80211_ACTION_MESHPEERING_OPEN, args[0], 0, 0); m->m_pkthdr.len = m->m_len = frm - mtod(m, uint8_t *); return mesh_send_action(ni, m); @@ -2059,7 +2059,7 @@ mesh_send_action_meshpeering_confirm(str frm = ieee80211_add_meshid(frm, vap); frm = ieee80211_add_meshconf(frm, vap); frm = ieee80211_add_meshpeer(frm, - IEEE80211_MESH_PEER_LINK_CONFIRM, + IEEE80211_ACTION_MESHPEERING_CONFIRM, args[0], args[1], 0); m->m_pkthdr.len = m->m_len = frm - mtod(m, uint8_t *); return mesh_send_action(ni, m); @@ -2110,7 +2110,7 @@ mesh_send_action_meshpeering_close(struc ADDSHORT(frm, args[2]); /* reason code */ frm = ieee80211_add_meshid(frm, vap); frm = ieee80211_add_meshpeer(frm, - IEEE80211_MESH_PEER_LINK_CLOSE, + IEEE80211_ACTION_MESHPEERING_CLOSE, args[0], args[1], args[2]); m->m_pkthdr.len = m->m_len = frm - mtod(m, uint8_t *); return mesh_send_action(ni, m); @@ -2234,7 +2234,7 @@ mesh_peer_timeout_cb(void *arg) args[0] = ni->ni_mlpid; args[2] = IEEE80211_REASON_MESH_MAX_RETRIES; ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CLOSE, args); ni->ni_mlrcnt = 0; mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING); @@ -2242,7 +2242,7 @@ mesh_peer_timeout_cb(void *arg) } else { args[0] = ni->ni_mlpid; ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_OPEN, args); ni->ni_mlrcnt++; mesh_peer_timeout_backoff(ni); @@ -2253,7 +2253,7 @@ mesh_peer_timeout_cb(void *arg) args[0] = ni->ni_mlpid; args[2] = IEEE80211_REASON_MESH_CONFIRM_TIMEOUT; ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CLOSE, args); ni->ni_mlrcnt = 0; mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING); @@ -2341,15 +2341,15 @@ mesh_verify_meshpeer(struct ieee80211vap meshpeer->peer_len > 10) return 1; switch (subtype) { - case IEEE80211_MESH_PEER_LINK_OPEN: + case IEEE80211_ACTION_MESHPEERING_OPEN: if (meshpeer->peer_len != 6) return 1; break; - case IEEE80211_MESH_PEER_LINK_CONFIRM: + case IEEE80211_ACTION_MESHPEERING_CONFIRM: if (meshpeer->peer_len != 8) return 1; break; - case IEEE80211_MESH_PEER_LINK_CLOSE: + case IEEE80211_ACTION_MESHPEERING_CLOSE: if (meshpeer->peer_len < 8) return 1; if (meshpeer->peer_len == 8 && meshpeer->peer_linkid != 0) @@ -2425,13 +2425,13 @@ ieee80211_add_meshpeer(uint8_t *frm, uin *frm++ = IEEE80211_ELEMID_MESHPEER; switch (subtype) { - case IEEE80211_MESH_PEER_LINK_OPEN: + case IEEE80211_ACTION_MESHPEERING_OPEN: *frm++ = 6; /* length */ memcpy(frm, meshpeerproto, 4); frm += 4; ADDSHORT(frm, localid); /* local ID */ break; - case IEEE80211_MESH_PEER_LINK_CONFIRM: + case IEEE80211_ACTION_MESHPEERING_CONFIRM: KASSERT(peerid != 0, ("sending peer confirm without peer id")); *frm++ = 8; /* length */ memcpy(frm, meshpeerproto, 4); @@ -2439,7 +2439,7 @@ ieee80211_add_meshpeer(uint8_t *frm, uin ADDSHORT(frm, localid); /* local ID */ ADDSHORT(frm, peerid); /* peer ID */ break; - case IEEE80211_MESH_PEER_LINK_CLOSE: + case IEEE80211_ACTION_MESHPEERING_CLOSE: if (peerid) *frm++ = 10; /* length */ else Modified: head/sys/net80211/ieee80211_mesh.h ============================================================================== --- head/sys/net80211/ieee80211_mesh.h Tue May 1 14:48:51 2012 (r234873) +++ head/sys/net80211/ieee80211_mesh.h Tue May 1 15:35:10 2012 (r234874) @@ -149,13 +149,6 @@ struct ieee80211_meshpeer_ie { uint16_t peer_rcode; } __packed; -enum { - IEEE80211_MESH_PEER_LINK_OPEN = 0, - IEEE80211_MESH_PEER_LINK_CONFIRM = 1, - IEEE80211_MESH_PEER_LINK_CLOSE = 2, - /* values 3-255 are reserved */ -}; - /* Mesh Peering Management Protocol */ #define IEEE80211_MESH_PEER_PROTO_OUI 0x00, 0x0f, 0xac #define IEEE80211_MESH_PEER_PROTO_VALUE 0x2a @@ -331,9 +324,9 @@ struct ieee80211_meshpuc_ie { /* * 802.11s Action Frames + * XXX: these are wrong, and some of them should be + * under MESH category while PROXY is under MULTIHOP category. */ -#define IEEE80211_ACTION_CAT_MESHPEERING 30 /* XXX Linux */ -/* XXX: these need to be looked into */ #define IEEE80211_ACTION_CAT_INTERWORK 15 #define IEEE80211_ACTION_CAT_RESOURCE 16 #define IEEE80211_ACTION_CAT_PROXY 17 @@ -342,10 +335,11 @@ struct ieee80211_meshpuc_ie { * Mesh Peering Action codes. */ enum { - IEEE80211_ACTION_MESHPEERING_OPEN = 0, - IEEE80211_ACTION_MESHPEERING_CONFIRM = 1, - IEEE80211_ACTION_MESHPEERING_CLOSE = 2, - /* 3-255 reserved */ + /* 0 reserved */ + IEEE80211_ACTION_MESHPEERING_OPEN = 1, + IEEE80211_ACTION_MESHPEERING_CONFIRM = 2, + IEEE80211_ACTION_MESHPEERING_CLOSE = 3, + /* 4-255 reserved */ }; /*