aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/ar71xx/mikrotik
Commit message (Expand)AuthorAgeFilesLines
* ar71xx/mikrotik: enable the AT803x PHY driverGabor Juhos2014-04-131-0/+1
* ar71xx/mikrotik: enable the 74x164 GPIO driverGabor Juhos2014-02-231-0/+1
* ar71xx/mikrotik: enable the GPIO latch driverGabor Juhos2014-02-221-1/+1
* ar71xx/mikrotik: enable small sector erase in the m25p80 driverGabor Juhos2014-02-221-0/+1
* ar71xx: add initial support for the Mikrotik RB911G/RB912UAG boardsGabor Juhos2013-12-161-0/+2
* kernel: remove obsolete yaffs options from target configsGabor Juhos2013-12-161-2/+0
* ar71xx/mikrotik: disable unused MTD optionsGabor Juhos2013-12-161-0/+8
* kernel: add missing config optionsHauke Mehrtens2013-11-011-1/+0
* ar71xx: move subtarget specific features to target.mkGabor Juhos2013-10-301-0/+1
* ar71xx: disable non Mikrotik boards in the mikrotik subtargetGabor Juhos2013-10-301-0/+82
* ar71xx: move CONFIG_MTD_NAND_AR934X_HW_ECC option to subtarget configGabor Juhos2013-10-301-0/+1
* ar71xx: rename 'nand' subtarget to 'mikrotik'Gabor Juhos2013-10-234-0/+74
'#n138'>138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
Index: madwifi-dfs-r3053/ath/if_ath.c
===================================================================
--- madwifi-dfs-r3053.orig/ath/if_ath.c	2007-12-13 05:25:13.662404044 +0100
+++ madwifi-dfs-r3053/ath/if_ath.c	2007-12-13 05:25:13.934419543 +0100
@@ -3973,7 +3973,9 @@
 		rfilt |= HAL_RX_FILTER_PROM;
 	if (ic->ic_opmode == IEEE80211_M_STA ||
 	    sc->sc_opmode == HAL_M_IBSS ||	/* NB: AHDEMO too */
-	    (sc->sc_nostabeacons) || sc->sc_scanning)
+	    (sc->sc_nostabeacons) || sc->sc_scanning ||
+		((ic->ic_opmode == IEEE80211_M_HOSTAP) &&
+		 (ic->ic_protmode != IEEE80211_PROT_NONE)))
 		rfilt |= HAL_RX_FILTER_BEACON;
 	if (sc->sc_nmonvaps > 0)
 		rfilt |= (HAL_RX_FILTER_CONTROL | HAL_RX_FILTER_BEACON |
Index: madwifi-dfs-r3053/net80211/ieee80211_input.c
===================================================================
--- madwifi-dfs-r3053.orig/net80211/ieee80211_input.c	2007-12-13 05:25:13.674404726 +0100
+++ madwifi-dfs-r3053/net80211/ieee80211_input.c	2007-12-13 05:25:13.938419772 +0100
@@ -329,11 +329,12 @@
 				bssid = wh->i_addr3;
 			}
 			/*
-			 * Validate the bssid.
+			 * Validate the bssid. Let beacons get through though for 11g protection mode.
 			 */
 #ifdef ATH_SUPERG_XR
 			if (!IEEE80211_ADDR_EQ(bssid, vap->iv_bss->ni_bssid) &&
-			    !IEEE80211_ADDR_EQ(bssid, dev->broadcast)) {
+			    !IEEE80211_ADDR_EQ(bssid, dev->broadcast) &&
+				(subtype != IEEE80211_FC0_SUBTYPE_BEACON)) {
 				/*
 				 * allow MGT frames to vap->iv_xrvap.
 				 * this will allow roaming between  XR and normal vaps
@@ -352,7 +353,8 @@
 			}
 #else
 			if (!IEEE80211_ADDR_EQ(bssid, vap->iv_bss->ni_bssid) &&
-			    !IEEE80211_ADDR_EQ(bssid, dev->broadcast)) {
+			    !IEEE80211_ADDR_EQ(bssid, dev->broadcast) &&
+				(subtype != IEEE80211_FC0_SUBTYPE_BEACON)) {
 				/* not interested in */
 				IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_INPUT,
 					bssid, NULL, "%s", "not to bss");
@@ -2971,7 +2973,7 @@
 	u_int8_t *frm, *efrm;
 	u_int8_t *ssid, *rates, *xrates, *suppchan, *wpa, *rsn, *wme, *ath;
 	u_int8_t rate;
-	int reassoc, resp, allocbs = 0;
+	int reassoc, resp, allocbs = 0, has_erp = 0;
 	u_int8_t qosinfo;
 
 	if (ni_or_null == NULL)
@@ -2996,11 +2998,15 @@
 		 *    o station mode when associated (to collect state
 		 *      updates such as 802.11g slot time), or
 		 *    o adhoc mode (to discover neighbors)
