mac80211: provide sequence numbers
I've come to think that not providing sequence numbers for the normal STA mode case was a mistake, at least two drivers now had to implement code they wouldn't otherwise need, and I believe at76_usb and adm8211 might be broken. This patch makes mac80211 assign a sequence number to all those frames that need one except beacons. That means that if a driver only implements modes that do not do beaconing it need not worry about the sequence number. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
2e20cc3986
commit
94778280fa
|
@ -67,7 +67,6 @@ struct p54_common {
|
||||||
int (*open)(struct ieee80211_hw *dev);
|
int (*open)(struct ieee80211_hw *dev);
|
||||||
void (*stop)(struct ieee80211_hw *dev);
|
void (*stop)(struct ieee80211_hw *dev);
|
||||||
int mode;
|
int mode;
|
||||||
u16 seqno;
|
|
||||||
u16 rx_mtu;
|
u16 rx_mtu;
|
||||||
u8 headroom;
|
u8 headroom;
|
||||||
u8 tailroom;
|
u8 tailroom;
|
||||||
|
|
|
@ -856,19 +856,6 @@ static int p54_tx(struct ieee80211_hw *dev, struct sk_buff *skb)
|
||||||
if (padding)
|
if (padding)
|
||||||
txhdr->align[0] = padding;
|
txhdr->align[0] = padding;
|
||||||
|
|
||||||
/* FIXME: The sequence that follows is needed for this driver to
|
|
||||||
* work with mac80211 since "mac80211: fix TX sequence numbers".
|
|
||||||
* As with the temporary code in rt2x00, changes will be needed
|
|
||||||
* to get proper sequence numbers on beacons. In addition, this
|
|
||||||
* patch places the sequence number in the hardware state, which
|
|
||||||
* limits us to a single virtual state.
|
|
||||||
*/
|
|
||||||
if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) {
|
|
||||||
if (info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT)
|
|
||||||
priv->seqno += 0x10;
|
|
||||||
ieee80211hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG);
|
|
||||||
ieee80211hdr->seq_ctrl |= cpu_to_le16(priv->seqno);
|
|
||||||
}
|
|
||||||
/* modifies skb->cb and with it info, so must be last! */
|
/* modifies skb->cb and with it info, so must be last! */
|
||||||
p54_assign_address(dev, skb, hdr, skb->len);
|
p54_assign_address(dev, skb, hdr, skb->len);
|
||||||
|
|
||||||
|
@ -1392,6 +1379,11 @@ struct ieee80211_hw *p54_init_common(size_t priv_data_len)
|
||||||
IEEE80211_HW_SIGNAL_DBM |
|
IEEE80211_HW_SIGNAL_DBM |
|
||||||
IEEE80211_HW_NOISE_DBM;
|
IEEE80211_HW_NOISE_DBM;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* XXX: when this driver gets support for any mode that
|
||||||
|
* requires beacons (AP, MESH, IBSS) then it must
|
||||||
|
* implement IEEE80211_TX_CTL_ASSIGN_SEQ.
|
||||||
|
*/
|
||||||
dev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
|
dev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
|
||||||
|
|
||||||
dev->channel_change_time = 1000; /* TODO: find actual value */
|
dev->channel_change_time = 1000; /* TODO: find actual value */
|
||||||
|
|
|
@ -100,7 +100,6 @@ struct rtl8187_priv {
|
||||||
struct usb_device *udev;
|
struct usb_device *udev;
|
||||||
u32 rx_conf;
|
u32 rx_conf;
|
||||||
u16 txpwr_base;
|
u16 txpwr_base;
|
||||||
u16 seqno;
|
|
||||||
u8 asic_rev;
|
u8 asic_rev;
|
||||||
u8 is_rtl8187b;
|
u8 is_rtl8187b;
|
||||||
enum {
|
enum {
|
||||||
|
|
|
@ -241,20 +241,6 @@ static int rtl8187_tx(struct ieee80211_hw *dev, struct sk_buff *skb)
|
||||||
ep = epmap[skb_get_queue_mapping(skb)];
|
ep = epmap[skb_get_queue_mapping(skb)];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME: The sequence that follows is needed for this driver to
|
|
||||||
* work with mac80211 since "mac80211: fix TX sequence numbers".
|
|
||||||
* As with the temporary code in rt2x00, changes will be needed
|
|
||||||
* to get proper sequence numbers on beacons. In addition, this
|
|
||||||
* patch places the sequence number in the hardware state, which
|
|
||||||
* limits us to a single virtual state.
|
|
||||||
*/
|
|
||||||
if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) {
|
|
||||||
if (info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT)
|
|
||||||
priv->seqno += 0x10;
|
|
||||||
ieee80211hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG);
|
|
||||||
ieee80211hdr->seq_ctrl |= cpu_to_le16(priv->seqno);
|
|
||||||
}
|
|
||||||
|
|
||||||
info->driver_data[0] = dev;
|
info->driver_data[0] = dev;
|
||||||
info->driver_data[1] = urb;
|
info->driver_data[1] = urb;
|
||||||
|
|
||||||
|
@ -1187,6 +1173,10 @@ static int __devinit rtl8187_probe(struct usb_interface *intf,
|
||||||
dev->max_signal = 65;
|
dev->max_signal = 65;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* XXX: Once this driver supports anything that requires
|
||||||
|
* beacons it must implement IEEE80211_TX_CTL_ASSIGN_SEQ.
|
||||||
|
*/
|
||||||
dev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
|
dev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
|
||||||
|
|
||||||
if ((id->driver_info == DEVICE_RTL8187) && priv->is_rtl8187b)
|
if ((id->driver_info == DEVICE_RTL8187) && priv->is_rtl8187b)
|
||||||
|
|
|
@ -438,6 +438,8 @@ struct ieee80211_sub_if_data {
|
||||||
struct ieee80211_key *keys[NUM_DEFAULT_KEYS];
|
struct ieee80211_key *keys[NUM_DEFAULT_KEYS];
|
||||||
struct ieee80211_key *default_key;
|
struct ieee80211_key *default_key;
|
||||||
|
|
||||||
|
u16 sequence_number;
|
||||||
|
|
||||||
/* BSS configuration for this interface. */
|
/* BSS configuration for this interface. */
|
||||||
struct ieee80211_bss_conf bss_conf;
|
struct ieee80211_bss_conf bss_conf;
|
||||||
|
|
||||||
|
|
|
@ -600,8 +600,18 @@ ieee80211_tx_h_sequence(struct ieee80211_tx_data *tx)
|
||||||
if (ieee80211_hdrlen(hdr->frame_control) < 24)
|
if (ieee80211_hdrlen(hdr->frame_control) < 24)
|
||||||
return TX_CONTINUE;
|
return TX_CONTINUE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Anything but QoS data that has a sequence number field
|
||||||
|
* (is long enough) gets a sequence number from the global
|
||||||
|
* counter.
|
||||||
|
*/
|
||||||
if (!ieee80211_is_data_qos(hdr->frame_control)) {
|
if (!ieee80211_is_data_qos(hdr->frame_control)) {
|
||||||
|
/* driver should assign sequence number */
|
||||||
info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ;
|
info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ;
|
||||||
|
/* for pure STA mode without beacons, we can do it */
|
||||||
|
hdr->seq_ctrl = cpu_to_le16(tx->sdata->sequence_number);
|
||||||
|
tx->sdata->sequence_number += 0x10;
|
||||||
|
tx->sdata->sequence_number &= IEEE80211_SCTL_SEQ;
|
||||||
return TX_CONTINUE;
|
return TX_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue