On Mon, 21 Aug 2006 09:41:14 +0200, Johannes Berg wrote:
> I think this is not correct if a STA is removed for which packets
> are buffered, but if it is still wrong then that case was never
> correct to start with if the hw has a set_tim callback.
You're right, good catch.
Just minor things:
> [...]
> - if (num_bits) {
> + if (have_bits) {
> /* Find largest even number N1 so that bits numbered 1 through
> * (N1 x 8) - 1 in the bitmap are 0 and number N2 so that bits
> * (N2 + 1) x 8 through 2007 are 0. */
> n1 = 0;
> - for (i = 0; i < sizeof(bitmap); i++) {
> - if (bitmap[i]) {
> + /* 251 = max size of tim bitmap in beacon */
> + for (i = 0; i < 251; i++) {
Please, use a constant here.
> [...]
> @@ -211,13 +213,10 @@ struct ieee80211_if_ap {
> u8 *generic_elem;
> size_t generic_elem_len;
>
> - /* TODO: sta_aid could be replaced by 2008-bit large bitfield of
> - * that could be used in TIM element generation. This would also
> - * make TIM element generation a bit faster. */
> - /* AID mapping to station data. NULL, if AID is free. AID is in the
> - * range 1..2007 and sta_aid[i] corresponds to AID i+1. */
> - struct sta_info *sta_aid[MAX_AID_TABLE_SIZE];
> - int max_aid; /* largest aid currently in use */
> + /* yes, this looks ugly, but guarantees that we can later use
> + * bitmap_empty :)
> + * NB: don't ever use set_bit, use bss_tim_set/bss_tim_clear! */
> + u8 tim[sizeof(unsigned long)*BITS_TO_LONGS(MAX_AID_TABLE_SIZE+1)];
Hm, adding spaces here would extend the line above 80 characters... But
this way it doesn't look good. What to do here? I'd prefer leaving the
line a little over 80 chars in this case. What do you think?
> [...]
> --- wireless-dev.orig/net/d80211/sta_info.c 2006-08-20 14:56:17.418192788
> +0200
> +++ wireless-dev/net/d80211/sta_info.c 2006-08-20 14:56:20.588192788
> +0200
> @@ -424,13 +424,6 @@ void sta_info_remove_aid_ptr(struct sta_
> sdata = IEEE80211_DEV_TO_SUB_IF(sta->dev);
> if (sta->aid <= 0 || !sdata->bss)
> return;
> -
> - sdata->bss->sta_aid[sta->aid - 1] = NULL;
> - if (sta->aid == sdata->bss->max_aid) {
> - while (sdata->bss->max_aid > 0 &&
> - !sdata->bss->sta_aid[sdata->bss->max_aid - 1])
> - sdata->bss->max_aid--;
> - }
> }
Why are you not calling bss_tim_clear here? Am I missing something?
Also, adding hw->set_tim call here should fix the problem you described
at the beginning of the mail.
Thanks,
Jiri
--
Jiri Benc
SUSE Labs
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html