+		 *    o ap mode in protection mode (beacons only)
 		 * Frames otherwise received are discarded.
 		 */
 		if (!((ic->ic_flags & IEEE80211_F_SCAN) ||
 		    (vap->iv_opmode == IEEE80211_M_STA && ni->ni_associd) ||
-		    vap->iv_opmode == IEEE80211_M_IBSS)) {
+		    (vap->iv_opmode == IEEE80211_M_IBSS) ||
+			((subtype == IEEE80211_FC0_SUBTYPE_BEACON) &&
+			 (vap->iv_opmode == IEEE80211_M_HOSTAP) &&
+			 (ic->ic_protmode != IEEE80211_PROT_NONE)))) {
 			vap->iv_stats.is_rx_mgtdiscard++;
 			return;
 		}
@@ -3083,6 +3089,7 @@
 					break;
 				}
 				scan.erp = frm[2];
+				has_erp = 1;
 				break;
 			case IEEE80211_ELEMID_RSN:
 				scan.rsn = frm;
@@ -3300,6 +3307,20 @@
 				ieee80211_bg_scan(vap);
 			return;
 		}
+
+		/* Update AP protection mode when in 11G mode */
+		if ((vap->iv_opmode == IEEE80211_M_HOSTAP) &&
+			IEEE80211_IS_CHAN_ANYG(ic->ic_curchan)) {
+
+			/* Assume no ERP IE == 11b AP */
+			if ((!has_erp || (has_erp && (scan.erp & IEEE80211_ERP_NON_ERP_PRESENT))) &&
+				!(ic->ic_flags & IEEE80211_F_USEPROT)) {
+
+				ic->ic_flags |= IEEE80211_F_USEPROT;
+				ic->ic_flags_ext |= IEEE80211_FEXT_ERPUPDATE;
+			}
+		}
+
 		/*
 		 * If scanning, just pass information to the scan module.
 		 */
Index: madwifi-dfs-r3053/net80211/ieee80211_node.c
===================================================================
--- madwifi-dfs-r3053.orig/net80211/ieee80211_node.c	2007-12-13 05:25:10.314213240 +0100
+++ madwifi-dfs-r3053/net80211/ieee80211_node.c	2007-12-13 05:25:13.938419772 +0100
@@ -380,10 +380,16 @@
 	/* Update country ie information */
 	ieee80211_build_countryie(ic);
 
-	if (IEEE80211_IS_CHAN_HALF(chan))
+	if (IEEE80211_IS_CHAN_HALF(chan)) {
 		ni->ni_rates = ic->ic_sup_half_rates;
-	else if (IEEE80211_IS_CHAN_QUARTER(chan))
+	} else if (IEEE80211_IS_CHAN_QUARTER(chan)) {
 		ni->ni_rates = ic->ic_sup_quarter_rates;
+	}
+
+	if ((vap->iv_flags & IEEE80211_F_PUREG) &&
+		IEEE80211_IS_CHAN_ANYG(chan)) {
+		ieee80211_setpuregbasicrates(&ni->ni_rates);
+	}
 
 	(void) ieee80211_sta_join1(PASS_NODE(ni));
 }
Index: madwifi-dfs-r3053/net80211/ieee80211_proto.c
===================================================================
--- madwifi-dfs-r3053.orig/net80211/ieee80211_proto.c	2007-12-13 05:25:10.322213696 +0100
+++ madwifi-dfs-r3053/net80211/ieee80211_proto.c	2007-12-13 05:25:13.942420001 +0100
@@ -584,6 +584,28 @@
 	{ 4, { 2, 4, 11, 22 } },	/* IEEE80211_MODE_TURBO_G (mixed b/g) */
 };
 
+static const struct ieee80211_rateset basicpureg[] = {
+    { 7, {2, 4, 11, 22, 12, 24, 48 } },
+};
+
+/*
+ * Mark basic rates for the 11g rate table based on the pureg setting
+ */
+void
+ieee80211_setpuregbasicrates(struct ieee80211_rateset *rs)
+{
+	int i, j;
+
+	for (i = 0; i < rs->rs_nrates; i++) {
+		rs->rs_rates[i] &= IEEE80211_RATE_VAL;
+		for (j = 0; j < basicpureg[0].rs_nrates; j++)
+			if (basicpureg[0].rs_rates[j] == rs->rs_rates[i]) {
+				rs->rs_rates[i] |= IEEE80211_RATE_BASIC;
+				break;
+			}
+	}
+}
+
 /*
  * Mark the basic rates for the 11g rate table based on the
  * specified mode.  For 11b compatibility we mark only 11b
Index: madwifi-dfs-r3053/net80211/ieee80211_var.h
===================================================================
--- madwifi-dfs-r3053.orig/net80211/ieee80211_var.h	2007-12-13 05:25:10.330214154 +0100
+++ madwifi-dfs-r3053/net80211/ieee80211_var.h	2007-12-13 05:25:13.942420001 +0100
@@ -668,6 +668,7 @@
 void ieee80211_build_sc_ie(struct ieee80211com *);
 void ieee80211_dfs_action(struct ieee80211com *);
 void ieee80211_expire_channel_non_occupancy_restrictions(struct ieee80211com *);
+void ieee80211_setpuregbasicrates(struct ieee80211_rateset *rs);
 
 /*
  * Iterate through ic_channels to enumerate all distinct ic_ieee channel numbers.