ath9k: Fix up hardware mode and beacons with multiple vifs.
RFC 1/2 ath9k: Fix up hardware mode and beacons with multiple vifs.
From: Ben Greear <[email protected]>
When using a mixture of AP and Station interfaces, the hardware mode was using the type of the last VIF registered. Instead, we should keep track of the number of different types of vifs and set the mode accordingly.
In addtion, use the vif type instead of hardware opmode when dealing with beacons.
Attempt to move some of the common setup code into smaller methods so we can re-use it when changing vif mode as well as adding/deleting vifs.
This needs review.
---
:100644 100644 3108699... a2da259... M drivers/net/wireless/ath/ath9k/ath9k.h
:100644 100644 385ba03... 8de591e... M drivers/net/wireless/ath/ath9k/beacon.c
:100644 100644 0452580... 1a65e53... M drivers/net/wireless/ath/ath9k/main.c
:100644 100644 ea2f67c... 9a2b4a8... M drivers/net/wireless/ath/ath9k/recv.c
drivers/net/wireless/ath/ath9k/ath9k.h | 10 +- drivers/net/wireless/ath/ath9k/beacon.c | 14 +- drivers/net/wireless/ath/ath9k/main.c | 263 ++++++++++++++++++++++--------- drivers/net/wireless/ath/ath9k/recv.c | 17 ++- 4 files changed, 214 insertions(+), 90 deletions(-)
drivers/net/wireless/ath/ath9k/ath9k.h +8 -2
@@ -607,10 +607,15 @@ struct ath_softc {u32 sc_flags;/* SC_OP_* */ u16 ps_flags;/* PS_* */ u16 curtxpow; -u8 nbcnvifs; -u16 nvifs;bool ps_enabled;bool ps_idle; +short nbcnvifs; +short nvifs; +short naps;/* number of APs */ +short nmeshes; +short nstations; +short nwds; +short nadhocs;unsigned long ps_usecount;struct ath_config config;
@@ -694,6 +699,7 @@ int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw,void ath_radio_enable (struct ath_softc *sc,struct ieee80211_hw *hw);void ath_radio_disable (struct ath_softc *sc,struct ieee80211_hw *hw);bool ath9k_setpower (struct ath_softc *sc,enum ath9k_power_mode mode); +bool ath9k_uses_beacons (int type);#ifdef CONFIG_PCI int ath_pci_init (void );
drivers/net/wireless/ath/ath9k/beacon.c +6 -8
@@ -244,9 +244,7 @@ int ath_beacon_alloc(struct ath_wiphy *aphy, struct ieee80211_vif *vif) struct ath_buf, list);list_del (&avp->av_bcbuf->list); -if (sc->sc_ah->opmode ==NL80211_IFTYPE_AP || - sc->sc_ah->opmode ==NL80211_IFTYPE_ADHOC || - sc->sc_ah->opmode ==NL80211_IFTYPE_MESH_POINT ) { +if (ath9k_uses_beacons (vif->type)) {int slot;/* * Assign the vif to a beacon xmit slot. As
@@ -282,7 +280,7 @@ int ath_beacon_alloc(struct ath_wiphy *aphy, struct ieee80211_vif *vif)/* NB: the beacon data buffer must be 32-bit aligned. */ skb =ieee80211_beacon_get (sc->hw, vif);if (skb ==NULL ) { -ath_dbg (common,ATH_DBG_BEACON ,"cannot get skb\n" ); +ath_err (common,"ieee80211_beacon_get failed\n" );return -ENOMEM ; }
@@ -720,10 +718,10 @@ void ath_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif) iftype = sc->sc_ah->opmode; } - cur_conf->listen_interval =1 ; - cur_conf->dtim_count =1 ; - cur_conf->bmiss_timeout = -ATH_DEFAULT_BMISS_LIMIT * cur_conf->beacon_interval; + cur_conf->listen_interval =1 ; + cur_conf->dtim_count =1 ; + cur_conf->bmiss_timeout = +ATH_DEFAULT_BMISS_LIMIT * cur_conf->beacon_interval;/* * It looks like mac80211 may end up using beacon interval of zero in
drivers/net/wireless/ath/ath9k/main.c +185 -78
342 lines not on this page · raw message
drivers/net/wireless/ath/ath9k/recv.c +15 -2
@@ -589,8 +589,14 @@ static void ath_rx_ps_beacon(struct ath_softc *sc, struct sk_buff *skb)return ; mgmt = (struct ieee80211_mgmt *)skb->data; -if (memcmp (common->curbssid, mgmt->bssid,ETH_ALEN ) !=0 ) +if (memcmp (common->curbssid, mgmt->bssid,ETH_ALEN ) !=0 ) { +/* TODO: This doesn't work well if you have stations +* associated to two different APs because curbssid +* is just the last AP that any of the stations associated +* with. +*/ return ;/* not from our current AP */ + } sc->ps_flags &= ~PS_WAIT_FOR_BEACON ;
@@ -980,13 +986,20 @@ static void ath9k_process_rssi(struct ath_common *common,int last_rssi;__le16 fc; +/* TODO: Maybe need to accept this if we have STA vifs active?? */ if (ah->opmode !=NL80211_IFTYPE_STATION )return ; fc = hdr->frame_control;if (!ieee80211_is_beacon (fc) || -compare_ether_addr (hdr->addr3, common->curbssid)) +compare_ether_addr (hdr->addr3, common->curbssid)) { +/* TODO: This doesn't work well if you have stations +* associated to two different APs because curbssid +* is just the last AP that any of the stations associated +* with. +*/ return ; + }if (rx_stats->rs_rssi !=ATH9K_RSSI_BAD && !rx_stats->rs_moreaggr)ATH_RSSI_LPF (aphy->last_rssi, rx_stats->rs_rssi);
Signature · 1 line
1.7.2.3
RFC 2/2 ath9k: Add 'misc' file to debugfs, fix queue indexes.
From: Ben Greear <[email protected]>
Add a misc file to show hardware op-mode, irq setup, number of various types of VIFs and more.
Also, previous patches were using the wrong xmit queue indexes. Change to use the internal ath9k indexes instead of the mac80211 queue indexes.
---
:100644 100644 b0cb792... 5005621... M drivers/net/wireless/ath/ath9k/debug.c
drivers/net/wireless/ath/ath9k/debug.c | 128 +++++++++++++++++++++++++++++--- 1 files changed, 116 insertions(+), 12 deletions(-)
drivers/net/wireless/ath/ath9k/debug.c +116 -12
@@ -595,10 +595,10 @@ static const struct file_operations fops_wiphy = {do { \ len +=snprintf (buf + len, size - len, \"%s%13u%11u%10u%10u\n" , str, \ - (unsigned int )(sc->tx.txq[WME_AC_BE ].elem), \ - (unsigned int )(sc->tx.txq[WME_AC_BK ].elem), \ - (unsigned int )(sc->tx.txq[WME_AC_VI ].elem), \ - (unsigned int )(sc->tx.txq[WME_AC_VO ].elem)); \ + (unsigned int )(sc->tx.txq[ATH_TXQ_AC_BE ].elem), \ + (unsigned int )(sc->tx.txq[ATH_TXQ_AC_BK ].elem), \ + (unsigned int )(sc->tx.txq[ATH_TXQ_AC_VI ].elem), \ + (unsigned int )(sc->tx.txq[ATH_TXQ_AC_VO ].elem)); \if (len >= size) \ goto done; \ }while (0 )
@@ -607,10 +607,10 @@ do { \do { \ len +=snprintf (buf + len, size - len, \"%s%13i%11i%10i%10i\n" , str, \ -list_empty (&sc->tx.txq[WME_AC_BE ].elem), \ -list_empty (&sc->tx.txq[WME_AC_BK ].elem), \ -list_empty (&sc->tx.txq[WME_AC_VI ].elem), \ -list_empty (&sc->tx.txq[WME_AC_VO ].elem)); \ +list_empty (&sc->tx.txq[ATH_TXQ_AC_BE ].elem), \ +list_empty (&sc->tx.txq[ATH_TXQ_AC_BK ].elem), \ +list_empty (&sc->tx.txq[ATH_TXQ_AC_VI ].elem), \ +list_empty (&sc->tx.txq[ATH_TXQ_AC_VO ].elem)); \if (len >= size) \ goto done; \ }while (0 )
@@ -657,10 +657,10 @@ static ssize_t read_file_xmit(struct file *file, char __user *user_buf,PR ("hw-tx-proc-desc: " , txprocdesc); len +=snprintf (buf + len, size - len,"%s%11p%11p%10p%10p\n" ,"txq-memory-address:" , - &(sc->tx.txq[WME_AC_BE ]), - &(sc->tx.txq[WME_AC_BK ]), - &(sc->tx.txq[WME_AC_VI ]), - &(sc->tx.txq[WME_AC_VO ])); + &(sc->tx.txq[ATH_TXQ_AC_BE ]), + &(sc->tx.txq[ATH_TXQ_AC_BK ]), + &(sc->tx.txq[ATH_TXQ_AC_VI ]), + &(sc->tx.txq[ATH_TXQ_AC_VO ]));if (len >= size) goto done;
@@ -777,6 +777,99 @@ done:return retval; } +static ssize_t read_file_misc (struct file *file,char __user *user_buf, +size_t count,loff_t *ppos) +{ +struct ath_softc *sc = file->private_data; +struct ath_common *common =ath9k_hw_common (sc->sc_ah); +struct ath_hw *ah = sc->sc_ah; +char *buf; +unsigned int len =0 , size =8000 ; +ssize_t retval =0 ; +const char *tmp; +unsigned int reg; + + buf =kzalloc (size,GFP_KERNEL ); +if (buf ==NULL ) +return -ENOMEM ; + +switch (sc->sc_ah->opmode) { +case NL80211_IFTYPE_ADHOC : + tmp ="ADHOC" ; +break ; +case NL80211_IFTYPE_MESH_POINT : + tmp ="MESH" ; +break ; +case NL80211_IFTYPE_AP : + tmp ="AP" ; +break ; +case NL80211_IFTYPE_STATION : + tmp ="STATION" ; +break ; +default : + tmp ="???" ; +break ; + } + + len +=snprintf (buf + len, size - len, +"curbssid: %pM\n" +"OP-Mode: %s(%i)\n" +"Beacon-Timer-Register: 0x%x\n" , + common->curbssid, + tmp, (int )(sc->sc_ah->opmode), +REG_READ (ah,AR_BEACON_PERIOD )); + + reg =REG_READ (ah,AR_TIMER_MODE ); + len +=snprintf (buf + len, size - len,"Timer-Mode-Register: 0x%x (" , + reg); +if (reg &AR_TBTT_TIMER_EN ) + len +=snprintf (buf + len, size - len,"TBTT " ); +if (reg &AR_DBA_TIMER_EN ) + len +=snprintf (buf + len, size - len,"DBA " ); +if (reg &AR_SWBA_TIMER_EN ) + len +=snprintf (buf + len, size - len,"SWBA " ); +if (reg &AR_HCF_TIMER_EN ) + len +=snprintf (buf + len, size - len,"HCF " ); +if (reg &AR_TIM_TIMER_EN ) + len +=snprintf (buf + len, size - len,"TIM " ); +if (reg &AR_DTIM_TIMER_EN ) + len +=snprintf (buf + len, size - len,"DTIM " ); + len +=snprintf (buf + len, size - len,")\n" ); + + reg = sc->sc_ah->imask; + len +=snprintf (buf + len, size - len,"imask: 0x%x (" , reg); +if (reg &ATH9K_INT_SWBA ) + len +=snprintf (buf + len, size - len,"SWBA " ); +if (reg &ATH9K_INT_BMISS ) + len +=snprintf (buf + len, size - len,"BMISS " ); +if (reg &ATH9K_INT_CST ) + len +=snprintf (buf + len, size - len,"CST " ); +if (reg &ATH9K_INT_RX ) + len +=snprintf (buf + len, size - len,"RX " ); +if (reg &ATH9K_INT_RXHP ) + len +=snprintf (buf + len, size - len,"RXHP " ); +if (reg &ATH9K_INT_RXLP ) + len +=snprintf (buf + len, size - len,"RXLP " ); +if (reg &ATH9K_INT_BB_WATCHDOG ) + len +=snprintf (buf + len, size - len,"BB_WATCHDOG " ); +/* there are other IRQs if one wanted to add them. */ + len +=snprintf (buf + len, size - len,")\n" ); + + len +=snprintf (buf + len, size - len, +"VIF Counts: AP: %hi STA: %hi MESH: %hi WDS: %hi" +" ADHOC: %hi nvifs: %hi beacon-vifs: %hi\n" , + sc->naps, sc->nstations, sc->nmeshes, sc->nwds, + sc->nadhocs, sc->nvifs, sc->nbcnvifs); + +if (len > size) + len = size; + + retval =simple_read_from_buffer (user_buf, count, ppos, buf, len); +kfree (buf); + +return retval; +} +void ath_debug_stat_tx (struct ath_softc *sc,struct ath_buf *bf,struct ath_tx_status *ts) {
@@ -822,6 +915,13 @@ static const struct file_operations fops_stations = { .llseek = default_llseek, }; +static const struct file_operations fops_misc = { + .read = read_file_misc, + .open = ath9k_debugfs_open, + .owner =THIS_MODULE , + .llseek = default_llseek, +}; +static ssize_t read_file_recv (struct file *file,char __user *user_buf,size_t count,loff_t *ppos) {
@@ -1063,6 +1163,10 @@ int ath9k_init_debug(struct ath_hw *ah) sc, &fops_stations)) goto err; +if (!debugfs_create_file ("misc" ,S_IRUSR , sc->debug.debugfs_phy, + sc, &fops_misc)) + goto err; +if (!debugfs_create_file ("recv" ,S_IRUSR , sc->debug.debugfs_phy, sc, &fops_recv)) goto err;
Signature · 1 line
1.7.2.3
RFC 1/2 ath9k: Fix up hardware mode and beacons with multiple vifs.
In reply to greearb at candelatech.comQuoted 41 lines · greearb at candelatech.com
From: Ben Greear<[email protected]>
When using a mixture of AP and Station interfaces, the hardware mode was using the type of the last VIF registered. Instead, we should keep track of the number of different types of vifs and set the mode accordingly.
In addtion, use the vif type instead of hardware opmode when dealing with beacons.
Attempt to move some of the common setup code into smaller methods so we can re-use it when changing vif mode as well as adding/deleting vifs.
This needs review.
Signed-off-by Ben Greear<[email protected]>---
:100644 100644 3108699... a2da259... Mdrivers/net/wireless/ath/ath9k/ath9k.h
:100644 100644 385ba03... 8de591e... Mdrivers/net/wireless/ath/ath9k/beacon.c
:100644 100644 0452580... 1a65e53... Mdrivers/net/wireless/ath/ath9k/main.c
:100644 100644 ea2f67c... 9a2b4a8... Mdrivers/net/wireless/ath/ath9k/recv.cdrivers/net/wireless/ath/ath9k/ath9k.h | 10 +- drivers/net/wireless/ath/ath9k/beacon.c | 14 +- drivers/net/wireless/ath/ath9k/main.c | 263 ++++++++++++++++++++++--------- drivers/net/wireless/ath/ath9k/recv.c | 17 ++- 4 files changed, 214 insertions(+), 90 deletions(-)drivers/net/wireless/ath/ath9k/ath9k.h +0
-2@@ -607,10 +607,15 @@ struct ath_softc {u32 sc_flags;/* SC_OP_* */ u16 ps_flags;/* PS_* */ u16 curtxpow; -u8 nbcnvifs; -u16 nvifs;bool ps_enabled;bool ps_idle;
drivers/net/wireless/ath/ath9k/ath9k.h struct ath_softc { · line 621
Quoted 10 lines
drivers/net/wireless/ath/ath9k/ath9k.h +7
-0+short nbcnvifs; +short nvifs; +short naps;/* number of APs */ +short nmeshes; +short nstations; +short nwds; +short nadhocs;unsigned long ps_usecount;struct ath_config config;
Do we really need all those counters? Wouldn't it be better to iterate over active interfaces instead?
Quoted 32 lines
drivers/net/wireless/ath/ath9k/recv.c +9
-2@@ -589,8 +589,14 @@ static void ath_rx_ps_beacon(struct ath_softc *sc, struct sk_buff *skb)return ; mgmt = (struct ieee80211_mgmt *)skb->data; -if (memcmp (common->curbssid, mgmt->bssid,ETH_ALEN ) !=0 ) +if (memcmp (common->curbssid, mgmt->bssid,ETH_ALEN ) !=0 ) { +/* TODO: This doesn't work well if you have stations +* associated to two different APs because curbssid +* is just the last AP that any of the stations associated +* with. +*/ return ;/* not from our current AP */ + } sc->ps_flags&= ~PS_WAIT_FOR_BEACON ;@@ -980,13 +986,20 @@ static void ath9k_process_rssi(struct ath_common *common,int last_rssi;__le16 fc; +/* TODO: Maybe need to accept this if we have STA vifs active?? */ if (ah->opmode !=NL80211_IFTYPE_STATION )return ; fc = hdr->frame_control;if (!ieee80211_is_beacon (fc) || -compare_ether_addr (hdr->addr3, common->curbssid)) +compare_ether_addr (hdr->addr3, common->curbssid)) {
drivers/net/wireless/ath/ath9k/recv.c static void ath9k_process_rssi(struct ath_common *common, · line 1005
Quoted 10 lines
drivers/net/wireless/ath/ath9k/recv.c +6
-0+/* TODO: This doesn't work well if you have stations +* associated to two different APs because curbssid +* is just the last AP that any of the stations associated +* with. +*/ return ; + }if (rx_stats->rs_rssi !=ATH9K_RSSI_BAD && !rx_stats->rs_moreaggr)ATH_RSSI_LPF (aphy->last_rssi, rx_stats->rs_rssi);
Checking for the STA opmode is correct, this code should not be used for STA+AP. For the multi-STA case, it may make sense to process the RSSI average per vif and using the minimum for ANI.
- Felix
RFC 1/2 ath9k: Fix up hardware mode and beacons with multiple vifs.
Quoted 24 lines · Felix Fietkau
Quoted 22 lines · greearb at candelatech.com
drivers/net/wireless/ath/ath9k/ath9k.h +0
-0@@ -607,10 +607,15 @@ struct ath_softc {u32
sc_flags; /* SC_OP_* */
u16ps_flags; /* PS_* */
u16 curtxpow;
- u8 nbcnvifs;
- u16 nvifs;
boolps_enabled;
boolps_idle;
+ short nbcnvifs;
+ short nvifs;
+ short naps; /* number of APs */
+ short nmeshes;
+ short nstations;
+ short nwds;
+ short nadhocs;
unsigned longps_usecount;
Quoted 3 lines
Quoted 1 line
struct
ath_configconfig;Do we really need all those counters? Wouldn't it be better to iterate over active interfaces instead?
Well, I like the counters. If they ever do not match expected results, it will be a clue that we have bugs in our setup/teardown/change logic.
Seems we use counters like this for ath5k with good results, btw.
Quoted 11 lines
Quoted 11 lines
if (!ieee80211_is_beacon(fc) ||
-compare_ether_addr(hdr->addr3, common->curbssid))
+compare_ether_addr(hdr->addr3, common->curbssid)) {
+ /* TODO: This doesn't work well if you have stations
+ * associated to two different APs because curbssid
+ * is just the last AP that any of the stations associated
+ * with.
+ */
return;
+ }
Quoted 5 lines
Quoted 2 lines
if (
rx_stats->rs_rssi!= ATH9K_RSSI_BAD&& !rx_stats->rs_moreaggr)ATH_RSSI_LPF(aphy->last_rssi, rx_stats->rs_rssi);Checking for the STA opmode is correct, this code should not be used for STA+AP. For the multi-STA case, it may make sense to process the RSSI average per vif and using the minimum for ANI.
Ok. I'll leave that alone for now.
Thanks,
Ben
Signature · 2 lines
Ben Greear <[email protected]> Candela Technologies Inc http://www.candelatech.com
RFC 1/2 ath9k: Fix up hardware mode and beacons with multiple vifs.
In reply to Felix FietkauQuoted 2 lines · Felix Fietkau
Do we really need all those counters? Wouldn't it be better to iterate over active interfaces instead?
I think iterating over active interfaces is better, especially if we set up more fine-graned ah-> variables that make sense in themselves for stuff like power save and tsf sync. But that's just my two cents.
As an example of something that may be more or less impossible to do without iteration consider multiple vifs with different beacon intervals. This could be handled by computing a greatest common devisor of all beacon intervals and using this for SWBA.
/Bj?rn
RFC 1/2 ath9k: Fix up hardware mode and beacons with multiple vifs.
Quoted 4 lines · Bj?rn Smedman
Quoted 2 lines · Felix Fietkau
Do we really need all those counters? Wouldn't it be better to iterate over active interfaces instead?
Quoted 8 lines
I think iterating over active interfaces is better, especially if we set up more fine-graned ah-> variables that make sense in themselves for stuff like power save and tsf sync. But that's just my two cents.
As an example of something that may be more or less impossible to do without iteration consider multiple vifs with different beacon intervals. This could be handled by computing a greatest common devisor of all beacon intervals and using this for SWBA.
We already iterate when setting the bssid mask. I could have that method calculate the vif counts with little extra cost. I want to avoid any more linear iterations over the interface list if possible, so hopefully I can re-use that one iteration and not add more...
Thanks,
Ben
Signature · 2 lines
Ben Greear <[email protected]> Candela Technologies Inc http://www.candelatech.com
RFC 1/2 ath9k: Fix up hardware mode and beacons with multiple vifs.
In reply to greearb at candelatech.comQuoted 23 lines · greearb at candelatech.com
From: Ben Greear <[email protected]>
When using a mixture of AP and Station interfaces, the hardware mode was using the type of the last VIF registered. Instead, we should keep track of the number of different types of vifs and set the mode accordingly.
In addtion, use the vif type instead of hardware opmode when dealing with beacons.
Attempt to move some of the common setup code into smaller methods so we can re-use it when changing vif mode as well as adding/deleting vifs.
This needs review.
Signed-off-by Ben Greear <[email protected]>---
:100644 100644 3108699... a2da259... Mdrivers/net/wireless/ath/ath9k/ath9k.h
:100644 100644 385ba03... 8de591e... Mdrivers/net/wireless/ath/ath9k/beacon.c
:100644 100644 0452580... 1a65e53... Mdrivers/net/wireless/ath/ath9k/main.c
:100644 100644 ea2f67c... 9a2b4a8... Mdrivers/net/wireless/ath/ath9k/recv.c
Quoted 6 lines
drivers/net/wireless/ath/ath9k/ath9k.h | 10 +- drivers/net/wireless/ath/ath9k/beacon.c | 14 +- drivers/net/wireless/ath/ath9k/main.c | 263 ++++++++++++++++++++++--------- drivers/net/wireless/ath/ath9k/recv.c | 17 ++- 4 files changed, 214 insertions(+), 90 deletions(-)
It would be really useful to have both an AP and MESH vif. With the mesh and ap vif's bridged, a station connected to the ap could ping outside the mesh. Currently, if you add the mesh vif and then the ap vif, it sort of works. The other way around, the mesh interval value causes beacons to be sent only for the vif associated with slot 0.
Is it possible to consider this case as you overhaul ath9k beaconing?
Steve
RFC 1/2 ath9k: Fix up hardware mode and beacons with multiple vifs.
Quoted 31 lines · Steve Brown
Quoted 23 lines · greearb at candelatech.com
From: Ben Greear<[email protected]>
When using a mixture of AP and Station interfaces, the hardware mode was using the type of the last VIF registered. Instead, we should keep track of the number of different types of vifs and set the mode accordingly.
In addtion, use the vif type instead of hardware opmode when dealing with beacons.
Attempt to move some of the common setup code into smaller methods so we can re-use it when changing vif mode as well as adding/deleting vifs.
This needs review.
Signed-off-by Ben Greear<[email protected]>---
:100644 100644 3108699... a2da259... Mdrivers/net/wireless/ath/ath9k/ath9k.h
:100644 100644 385ba03... 8de591e... Mdrivers/net/wireless/ath/ath9k/beacon.c
:100644 100644 0452580... 1a65e53... Mdrivers/net/wireless/ath/ath9k/main.c
:100644 100644 ea2f67c... 9a2b4a8... Mdrivers/net/wireless/ath/ath9k/recv.cQuoted 6 lines
drivers/net/wireless/ath/ath9k/ath9k.h | 10 +- drivers/net/wireless/ath/ath9k/beacon.c | 14 +- drivers/net/wireless/ath/ath9k/main.c | 263 ++++++++++++++++++++++--------- drivers/net/wireless/ath/ath9k/recv.c | 17 ++- 4 files changed, 214 insertions(+), 90 deletions(-)
Quoted 7 lines
It would be really useful to have both an AP and MESH vif. With the mesh and ap vif's bridged, a station connected to the ap could ping outside the mesh. Currently, if you add the mesh vif and then the ap vif, it sort of works. The other way around, the mesh interval value causes beacons to be sent only for the vif associated with slot 0.
Is it possible to consider this case as you overhaul ath9k beaconing?
Perhaps someone else would be better. I have no way to test mesh right now, and still do not understand this code too well.
Hopefully the vif-counting work would help with dealing with your scenario, however...
Also, could you try with my patch(es)? Part of the problem with the old code is that if you added mesh second, you would not be in AP mode anymore. I think that part will be fixed now. There may be other issues remaining, however.
Thanks,
Ben
Signature · 2 lines
Ben Greear <[email protected]> Candela Technologies Inc http://www.candelatech.com
RFC 1/2 ath9k: Fix up hardware mode and beacons with multiple vifs.
In reply to greearb at candelatech.comQuoted 7 lines · On Fri, Jan 14, 2011 at 6:27 PM, <[email protected]> wrote:
From: Ben Greear <[email protected]>
When using a mixture of AP and Station interfaces, the hardware mode was using the type of the last VIF registered. ?Instead, we should keep track of the number of different types of vifs and set the mode accordingly.
Thank you for your efforts to get multi-vifs working better.
This is another comment that is a little out of place but when I see the identifier beacon_interval in this context I cannot help bringing up per-vif settings as a related problem: If I read the code (or rather the lack of code) correctly the beacon interval of the last (or first?) beaconing vif added will be used to set up beacon tx, whereas the actual beacon contents will reflect the beacon intervals configured for individual vifs which may all be different... The same goes for e.g. tx queue configuration, no?
It feels like we need a general multi-vif cleanup here but it's too big for me unfortunately.
/Bj?rn
RFC 1/2 ath9k: Fix up hardware mode and beacons with multiple vifs.
Quoted 20 lines · Bj?rn Smedman
Quoted 7 lines · On Fri, Jan 14, 2011 at 6:27 PM,<[email protected]> wrote:
From: Ben Greear<[email protected]>
When using a mixture of AP and Station interfaces, the hardware mode was using the type of the last VIF registered. Instead, we should keep track of the number of different types of vifs and set the mode accordingly.
Thank you for your efforts to get multi-vifs working better.
This is another comment that is a little out of place but when I see the identifier
beacon_intervalin this context I cannot help bringing up per-vif settings as a related problem: If I read the code (or rather the lack of code) correctly the beacon interval of the last (or first?) beaconing vif added will be used to set up beacon tx, whereas the actual beacon contents will reflect the beacon intervals configured for individual vifs which may all be different... The same goes for e.g. tx queue configuration, no?
Quoted 2 lines
It feels like we need a general multi-vif cleanup here but it's too big for me unfortunately.
I haven't looked at beacons in that detail yet.
If I can get agreement on the current patch (and the dozen or so preceding it), then I can take a closer look at beacon intervals. I don't think that needs to be done as part of this vif/opmode/beaconing cleanup though.
New patch is coming shortly, as soon as I get some testing completed.
Thanks,
Ben
Signature · 2 lines
Ben Greear <[email protected]> Candela Technologies Inc http://www.candelatech.com
RFC 1/2 ath9k: Fix up hardware mode and beacons with multiple vifs.
In reply to Björn SmedmanQuoted 11 lines · Bj?rn Smedman
Thank you for your efforts to get multi-vifs working better.
This is another comment that is a little out of place but when I see the identifier
beacon_intervalin this context I cannot help bringing up per-vif settings as a related problem: If I read the code (or rather the lack of code) correctly the beacon interval of the last (or first?) beaconing vif added will be used to set up beacon tx, whereas the actual beacon contents will reflect the beacon intervals configured for individual vifs which may all be different... The same goes for e.g. tx queue configuration, no?
Quoted 5 lines
It feels like we need a general multi-vif cleanup here but it's too big for me unfortunately.
/Bj?rn
_______________________________________________
For instance, an ap vif has a ~100ms interval and a mesh vif has a ~1000ms interval. I don't see how to avoid a per vif interval.
Steve
RFC 1/2 ath9k: Fix up hardware mode and beacons with multiple vifs.
2011/1/15 Steve Brown <[email protected]>:
Quoted 9 lines · Bj?rn Smedman
Quoted 8 lines
This is another comment that is a little out of place but when I see the identifier
beacon_intervalin this context I cannot help bringing up per-vif settings as a related problem: If I read the code (or rather the lack of code) correctly the beacon interval of the last (or first?) beaconing vif added will be used to set up beacon tx, whereas the actual beacon contents will reflect the beacon intervals configured for individual vifs which may all be different... The same goes for e.g. tx queue configuration, no?
[snip]
Quoted 2 lines
For instance, an ap vif has a ~100ms interval and a mesh vif has a ~1000ms interval. I don't see how to avoid a per vif interval.
I agree. We should fix ath9k so it works correctly even if beacon interval is different for different vifs (within some reasonable limits).
In the mean time, as a workaround, try to configure the same beacon interval for all vifs.
/Bj?rn
RFC 1/2 ath9k: Fix up hardware mode and beacons with multiple vifs.
Quoted 7 lines · Bj?rn Smedman
2011/1/15 Steve Brown <[email protected]>:
Quoted 2 lines
For instance, an ap vif has a ~100ms interval and a mesh vif has a ~1000ms interval. I don't see how to avoid a per vif interval.
I agree. We should fix ath9k so it works correctly even if beacon interval is different for different vifs (within some reasonable limits).
Yes, up to a limit. Handling something like 100 TU on one vif and 1000 TU on another is fine, but something like 100 TU and 103 TU would need to be forced to use the same interval. I've been thinking of adding some kind of mechanism for the driver to override Beacon interval in such cases (which would need to go back all the way to user space to hostapd in case of AP mode).
Signature · 1 line
Jouni Malinen PGP id EFC895FA