Deleted Added
full compact
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}