ieee80211_adhoc.c (205277) | ieee80211_adhoc.c (218927) |
---|---|
1/*- 2 * Copyright (c) 2007-2009 Sam Leffler, Errno Consulting 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 11 unchanged lines hidden (view full) --- 20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#include <sys/cdefs.h> 27#ifdef __FreeBSD__ | 1/*- 2 * Copyright (c) 2007-2009 Sam Leffler, Errno Consulting 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 11 unchanged lines hidden (view full) --- 20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#include <sys/cdefs.h> 27#ifdef __FreeBSD__ |
28__FBSDID("$FreeBSD: head/sys/net80211/ieee80211_adhoc.c 205277 2010-03-18 11:06:38Z rpaulo $"); | 28__FBSDID("$FreeBSD: head/sys/net80211/ieee80211_adhoc.c 218927 2011-02-21 19:59:43Z bschmidt $"); |
29#endif 30 31/* 32 * IEEE 802.11 IBSS mode support. 33 */ 34#include "opt_inet.h" 35#include "opt_wlan.h" 36 --- 781 unchanged lines hidden (view full) --- 818 * probe response frame. When the request includes 819 * only a bare-bones rate set, communicate this to 820 * the transmit side. 821 */ 822 ieee80211_send_proberesp(vap, wh->i_addr2, 823 is11bclient(rates, xrates) ? IEEE80211_SEND_LEGACY_11B : 0); 824 break; 825 | 29#endif 30 31/* 32 * IEEE 802.11 IBSS mode support. 33 */ 34#include "opt_inet.h" 35#include "opt_wlan.h" 36 --- 781 unchanged lines hidden (view full) --- 818 * probe response frame. When the request includes 819 * only a bare-bones rate set, communicate this to 820 * the transmit side. 821 */ 822 ieee80211_send_proberesp(vap, wh->i_addr2, 823 is11bclient(rates, xrates) ? IEEE80211_SEND_LEGACY_11B : 0); 824 break; 825 |
826 case IEEE80211_FC0_SUBTYPE_ACTION: { 827 const struct ieee80211_action *ia; 828 829 if (vap->iv_state != IEEE80211_S_RUN) { | 826 case IEEE80211_FC0_SUBTYPE_ACTION: 827 case IEEE80211_FC0_SUBTYPE_ACTION_NOACK: 828 if (vap->iv_state == IEEE80211_S_RUN) { 829 if (ieee80211_parse_action(ni, m0) == 0) 830 (void)ic->ic_recv_action(ni, wh, frm, efrm); 831 } else { |
830 IEEE80211_DISCARD(vap, IEEE80211_MSG_INPUT, 831 wh, NULL, "wrong state %s", 832 ieee80211_state_name[vap->iv_state]); 833 vap->iv_stats.is_rx_mgtdiscard++; | 832 IEEE80211_DISCARD(vap, IEEE80211_MSG_INPUT, 833 wh, NULL, "wrong state %s", 834 ieee80211_state_name[vap->iv_state]); 835 vap->iv_stats.is_rx_mgtdiscard++; |
834 return; | |
835 } | 836 } |
836 /* 837 * action frame format: 838 * [1] category 839 * [1] action 840 * [tlv] parameters 841 */ 842 IEEE80211_VERIFY_LENGTH(efrm - frm, 843 sizeof(struct ieee80211_action), return); 844 ia = (const struct ieee80211_action *) frm; 845 846 vap->iv_stats.is_rx_action++; 847 IEEE80211_NODE_STAT(ni, rx_action); 848 849 /* verify frame payloads but defer processing */ 850 /* XXX maybe push this to method */ 851 switch (ia->ia_category) { 852 case IEEE80211_ACTION_CAT_BA: 853 switch (ia->ia_action) { 854 case IEEE80211_ACTION_BA_ADDBA_REQUEST: 855 IEEE80211_VERIFY_LENGTH(efrm - frm, 856 sizeof(struct ieee80211_action_ba_addbarequest), 857 return); 858 break; 859 case IEEE80211_ACTION_BA_ADDBA_RESPONSE: 860 IEEE80211_VERIFY_LENGTH(efrm - frm, 861 sizeof(struct ieee80211_action_ba_addbaresponse), 862 return); 863 break; 864 case IEEE80211_ACTION_BA_DELBA: 865 IEEE80211_VERIFY_LENGTH(efrm - frm, 866 sizeof(struct ieee80211_action_ba_delba), 867 return); 868 break; 869 } 870 break; 871 case IEEE80211_ACTION_CAT_HT: 872 switch (ia->ia_action) { 873 case IEEE80211_ACTION_HT_TXCHWIDTH: 874 IEEE80211_VERIFY_LENGTH(efrm - frm, 875 sizeof(struct ieee80211_action_ht_txchwidth), 876 return); 877 break; 878 } 879 break; 880 } 881 ic->ic_recv_action(ni, wh, frm, efrm); | |
882 break; | 837 break; |
883 } | |
884 | 838 |
885 case IEEE80211_FC0_SUBTYPE_AUTH: | |
886 case IEEE80211_FC0_SUBTYPE_ASSOC_REQ: | 839 case IEEE80211_FC0_SUBTYPE_ASSOC_REQ: |
887 case IEEE80211_FC0_SUBTYPE_REASSOC_REQ: | |
888 case IEEE80211_FC0_SUBTYPE_ASSOC_RESP: | 840 case IEEE80211_FC0_SUBTYPE_ASSOC_RESP: |
841 case IEEE80211_FC0_SUBTYPE_REASSOC_REQ: |
|
889 case IEEE80211_FC0_SUBTYPE_REASSOC_RESP: | 842 case IEEE80211_FC0_SUBTYPE_REASSOC_RESP: |
890 case IEEE80211_FC0_SUBTYPE_DEAUTH: | 843 case IEEE80211_FC0_SUBTYPE_ATIM: |
891 case IEEE80211_FC0_SUBTYPE_DISASSOC: | 844 case IEEE80211_FC0_SUBTYPE_DISASSOC: |
845 case IEEE80211_FC0_SUBTYPE_AUTH: 846 case IEEE80211_FC0_SUBTYPE_DEAUTH: |
|
892 IEEE80211_DISCARD(vap, IEEE80211_MSG_INPUT, | 847 IEEE80211_DISCARD(vap, IEEE80211_MSG_INPUT, |
893 wh, NULL, "%s", "not handled"); | 848 wh, NULL, "%s", "not handled"); |
894 vap->iv_stats.is_rx_mgtdiscard++; | 849 vap->iv_stats.is_rx_mgtdiscard++; |
895 return; | 850 break; |
896 897 default: 898 IEEE80211_DISCARD(vap, IEEE80211_MSG_ANY, | 851 852 default: 853 IEEE80211_DISCARD(vap, IEEE80211_MSG_ANY, |
899 wh, "mgt", "subtype 0x%x not handled", subtype); | 854 wh, "mgt", "subtype 0x%x not handled", subtype); |
900 vap->iv_stats.is_rx_badsubtype++; 901 break; 902 } 903} 904#undef IEEE80211_VERIFY_LENGTH 905#undef IEEE80211_VERIFY_ELEMENT 906 907static void 908ahdemo_recv_mgmt(struct ieee80211_node *ni, struct mbuf *m0, 909 int subtype, int rssi, int nf) 910{ 911 struct ieee80211vap *vap = ni->ni_vap; 912 struct ieee80211com *ic = ni->ni_ic; | 855 vap->iv_stats.is_rx_badsubtype++; 856 break; 857 } 858} 859#undef IEEE80211_VERIFY_LENGTH 860#undef IEEE80211_VERIFY_ELEMENT 861 862static void 863ahdemo_recv_mgmt(struct ieee80211_node *ni, struct mbuf *m0, 864 int subtype, int rssi, int nf) 865{ 866 struct ieee80211vap *vap = ni->ni_vap; 867 struct ieee80211com *ic = ni->ni_ic; |
868 struct ieee80211_frame *wh; |
|
913 914 /* 915 * Process management frames when scanning; useful for doing 916 * a site-survey. 917 */ 918 if (ic->ic_flags & IEEE80211_F_SCAN) 919 adhoc_recv_mgmt(ni, m0, subtype, rssi, nf); | 869 870 /* 871 * Process management frames when scanning; useful for doing 872 * a site-survey. 873 */ 874 if (ic->ic_flags & IEEE80211_F_SCAN) 875 adhoc_recv_mgmt(ni, m0, subtype, rssi, nf); |
920 else 921 vap->iv_stats.is_rx_mgtdiscard++; | 876 else { 877 wh = mtod(m0, struct ieee80211_frame *); 878 switch (subtype) { 879 case IEEE80211_FC0_SUBTYPE_ASSOC_REQ: 880 case IEEE80211_FC0_SUBTYPE_ASSOC_RESP: 881 case IEEE80211_FC0_SUBTYPE_REASSOC_REQ: 882 case IEEE80211_FC0_SUBTYPE_REASSOC_RESP: 883 case IEEE80211_FC0_SUBTYPE_PROBE_REQ: 884 case IEEE80211_FC0_SUBTYPE_PROBE_RESP: 885 case IEEE80211_FC0_SUBTYPE_BEACON: 886 case IEEE80211_FC0_SUBTYPE_ATIM: 887 case IEEE80211_FC0_SUBTYPE_DISASSOC: 888 case IEEE80211_FC0_SUBTYPE_AUTH: 889 case IEEE80211_FC0_SUBTYPE_DEAUTH: 890 case IEEE80211_FC0_SUBTYPE_ACTION: 891 case IEEE80211_FC0_SUBTYPE_ACTION_NOACK: 892 IEEE80211_DISCARD(vap, IEEE80211_MSG_INPUT, 893 wh, NULL, "%s", "not handled"); 894 vap->iv_stats.is_rx_mgtdiscard++; 895 break; 896 default: 897 IEEE80211_DISCARD(vap, IEEE80211_MSG_ANY, 898 wh, "mgt", "subtype 0x%x not handled", subtype); 899 vap->iv_stats.is_rx_badsubtype++; 900 break; 901 } 902 } |
922} 923 924static void 925adhoc_recv_ctl(struct ieee80211_node *ni, struct mbuf *m, int subtype) 926{ 927 928 switch (subtype) { 929 case IEEE80211_FC0_SUBTYPE_BAR: 930 ieee80211_recv_bar(ni, m); 931 break; 932 } 933} | 903} 904 905static void 906adhoc_recv_ctl(struct ieee80211_node *ni, struct mbuf *m, int subtype) 907{ 908 909 switch (subtype) { 910 case IEEE80211_FC0_SUBTYPE_BAR: 911 ieee80211_recv_bar(ni, m); 912 break; 913 } 914} |