* [0/5] Improvements to the ieee80211 layer
@ 2005-05-24 13:07 Jiri Benc
2005-05-24 13:10 ` [1/5] ieee80211: cleanup Jiri Benc
` (12 more replies)
0 siblings, 13 replies; 27+ messages in thread
From: Jiri Benc @ 2005-05-24 13:07 UTC (permalink / raw)
To: NetDev; +Cc: LKML, jgarzik, pavel
The ieee80211 layer, now present in -mm, lacks many important features
(actually it's just a part of the ipw2100/ipw2200 driver; these cards do
a lot of the processing in the hardware/firmware and thus the layer
currently can not be used for simpler devices).
This is the first series of patches that try to convert it to a generic
IEEE 802.11 layer, usable for most of today's wireless cards.
The long term plan is:
- to implement a complete 802.11 stack in the kernel, making it easy to
write drivers for simple (cheap) devices
- to implement all of Ad-Hoc, AP and monitor modes in the layer, so it
will be easy to support them in the drivers
- to integrate Wireless Extensions to unify the kernel-userspace
interface of all the drivers
This means that drivers for "stupid" (simple, cheap) cards should be
very short and easy to write, whereas drivers for "clever" cards will be
longer (but still shorter than they are now).
We have a couple of cards for testing, and we gradually modify the
drivers for ipw2100 and ipw2200 with the development of the layer. When
the layer is mature enough for the "stupid" cards, we will rewrite the
driver for Atheros-based cards to use this layer. We plan to send all
the patches for these drivers to the netdev list. Of course, we are in
close contact with Pavel Machek, who is pushing the ipw2100 driver
upstream.
Any comments and suggestions are appreciated.
Jiri Benc <jbenc@suse.cz> and Jirka Bohac <jbohac@suse.cz>
SUSE Labs
^ permalink raw reply [flat|nested] 27+ messages in thread
* [1/5] ieee80211: cleanup
2005-05-24 13:07 [0/5] Improvements to the ieee80211 layer Jiri Benc
@ 2005-05-24 13:10 ` Jiri Benc
2005-05-28 2:43 ` Jeff Garzik
2005-05-24 13:11 ` [2/5] ieee80211: ieee80211_device alignment fix and cleanup Jiri Benc
` (11 subsequent siblings)
12 siblings, 1 reply; 27+ messages in thread
From: Jiri Benc @ 2005-05-24 13:10 UTC (permalink / raw)
To: NetDev; +Cc: LKML, jgarzik, pavel
Cleanup of unused and duplicated constants and structures in the ieee80211
header.
Signed-off-by: Jiri Benc <jbenc@suse.cz>
Signed-off-by: Jirka Bohac <jbohac@suse.cz>
--- orig/include/net/ieee80211.h 2005-05-12 11:36:27.000000000 +0200
+++ new/include/net/ieee80211.h 2005-05-17 15:37:38.000000000 +0200
@@ -93,6 +93,8 @@
u16 length;
} __attribute__ ((packed));
+#define IEEE80211_1ADDR_LEN 10
+#define IEEE80211_2ADDR_LEN 16
#define IEEE80211_3ADDR_LEN 24
#define IEEE80211_4ADDR_LEN 30
#define IEEE80211_FCS_LEN 4
@@ -299,23 +301,6 @@
#define WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH 9
-/* Information Element IDs */
-#define WLAN_EID_SSID 0
-#define WLAN_EID_SUPP_RATES 1
-#define WLAN_EID_FH_PARAMS 2
-#define WLAN_EID_DS_PARAMS 3
-#define WLAN_EID_CF_PARAMS 4
-#define WLAN_EID_TIM 5
-#define WLAN_EID_IBSS_PARAMS 6
-#define WLAN_EID_CHALLENGE 16
-#define WLAN_EID_RSN 48
-#define WLAN_EID_GENERIC 221
-
-#define IEEE80211_MGMT_HDR_LEN 24
-#define IEEE80211_DATA_HDR3_LEN 24
-#define IEEE80211_DATA_HDR4_LEN 30
-
-
#define IEEE80211_STATMASK_SIGNAL (1<<0)
#define IEEE80211_STATMASK_RSSI (1<<1)
#define IEEE80211_STATMASK_NOISE (1<<2)
@@ -489,15 +474,6 @@
*/
-struct ieee80211_header_data {
- u16 frame_ctl;
- u16 duration_id;
- u8 addr1[6];
- u8 addr2[6];
- u8 addr3[6];
- u16 seq_ctrl;
-};
-
#define BEACON_PROBE_SSID_ID_POSITION 12
/* Management Frame Information Element Types */
@@ -542,7 +518,7 @@
*/
struct ieee80211_authentication {
- struct ieee80211_header_data header;
+ struct ieee80211_hdr_3addr header;
u16 algorithm;
u16 transaction;
u16 status;
@@ -551,7 +527,7 @@
struct ieee80211_probe_response {
- struct ieee80211_header_data header;
+ struct ieee80211_hdr_3addr header;
u32 time_stamp[2];
u16 beacon_interval;
u16 capability;
@@ -793,21 +769,21 @@
extern inline int ieee80211_get_hdrlen(u16 fc)
{
- int hdrlen = 24;
+ int hdrlen = IEEE80211_3ADDR_LEN;
switch (WLAN_FC_GET_TYPE(fc)) {
case IEEE80211_FTYPE_DATA:
if ((fc & IEEE80211_FCTL_FROMDS) && (fc & IEEE80211_FCTL_TODS))
- hdrlen = 30; /* Addr4 */
+ hdrlen = IEEE80211_4ADDR_LEN;
break;
case IEEE80211_FTYPE_CTL:
switch (WLAN_FC_GET_STYPE(fc)) {
case IEEE80211_STYPE_CTS:
case IEEE80211_STYPE_ACK:
- hdrlen = 10;
+ hdrlen = IEEE80211_1ADDR_LEN;
break;
default:
- hdrlen = 16;
+ hdrlen = IEEE80211_2ADDR_LEN;
break;
}
break;
--- orig/net/ieee80211/ieee80211_rx.c 2005-05-12 11:36:29.000000000 +0200
+++ new/net/ieee80211/ieee80211_rx.c 2005-05-17 15:37:38.000000000 +0200
@@ -475,7 +475,7 @@
#endif
/* Data frame - extract src/dst addresses */
- if (skb->len < IEEE80211_DATA_HDR3_LEN)
+ if (skb->len < IEEE80211_3ADDR_LEN)
goto rx_dropped;
switch (fc & (IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS)) {
@@ -488,7 +488,7 @@
memcpy(src, hdr->addr2, ETH_ALEN);
break;
case IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS:
- if (skb->len < IEEE80211_DATA_HDR4_LEN)
+ if (skb->len < IEEE80211_4ADDR_LEN)
goto rx_dropped;
memcpy(dst, hdr->addr3, ETH_ALEN);
memcpy(src, hdr->addr4, ETH_ALEN);
--
Jiri Benc
SUSE Labs
^ permalink raw reply [flat|nested] 27+ messages in thread
* [2/5] ieee80211: ieee80211_device alignment fix and cleanup
2005-05-24 13:07 [0/5] Improvements to the ieee80211 layer Jiri Benc
2005-05-24 13:10 ` [1/5] ieee80211: cleanup Jiri Benc
@ 2005-05-24 13:11 ` Jiri Benc
2005-05-28 3:37 ` Jeff Garzik
2005-05-24 13:12 ` [3/5] netdev: HH_DATA_OFF bugfix Jiri Benc
` (10 subsequent siblings)
12 siblings, 1 reply; 27+ messages in thread
From: Jiri Benc @ 2005-05-24 13:11 UTC (permalink / raw)
To: NetDev; +Cc: LKML, jgarzik, pavel
Changes to the ieee80211 layer:
- fixes a serious alignment problem of the driver's private data
- makes the drivers use the ieee80211_device instead of the net_device where
appropriate (will ease further development of ieee80211 as a self-contained
layer)
Signed-off-by: Jiri Benc <jbenc@suse.cz>
Signed-off-by: Jirka Bohac <jbohac@suse.cz>
--- linux-2.6.12-rc2-mm3.01/include/net/ieee80211.h 2005-05-18 10:49:01.000000000 +0200
+++ linux-2.6.12-rc2-mm3.02.0/include/net/ieee80211.h 2005-05-18 12:02:03.000000000 +0200
@@ -704,15 +704,13 @@
int abg_ture; /* ABG flag */
/* Callback functions */
- void (*set_security)(struct net_device *dev,
+ void (*set_security)(struct ieee80211_device *ieee,
struct ieee80211_security *sec);
int (*hard_start_xmit)(struct ieee80211_txb *txb,
- struct net_device *dev);
- int (*reset_port)(struct net_device *dev);
+ struct ieee80211_device *ieee);
+ int (*reset_port)(struct ieee80211_device *ieee);
- /* This must be the last item so that it points to the data
- * allocated beyond this structure by alloc_ieee80211 */
- u8 priv[0];
+ void *priv;
};
#define IEEE_A (1<<0)
@@ -720,9 +718,18 @@
#define IEEE_G (1<<2)
#define IEEE_MODE_MASK (IEEE_A|IEEE_B|IEEE_G)
-extern inline void *ieee80211_priv(struct net_device *dev)
+static inline void *ieee80211_priv(struct ieee80211_device *ieee)
{
- return ((struct ieee80211_device *)netdev_priv(dev))->priv;
+ return (char *)ieee +
+ ((sizeof(struct ieee80211_device) + NETDEV_ALIGN_CONST)
+ & ~NETDEV_ALIGN_CONST);
+}
+
+static inline struct net_device *ieee80211_dev(struct ieee80211_device *ieee)
+{
+ return (struct net_device *)((char *)ieee -
+ ((sizeof(struct net_device) + NETDEV_ALIGN_CONST)
+ & ~NETDEV_ALIGN_CONST));
}
extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len)
@@ -795,8 +802,8 @@
/* ieee80211.c */
-extern void free_ieee80211(struct net_device *dev);
-extern struct net_device *alloc_ieee80211(int sizeof_priv);
+extern void free_ieee80211(struct ieee80211_device *ieee);
+extern struct ieee80211_device *alloc_ieee80211(int sizeof_priv);
extern int ieee80211_set_encryption(struct ieee80211_device *ieee);
--- linux-2.6.12-rc2-mm3.01/net/ieee80211/ieee80211_module.c 2005-04-19 17:04:43.000000000 +0200
+++ linux-2.6.12-rc2-mm3.02.0/net/ieee80211/ieee80211_module.c 2005-05-18 12:04:30.000000000 +0200
@@ -70,7 +70,7 @@
GFP_KERNEL);
if (!ieee->networks) {
printk(KERN_WARNING "%s: Out of memory allocating beacons\n",
- ieee->dev->name);
+ ieee80211_dev(ieee)->name);
return -ENOMEM;
}
@@ -99,23 +99,28 @@
}
-struct net_device *alloc_ieee80211(int sizeof_priv)
+struct ieee80211_device *alloc_ieee80211(int sizeof_priv)
{
struct ieee80211_device *ieee;
struct net_device *dev;
+ int alloc_size;
int err;
IEEE80211_DEBUG_INFO("Initializing...\n");
- dev = alloc_etherdev(sizeof(struct ieee80211_device) + sizeof_priv);
+ alloc_size = ((sizeof(struct ieee80211_device) + NETDEV_ALIGN_CONST)
+ & ~NETDEV_ALIGN_CONST)
+ + sizeof_priv;
+ dev = alloc_etherdev(alloc_size);
if (!dev) {
IEEE80211_ERROR("Unable to network device.\n");
goto failed;
}
ieee = netdev_priv(dev);
- dev->hard_start_xmit = ieee80211_xmit;
-
ieee->dev = dev;
+ ieee->priv = ieee80211_priv(ieee);
+
+ dev->hard_start_xmit = ieee80211_xmit;
err = ieee80211_networks_allocate(ieee);
if (err) {
@@ -148,7 +153,7 @@
ieee->privacy_invoked = 0;
ieee->ieee802_1x = 1;
- return dev;
+ return ieee;
failed:
if (dev)
@@ -157,10 +162,8 @@
}
-void free_ieee80211(struct net_device *dev)
+void free_ieee80211(struct ieee80211_device *ieee)
{
- struct ieee80211_device *ieee = netdev_priv(dev);
-
int i;
del_timer_sync(&ieee->crypt_deinit_timer);
@@ -179,7 +182,7 @@
}
ieee80211_networks_free(ieee);
- free_netdev(dev);
+ free_netdev(ieee80211_dev(ieee));
}
#ifdef CONFIG_IEEE80211_DEBUG
--- linux-2.6.12-rc2-mm3.01/net/ieee80211/ieee80211_rx.c 2005-05-18 10:49:01.000000000 +0200
+++ linux-2.6.12-rc2-mm3.02.0/net/ieee80211/ieee80211_rx.c 2005-05-18 12:24:18.000000000 +0200
@@ -100,7 +100,7 @@
if (frag == 0) {
/* Reserve enough space to fit maximum frame length */
- skb = dev_alloc_skb(ieee->dev->mtu +
+ skb = dev_alloc_skb(ieee80211_dev(ieee)->mtu +
sizeof(struct ieee80211_hdr) +
8 /* LLC */ +
2 /* alignment */ +
@@ -176,7 +176,7 @@
{
if (ieee->iw_mode == IW_MODE_MASTER) {
printk(KERN_DEBUG "%s: Master mode not yet suppported.\n",
- ieee->dev->name);
+ ieee80211_dev(ieee)->name);
return 0;
/*
hostap_update_sta_ps(ieee, (struct hostap_ieee80211_hdr *)
@@ -234,7 +234,7 @@
static int ieee80211_is_eapol_frame(struct ieee80211_device *ieee,
struct sk_buff *skb)
{
- struct net_device *dev = ieee->dev;
+ struct net_device *dev = ieee80211_dev(ieee);
u16 fc, ethertype;
struct ieee80211_hdr *hdr;
u8 *pos;
@@ -290,7 +290,7 @@
if (net_ratelimit()) {
printk(KERN_DEBUG "%s: TKIP countermeasures: dropped "
"received packet from " MAC_FMT "\n",
- ieee->dev->name, MAC_ARG(hdr->addr2));
+ ieee80211_dev(dev)->name, MAC_ARG(hdr->addr2));
}
return -1;
}
@@ -335,7 +335,7 @@
if (res < 0) {
printk(KERN_DEBUG "%s: MSDU decryption/MIC verification failed"
" (SA=" MAC_FMT " keyidx=%d)\n",
- ieee->dev->name, MAC_ARG(hdr->addr2), keyidx);
+ ieee80211_dev(ieee)->name, MAC_ARG(hdr->addr2), keyidx);
return -1;
}
@@ -349,7 +349,7 @@
int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
struct ieee80211_rx_stats *rx_stats)
{
- struct net_device *dev = ieee->dev;
+ struct net_device *dev = ieee80211_dev(ieee);
struct ieee80211_hdr *hdr;
size_t hdrlen;
u16 fc, type, stype, sc;
@@ -1195,7 +1195,7 @@
IEEE80211_DEBUG_MGMT("received UNKNOWN (%d)\n",
WLAN_FC_GET_STYPE(header->frame_ctl));
IEEE80211_WARNING("%s: Unknown management packet: %d\n",
- ieee->dev->name,
+ ieee80211_dev(ieee)->name,
WLAN_FC_GET_STYPE(header->frame_ctl));
break;
}
--- linux-2.6.12-rc2-mm3.01/net/ieee80211/ieee80211_tx.c 2005-04-19 17:04:43.000000000 +0200
+++ linux-2.6.12-rc2-mm3.02.0/net/ieee80211/ieee80211_tx.c 2005-05-18 12:20:07.000000000 +0200
@@ -172,7 +172,7 @@
if (net_ratelimit()) {
printk(KERN_DEBUG "%s: TKIP countermeasures: dropped "
"TX packet to " MAC_FMT "\n",
- ieee->dev->name, MAC_ARG(header->addr1));
+ ieee80211_dev(ieee)->name, MAC_ARG(header->addr1));
}
return -1;
}
@@ -193,7 +193,7 @@
atomic_dec(&crypt->refcnt);
if (res < 0) {
printk(KERN_INFO "%s: Encryption failed: len=%d.\n",
- ieee->dev->name, frag->len);
+ ieee80211_dev(ieee)->name, frag->len);
ieee->ieee_stats.tx_discards++;
return -1;
}
@@ -270,13 +270,13 @@
* creating it... */
if (!ieee->hard_start_xmit) {
printk(KERN_WARNING "%s: No xmit handler.\n",
- ieee->dev->name);
+ dev->name);
goto success;
}
if (unlikely(skb->len < SNAP_SIZE + sizeof(u16))) {
printk(KERN_WARNING "%s: skb too small (%d).\n",
- ieee->dev->name, skb->len);
+ dev->name, skb->len);
goto success;
}
@@ -372,7 +372,7 @@
txb = ieee80211_alloc_txb(nr_frags, frag_size, GFP_ATOMIC);
if (unlikely(!txb)) {
printk(KERN_WARNING "%s: Could not allocate TXB\n",
- ieee->dev->name);
+ dev->name);
goto failed;
}
txb->encrypted = encrypt;
@@ -427,7 +427,7 @@
dev_kfree_skb_any(skb);
if (txb) {
- if ((*ieee->hard_start_xmit)(txb, dev) == 0) {
+ if ((*ieee->hard_start_xmit)(txb, ieee) == 0) {
stats->tx_packets++;
stats->tx_bytes += txb->payload_size;
return 0;
--- linux-2.6.12-rc2-mm3.01/net/ieee80211/ieee80211_wx.c 2005-04-19 17:04:43.000000000 +0200
+++ linux-2.6.12-rc2-mm3.02.0/net/ieee80211/ieee80211_wx.c 2005-05-18 12:27:28.000000000 +0200
@@ -252,7 +252,7 @@
union iwreq_data *wrqu, char *keybuf)
{
struct iw_point *erq = &(wrqu->encoding);
- struct net_device *dev = ieee->dev;
+ struct net_device *dev = ieee80211_dev(ieee);
struct ieee80211_security sec = {
.flags = 0
};
@@ -402,7 +402,7 @@
sec.level = SEC_LEVEL_1; /* 40 and 104 bit WEP */
if (ieee->set_security)
- ieee->set_security(dev, &sec);
+ ieee->set_security(ieee, &sec);
/* Do not reset port if card is in Managed mode since resetting will
* generate new IEEE 802.11 authentication which may end up in looping
@@ -411,7 +411,7 @@
* the callbacks structures used to initialize the 802.11 stack. */
if (ieee->reset_on_keychange &&
ieee->iw_mode != IW_MODE_INFRA &&
- ieee->reset_port && ieee->reset_port(dev)) {
+ ieee->reset_port && ieee->reset_port(ieee)) {
printk(KERN_DEBUG "%s: reset_port failed\n", dev->name);
return -EINVAL;
}
--
Jiri Benc
SUSE Labs
^ permalink raw reply [flat|nested] 27+ messages in thread
* [3/5] netdev: HH_DATA_OFF bugfix
2005-05-24 13:07 [0/5] Improvements to the ieee80211 layer Jiri Benc
2005-05-24 13:10 ` [1/5] ieee80211: cleanup Jiri Benc
2005-05-24 13:11 ` [2/5] ieee80211: ieee80211_device alignment fix and cleanup Jiri Benc
@ 2005-05-24 13:12 ` Jiri Benc
2005-05-28 3:15 ` Jeff Garzik
2005-05-24 13:12 ` [4/5] ieee80211: ethernet independency Jiri Benc
` (9 subsequent siblings)
12 siblings, 1 reply; 27+ messages in thread
From: Jiri Benc @ 2005-05-24 13:12 UTC (permalink / raw)
To: NetDev; +Cc: LKML, jgarzik, pavel
When the hardware header size is a multiple of HH_DATA_MOD, HH_DATA_OFF()
incorrectly returns HH_DATA_MOD (instead of 0).
Signed-off-by: Jiri Benc <jbenc@suse.cz>
--- linux/include/linux/netdevice.h
+++ work/include/linux/netdevice.h
@@ -204,7 +209,7 @@
/* cached hardware header; allow for machine alignment needs. */
#define HH_DATA_MOD 16
#define HH_DATA_OFF(__len) \
- (HH_DATA_MOD - ((__len) & (HH_DATA_MOD - 1)))
+ (HH_DATA_MOD - (((__len - 1) & (HH_DATA_MOD - 1)) + 1))
#define HH_DATA_ALIGN(__len) \
(((__len)+(HH_DATA_MOD-1))&~(HH_DATA_MOD - 1))
unsigned long hh_data[HH_DATA_ALIGN(LL_MAX_HEADER) / sizeof(long)];
--
Jiri Benc
SUSE Labs
^ permalink raw reply [flat|nested] 27+ messages in thread
* [4/5] ieee80211: ethernet independency
2005-05-24 13:07 [0/5] Improvements to the ieee80211 layer Jiri Benc
` (2 preceding siblings ...)
2005-05-24 13:12 ` [3/5] netdev: HH_DATA_OFF bugfix Jiri Benc
@ 2005-05-24 13:12 ` Jiri Benc
2005-05-24 13:13 ` [5/5] ieee80211: add sequence numbers Jiri Benc
` (8 subsequent siblings)
12 siblings, 0 replies; 27+ messages in thread
From: Jiri Benc @ 2005-05-24 13:12 UTC (permalink / raw)
To: NetDev; +Cc: LKML, jgarzik, pavel
Makes the 802.11 layer independent of ethernet. (The previous implementation
had the ethernet headers built by the ethernet layer and then parsed them and
rebuilt them into 802.11 headers.)
Signed-off-by: Jiri Benc <jbenc@suse.cz>
Signed-off-by: Jirka Bohac <jbohac@suse.cz>
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -83,13 +83,18 @@
* used.
*/
-#if !defined(CONFIG_AX25) && !defined(CONFIG_AX25_MODULE) && !defined(CONFIG_TR)
+#if !defined(CONFIG_AX25) && !defined(CONFIG_AX25_MODULE) && !defined(CONFIG_TR) \
+ && !defined(CONFIG_IEEE80211)
#define LL_MAX_HEADER 32
#else
#if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)
#define LL_MAX_HEADER 96
#else
+#if defined(CONFIG_TR)
#define LL_MAX_HEADER 48
+#else
+#define LL_MAX_HEADER 38
+#endif
#endif
#endif
--- a/include/net/ieee80211.h
+++ b/include/net/ieee80211.h
@@ -20,7 +20,6 @@
*/
#ifndef IEEE80211_H
#define IEEE80211_H
-#include <linux/if_ether.h> /* ETH_ALEN */
#include <linux/kernel.h> /* ARRAY_SIZE */
#if WIRELESS_EXT < 17
@@ -42,25 +41,26 @@
WEP IV and ICV. (this interpretation suggested by Ramiro Barreiro) */
+#define IEEE80211_ALEN 6
#define IEEE80211_HLEN 30
#define IEEE80211_FRAME_LEN (IEEE80211_DATA_LEN + IEEE80211_HLEN)
struct ieee80211_hdr {
u16 frame_ctl;
u16 duration_id;
- u8 addr1[ETH_ALEN];
- u8 addr2[ETH_ALEN];
- u8 addr3[ETH_ALEN];
+ u8 addr1[IEEE80211_ALEN];
+ u8 addr2[IEEE80211_ALEN];
+ u8 addr3[IEEE80211_ALEN];
u16 seq_ctl;
- u8 addr4[ETH_ALEN];
+ u8 addr4[IEEE80211_ALEN];
} __attribute__ ((packed));
struct ieee80211_hdr_3addr {
u16 frame_ctl;
u16 duration_id;
- u8 addr1[ETH_ALEN];
- u8 addr2[ETH_ALEN];
- u8 addr3[ETH_ALEN];
+ u8 addr1[IEEE80211_ALEN];
+ u8 addr2[IEEE80211_ALEN];
+ u8 addr3[IEEE80211_ALEN];
u16 seq_ctl;
} __attribute__ ((packed));
@@ -233,7 +233,7 @@
#define ETH_P_PREAUTH 0x88C7 /* IEEE 802.11i pre-authentication */
#ifndef ETH_P_80211_RAW
-#define ETH_P_80211_RAW (ETH_P_ECONET + 1)
+#define ETH_P_80211_RAW 0x0003
#endif
/* IEEE 802.11 defines */
@@ -246,11 +246,29 @@
u8 ssap; /* always 0xAA */
u8 ctrl; /* always 0x03 */
u8 oui[P80211_OUI_LEN]; /* organizational universal id */
+ u16 type; /* packet type ID field */
} __attribute__ ((packed));
#define SNAP_SIZE sizeof(struct ieee80211_snap_hdr)
+#define IEEE80211_SNAP_IS_RFC1042(snap) \
+ ((snap)->oui[0] == 0 && (snap)->oui[1] == 0 && (snap)->oui[2] == 0)
+#define IEEE80211_SNAP_IS_BRIDGE_TUNNEL(snap) \
+ ((snap)->oui[0] == 0 && (snap)->oui[1] == 0 && (snap)->oui[2] == 0xf8)
+
+#define IEEE80211_FC_GET_TODS(hdr) \
+ ((hdr)->frame_ctl & __constant_cpu_to_le16(IEEE80211_FCTL_TODS))
+#define IEEE80211_FC_GET_FROMDS(hdr) \
+ ((hdr)->frame_ctl & __constant_cpu_to_le16(IEEE80211_FCTL_FROMDS))
+#define IEEE80211_GET_DADDR(hdr) \
+ (IEEE80211_FC_GET_TODS(hdr) ? (hdr)->addr3 : (hdr)->addr1)
+#define IEEE80211_GET_SADDR(hdr) \
+ (IEEE80211_FC_GET_FROMDS(hdr) ? \
+ (IEEE80211_FC_GET_TODS(hdr) ? (hdr)->addr4 : (hdr)->addr3) \
+ : (hdr)->addr2)
+/* IEEE80211_GET_xADDR do not work when both TODS and FROMDS are set. */
+
#define WLAN_FC_GET_TYPE(fc) ((fc) & IEEE80211_FCTL_FTYPE)
#define WLAN_FC_GET_STYPE(fc) ((fc) & IEEE80211_FCTL_STYPE)
@@ -395,8 +413,8 @@
unsigned int seq;
unsigned int last_frag;
struct sk_buff *skb;
- u8 src_addr[ETH_ALEN];
- u8 dst_addr[ETH_ALEN];
+ u8 src_addr[IEEE80211_ALEN];
+ u8 dst_addr[IEEE80211_ALEN];
};
struct ieee80211_stats {
@@ -507,7 +525,7 @@
u16 auth_sequence;
u16 beacon_interval;
u16 capability;
- u8 current_ap[ETH_ALEN];
+ u8 current_ap[IEEE80211_ALEN];
u16 listen_interval;
struct {
u16 association_id:14, reserved:2;
@@ -537,7 +555,7 @@
struct ieee80211_assoc_request_frame {
u16 capability;
u16 listen_interval;
- u8 current_ap[ETH_ALEN];
+ u8 current_ap[IEEE80211_ALEN];
struct ieee80211_info_element info_element;
} __attribute__ ((packed));
@@ -581,7 +599,7 @@
struct ieee80211_network {
/* These entries are used to identify a unique network */
- u8 bssid[ETH_ALEN];
+ u8 bssid[IEEE80211_ALEN];
u8 channel;
/* Ensure null-terminated for any debug msgs */
u8 ssid[IW_ESSID_MAX_SIZE + 1];
@@ -625,12 +643,12 @@
#define MAC_ARG(x) ((u8*)(x))[0],((u8*)(x))[1],((u8*)(x))[2],((u8*)(x))[3],((u8*)(x))[4],((u8*)(x))[5]
-extern inline int is_multicast_ether_addr(const u8 *addr)
+extern inline int is_multicast_ieee80211_addr(const u8 *addr)
{
return ((addr[0] != 0xff) && (0x01 & addr[0]));
}
-extern inline int is_broadcast_ether_addr(const u8 *addr)
+extern inline int is_broadcast_ieee80211_addr(const u8 *addr)
{
return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \
(addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff));
@@ -694,7 +712,7 @@
u16 fts; /* Fragmentation Threshold */
/* Association info */
- u8 bssid[ETH_ALEN];
+ u8 bssid[IEEE80211_ALEN];
enum ieee80211_state state;
@@ -774,7 +792,7 @@
return 0;
}
-extern inline int ieee80211_get_hdrlen(u16 fc)
+extern inline int __ieee80211_get_hdrlen(u16 fc)
{
int hdrlen = IEEE80211_3ADDR_LEN;
@@ -798,12 +816,29 @@
return hdrlen;
}
+#define ieee80211_get_hdrlen(hdr) __ieee80211_get_hdrlen(le16_to_cpu((hdr)->frame_ctl))
+
+#define IEEE80211_GET_DATA_HDR_LEN(hdr) \
+ ((((hdr)->frame_ctl & \
+ __constant_cpu_to_le16(IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) \
+ == __constant_cpu_to_le16(IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) \
+ ? IEEE80211_4ADDR_LEN : IEEE80211_3ADDR_LEN)
+#define IEEE80211_GET_SNAP(hdr) \
+ ((struct ieee80211_snap_hdr *) \
+ ((u8 *)(hdr) + IEEE80211_GET_DATA_HDR_LEN(hdr)))
+extern inline int ieee80211_get_proto(struct ieee80211_hdr *header)
+{
+ struct ieee80211_snap_hdr *snap = IEEE80211_GET_SNAP(header);
+ return (snap->dsap == 0xaa && snap->ssap == 0xaa ?
+ ntohs(snap->type) : ETH_P_802_2);
+}
/* ieee80211.c */
extern void free_ieee80211(struct ieee80211_device *ieee);
extern struct ieee80211_device *alloc_ieee80211(int sizeof_priv);
+extern void ieee80211_setup(struct net_device *dev);
extern int ieee80211_set_encryption(struct ieee80211_device *ieee);
--- a/net/ieee80211/ieee80211_rx.c
+++ b/net/ieee80211/ieee80211_rx.c
@@ -42,11 +42,10 @@
struct ieee80211_rx_stats *rx_stats)
{
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
- u16 fc = le16_to_cpu(hdr->frame_ctl);
skb->dev = ieee->dev;
skb->mac.raw = skb->data;
- skb_pull(skb, ieee80211_get_hdrlen(fc));
+ skb_pull(skb, ieee80211_get_hdrlen(hdr));
skb->pkt_type = PACKET_OTHERHOST;
skb->protocol = __constant_htons(ETH_P_80211_RAW);
memset(skb->cb, 0, sizeof(skb->cb));
@@ -76,8 +75,8 @@
if (entry->skb != NULL && entry->seq == seq &&
(entry->last_frag + 1 == frag || frag == -1) &&
- memcmp(entry->src_addr, src, ETH_ALEN) == 0 &&
- memcmp(entry->dst_addr, dst, ETH_ALEN) == 0)
+ memcmp(entry->src_addr, src, IEEE80211_ALEN) == 0 &&
+ memcmp(entry->dst_addr, dst, IEEE80211_ALEN) == 0)
return entry;
}
@@ -104,7 +103,7 @@
sizeof(struct ieee80211_hdr) +
8 /* LLC */ +
2 /* alignment */ +
- 8 /* WEP */ + ETH_ALEN /* WDS */);
+ 8 /* WEP */ + IEEE80211_ALEN /* WDS */);
if (skb == NULL)
return NULL;
@@ -120,8 +119,8 @@
entry->seq = seq;
entry->last_frag = frag;
entry->skb = skb;
- memcpy(entry->src_addr, hdr->addr2, ETH_ALEN);
- memcpy(entry->dst_addr, hdr->addr1, ETH_ALEN);
+ memcpy(entry->src_addr, hdr->addr2, IEEE80211_ALEN);
+ memcpy(entry->dst_addr, hdr->addr1, IEEE80211_ALEN);
} else {
/* received a fragment of a frame for which the head fragment
* should have already been received */
@@ -221,15 +220,6 @@
#endif
-/* See IEEE 802.1H for LLC/SNAP encapsulation/decapsulation */
-/* Ethernet-II snap header (RFC1042 for most EtherTypes) */
-static unsigned char rfc1042_header[] =
-{ 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 };
-/* Bridge-Tunnel header (for EtherTypes ETH_P_AARP and ETH_P_IPX) */
-static unsigned char bridge_tunnel_header[] =
-{ 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8 };
-/* No encapsulation header if EtherType < 0x600 (=length) */
-
/* Called by ieee80211_rx_frame_decrypt */
static int ieee80211_is_eapol_frame(struct ieee80211_device *ieee,
struct sk_buff *skb)
@@ -237,7 +227,6 @@
struct net_device *dev = ieee80211_dev(ieee);
u16 fc, ethertype;
struct ieee80211_hdr *hdr;
- u8 *pos;
if (skb->len < 24)
return 0;
@@ -248,12 +237,12 @@
/* check that the frame is unicast frame to us */
if ((fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) ==
IEEE80211_FCTL_TODS &&
- memcmp(hdr->addr1, dev->dev_addr, ETH_ALEN) == 0 &&
- memcmp(hdr->addr3, dev->dev_addr, ETH_ALEN) == 0) {
+ memcmp(hdr->addr1, dev->dev_addr, IEEE80211_ALEN) == 0 &&
+ memcmp(hdr->addr3, dev->dev_addr, IEEE80211_ALEN) == 0) {
/* ToDS frame with own addr BSSID and DA */
} else if ((fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) ==
IEEE80211_FCTL_FROMDS &&
- memcmp(hdr->addr1, dev->dev_addr, ETH_ALEN) == 0) {
+ memcmp(hdr->addr1, dev->dev_addr, IEEE80211_ALEN) == 0) {
/* FromDS frame with own addr as DA */
} else
return 0;
@@ -262,8 +251,7 @@
return 0;
/* check for port access entity Ethernet type */
- pos = skb->data + 24;
- ethertype = (pos[6] << 8) | pos[7];
+ ethertype = ieee80211_get_proto(hdr);
if (ethertype == ETH_P_PAE)
return 1;
@@ -282,7 +270,7 @@
return 0;
hdr = (struct ieee80211_hdr *) skb->data;
- hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl));
+ hdrlen = ieee80211_get_hdrlen(hdr);
#ifdef CONFIG_IEEE80211_CRYPT_TKIP
if (ieee->tkip_countermeasures &&
@@ -327,7 +315,7 @@
return 0;
hdr = (struct ieee80211_hdr *) skb->data;
- hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl));
+ hdrlen = ieee80211_get_hdrlen(hdr);
atomic_inc(&crypt->refcnt);
res = crypt->ops->decrypt_msdu(skb, keyidx, hdrlen, crypt->priv);
@@ -343,6 +331,44 @@
}
+unsigned short ieee80211_type_trans(struct sk_buff *skb,
+ struct ieee80211_device *ieee)
+{
+ struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
+ struct ieee80211_snap_hdr *snap;
+ int hdrlen;
+ u8 *daddr = IEEE80211_GET_DADDR(hdr);
+ unsigned short type;
+
+ skb->mac.raw = skb->data;
+
+ hdrlen = ieee80211_get_hdrlen(hdr);
+ snap = (struct ieee80211_snap_hdr *)(skb->data + hdrlen);
+ if (snap->dsap == 0xaa && snap->ssap == 0xaa &&
+ ((IEEE80211_SNAP_IS_RFC1042(snap) &&
+ snap->type != __constant_htons(ETH_P_AARP) &&
+ snap->type != __constant_htons(ETH_P_IPX)) ||
+ IEEE80211_SNAP_IS_BRIDGE_TUNNEL(snap))) {
+ type = snap->type;
+ skb_pull(skb, hdrlen + SNAP_SIZE);
+ }
+ else {
+ type = __constant_htons(ETH_P_802_2);
+ skb_pull(skb, hdrlen);
+ }
+
+ skb->input_dev = ieee->dev;
+ if (is_broadcast_ieee80211_addr(daddr))
+ skb->pkt_type = PACKET_BROADCAST;
+ else if (is_multicast_ieee80211_addr(daddr))
+ skb->pkt_type = PACKET_MULTICAST;
+ else if (memcmp(daddr, ieee->dev->dev_addr, IEEE80211_ALEN))
+ skb->pkt_type = PACKET_OTHERHOST;
+
+ return type;
+}
+
+
/* All received frames are sent to this function. @skb contains the frame in
* IEEE 802.11 format, i.e., in the format it was sent over air.
* This function is called only as a tasklet (software IRQ). */
@@ -355,8 +381,6 @@
u16 fc, type, stype, sc;
struct net_device_stats *stats;
unsigned int frag;
- u8 *payload;
- u16 ethertype;
#ifdef NOT_YET
struct net_device *wds = NULL;
struct sk_buff *skb2 = NULL;
@@ -365,8 +389,8 @@
int from_assoc_ap = 0;
void *sta = NULL;
#endif
- u8 dst[ETH_ALEN];
- u8 src[ETH_ALEN];
+ u8 dst[IEEE80211_ALEN];
+ u8 src[IEEE80211_ALEN];
struct ieee80211_crypt_data *crypt = NULL;
int keyidx = 0;
@@ -384,7 +408,7 @@
stype = WLAN_FC_GET_STYPE(fc);
sc = le16_to_cpu(hdr->seq_ctl);
frag = WLAN_GET_SEQ_FRAG(sc);
- hdrlen = ieee80211_get_hdrlen(fc);
+ hdrlen = __ieee80211_get_hdrlen(fc);
#ifdef NOT_YET
#if WIRELESS_EXT > 15
@@ -480,22 +504,23 @@
switch (fc & (IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS)) {
case IEEE80211_FCTL_FROMDS:
- memcpy(dst, hdr->addr1, ETH_ALEN);
- memcpy(src, hdr->addr3, ETH_ALEN);
+ memcpy(dst, hdr->addr1, IEEE80211_ALEN);
+ memcpy(src, hdr->addr3, IEEE80211_ALEN);
break;
case IEEE80211_FCTL_TODS:
- memcpy(dst, hdr->addr3, ETH_ALEN);
- memcpy(src, hdr->addr2, ETH_ALEN);
+ memcpy(dst, hdr->addr3, IEEE80211_ALEN);
+ memcpy(src, hdr->addr2, IEEE80211_ALEN);
break;
case IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS:
if (skb->len < IEEE80211_4ADDR_LEN)
goto rx_dropped;
- memcpy(dst, hdr->addr3, ETH_ALEN);
- memcpy(src, hdr->addr4, ETH_ALEN);
+ memcpy(dst, hdr->addr3, IEEE80211_ALEN);
+ memcpy(src, hdr->addr4, IEEE80211_ALEN);
+ /* FIXME: this is wrong */
break;
case 0:
- memcpy(dst, hdr->addr1, ETH_ALEN);
- memcpy(src, hdr->addr2, ETH_ALEN);
+ memcpy(dst, hdr->addr1, IEEE80211_ALEN);
+ memcpy(src, hdr->addr2, IEEE80211_ALEN);
break;
}
@@ -510,7 +535,7 @@
if (ieee->iw_mode == IW_MODE_MASTER && !wds &&
(fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) == IEEE80211_FCTL_FROMDS &&
ieee->stadev &&
- memcmp(hdr->addr2, ieee->assoc_ap_addr, ETH_ALEN) == 0) {
+ memcmp(hdr->addr2, ieee->assoc_ap_addr, IEEE80211_ALEN) == 0) {
/* Frame from BSSID of the AP for which we are a client */
skb->dev = dev = ieee->stadev;
stats = hostap_get_stats(dev);
@@ -668,9 +693,6 @@
/* skb: hdr + (possible reassembled) full plaintext payload */
- payload = skb->data + hdrlen;
- ethertype = (payload[6] << 8) | payload[7];
-
#ifdef NOT_YET
/* If IEEE 802.1X is used, check whether the port is authorized to send
* the received frame. */
@@ -697,38 +719,6 @@
}
#endif
- /* convert hdr + possible LLC headers into Ethernet header */
- if (skb->len - hdrlen >= 8 &&
- ((memcmp(payload, rfc1042_header, SNAP_SIZE) == 0 &&
- ethertype != ETH_P_AARP && ethertype != ETH_P_IPX) ||
- memcmp(payload, bridge_tunnel_header, SNAP_SIZE) == 0)) {
- /* remove RFC1042 or Bridge-Tunnel encapsulation and
- * replace EtherType */
- skb_pull(skb, hdrlen + SNAP_SIZE);
- memcpy(skb_push(skb, ETH_ALEN), src, ETH_ALEN);
- memcpy(skb_push(skb, ETH_ALEN), dst, ETH_ALEN);
- } else {
- u16 len;
- /* Leave Ethernet header part of hdr and full payload */
- skb_pull(skb, hdrlen);
- len = htons(skb->len);
- memcpy(skb_push(skb, 2), &len, 2);
- memcpy(skb_push(skb, ETH_ALEN), src, ETH_ALEN);
- memcpy(skb_push(skb, ETH_ALEN), dst, ETH_ALEN);
- }
-
-#ifdef NOT_YET
- if (wds && ((fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) ==
- IEEE80211_FCTL_TODS) &&
- skb->len >= ETH_HLEN + ETH_ALEN) {
- /* Non-standard frame: get addr4 from its bogus location after
- * the payload */
- memcpy(skb->data + ETH_ALEN,
- skb->data + skb->len - ETH_ALEN, ETH_ALEN);
- skb_trim(skb, skb->len - ETH_ALEN);
- }
-#endif
-
stats->rx_packets++;
stats->rx_bytes += skb->len;
@@ -754,7 +744,7 @@
if (skb2 != NULL) {
/* send to wireless media */
- skb2->protocol = __constant_htons(ETH_P_802_3);
+ skb2->protocol = ieee80211_type_trans(skb2, ieee);
skb2->mac.raw = skb2->nh.raw = skb2->data;
/* skb2->nh.raw = skb2->data + ETH_HLEN; */
skb2->dev = dev;
@@ -764,7 +754,7 @@
#endif
if (skb) {
- skb->protocol = eth_type_trans(skb, dev);
+ skb->protocol = ieee80211_type_trans(skb, ieee);
memset(skb->cb, 0, sizeof(skb->cb));
skb->dev = dev;
skb->ip_summed = CHECKSUM_NONE; /* 802.11 crc not sufficient */
@@ -821,7 +811,7 @@
u8 i;
/* Pull out fixed field data */
- memcpy(network->bssid, beacon->header.addr3, ETH_ALEN);
+ memcpy(network->bssid, beacon->header.addr3, IEEE80211_ALEN);
network->capability = beacon->capability;
network->last_scanned = jiffies;
network->time_stamp[0] = beacon->time_stamp[0];
@@ -849,7 +839,7 @@
while (left >= sizeof(struct ieee80211_info_element_hdr)) {
if (sizeof(struct ieee80211_info_element_hdr) + info_element->len > left) {
IEEE80211_DEBUG_SCAN("SCAN: parse failed: info_element->len + 2 > left : info_element->len+2=%d left=%d.\n",
- info_element->len + sizeof(struct ieee80211_info_element),
+ info_element->len + (int)sizeof(struct ieee80211_info_element),
left);
return 1;
}
@@ -1017,7 +1007,7 @@
* as one network */
return ((src->ssid_len == dst->ssid_len) &&
(src->channel == dst->channel) &&
- !memcmp(src->bssid, dst->bssid, ETH_ALEN) &&
+ !memcmp(src->bssid, dst->bssid, IEEE80211_ALEN) &&
!memcmp(src->ssid, dst->ssid, src->ssid_len));
}
--- a/net/ieee80211/ieee80211_module.c
+++ b/net/ieee80211/ieee80211_module.c
@@ -48,7 +48,6 @@
#include <linux/types.h>
#include <linux/version.h>
#include <linux/wireless.h>
-#include <linux/etherdevice.h>
#include <asm/uaccess.h>
#include <net/arp.h>
@@ -99,28 +98,230 @@
}
+static int ieee80211_change_mtu(struct net_device *dev, int new_mtu)
+{
+ if ((new_mtu < 68) || (new_mtu > IEEE80211_DATA_LEN - 8 - SNAP_SIZE))
+ return -EINVAL;
+ dev->mtu = new_mtu;
+ return 0;
+}
+
+
+static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 };
+static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 };
+
+static inline int __ieee80211_put_snap(u8 *data, u16 h_proto)
+{
+ struct ieee80211_snap_hdr *snap;
+ u8 *oui;
+
+ snap = (struct ieee80211_snap_hdr *)data;
+ snap->dsap = 0xaa;
+ snap->ssap = 0xaa;
+ snap->ctrl = 0x03;
+
+ if (h_proto == __constant_htons(ETH_P_IPX) ||
+ h_proto == __constant_htons(ETH_P_AARP))
+ oui = P802_1H_OUI;
+ else
+ oui = RFC1042_OUI;
+ snap->oui[0] = oui[0];
+ snap->oui[1] = oui[1];
+ snap->oui[2] = oui[2];
+
+ snap->type = h_proto;
+
+ return SNAP_SIZE;
+}
+
+static inline int ieee80211_put_snap(u8 *data, u16 h_proto)
+{
+ return __ieee80211_put_snap(data, htons(h_proto));
+}
+
+/*
+ * Create the IEEE 802.11 MAC header for an arbitrary protocol layer
+ *
+ * saddr=NULL means use device source address
+ * daddr=NULL means leave destination address (eg unresolved arp)
+ */
+static int ieee80211_header(struct sk_buff *skb, struct net_device *dev,
+ unsigned short type, void *daddr, void *saddr, unsigned len)
+{
+ struct ieee80211_device *ieee = netdev_priv(dev);
+ struct ieee80211_hdr *header;
+ int fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA;
+ int hdr_len = IEEE80211_3ADDR_LEN;
+
+ if (type != ETH_P_802_3 && type != ETH_P_802_2) {
+ ieee80211_put_snap(skb_push(skb, SNAP_SIZE), type);
+ hdr_len += SNAP_SIZE;
+ }
+
+ if (!saddr) saddr = dev->dev_addr;
+ header = (struct ieee80211_hdr *)skb_push(skb, IEEE80211_3ADDR_LEN);
+ header->duration_id = header->seq_ctl = 0;
+ if (ieee->iw_mode == IW_MODE_INFRA) {
+ fc |= IEEE80211_FCTL_TODS;
+ /* To DS: Addr1 = BSSID, Addr2 = SA,
+ Addr3 = DA */
+ memcpy(header->addr1, ieee->bssid, IEEE80211_ALEN);
+ memcpy(header->addr2, saddr, IEEE80211_ALEN);
+ if (daddr)
+ memcpy(header->addr3, daddr, IEEE80211_ALEN);
+ else
+ memset(header->addr3, 0, IEEE80211_ALEN);
+ } else if (ieee->iw_mode == IW_MODE_ADHOC) {
+ /* not From/To DS: Addr1 = DA, Addr2 = SA,
+ Addr3 = BSSID */
+ if (daddr)
+ memcpy(header->addr1, daddr, IEEE80211_ALEN);
+ else
+ memset(header->addr1, 0, IEEE80211_ALEN);
+ memcpy(header->addr2, saddr, IEEE80211_ALEN);
+ memcpy(header->addr3, ieee->bssid, IEEE80211_ALEN);
+ }
+ header->frame_ctl = cpu_to_le16(fc);
+
+ if (!daddr || (dev->flags & (IFF_LOOPBACK | IFF_NOARP)))
+ return -hdr_len;
+ return hdr_len;
+}
+
+static int ieee80211_rebuild_header(struct sk_buff *skb)
+{
+ struct ieee80211_hdr *header = (struct ieee80211_hdr *)skb->data;
+ struct net_device *dev = skb->dev;
+ unsigned short type;
+
+ type = ieee80211_get_proto(header);
+
+ switch (type) {
+#ifdef CONFIG_INET
+ case ETH_P_IP:
+ return arp_find(IEEE80211_GET_DADDR(header), skb);
+#endif
+ default:
+ printk(KERN_DEBUG
+ "%s: unable to resolve type %X addresses.\n",
+ dev->name, type);
+ break;
+ }
+
+ return 0;
+}
+
+static int ieee80211_mac_addr(struct net_device *dev, void *p)
+{
+ struct sockaddr *addr = p;
+
+ if (netif_running(dev))
+ return -EBUSY;
+ memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
+ return 0;
+}
+
+static int ieee80211_header_cache(struct neighbour *neigh, struct hh_cache *hh)
+{
+ struct net_device *dev = neigh->dev;
+ struct ieee80211_device *ieee = netdev_priv(dev);
+ unsigned short type = hh->hh_type;
+ struct ieee80211_hdr *header;
+ int fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA;
+
+ if (type == __constant_htons(ETH_P_802_3) ||
+ type == __constant_htons(ETH_P_802_2))
+ return -1;
+
+ header = (struct ieee80211_hdr *)
+ (((u8 *)hh->hh_data) +
+ (HH_DATA_OFF(IEEE80211_3ADDR_LEN + SNAP_SIZE)));
+ __ieee80211_put_snap((u8 *)header + IEEE80211_3ADDR_LEN, type);
+
+ header->duration_id = header->seq_ctl = 0;
+ if (ieee->iw_mode == IW_MODE_INFRA) {
+ fc |= IEEE80211_FCTL_TODS;
+ /* To DS: Addr1 = BSSID, Addr2 = SA,
+ Addr3 = DA */
+ memcpy(header->addr1, ieee->bssid, IEEE80211_ALEN);
+ memcpy(header->addr2, dev->dev_addr, IEEE80211_ALEN);
+ memcpy(header->addr3, neigh->ha, IEEE80211_ALEN);
+ } else if (ieee->iw_mode == IW_MODE_ADHOC) {
+ /* not From/To DS: Addr1 = DA, Addr2 = SA,
+ Addr3 = BSSID */
+ memcpy(header->addr1, neigh->ha, IEEE80211_ALEN);
+ memcpy(header->addr2, dev->dev_addr, IEEE80211_ALEN);
+ memcpy(header->addr3, ieee->bssid, IEEE80211_ALEN);
+ }
+ header->frame_ctl = cpu_to_le16(fc);
+
+ hh->hh_len = IEEE80211_3ADDR_LEN + SNAP_SIZE;
+ return 0;
+}
+
+static void ieee80211_header_cache_update(struct hh_cache *hh,
+ struct net_device *dev, unsigned char *haddr)
+{
+ struct ieee80211_hdr *header;
+
+ header = (struct ieee80211_hdr *)
+ (((u8 *)hh->hh_data) +
+ (HH_DATA_OFF(IEEE80211_3ADDR_LEN + SNAP_SIZE)));
+ memcpy(IEEE80211_GET_DADDR(header), haddr, dev->addr_len);
+}
+
+static int ieee80211_header_parse(struct sk_buff *skb, unsigned char *haddr)
+{
+ struct ieee80211_hdr *header = (struct ieee80211_hdr *)skb->data;
+
+ memcpy(haddr, IEEE80211_GET_SADDR(header), IEEE80211_ALEN);
+ return IEEE80211_ALEN;
+}
+
+
+void ieee80211_setup(struct net_device *dev)
+{
+ dev->change_mtu = ieee80211_change_mtu;
+ dev->hard_header = ieee80211_header;
+ dev->rebuild_header = ieee80211_rebuild_header;
+ dev->set_mac_address = ieee80211_mac_addr;
+ dev->hard_header_cache = ieee80211_header_cache;
+ dev->header_cache_update = ieee80211_header_cache_update;
+ dev->hard_header_parse = ieee80211_header_parse;
+
+ dev->hard_start_xmit = ieee80211_xmit;
+
+ dev->type = ARPHRD_ETHER;
+ dev->hard_header_len = IEEE80211_3ADDR_LEN + SNAP_SIZE;
+ dev->mtu = IEEE80211_DATA_LEN - 8 - SNAP_SIZE;
+ dev->addr_len = IEEE80211_ALEN;
+ dev->tx_queue_len = 1000;
+ dev->flags = IFF_BROADCAST | IFF_MULTICAST;
+
+ memset(dev->broadcast, 0xFF, IEEE80211_ALEN);
+}
+
+
struct ieee80211_device *alloc_ieee80211(int sizeof_priv)
{
struct ieee80211_device *ieee;
struct net_device *dev;
- int alloc_size;
+ int alloc_size;
int err;
IEEE80211_DEBUG_INFO("Initializing...\n");
- alloc_size = ((sizeof(struct ieee80211_device) + NETDEV_ALIGN_CONST)
- & ~NETDEV_ALIGN_CONST)
- + sizeof_priv;
- dev = alloc_etherdev(alloc_size);
+ alloc_size = ((sizeof(struct ieee80211_device) + NETDEV_ALIGN_CONST)
+ & ~NETDEV_ALIGN_CONST)
+ + sizeof_priv;
+ dev = alloc_netdev(alloc_size, "wlan%d", ieee80211_setup);
if (!dev) {
- IEEE80211_ERROR("Unable to network device.\n");
+ IEEE80211_ERROR("Unable to allocate network device.\n");
goto failed;
}
ieee = netdev_priv(dev);
ieee->dev = dev;
ieee->priv = ieee80211_priv(ieee);
-
- dev->hard_start_xmit = ieee80211_xmit;
err = ieee80211_networks_allocate(ieee);
if (err) {
@@ -201,7 +402,7 @@
unsigned long count, void *data)
{
char buf[] = "0x00000000";
- unsigned long len = min(sizeof(buf) - 1, (u32)count);
+ unsigned long len = min((unsigned long)sizeof(buf) - 1, count);
char *p = (char *)buf;
unsigned long val;
@@ -268,4 +469,5 @@
#endif
+EXPORT_SYMBOL(ieee80211_setup);
EXPORT_SYMBOL(alloc_ieee80211);
EXPORT_SYMBOL(free_ieee80211);
--- a/net/ieee80211/ieee80211_tx.c
+++ b/net/ieee80211/ieee80211_tx.c
@@ -84,16 +84,6 @@
Total: 8 non-data bytes
-802.3 Ethernet Data Frame
-
- ,-----------------------------------------.
-Bytes | 6 | 6 | 2 | Variable | 4 |
- |-------|-------|------|-----------|------|
-Desc. | Dest. | Source| Type | IP Packet | fcs |
- | MAC | MAC | | | |
- `-----------------------------------------'
-Total: 18 non-data bytes
-
In the event that fragmentation is required, the incoming payload is split into
N parts of size ieee->fts. The first fragment contains the SNAP header and the
remaining packets are just data.
@@ -104,56 +94,8 @@
encryption it will take 3 frames. With WEP it will take 4 frames as the
payload of each frame is reduced to 492 bytes.
-* SKB visualization
-*
-* ,- skb->data
-* |
-* | ETHERNET HEADER ,-<-- PAYLOAD
-* | | 14 bytes from skb->data
-* | 2 bytes for Type --> ,T. | (sizeof ethhdr)
-* | | | |
-* |,-Dest.--. ,--Src.---. | | |
-* | 6 bytes| | 6 bytes | | | |
-* v | | | | | |
-* 0 | v 1 | v | v 2
-* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
-* ^ | ^ | ^ |
-* | | | | | |
-* | | | | `T' <---- 2 bytes for Type
-* | | | |
-* | | '---SNAP--' <-------- 6 bytes for SNAP
-* | |
-* `-IV--' <-------------------- 4 bytes for IV (WEP)
-*
-* SNAP HEADER
-*
*/
-static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 };
-static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 };
-
-static inline int ieee80211_put_snap(u8 *data, u16 h_proto)
-{
- struct ieee80211_snap_hdr *snap;
- u8 *oui;
-
- snap = (struct ieee80211_snap_hdr *)data;
- snap->dsap = 0xaa;
- snap->ssap = 0xaa;
- snap->ctrl = 0x03;
-
- if (h_proto == 0x8137 || h_proto == 0x80f3)
- oui = P802_1H_OUI;
- else
- oui = RFC1042_OUI;
- snap->oui[0] = oui[0];
- snap->oui[1] = oui[1];
- snap->oui[2] = oui[2];
-
- *(u16 *)(data + SNAP_SIZE) = htons(h_proto);
-
- return SNAP_SIZE + sizeof(u16);
-}
static inline int ieee80211_encrypt_fragment(
struct ieee80211_device *ieee,
@@ -248,19 +190,16 @@
struct net_device *dev)
{
struct ieee80211_device *ieee = netdev_priv(dev);
+ struct ieee80211_hdr *header = (struct ieee80211_hdr *)skb->data;
struct ieee80211_txb *txb = NULL;
struct ieee80211_hdr *frag_hdr;
int i, bytes_per_frag, nr_frags, bytes_last_frag, frag_size;
unsigned long flags;
struct net_device_stats *stats = &ieee->stats;
- int ether_type, encrypt;
+ int type, encrypt;
int bytes, fc, hdr_len;
struct sk_buff *skb_frag;
- struct ieee80211_hdr header = { /* Ensure zero initialized */
- .duration_id = 0,
- .seq_ctl = 0
- };
- u8 dest[ETH_ALEN], src[ETH_ALEN];
+ u8 *dest;
struct ieee80211_crypt_data* crypt;
@@ -269,76 +208,48 @@
/* If there is no driver handler to take the TXB, dont' bother
* creating it... */
if (!ieee->hard_start_xmit) {
- printk(KERN_WARNING "%s: No xmit handler.\n",
- dev->name);
+ if (printk_ratelimit())
+ printk(KERN_WARNING "%s: No xmit handler.\n",
+ dev->name);
goto success;
}
- if (unlikely(skb->len < SNAP_SIZE + sizeof(u16))) {
- printk(KERN_WARNING "%s: skb too small (%d).\n",
- dev->name, skb->len);
- goto success;
- }
-
- ether_type = ntohs(((struct ethhdr *)skb->data)->h_proto);
+ type = ieee80211_get_proto(header);
+ dest = IEEE80211_GET_DADDR(header);
+ hdr_len = ieee80211_get_hdrlen(header);
crypt = ieee->crypt[ieee->tx_keyidx];
- encrypt = !(ether_type == ETH_P_PAE && ieee->ieee802_1x) &&
+ encrypt = !(type == ETH_P_PAE && ieee->ieee802_1x) &&
ieee->host_encrypt && crypt && crypt->ops;
if (!encrypt && ieee->ieee802_1x &&
- ieee->drop_unencrypted && ether_type != ETH_P_PAE) {
+ ieee->drop_unencrypted && type != ETH_P_PAE) {
stats->tx_dropped++;
goto success;
}
#ifdef CONFIG_IEEE80211_DEBUG
- if (crypt && !encrypt && ether_type == ETH_P_PAE) {
- struct eapol *eap = (struct eapol *)(skb->data +
- sizeof(struct ethhdr) - SNAP_SIZE - sizeof(u16));
+ if (crypt && !encrypt && type == ETH_P_PAE) {
+ struct eapol *eap = (struct eapol *)(skb->data + hdr_len);
IEEE80211_DEBUG_EAP("TX: IEEE 802.11 EAPOL frame: %s\n",
eap_get_type(eap->type));
}
#endif
- /* Save source and destination addresses */
- memcpy(&dest, skb->data, ETH_ALEN);
- memcpy(&src, skb->data+ETH_ALEN, ETH_ALEN);
-
- /* Advance the SKB to the start of the payload */
- skb_pull(skb, sizeof(struct ethhdr));
-
/* Determine total amount of storage required for TXB packets */
- bytes = skb->len + SNAP_SIZE + sizeof(u16);
+ bytes = skb->len - hdr_len;
+ fc = le16_to_cpu(header->frame_ctl);
if (encrypt)
- fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA |
- IEEE80211_FCTL_WEP;
- else
- fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA;
+ fc |= IEEE80211_FCTL_WEP;
- if (ieee->iw_mode == IW_MODE_INFRA) {
- fc |= IEEE80211_FCTL_TODS;
- /* To DS: Addr1 = BSSID, Addr2 = SA,
- Addr3 = DA */
- memcpy(&header.addr1, ieee->bssid, ETH_ALEN);
- memcpy(&header.addr2, &src, ETH_ALEN);
- memcpy(&header.addr3, &dest, ETH_ALEN);
- } else if (ieee->iw_mode == IW_MODE_ADHOC) {
- /* not From/To DS: Addr1 = DA, Addr2 = SA,
- Addr3 = BSSID */
- memcpy(&header.addr1, dest, ETH_ALEN);
- memcpy(&header.addr2, src, ETH_ALEN);
- memcpy(&header.addr3, ieee->bssid, ETH_ALEN);
- }
- header.frame_ctl = cpu_to_le16(fc);
- hdr_len = IEEE80211_3ADDR_LEN;
+ header->frame_ctl = cpu_to_le16(fc);
/* Determine fragmentation size based on destination (multicast
* and broadcast are not fragmented) */
- if (is_multicast_ether_addr(dest) ||
- is_broadcast_ether_addr(dest))
+ if (is_multicast_ieee80211_addr(dest) ||
+ is_broadcast_ieee80211_addr(dest))
frag_size = MAX_FRAG_THRESHOLD;
else
frag_size = ieee->fts;
@@ -347,7 +258,7 @@
* this stack is providing the full 802.11 header, one will
* eventually be affixed to this fragment -- so we must account for
* it when determining the amount of payload space. */
- bytes_per_frag = frag_size - IEEE80211_3ADDR_LEN;
+ bytes_per_frag = frag_size - hdr_len;
if (ieee->config &
(CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS))
bytes_per_frag -= IEEE80211_FCS_LEN;
@@ -378,6 +289,8 @@
txb->encrypted = encrypt;
txb->payload_size = bytes;
+ skb_pull(skb, hdr_len);
+
for (i = 0; i < nr_frags; i++) {
skb_frag = txb->fragments[i];
@@ -385,7 +298,7 @@
skb_reserve(skb_frag, crypt->ops->extra_prefix_len);
frag_hdr = (struct ieee80211_hdr *)skb_put(skb_frag, hdr_len);
- memcpy(frag_hdr, &header, hdr_len);
+ memcpy(frag_hdr, header, hdr_len);
/* If this is not the last fragment, then add the MOREFRAGS
* bit to the frame control */
@@ -398,14 +311,6 @@
bytes = bytes_last_frag;
}
- /* Put a SNAP header on the first fragment */
- if (i == 0) {
- ieee80211_put_snap(
- skb_put(skb_frag, SNAP_SIZE + sizeof(u16)),
- ether_type);
- bytes -= SNAP_SIZE + sizeof(u16);
- }
-
memcpy(skb_put(skb_frag, bytes), skb->data, bytes);
/* Advance the SKB... */
--- a/net/ieee80211/ieee80211_wx.c
+++ b/net/ieee80211/ieee80211_wx.c
@@ -53,7 +53,7 @@
/* First entry *MUST* be the AP MAC address */
iwe.cmd = SIOCGIWAP;
iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
- memcpy(iwe.u.ap_addr.sa_data, network->bssid, ETH_ALEN);
+ memcpy(iwe.u.ap_addr.sa_data, network->bssid, IEEE80211_ALEN);
start = iwe_stream_add_event(start, stop, &iwe, IW_EV_ADDR_LEN);
/* Remaining entries will be displayed in the order we provide them */
--- a/net/ieee80211/ieee80211_crypt_ccmp.c
+++ b/net/ieee80211/ieee80211_crypt_ccmp.c
@@ -17,7 +17,6 @@
#include <linux/random.h>
#include <linux/skbuff.h>
#include <linux/netdevice.h>
-#include <linux/if_ether.h>
#include <linux/if_arp.h>
#include <asm/string.h>
#include <linux/wireless.h>
@@ -156,7 +155,7 @@
* Dlen */
b0[0] = 0x59;
b0[1] = qc;
- memcpy(b0 + 2, hdr->addr2, ETH_ALEN);
+ memcpy(b0 + 2, hdr->addr2, IEEE80211_ALEN);
memcpy(b0 + 8, pn, CCMP_PN_LEN);
b0[14] = (dlen >> 8) & 0xff;
b0[15] = dlen & 0xff;
@@ -173,13 +172,13 @@
aad[1] = aad_len & 0xff;
aad[2] = pos[0] & 0x8f;
aad[3] = pos[1] & 0xc7;
- memcpy(aad + 4, hdr->addr1, 3 * ETH_ALEN);
+ memcpy(aad + 4, hdr->addr1, 3 * IEEE80211_ALEN);
pos = (u8 *) &hdr->seq_ctl;
aad[22] = pos[0] & 0x0f;
aad[23] = 0; /* all bits masked */
memset(aad + 24, 0, 8);
if (a4_included)
- memcpy(aad + 24, hdr->addr4, ETH_ALEN);
+ memcpy(aad + 24, hdr->addr4, IEEE80211_ALEN);
if (qc_included) {
aad[a4_included ? 30 : 24] = qc;
/* rest of QC masked */
--- a/net/ieee80211/ieee80211_crypt_tkip.c
+++ b/net/ieee80211/ieee80211_crypt_tkip.c
@@ -17,7 +17,6 @@
#include <linux/random.h>
#include <linux/skbuff.h>
#include <linux/netdevice.h>
-#include <linux/if_ether.h>
#include <linux/if_arp.h>
#include <asm/string.h>
@@ -461,20 +460,20 @@
switch (le16_to_cpu(hdr11->frame_ctl) &
(IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS)) {
case IEEE80211_FCTL_TODS:
- memcpy(hdr, hdr11->addr3, ETH_ALEN); /* DA */
- memcpy(hdr + ETH_ALEN, hdr11->addr2, ETH_ALEN); /* SA */
+ memcpy(hdr, hdr11->addr3, IEEE80211_ALEN); /* DA */
+ memcpy(hdr + IEEE80211_ALEN, hdr11->addr2, IEEE80211_ALEN); /* SA */
break;
case IEEE80211_FCTL_FROMDS:
- memcpy(hdr, hdr11->addr1, ETH_ALEN); /* DA */
- memcpy(hdr + ETH_ALEN, hdr11->addr3, ETH_ALEN); /* SA */
+ memcpy(hdr, hdr11->addr1, IEEE80211_ALEN); /* DA */
+ memcpy(hdr + IEEE80211_ALEN, hdr11->addr3, IEEE80211_ALEN); /* SA */
break;
case IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS:
- memcpy(hdr, hdr11->addr3, ETH_ALEN); /* DA */
- memcpy(hdr + ETH_ALEN, hdr11->addr4, ETH_ALEN); /* SA */
+ memcpy(hdr, hdr11->addr3, IEEE80211_ALEN); /* DA */
+ memcpy(hdr + IEEE80211_ALEN, hdr11->addr4, IEEE80211_ALEN); /* SA */
break;
case 0:
- memcpy(hdr, hdr11->addr1, ETH_ALEN); /* DA */
- memcpy(hdr + ETH_ALEN, hdr11->addr2, ETH_ALEN); /* SA */
+ memcpy(hdr, hdr11->addr1, IEEE80211_ALEN); /* DA */
+ memcpy(hdr + IEEE80211_ALEN, hdr11->addr2, IEEE80211_ALEN); /* SA */
break;
}
@@ -521,7 +520,7 @@
else
ev.flags |= IW_MICFAILURE_PAIRWISE;
ev.src_addr.sa_family = ARPHRD_ETHER;
- memcpy(ev.src_addr.sa_data, hdr->addr2, ETH_ALEN);
+ memcpy(ev.src_addr.sa_data, hdr->addr2, IEEE80211_ALEN);
memset(&wrqu, 0, sizeof(wrqu));
wrqu.data.length = sizeof(ev);
wireless_send_event(dev, IWEVMICHAELMICFAILURE, &wrqu, (char *) &ev);
--
Jiri Benc
SUSE Labs
^ permalink raw reply [flat|nested] 27+ messages in thread
* [5/5] ieee80211: add sequence numbers
2005-05-24 13:07 [0/5] Improvements to the ieee80211 layer Jiri Benc
` (3 preceding siblings ...)
2005-05-24 13:12 ` [4/5] ieee80211: ethernet independency Jiri Benc
@ 2005-05-24 13:13 ` Jiri Benc
2005-05-24 13:15 ` [1-2/6] ipw2100, ipw2200: patches to merge to kernel Jiri Benc
` (7 subsequent siblings)
12 siblings, 0 replies; 27+ messages in thread
From: Jiri Benc @ 2005-05-24 13:13 UTC (permalink / raw)
To: NetDev; +Cc: LKML, jgarzik, pavel
Adds sequence numbers to IEEE 802.11 headers.
Signed-off-by: Jiri Benc <jbenc@suse.cz>
Signed-off-by: Jirka Bohac <jbohac@suse.cz>
--- a/include/net/ieee80211.h
+++ b/include/net/ieee80211.h
@@ -711,6 +711,8 @@
unsigned int frag_next_idx;
u16 fts; /* Fragmentation Threshold */
+ u16 seq_number; /* sequence number in transmitted frames */
+
/* Association info */
u8 bssid[IEEE80211_ALEN];
--- a/net/ieee80211/ieee80211_module.c
+++ b/net/ieee80211/ieee80211_module.c
@@ -333,6 +333,7 @@
/* Default fragmentation threshold is maximum payload size */
ieee->fts = DEFAULT_FTS;
+ ieee->seq_number = 0;
ieee->scan_age = DEFAULT_MAX_SCAN_AGE;
ieee->open_wep = 1;
--- a/net/ieee80211/ieee80211_tx.c
+++ b/net/ieee80211/ieee80211_tx.c
@@ -277,6 +277,13 @@
else
bytes_last_frag = bytes_per_frag;
+ if (nr_frags > 16) {
+ /* Should never happen */
+ printk(KERN_WARNING "%s: Fragmentation threshold too low\n",
+ dev->name);
+ goto failed;
+ }
+
/* When we allocate the TXB we allocate enough space for the reserve
* and full fragment bytes (bytes_per_frag doesn't include prefix,
* postfix, header, FCS, etc.) */
@@ -300,6 +307,8 @@
frag_hdr = (struct ieee80211_hdr *)skb_put(skb_frag, hdr_len);
memcpy(frag_hdr, header, hdr_len);
+ frag_hdr->seq_ctl = cpu_to_le16(ieee->seq_number | i);
+
/* If this is not the last fragment, then add the MOREFRAGS
* bit to the frame control */
if (i != nr_frags - 1) {
@@ -324,7 +333,7 @@
(CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS))
skb_put(skb_frag, 4);
}
-
+ ieee->seq_number += 0x10;
success:
spin_unlock_irqrestore(&ieee->lock, flags);
--
Jiri Benc
SUSE Labs
^ permalink raw reply [flat|nested] 27+ messages in thread
* [1-2/6] ipw2100, ipw2200: patches to merge to kernel
2005-05-24 13:07 [0/5] Improvements to the ieee80211 layer Jiri Benc
` (4 preceding siblings ...)
2005-05-24 13:13 ` [5/5] ieee80211: add sequence numbers Jiri Benc
@ 2005-05-24 13:15 ` Jiri Benc
2005-05-24 17:24 ` Dave Jones
2005-05-24 13:16 ` [3/6] ipw2100: fix after "ieee80211: cleanup" Jiri Benc
` (6 subsequent siblings)
12 siblings, 1 reply; 27+ messages in thread
From: Jiri Benc @ 2005-05-24 13:15 UTC (permalink / raw)
To: NetDev; +Cc: pavel
Patches to merge the ipw2100 and ipw2200 drivers to the kernel can be
downloaded from:
http://jikos.cz/~jbohac/wifi/import-ipw2100.patch
http://jikos.cz/~jbohac/wifi/import-ipw2200.patch
(they are too large to post them here)
The ipw2100 patch is just a merge of ipw2100 driver with Pavel Machek's
cleanup patch.
The ipw2200 patch is not cleaned up and is intended for testing purposes
only.
--
Jiri Benc
SUSE Labs
^ permalink raw reply [flat|nested] 27+ messages in thread
* [3/6] ipw2100: fix after "ieee80211: cleanup"
2005-05-24 13:07 [0/5] Improvements to the ieee80211 layer Jiri Benc
` (5 preceding siblings ...)
2005-05-24 13:15 ` [1-2/6] ipw2100, ipw2200: patches to merge to kernel Jiri Benc
@ 2005-05-24 13:16 ` Jiri Benc
2005-05-24 13:18 ` [4/6] ipw2100: fix after "ieee80211_device alignment fix" Jiri Benc
` (5 subsequent siblings)
12 siblings, 0 replies; 27+ messages in thread
From: Jiri Benc @ 2005-05-24 13:16 UTC (permalink / raw)
To: NetDev; +Cc: pavel
Fixes ipw2100 after the ieee80211 header cleanup
(patch [1/5] ieee80211: cleanup).
Signed-off-by: Jiri Benc <jbenc@suse.cz>
Signed-off-by: Jirka Bohac <jbohac@suse.cz>
--- a/drivers/net/wireless/ipw2100.h 2005-05-19 16:23:00.000000000 +0200
+++ b/drivers/net/wireless/ipw2100.h 2005-05-19 16:37:14.000000000 +0200
@@ -798,7 +798,7 @@
-#define IPW_HEADER_802_11_SIZE sizeof(struct ieee80211_header_data)
+#define IPW_HEADER_802_11_SIZE sizeof(struct ieee80211_hdr_3addr)
#define IPW_MAX_80211_PAYLOAD_SIZE 2304U
#define IPW_MAX_802_11_PAYLOAD_LENGTH 2312
#define IPW_MAX_ACCEPTABLE_TX_FRAME_LENGTH 1536
--
Jiri Benc
SUSE Labs
^ permalink raw reply [flat|nested] 27+ messages in thread
* [4/6] ipw2100: fix after "ieee80211_device alignment fix"
2005-05-24 13:07 [0/5] Improvements to the ieee80211 layer Jiri Benc
` (6 preceding siblings ...)
2005-05-24 13:16 ` [3/6] ipw2100: fix after "ieee80211: cleanup" Jiri Benc
@ 2005-05-24 13:18 ` Jiri Benc
2005-05-24 18:58 ` Pavel Machek
2005-05-24 13:19 ` [5/6] ipw2200: " Jiri Benc
` (4 subsequent siblings)
12 siblings, 1 reply; 27+ messages in thread
From: Jiri Benc @ 2005-05-24 13:18 UTC (permalink / raw)
To: NetDev; +Cc: pavel
Fixes ipw2100 after ieee80211_device alignment fix
(patch [2/5] ieee80211: ieee80211_device alignment fix and cleanup)
Signed-off-by: Jiri Benc <jbenc@suse.cz>
Signed-off-by: Jirka Bohac <jbohac@suse.cz>
--- linux-2.6.12-rc2-mm3.01/drivers/net/wireless/ipw2100.c 2005-05-19 16:23:00.000000000 +0200
+++ linux-2.6.12-rc2-mm3.04/drivers/net/wireless/ipw2100.c 2005-05-19 17:35:48.000000000 +0200
@@ -1717,7 +1717,7 @@
/* Called by register_netdev() */
static int ipw2100_net_init(struct net_device *dev)
{
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
return ipw2100_up(priv, 1);
}
@@ -3142,9 +3142,9 @@
return IRQ_NONE;
}
-static int ipw2100_tx(struct ieee80211_txb *txb, struct net_device *dev)
+static int ipw2100_tx(struct ieee80211_txb *txb, struct ieee80211_device *ieee)
{
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(ieee);
struct list_head *element;
struct ipw2100_tx_packet *packet;
unsigned long flags;
@@ -3154,7 +3154,7 @@
if (!(priv->status & STATUS_ASSOCIATED)) {
IPW_DEBUG_INFO("Can not transmit when not connected.\n");
priv->ieee->stats.tx_carrier_errors++;
- netif_stop_queue(dev);
+ netif_stop_queue(ieee80211_dev(ieee));
goto fail_unlock;
}
@@ -3185,7 +3185,7 @@
return 0;
fail_unlock:
- netif_stop_queue(dev);
+ netif_stop_queue(ieee80211_dev(ieee));
spin_unlock_irqrestore(&priv->low_lock, flags);
return 1;
}
@@ -5087,10 +5087,10 @@
ipw2100_configure_security(priv, 0);
}
-static void shim__set_security(struct net_device *dev,
+static void shim__set_security(struct ieee80211_device *ieee,
struct ieee80211_security *sec)
{
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(ieee);
int i, force_update = 0;
down(&priv->action_sem);
@@ -5270,7 +5270,7 @@
* method as well) to talk to the firmware */
static int ipw2100_set_address(struct net_device *dev, void *p)
{
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
struct sockaddr *addr = p;
int err = 0;
@@ -5298,7 +5298,7 @@
static int ipw2100_open(struct net_device *dev)
{
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
unsigned long flags;
IPW_DEBUG_INFO("dev->open\n");
@@ -5312,7 +5312,7 @@
static int ipw2100_close(struct net_device *dev)
{
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
unsigned long flags;
struct list_head *element;
struct ipw2100_tx_packet *packet;
@@ -5348,7 +5348,7 @@
*/
static void ipw2100_tx_timeout(struct net_device *dev)
{
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
priv->ieee->stats.tx_errors++;
@@ -5371,7 +5371,7 @@
*/
static struct net_device_stats *ipw2100_stats(struct net_device *dev)
{
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
return &priv->ieee->stats;
}
@@ -5458,7 +5458,7 @@
}
if (ieee->set_security)
- ieee->set_security(ieee->dev, &sec);
+ ieee->set_security(ieee, &sec);
else
ret = -EOPNOTSUPP;
@@ -5485,7 +5485,7 @@
}
if (ieee->set_security)
- ieee->set_security(ieee->dev, &sec);
+ ieee->set_security(ieee, &sec);
else
ret = -EOPNOTSUPP;
@@ -5495,7 +5495,7 @@
static int ipw2100_wpa_set_param(struct net_device *dev, u8 name, u32 value){
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
int ret=0;
switch(name){
@@ -5534,7 +5534,7 @@
static int ipw2100_wpa_mlme(struct net_device *dev, int command, int reason){
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
int ret=0;
switch(command){
@@ -5576,8 +5576,8 @@
static int ipw2100_wpa_set_wpa_ie(struct net_device *dev,
struct ipw2100_param *param, int plen){
- struct ipw2100_priv *priv = ieee80211_priv(dev);
- struct ieee80211_device *ieee = priv->ieee;
+ struct ieee80211_device *ieee = netdev_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(ieee);
u8 *buf;
if (! ieee->wpa_enabled)
@@ -5616,8 +5616,8 @@
struct ipw2100_param *param, int param_len){
int ret = 0;
- struct ipw2100_priv *priv = ieee80211_priv(dev);
- struct ieee80211_device *ieee = priv->ieee;
+ struct ieee80211_device *ieee = netdev_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(ieee);
struct ieee80211_crypto_ops *ops;
struct ieee80211_crypt_data **crypt;
@@ -5737,7 +5737,7 @@
}
done:
if (ieee->set_security)
- ieee->set_security(ieee->dev, &sec);
+ ieee->set_security(ieee, &sec);
/* Do not reset port if card is in Managed mode since resetting will
* generate new IEEE 802.11 authentication which may end up in looping
@@ -5834,7 +5834,7 @@
static void ipw_ethtool_get_drvinfo(struct net_device *dev,
struct ethtool_drvinfo *info)
{
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
char fw_ver[64], ucode_ver[64];
strcpy(info->driver, DRV_NAME);
@@ -5851,7 +5851,7 @@
static u32 ipw2100_ethtool_get_link(struct net_device *dev)
{
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
return (priv->status & STATUS_ASSOCIATED) ? 1 : 0;
}
@@ -5944,12 +5944,14 @@
{
struct ipw2100_priv *priv;
struct net_device *dev;
+ struct ieee80211_device *ieee;
- dev = alloc_ieee80211(sizeof(struct ipw2100_priv));
- if (!dev)
+ ieee = alloc_ieee80211(sizeof(struct ipw2100_priv));
+ if (!ieee)
return NULL;
- priv = ieee80211_priv(dev);
- priv->ieee = netdev_priv(dev);
+ dev = ieee80211_dev(ieee);
+ priv = ieee80211_priv(ieee);
+ priv->ieee = ieee;
priv->pci_dev = pci_dev;
priv->net_dev = dev;
@@ -6131,7 +6133,7 @@
return err;
}
- priv = ieee80211_priv(dev);
+ priv = ieee80211_priv(netdev_priv(dev));
pci_set_master(pci_dev);
pci_set_drvdata(pci_dev, priv);
@@ -6270,7 +6272,7 @@
ipw2100_queues_free(priv);
sysfs_remove_group(&pci_dev->dev.kobj, &ipw2100_attribute_group);
- free_ieee80211(dev);
+ free_ieee80211(netdev_priv(dev));
pci_set_drvdata(pci_dev, NULL);
}
@@ -6326,7 +6328,7 @@
if (dev->base_addr)
iounmap((unsigned char *)dev->base_addr);
- free_ieee80211(dev);
+ free_ieee80211(netdev_priv(dev));
}
pci_release_regions(pci_dev);
@@ -6547,7 +6549,7 @@
* This can be called at any time. No action lock required
*/
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
if (!(priv->status & STATUS_ASSOCIATED))
strcpy(wrqu->name, "unassociated");
else
@@ -6562,7 +6564,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
struct iw_freq *fwrq = &wrqu->freq;
int err = 0;
@@ -6613,7 +6615,7 @@
* This can be called at any time. No action lock required
*/
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
wrqu->freq.e = 0;
@@ -6634,7 +6636,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
int err = 0;
IPW_DEBUG_WX("SET Mode -> %d \n", wrqu->mode);
@@ -6677,7 +6679,7 @@
* This can be called at any time. No action lock required
*/
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
wrqu->mode = priv->ieee->iw_mode;
IPW_DEBUG_WX("GET Mode -> %d\n", wrqu->mode);
@@ -6713,7 +6715,7 @@
* This can be called at any time. No action lock required
*/
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
struct iw_range *range = (struct iw_range *)extra;
u16 val;
int i, level;
@@ -6825,7 +6827,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
int err = 0;
static const unsigned char any[] = {
@@ -6880,7 +6882,7 @@
* This can be called at any time. No action lock required
*/
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
/* If we are associated, trying to associate, or have a statically
* configured BSSID then return that; otherwise return ANY */
@@ -6900,7 +6902,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
char *essid = ""; /* ANY */
int length = 0;
int err = 0;
@@ -6954,7 +6956,7 @@
* This can be called at any time. No action lock required
*/
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
/* If we are associated, trying to associate, or have a statically
* configured ESSID then return that; otherwise return ANY */
@@ -6982,7 +6984,7 @@
* This can be called at any time. No action lock required
*/
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
if (wrqu->data.length > IW_ESSID_MAX_SIZE)
return -E2BIG;
@@ -7004,7 +7006,7 @@
* This can be called at any time. No action lock required
*/
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
wrqu->data.length = strlen(priv->nick) + 1;
memcpy(extra, priv->nick, wrqu->data.length);
@@ -7019,7 +7021,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
u32 target_rate = wrqu->bitrate.value;
u32 rate;
int err = 0;
@@ -7060,7 +7062,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
int val;
int len = sizeof(val);
int err = 0;
@@ -7112,7 +7114,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
int value, err;
/* Auto RTS not yet supported */
@@ -7152,7 +7154,7 @@
* This can be called at any time. No action lock required
*/
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
wrqu->rts.value = priv->rts_threshold & ~RTS_DISABLED;
wrqu->rts.fixed = 1; /* no auto select */
@@ -7169,7 +7171,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
int err = 0, value;
if (priv->ieee->iw_mode != IW_MODE_ADHOC)
@@ -7209,7 +7211,7 @@
* This can be called at any time. No action lock required
*/
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
if (priv->ieee->iw_mode != IW_MODE_ADHOC) {
wrqu->power.disabled = 1;
@@ -7245,7 +7247,7 @@
* This can be called at any time. No action lock required
*/
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
if (!wrqu->frag.fixed)
return -EINVAL;
@@ -7275,7 +7277,7 @@
* This can be called at any time. No action lock required
*/
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
wrqu->frag.value = priv->frag_threshold & ~FRAG_DISABLED;
wrqu->frag.fixed = 0; /* no auto select */
wrqu->frag.disabled = (priv->frag_threshold & FRAG_DISABLED) ? 1 : 0;
@@ -7289,7 +7291,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
int err = 0;
if (wrqu->retry.flags & IW_RETRY_LIFETIME ||
@@ -7338,7 +7340,7 @@
* This can be called at any time. No action lock required
*/
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
wrqu->retry.disabled = 0; /* can't be disabled */
@@ -7367,7 +7369,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
int err = 0;
down(&priv->action_sem);
@@ -7398,7 +7400,7 @@
* This can be called at any time. No action lock required
*/
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
return ieee80211_wx_get_scan(priv->ieee, info, wrqu, extra);
}
@@ -7414,7 +7416,7 @@
* No check of STATUS_INITIALIZED required
*/
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
return ieee80211_wx_set_encode(priv->ieee, info, wrqu, key);
}
@@ -7426,7 +7428,7 @@
* This can be called at any time. No action lock required
*/
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
return ieee80211_wx_get_encode(priv->ieee, info, wrqu, key);
}
@@ -7434,7 +7436,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
int err = 0;
down(&priv->action_sem);
@@ -7484,7 +7486,7 @@
* This can be called at any time. No action lock required
*/
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
if (!(priv->power_mode & IPW_POWER_ENABLED)) {
wrqu->power.disabled = 1;
@@ -7509,7 +7511,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
int *parms = (int *)extra;
int enable = (parms[0] > 0);
int err = 0;
@@ -7540,7 +7542,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
if (priv->status & STATUS_INITIALIZED)
schedule_reset(priv);
return 0;
@@ -7552,7 +7554,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
int err = 0, mode = *(int *)extra;
down(&priv->action_sem);
@@ -7580,7 +7582,7 @@
* This can be called at any time. No action lock required
*/
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
int level = IPW_POWER_LEVEL(priv->power_mode);
s32 timeout, period;
@@ -7617,7 +7619,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
int err, mode = *(int *)extra;
down(&priv->action_sem);
@@ -7650,7 +7652,7 @@
* This can be called at any time. No action lock required
*/
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
if (priv->config & CFG_LONG_PREAMBLE)
snprintf(wrqu->name, IFNAMSIZ, "long (1)");
@@ -7792,7 +7794,7 @@
int tx_qual;
int beacon_qual;
- struct ipw2100_priv *priv = ieee80211_priv(dev);
+ struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
struct iw_statistics *wstats;
u32 rssi, quality, tx_retries, missed_beacons, tx_failures;
u32 ord_len = sizeof(u32);
--
Jiri Benc
SUSE Labs
^ permalink raw reply [flat|nested] 27+ messages in thread
* [5/6] ipw2200: fix after "ieee80211_device alignment fix"
2005-05-24 13:07 [0/5] Improvements to the ieee80211 layer Jiri Benc
` (7 preceding siblings ...)
2005-05-24 13:18 ` [4/6] ipw2100: fix after "ieee80211_device alignment fix" Jiri Benc
@ 2005-05-24 13:19 ` Jiri Benc
2005-05-24 13:20 ` [6/6] ipw2200: fix after "ieee80211: ethernet independency" Jiri Benc
` (3 subsequent siblings)
12 siblings, 0 replies; 27+ messages in thread
From: Jiri Benc @ 2005-05-24 13:19 UTC (permalink / raw)
To: NetDev
Fixes ipw2200 after ieee80211_device alignment fix
(patch [2/5] ieee80211: ieee80211_device alignment fix and cleanup).
Signed-off-by: Jiri Benc <jbenc@suse.cz>
Signed-off-by: Jirka Bohac <jbohac@suse.cz>
--- linux-2.6.12-rc2-mm3.02/drivers/net/wireless/ipw2200.c 2005-05-18 13:36:28.000000000 +0200
+++ linux-2.6.12-rc2-mm3.02-ipwfix/drivers/net/wireless/ipw2200.c 2005-05-18 16:50:29.000000000 +0200
@@ -5586,7 +5586,7 @@
}
if (ieee->set_security)
- ieee->set_security(ieee->dev, &sec);
+ ieee->set_security(ieee, &sec);
else
ret = -EOPNOTSUPP;
@@ -5613,7 +5613,7 @@
}
if (ieee->set_security)
- ieee->set_security(ieee->dev, &sec);
+ ieee->set_security(ieee, &sec);
else
ret = -EOPNOTSUPP;
@@ -5623,7 +5623,7 @@
static int ipw_wpa_set_param(struct net_device *dev, u8 name, u32 value)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
int ret=0;
switch (name) {
@@ -5662,7 +5662,7 @@
static int ipw_wpa_mlme(struct net_device *dev, int command, int reason)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
int ret = 0;
switch (command) {
@@ -5712,8 +5712,8 @@
static int ipw_wpa_set_wpa_ie(struct net_device *dev,
struct ipw_param *param, int plen)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
- struct ieee80211_device *ieee = priv->ieee;
+ struct ieee80211_device *ieee = netdev_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(ieee);
u8 *buf;
if (!ieee->wpa_enabled)
@@ -5748,8 +5748,7 @@
struct ipw_param *param, int param_len)
{
int ret = 0;
- struct ipw_priv *priv = ieee80211_priv(dev);
- struct ieee80211_device *ieee = priv->ieee;
+ struct ieee80211_device *ieee = netdev_priv(dev);
struct ieee80211_crypto_ops *ops;
struct ieee80211_crypt_data **crypt;
@@ -5871,7 +5870,7 @@
}
done:
if (ieee->set_security)
- ieee->set_security(ieee->dev, &sec);
+ ieee->set_security(ieee, &sec);
/* Do not reset port if card is in Managed mode since resetting will
* generate new IEEE 802.11 authentication which may end up in looping
@@ -5881,7 +5880,7 @@
if (ieee->reset_on_keychange &&
ieee->iw_mode != IW_MODE_INFRA &&
ieee->reset_port &&
- ieee->reset_port(dev)) {
+ ieee->reset_port(ieee)) {
IPW_DEBUG_INFO("%s: reset_port failed\n", dev->name);
param->u.crypt.err = IPW_CRYPT_ERR_CARD_CONF_FAILED;
return -EINVAL;
@@ -6525,7 +6524,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
down(&priv->sem);
if (priv->status & STATUS_RF_KILL_MASK)
strcpy(wrqu->name, "radio off");
@@ -6574,7 +6573,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
struct iw_freq *fwrq = &wrqu->freq;
int ret = 0;
@@ -6610,7 +6609,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
wrqu->freq.e = 0;
@@ -6632,7 +6631,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
int err = 0;
IPW_DEBUG_WX("Set MODE: %d\n", wrqu->mode);
@@ -6688,7 +6687,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
down(&priv->sem);
wrqu->mode = priv->ieee->iw_mode;
IPW_DEBUG_WX("Get MODE -> %d\n", wrqu->mode);
@@ -6725,7 +6724,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
struct iw_range *range = (struct iw_range *)extra;
u16 val;
int i;
@@ -6789,7 +6788,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
static const unsigned char any[] = {
0xff, 0xff, 0xff, 0xff, 0xff, 0xff
@@ -6838,7 +6837,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
/* If we are associated, trying to associate, or have a statically
* configured BSSID then return that; otherwise return ANY */
down(&priv->sem);
@@ -6859,7 +6858,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
char *essid = ""; /* ANY */
int length = 0;
down(&priv->sem);
@@ -6909,7 +6908,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
/* If we are associated, trying to associate, or have a statically
* configured ESSID then return that; otherwise return ANY */
@@ -6934,7 +6933,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
IPW_DEBUG_WX("Setting nick to '%s'\n", extra);
if (wrqu->data.length > IW_ESSID_MAX_SIZE)
@@ -6954,7 +6953,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
IPW_DEBUG_WX("Getting nick\n");
down(&priv->sem);
wrqu->data.length = strlen(priv->nick) + 1;
@@ -6969,7 +6968,7 @@
union iwreq_data *wrqu, char *extra)
{
/* TODO: We should use semaphores or locks for access to priv */
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
u32 target_rate = wrqu->bitrate.value;
u32 fixed, mask;
@@ -7081,7 +7080,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw_priv * priv = ieee80211_priv(dev);
+ struct ipw_priv * priv = ieee80211_priv(netdev_priv(dev));
down(&priv->sem);
wrqu->bitrate.value = priv->last_rate;
up(&priv->sem);
@@ -7094,7 +7093,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
down(&priv->sem);
if (wrqu->rts.disabled)
priv->rts_threshold = DEFAULT_RTS_THRESHOLD;
@@ -7117,7 +7116,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
down(&priv->sem);
wrqu->rts.value = priv->rts_threshold;
wrqu->rts.fixed = 0; /* no auto select */
@@ -7133,7 +7132,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
struct ipw_tx_power tx_power;
int i;
down(&priv->sem);
@@ -7185,7 +7184,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
down(&priv->sem);
wrqu->power.value = priv->tx_power;
wrqu->power.fixed = 1;
@@ -7204,7 +7203,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
down(&priv->sem);
if (wrqu->frag.disabled)
priv->ieee->fts = DEFAULT_FTS;
@@ -7226,7 +7225,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
down(&priv->sem);
wrqu->frag.value = priv->ieee->fts;
wrqu->frag.fixed = 0; /* no auto select */
@@ -7260,7 +7259,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
IPW_DEBUG_WX("Start scan\n");
down(&priv->sem);
if (ipw_request_scan(priv)) {
@@ -7275,7 +7274,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
return ieee80211_wx_get_scan(priv->ieee, info, wrqu, extra);
}
@@ -7283,7 +7282,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *key)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
return ieee80211_wx_set_encode(priv->ieee, info, wrqu, key);
}
@@ -7291,7 +7290,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *key)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
return ieee80211_wx_get_encode(priv->ieee, info, wrqu, key);
}
@@ -7299,7 +7298,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
int err;
down(&priv->sem);
if (wrqu->power.disabled) {
@@ -7350,7 +7349,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
down(&priv->sem);
if (!(priv->power_mode & IPW_POWER_ENABLED))
wrqu->power.disabled = 1;
@@ -7367,7 +7366,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
int mode = *(int *)extra;
int err;
down(&priv->sem);
@@ -7396,7 +7395,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
int level = IPW_POWER_LEVEL(priv->power_mode);
char *p = extra;
@@ -7428,7 +7427,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(netdev_priv(dev)));
int mode = *(int *)extra;
u8 band = 0, modulation = 0;
@@ -7495,7 +7494,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
down(&priv->sem);
switch (priv->ieee->mode) {
case IEEE_A:
@@ -7538,7 +7537,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
int mode = *(int *)extra;
down(&priv->sem);
/* Switching from SHORT -> LONG requires a disassociation */
@@ -7570,7 +7569,7 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
down(&priv->sem);
if (priv->config & CFG_PREAMBLE_LONG)
snprintf(wrqu->name, IFNAMSIZ, "long (1)");
@@ -7745,7 +7744,7 @@
*/
static struct iw_statistics *ipw_get_wireless_stats(struct net_device * dev)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
struct iw_statistics *wstats;
wstats = &priv->wstats;
@@ -7808,7 +7807,7 @@
static int ipw_net_open(struct net_device *dev)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
IPW_DEBUG_INFO("dev->open\n");
/* we should be verifying the device is ready to be opened */
down(&priv->sem);
@@ -7972,9 +7971,9 @@
}
static int ipw_net_hard_start_xmit(struct ieee80211_txb *txb,
- struct net_device *dev)
+ struct ieee80211_device *ieee)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(ieee);
unsigned long flags;
IPW_DEBUG_TX("dev->xmit(%d bytes)\n", txb->payload_size);
@@ -7983,7 +7982,7 @@
if (!(priv->status & STATUS_ASSOCIATED)) {
IPW_DEBUG_INFO("Tx attempt while not associated.\n");
priv->ieee->stats.tx_carrier_errors++;
- netif_stop_queue(dev);
+ netif_stop_queue(ieee80211_dev(ieee));
goto fail_unlock;
}
@@ -8002,7 +8001,7 @@
static struct net_device_stats *ipw_net_get_stats(struct net_device *dev)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
priv->ieee->stats.tx_packets = priv->tx_packets;
priv->ieee->stats.rx_packets = priv->rx_packets;
@@ -8016,7 +8015,7 @@
static int ipw_net_set_mac_address(struct net_device *dev, void *p)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
struct sockaddr *addr = p;
if (!is_valid_ether_addr(addr->sa_data))
return -EADDRNOTAVAIL;
@@ -8033,7 +8032,7 @@
static void ipw_ethtool_get_drvinfo(struct net_device *dev,
struct ethtool_drvinfo *info)
{
- struct ipw_priv *p = ieee80211_priv(dev);
+ struct ipw_priv *p = ieee80211_priv(netdev_priv(dev));
char vers[64];
char date[32];
u32 len;
@@ -8054,7 +8053,7 @@
static u32 ipw_ethtool_get_link(struct net_device *dev)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
return (priv->status & STATUS_ASSOCIATED) != 0;
}
@@ -8066,7 +8065,7 @@
static int ipw_ethtool_get_eeprom(struct net_device *dev,
struct ethtool_eeprom *eeprom, u8 *bytes)
{
- struct ipw_priv *p = ieee80211_priv(dev);
+ struct ipw_priv *p = ieee80211_priv(netdev_priv(dev));
if (eeprom->offset + eeprom->len > CX2_EEPROM_IMAGE_SIZE)
return -EINVAL;
@@ -8079,7 +8078,7 @@
static int ipw_ethtool_set_eeprom(struct net_device *dev,
struct ethtool_eeprom *eeprom, u8 *bytes)
{
- struct ipw_priv *p = ieee80211_priv(dev);
+ struct ipw_priv *p = ieee80211_priv(netdev_priv(dev));
int i;
if (eeprom->offset + eeprom->len > CX2_EEPROM_IMAGE_SIZE)
@@ -8293,10 +8292,10 @@
}
-static void shim__set_security(struct net_device *dev,
+static void shim__set_security(struct ieee80211_device *ieee,
struct ieee80211_security *sec)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(ieee);
int i;
down(&priv->sem);
for (i = 0; i < 4; i++) {
@@ -8579,7 +8578,7 @@
/* Called by register_netdev() */
static int ipw_net_init(struct net_device *dev)
{
- struct ipw_priv *priv = ieee80211_priv(dev);
+ struct ipw_priv *priv = ieee80211_priv(netdev_priv(dev));
down(&priv->sem);
if (priv->status & STATUS_RF_KILL_SW) {
IPW_WARNING("Radio disabled by module parameter.\n");
@@ -8665,19 +8664,21 @@
{
int err = 0;
struct net_device *net_dev;
+ struct ieee80211_device *ieee;
void __iomem *base;
u32 length, val;
struct ipw_priv *priv;
int band, modulation;
- net_dev = alloc_ieee80211(sizeof(struct ipw_priv));
- if (net_dev == NULL) {
+ ieee = alloc_ieee80211(sizeof(struct ipw_priv));
+ if (ieee == NULL) {
err = -ENOMEM;
goto out;
}
+ net_dev = ieee80211_dev(ieee);
- priv = ieee80211_priv(net_dev);
- priv->ieee = netdev_priv(net_dev);
+ priv = ieee80211_priv(ieee);
+ priv->ieee = ieee;
priv->net_dev = net_dev;
priv->pci_dev = pdev;
@@ -8882,7 +8883,7 @@
pci_disable_device(pdev);
pci_set_drvdata(pdev, NULL);
out_free_ieee80211:
- free_ieee80211(priv->net_dev);
+ free_ieee80211(priv->ieee);
out:
return err;
}
@@ -8924,7 +8925,7 @@
pci_release_regions(pdev);
pci_disable_device(pdev);
pci_set_drvdata(pdev, NULL);
- free_ieee80211(priv->net_dev);
+ free_ieee80211(priv->ieee);
#ifdef CONFIG_PM
if (fw_loaded) {
--
Jiri Benc
SUSE Labs
^ permalink raw reply [flat|nested] 27+ messages in thread
* [6/6] ipw2200: fix after "ieee80211: ethernet independency"
2005-05-24 13:07 [0/5] Improvements to the ieee80211 layer Jiri Benc
` (8 preceding siblings ...)
2005-05-24 13:19 ` [5/6] ipw2200: " Jiri Benc
@ 2005-05-24 13:20 ` Jiri Benc
2005-05-24 18:52 ` [0/5] Improvements to the ieee80211 layer Pavel Machek
` (2 subsequent siblings)
12 siblings, 0 replies; 27+ messages in thread
From: Jiri Benc @ 2005-05-24 13:20 UTC (permalink / raw)
To: NetDev
Fixes ipw2200 after making the 802.11 layer independent of ethernet
(patch [4/5] ieee80211: ethernet independency).
Signed-off-by: Jiri Benc <jbenc@suse.cz>
Signed-off-by: Jirka Bohac <jbohac@suse.cz>
--- a/drivers/net/wireless/ipw2200.c 2005-05-18 16:50:29.000000000 +0200
+++ b/drivers/net/wireless/ipw2200.c 2005-05-20 14:16:40.000000000 +0200
@@ -6316,8 +6316,8 @@
return 0;
/* {broad,multi}cast packets to our IBSS go through */
- if (is_broadcast_ether_addr(header->addr1) ||
- is_multicast_ether_addr(header->addr1))
+ if (is_broadcast_ieee80211_addr(header->addr1) ||
+ is_multicast_ieee80211_addr(header->addr1))
return !memcmp(header->addr3, priv->bssid, ETH_ALEN);
/* packets to our adapter go through */
@@ -6329,8 +6329,8 @@
return 0;
/* {broad,multi}cast packets to our IBSS go through */
- if (is_broadcast_ether_addr(header->addr1) ||
- is_multicast_ether_addr(header->addr1))
+ if (is_broadcast_ieee80211_addr(header->addr1) ||
+ is_multicast_ieee80211_addr(header->addr1))
return !memcmp(header->addr2, priv->bssid, ETH_ALEN);
/* packets to our adapter go through */
@@ -7847,8 +7847,8 @@
switch (priv->ieee->iw_mode) {
case IW_MODE_ADHOC:
hdr_len = IEEE80211_3ADDR_LEN;
- unicast = !is_broadcast_ether_addr(hdr->addr1) &&
- !is_multicast_ether_addr(hdr->addr1);
+ unicast = !is_broadcast_ieee80211_addr(hdr->addr1) &&
+ !is_multicast_ieee80211_addr(hdr->addr1);
id = ipw_find_station(priv, hdr->addr1);
if (id == IPW_INVALID_STATION) {
id = ipw_add_station(priv, hdr->addr1);
@@ -7863,8 +7863,8 @@
case IW_MODE_INFRA:
default:
- unicast = !is_broadcast_ether_addr(hdr->addr3) &&
- !is_multicast_ether_addr(hdr->addr3);
+ unicast = !is_broadcast_ieee80211_addr(hdr->addr3) &&
+ !is_multicast_ieee80211_addr(hdr->addr3);
hdr_len = IEEE80211_3ADDR_LEN;
id = 0;
break;
--
Jiri Benc
SUSE Labs
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [1-2/6] ipw2100, ipw2200: patches to merge to kernel
2005-05-24 13:15 ` [1-2/6] ipw2100, ipw2200: patches to merge to kernel Jiri Benc
@ 2005-05-24 17:24 ` Dave Jones
2005-05-24 17:56 ` Thomas Graf
0 siblings, 1 reply; 27+ messages in thread
From: Dave Jones @ 2005-05-24 17:24 UTC (permalink / raw)
To: Jiri Benc; +Cc: NetDev, pavel
On Tue, May 24, 2005 at 03:15:06PM +0200, Jiri Benc wrote:
> Patches to merge the ipw2100 and ipw2200 drivers to the kernel can be
> downloaded from:
> http://jikos.cz/~jbohac/wifi/import-ipw2100.patch
> http://jikos.cz/~jbohac/wifi/import-ipw2200.patch
> (they are too large to post them here)
>
> The ipw2100 patch is just a merge of ipw2100 driver with Pavel Machek's
> cleanup patch.
It contains a number of bogus uses of HZ.
+ IPW_DEBUG_INFO("Command completion failed out after %dms.\n",
+ HOST_COMPLETE_TIMEOUT / (HZ / 100));
..
+ schedule_timeout(HZ / 100);
..
What I don't understand, is that HZ in kernel-code should be 1000
according to <asm/param.h>, though for some reason, I've seen
divide by zeros, and really strange oopses with this code.
It's as if its for some reason, choosing to use the userspace HZ
definition. Hmm, does it need an explicit include of <asm/param.h>
perhaps ?
Dave
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [1-2/6] ipw2100, ipw2200: patches to merge to kernel
2005-05-24 17:24 ` Dave Jones
@ 2005-05-24 17:56 ` Thomas Graf
0 siblings, 0 replies; 27+ messages in thread
From: Thomas Graf @ 2005-05-24 17:56 UTC (permalink / raw)
To: Dave Jones; +Cc: Jiri Benc, NetDev, pavel
* Dave Jones <20050524172416.GB10479@redhat.com> 2005-05-24 13:24
> On Tue, May 24, 2005 at 03:15:06PM +0200, Jiri Benc wrote:
> > Patches to merge the ipw2100 and ipw2200 drivers to the kernel can be
> > downloaded from:
> > http://jikos.cz/~jbohac/wifi/import-ipw2100.patch
> > http://jikos.cz/~jbohac/wifi/import-ipw2200.patch
> > (they are too large to post them here)
> >
> > The ipw2100 patch is just a merge of ipw2100 driver with Pavel Machek's
> > cleanup patch.
>
> It contains a number of bogus uses of HZ.
>
> + IPW_DEBUG_INFO("Command completion failed out after %dms.\n",
> + HOST_COMPLETE_TIMEOUT / (HZ / 100));
>
> ..
>
> + schedule_timeout(HZ / 100);
>
> ..
>
> What I don't understand, is that HZ in kernel-code should be 1000
> according to <asm/param.h>, though for some reason, I've seen
> divide by zeros, and really strange oopses with this code.
> It's as if its for some reason, choosing to use the userspace HZ
> definition. Hmm, does it need an explicit include of <asm/param.h>
> perhaps ?
It should really use jiffies_to_msecs/usecs. HZ is < 100 on some
architectures and thus results in a division by 0, even it was safe,
the above code is inaccurate for some values of HZ.
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [0/5] Improvements to the ieee80211 layer
2005-05-24 13:07 [0/5] Improvements to the ieee80211 layer Jiri Benc
` (9 preceding siblings ...)
2005-05-24 13:20 ` [6/6] ipw2200: fix after "ieee80211: ethernet independency" Jiri Benc
@ 2005-05-24 18:52 ` Pavel Machek
2005-05-25 8:29 ` Jirka Bohac
2005-05-25 6:55 ` Zhu Yi
2005-05-28 3:18 ` Jeff Garzik
12 siblings, 1 reply; 27+ messages in thread
From: Pavel Machek @ 2005-05-24 18:52 UTC (permalink / raw)
To: Jiri Benc; +Cc: NetDev, LKML, jgarzik
Hi!
> The ieee80211 layer, now present in -mm, lacks many important features
> (actually it's just a part of the ipw2100/ipw2200 driver; these cards do
> a lot of the processing in the hardware/firmware and thus the layer
> currently can not be used for simpler devices).
>
> This is the first series of patches that try to convert it to a generic
> IEEE 802.11 layer, usable for most of today's wireless cards.
Are they against -rc4-mm2?
Would it be possible to put agregate patch on the web somewhere (or
git tree?). I would certainly be easier to test....
Pavel
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [4/6] ipw2100: fix after "ieee80211_device alignment fix"
2005-05-24 13:18 ` [4/6] ipw2100: fix after "ieee80211_device alignment fix" Jiri Benc
@ 2005-05-24 18:58 ` Pavel Machek
2005-05-24 19:18 ` Jirka Bohac
0 siblings, 1 reply; 27+ messages in thread
From: Pavel Machek @ 2005-05-24 18:58 UTC (permalink / raw)
To: Jiri Benc; +Cc: NetDev
On Út 24-05-05 15:18:02, Jiri Benc wrote:
> Fixes ipw2100 after ieee80211_device alignment fix
> (patch [2/5] ieee80211: ieee80211_device alignment fix and cleanup)
>
>
> Signed-off-by: Jiri Benc <jbenc@suse.cz>
> Signed-off-by: Jirka Bohac <jbohac@suse.cz>
>
> --- linux-2.6.12-rc2-mm3.01/drivers/net/wireless/ipw2100.c 2005-05-19 16:23:00.000000000 +0200
> +++ linux-2.6.12-rc2-mm3.04/drivers/net/wireless/ipw2100.c 2005-05-19 17:35:48.000000000 +0200
> @@ -1717,7 +1717,7 @@
> /* Called by register_netdev() */
> static int ipw2100_net_init(struct net_device *dev)
> {
> - struct ipw2100_priv *priv = ieee80211_priv(dev);
> + struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
> return ipw2100_up(priv, 1);
> }
Ugh, that is getting rather ugly. Perhaps inline function doing this
should be introduced?
Pavel
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [4/6] ipw2100: fix after "ieee80211_device alignment fix"
2005-05-24 18:58 ` Pavel Machek
@ 2005-05-24 19:18 ` Jirka Bohac
0 siblings, 0 replies; 27+ messages in thread
From: Jirka Bohac @ 2005-05-24 19:18 UTC (permalink / raw)
To: Pavel Machek; +Cc: Jiri Benc, NetDev
On Tue, May 24, 2005 at 08:58:20PM +0200, Pavel Machek wrote:
> On Út 24-05-05 15:18:02, Jiri Benc wrote:
> > Fixes ipw2100 after ieee80211_device alignment fix
> > (patch [2/5] ieee80211: ieee80211_device alignment fix and cleanup)
> >
> >
> > Signed-off-by: Jiri Benc <jbenc@suse.cz>
> > Signed-off-by: Jirka Bohac <jbohac@suse.cz>
> >
> > --- linux-2.6.12-rc2-mm3.01/drivers/net/wireless/ipw2100.c 2005-05-19 16:23:00.000000000 +0200
> > +++ linux-2.6.12-rc2-mm3.04/drivers/net/wireless/ipw2100.c 2005-05-19 17:35:48.000000000 +0200
> > @@ -1717,7 +1717,7 @@
> > /* Called by register_netdev() */
> > static int ipw2100_net_init(struct net_device *dev)
> > {
> > - struct ipw2100_priv *priv = ieee80211_priv(dev);
> > + struct ipw2100_priv *priv = ieee80211_priv(netdev_priv(dev));
> > return ipw2100_up(priv, 1);
> > }
>
>
> Ugh, that is getting rather ugly. Perhaps inline function doing this
> should be introduced?
Ok, this is a little ugly, but this driver is slowly getting
re-written as work on the ieee80211 layer proceeds.
Drivers will not be supposed to use references to struct net_device
internally. Instead, they should be using references to struct
ieee80211_device -- this will be their interface to the stack,
not net_device. So this patch is a quick fix for the driver to
work with the unfinished layer. This "call" will disappear when
the layer is finished.
Both ieee80211_priv() and netdev_priv() are inline.
Regards,
--
Jirka Bohac <jbohac@suse.cz>
SUSE Labs, SUSE CR
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [0/5] Improvements to the ieee80211 layer
2005-05-24 13:07 [0/5] Improvements to the ieee80211 layer Jiri Benc
` (10 preceding siblings ...)
2005-05-24 18:52 ` [0/5] Improvements to the ieee80211 layer Pavel Machek
@ 2005-05-25 6:55 ` Zhu Yi
2005-05-25 11:20 ` Jiri Benc
2005-05-28 3:18 ` Jeff Garzik
12 siblings, 1 reply; 27+ messages in thread
From: Zhu Yi @ 2005-05-25 6:55 UTC (permalink / raw)
To: Jiri Benc; +Cc: NetDev, LKML, jgarzik, pavel
On Tue, 2005-05-24 at 15:07 +0200, Jiri Benc wrote:
> The ieee80211 layer, now present in -mm, lacks many important features
> (actually it's just a part of the ipw2100/ipw2200 driver; these cards do
> a lot of the processing in the hardware/firmware and thus the layer
> currently can not be used for simpler devices).
>
> This is the first series of patches that try to convert it to a generic
> IEEE 802.11 layer, usable for most of today's wireless cards.
>
> The long term plan is:
> - to implement a complete 802.11 stack in the kernel, making it easy to
> write drivers for simple (cheap) devices
> - to implement all of Ad-Hoc, AP and monitor modes in the layer, so it
> will be easy to support them in the drivers
> - to integrate Wireless Extensions to unify the kernel-userspace
> interface of all the drivers
Do you just clean up current ieee80211 code to still do 802.11 <-> 802.3
conversion inside the driver or you plan to handle real 802.11 frames in
the stack like this?
http://oss.sgi.com/archives/netdev/2005-03/msg01405.html
Thanks,
-yi
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [0/5] Improvements to the ieee80211 layer
2005-05-24 18:52 ` [0/5] Improvements to the ieee80211 layer Pavel Machek
@ 2005-05-25 8:29 ` Jirka Bohac
2005-05-25 9:27 ` Pavel Machek
0 siblings, 1 reply; 27+ messages in thread
From: Jirka Bohac @ 2005-05-25 8:29 UTC (permalink / raw)
To: Pavel Machek; +Cc: NetDev
On Tue, May 24, 2005 at 08:52:41PM +0200, Pavel Machek wrote:
> > This is the first series of patches that try to convert it to a generic
> > IEEE 802.11 layer, usable for most of today's wireless cards.
>
> Are they against -rc4-mm2?
No, they're against -rc3-mm3. The whole ieee80211 layer has been
accidentally removed from -rc4-mm3 (see
http://lkml.org/lkml/2005/5/18/57 )
> Would it be possible to put agregate patch on the web somewhere (or
> git tree?). I would certainly be easier to test....
Hmm, always thought that small patches would be preferred ;-)
Here you go: http://jikos.cz/~jbohac/tmp/big_80211_patch_01.patch.bz2
This is combined from all the 11 patches we posted yesterday
regards,
--
Jirka Bohac <jbohac@suse.cz>
SUSE Labs, SUSE CR
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [0/5] Improvements to the ieee80211 layer
2005-05-25 8:29 ` Jirka Bohac
@ 2005-05-25 9:27 ` Pavel Machek
2005-05-25 9:42 ` Jiri Benc
0 siblings, 1 reply; 27+ messages in thread
From: Pavel Machek @ 2005-05-25 9:27 UTC (permalink / raw)
To: Jirka Bohac; +Cc: NetDev
Hi!
> > > This is the first series of patches that try to convert it to a generic
> > > IEEE 802.11 layer, usable for most of today's wireless cards.
> >
> > Are they against -rc4-mm2?
>
> No, they're against -rc3-mm3. The whole ieee80211 layer has been
> accidentally removed from -rc4-mm3 (see
> http://lkml.org/lkml/2005/5/18/57 )
>
> > Would it be possible to put agregate patch on the web somewhere (or
> > git tree?). I would certainly be easier to test....
>
> Hmm, always thought that small patches would be preferred ;-)
> Here you go: http://jikos.cz/~jbohac/tmp/big_80211_patch_01.patch.bz2
> This is combined from all the 11 patches we posted yesterday
Well, they certainly are prefered for review, but applying series of
11 patches, with two that need to be get from the web is not that
easy....
I could not compile it:
CC net/ieee80211/ieee80211_rx.o
net/ieee80211/ieee80211_rx.c: In function
`ieee80211_rx_frame_decrypt':
net/ieee80211/ieee80211_rx.c:281: error: `dev' undeclared (first use
in this function)
net/ieee80211/ieee80211_rx.c:281: error: (Each undeclared identifier
is reported only once
net/ieee80211/ieee80211_rx.c:281: error: for each function it appears
in.)
make[2]: *** [net/ieee80211/ieee80211_rx.o] Error 1
make[1]: *** [net/ieee80211] Error 2
make: *** [net] Error 2
468.99user 31.35system 523.98 (8m43.981s) elapsed 95.49%CPU
pavel@amd:/data/l/linux-mm$
After fixing that, ipw2100 seems to work. [Funny, it changed name from
eth1 to wlan0?] Good.
Pavel
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [0/5] Improvements to the ieee80211 layer
2005-05-25 9:27 ` Pavel Machek
@ 2005-05-25 9:42 ` Jiri Benc
0 siblings, 0 replies; 27+ messages in thread
From: Jiri Benc @ 2005-05-25 9:42 UTC (permalink / raw)
To: Pavel Machek; +Cc: Jirka Bohac, NetDev
On Wed, 25 May 2005 11:27:10 +0200, Pavel Machek wrote:
> net/ieee80211/ieee80211_rx.c:281: error: `dev' undeclared (first use
> in this function)
Thanks, we had CONFIG_IEEE80211_CRYPT_TKIP disabled when testing as
there seem to be more important things to deal with. Will be fixed in
the next patch series.
--
Jiri Benc
SUSE Labs
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [0/5] Improvements to the ieee80211 layer
2005-05-25 6:55 ` Zhu Yi
@ 2005-05-25 11:20 ` Jiri Benc
2005-05-26 3:36 ` Zhu Yi
0 siblings, 1 reply; 27+ messages in thread
From: Jiri Benc @ 2005-05-25 11:20 UTC (permalink / raw)
To: Zhu Yi; +Cc: NetDev, jbohac
On Wed, 25 May 2005 14:55:16 +0800, Zhu Yi wrote:
> Do you just clean up current ieee80211 code to still do 802.11 <-> 802.3
> conversion inside the driver or you plan to handle real 802.11 frames in
> the stack like this?
> http://oss.sgi.com/archives/netdev/2005-03/msg01405.html
We are trying to handle real 802.11 frames. Have you made any progress
in your work since posting that patch? If so, could you please post it
to netdev (or to us)?
Thanks.
--
Jiri Benc
SUSE Labs
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [0/5] Improvements to the ieee80211 layer
2005-05-25 11:20 ` Jiri Benc
@ 2005-05-26 3:36 ` Zhu Yi
0 siblings, 0 replies; 27+ messages in thread
From: Zhu Yi @ 2005-05-26 3:36 UTC (permalink / raw)
To: Jiri Benc; +Cc: NetDev, jbohac
On Wed, 2005-05-25 at 13:20 +0200, Jiri Benc wrote:
> On Wed, 25 May 2005 14:55:16 +0800, Zhu Yi wrote:
> > Do you just clean up current ieee80211 code to still do 802.11 <-> 802.3
> > conversion inside the driver or you plan to handle real 802.11 frames in
> > the stack like this?
> > http://oss.sgi.com/archives/netdev/2005-03/msg01405.html
>
> We are trying to handle real 802.11 frames. Have you made any progress
> in your work since posting that patch? If so, could you please post it
> to netdev (or to us)?
No much progress since that. I planned to add a new type SOCK_80211 to
PF_PACKET domain, so that user space can send packets through the 80211
stack but don't need to build 802.11 headers themselves. This can be
used by programs like wpa_supplicant. Do you know some better way to do
this?
Thanks,
-yi
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [1/5] ieee80211: cleanup
2005-05-24 13:10 ` [1/5] ieee80211: cleanup Jiri Benc
@ 2005-05-28 2:43 ` Jeff Garzik
0 siblings, 0 replies; 27+ messages in thread
From: Jeff Garzik @ 2005-05-28 2:43 UTC (permalink / raw)
To: Jiri Benc; +Cc: NetDev, LKML, pavel
applied
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [3/5] netdev: HH_DATA_OFF bugfix
2005-05-24 13:12 ` [3/5] netdev: HH_DATA_OFF bugfix Jiri Benc
@ 2005-05-28 3:15 ` Jeff Garzik
0 siblings, 0 replies; 27+ messages in thread
From: Jeff Garzik @ 2005-05-28 3:15 UTC (permalink / raw)
To: Jiri Benc, David S. Miller; +Cc: NetDev, LKML, pavel
Jiri Benc wrote:
> When the hardware header size is a multiple of HH_DATA_MOD, HH_DATA_OFF()
> incorrectly returns HH_DATA_MOD (instead of 0).
>
> Signed-off-by: Jiri Benc <jbenc@suse.cz>
>
> --- linux/include/linux/netdevice.h
> +++ work/include/linux/netdevice.h
> @@ -204,7 +209,7 @@
> /* cached hardware header; allow for machine alignment needs. */
> #define HH_DATA_MOD 16
> #define HH_DATA_OFF(__len) \
> - (HH_DATA_MOD - ((__len) & (HH_DATA_MOD - 1)))
> + (HH_DATA_MOD - (((__len - 1) & (HH_DATA_MOD - 1)) + 1))
> #define HH_DATA_ALIGN(__len) \
> (((__len)+(HH_DATA_MOD-1))&~(HH_DATA_MOD - 1))
> unsigned long hh_data[HH_DATA_ALIGN(LL_MAX_HEADER) / sizeof(long)];
You'll want to run this one by DaveM. He would be the appropriate one
to merge this, since it affects all ethernet devices (net/ethernet/eth.c
uses HH_DATA_OFF macro).
I'm going over the rest of the ieee80211/ipw patches...
Jeff
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [0/5] Improvements to the ieee80211 layer
2005-05-24 13:07 [0/5] Improvements to the ieee80211 layer Jiri Benc
` (11 preceding siblings ...)
2005-05-25 6:55 ` Zhu Yi
@ 2005-05-28 3:18 ` Jeff Garzik
12 siblings, 0 replies; 27+ messages in thread
From: Jeff Garzik @ 2005-05-28 3:18 UTC (permalink / raw)
To: Jiri Benc; +Cc: NetDev, LKML, pavel
Jiri Benc wrote:
> The ieee80211 layer, now present in -mm, lacks many important features
> (actually it's just a part of the ipw2100/ipw2200 driver; these cards do
> a lot of the processing in the hardware/firmware and thus the layer
> currently can not be used for simpler devices).
Agreed.
> This is the first series of patches that try to convert it to a generic
> IEEE 802.11 layer, usable for most of today's wireless cards.
Great!
> The long term plan is:
> - to implement a complete 802.11 stack in the kernel, making it easy to
> write drivers for simple (cheap) devices
> - to implement all of Ad-Hoc, AP and monitor modes in the layer, so it
> will be easy to support them in the drivers
> - to integrate Wireless Extensions to unify the kernel-userspace
> interface of all the drivers
>
> This means that drivers for "stupid" (simple, cheap) cards should be
> very short and easy to write, whereas drivers for "clever" cards will be
> longer (but still shorter than they are now).
>
> We have a couple of cards for testing, and we gradually modify the
> drivers for ipw2100 and ipw2200 with the development of the layer. When
> the layer is mature enough for the "stupid" cards, we will rewrite the
> driver for Atheros-based cards to use this layer. We plan to send all
> the patches for these drivers to the netdev list. Of course, we are in
> close contact with Pavel Machek, who is pushing the ipw2100 driver
> upstream.
I'm interesting in writing a RealTek driver using ieee80211. As the
ieee80211 layer matures, I'll start publishing that code.
Jeff
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [2/5] ieee80211: ieee80211_device alignment fix and cleanup
2005-05-24 13:11 ` [2/5] ieee80211: ieee80211_device alignment fix and cleanup Jiri Benc
@ 2005-05-28 3:37 ` Jeff Garzik
2005-05-31 13:30 ` Jiri Benc
0 siblings, 1 reply; 27+ messages in thread
From: Jeff Garzik @ 2005-05-28 3:37 UTC (permalink / raw)
To: Jiri Benc; +Cc: NetDev, LKML, pavel
Comments on the remaining patches in this series:
1) I am not convinced that the subclassing of net_device should be done
in this manner. Read drivers/net/wan/hdlc_generic.c and .../pc300_drv.c
for examples of how hdlc_device is handled.
Comments and thoughts welcome.
2) Please put all the new, protocol-layer functions
ieee80211_type_trans(), ieee80211_change_mtu(), ieee80211_header(), etc.
in their own file.
3) Temporary or not, the following construct is simply not necessary.
Modify the definition rather than repeating this two-call piece of code
in multiple areas:
ieee80211_priv(netdev_priv(dev));
4) A low-level wireless hardware driver should look like other net
drivers, and use the existing driver API. The low level driver should
implement its own dev->hard_start_xmit().
ieee = netdev_priv(dev);
- dev->hard_start_xmit = ieee80211_xmit;
-
ieee->dev = dev;
+ ieee->priv = ieee80211_priv(ieee);
+
+ dev->hard_start_xmit = ieee80211_xmit;
Certainly, the driver will make many calls to generic ieee80211_xxx
functions to get things done.
I understand this was not your change; you simply moved the
dev->hard_start_xmit() assignment down. I just wanted to take this
opportunity to make a point.
5) The wireless code in -mm all sourced directly from my netdev-2.6.git
tree. I strongly encourage everyone who wants to work on wireless to
download git (read http://lkml.org/lkml/2005/5/26/11) and check out
branches 'we18' (wireless ex 18), 'we18-ieee80211' (we18 + ieee80211),
and 'we18-ieee80211-wifi' (we18 + ieee80211 + hostAP) of
rsync://rsync.kernel.org/pub/scm/linux/kernel/git/jgarzik/netdev-2.6.git
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [2/5] ieee80211: ieee80211_device alignment fix and cleanup
2005-05-28 3:37 ` Jeff Garzik
@ 2005-05-31 13:30 ` Jiri Benc
0 siblings, 0 replies; 27+ messages in thread
From: Jiri Benc @ 2005-05-31 13:30 UTC (permalink / raw)
To: Jeff Garzik; +Cc: NetDev, jbohac
On Fri, 27 May 2005 23:37:46 -0400, Jeff Garzik wrote:
> 1) I am not convinced that the subclassing of net_device should be done
> in this manner. Read drivers/net/wan/hdlc_generic.c and .../pc300_drv.c
> for examples of how hdlc_device is handled.
We see two differences to the hdlc concept:
1. the driver private data is allocated together with the net_device and
ieee80211_device data;
2. ieee80211_device is passed to functions instead of net_device.
Allocating all the structures together just extends the concept of
net_device allocation. The advantage is that all the structures are
located close to each other in the memory which (hopefully) improves
cache performance.
Passing ieee80211_device seems to be more appropriate in this case,
since drivers will be accessing ieee80211 data far more frequently than
net_device data. For example, part of the plan is to integrate Wireless
Extensions into the ieee80211 layer -- for all the ioctl handlers, it
will be much more interesting to have the ieee80211_device passed to
them. Furthermore, driver writers will not be tempted to think that
net_device->priv points to _their_ private data (which the name
suggests, but is not true).
Or did you mean something different?
> 2) Please put all the new, protocol-layer functions
> ieee80211_type_trans(), ieee80211_change_mtu(), ieee80211_header(), etc.
> in their own file.
Will be posted in the next patch series.
> 3) Temporary or not, the following construct is simply not necessary.
> Modify the definition rather than repeating this two-call piece of code
> in multiple areas:
> ieee80211_priv(netdev_priv(dev));
As soon as we're done integrating WE into ieee80211, most of this will
disappear. But sure, we can add a ieee80211_priv_from_netdev (or so)
macro for now.
> 4) A low-level wireless hardware driver should look like other net
> drivers, and use the existing driver API. The low level driver should
> implement its own dev->hard_start_xmit().
> Certainly, the driver will make many calls to generic ieee80211_xxx
> functions to get things done.
Actually, hard_start_xmit has to do a lot of work regarding software
fragmentation, encryption, sequence numbering, etc. Sure, every driver
could call some ieee80211_prepare_to_xmit function in its own
hard_start_xmit, but we see no point in doing this as it would have to
be done by almost every driver. Drivers for very clever cards may
probably be an exception, but the risk is, that if they implement part
of the logic themselves, they will be more difficult to maintain as new
features are implemented in the ieee80211 layer. Furthermore, it is
against one of our premises ("the simpler card, the simpler driver").
We think that this concept of an "ieee80211 sublayer" has more
advantages than the concept of an "ieee80211 library". Do you have any
reasons why it should be the other way round?
Jiri Benc & Jirka Bohac
--
Jiri Benc
SUSE Labs
^ permalink raw reply [flat|nested] 27+ messages in thread
end of thread, other threads:[~2005-05-31 13:30 UTC | newest]
Thread overview: 27+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-05-24 13:07 [0/5] Improvements to the ieee80211 layer Jiri Benc
2005-05-24 13:10 ` [1/5] ieee80211: cleanup Jiri Benc
2005-05-28 2:43 ` Jeff Garzik
2005-05-24 13:11 ` [2/5] ieee80211: ieee80211_device alignment fix and cleanup Jiri Benc
2005-05-28 3:37 ` Jeff Garzik
2005-05-31 13:30 ` Jiri Benc
2005-05-24 13:12 ` [3/5] netdev: HH_DATA_OFF bugfix Jiri Benc
2005-05-28 3:15 ` Jeff Garzik
2005-05-24 13:12 ` [4/5] ieee80211: ethernet independency Jiri Benc
2005-05-24 13:13 ` [5/5] ieee80211: add sequence numbers Jiri Benc
2005-05-24 13:15 ` [1-2/6] ipw2100, ipw2200: patches to merge to kernel Jiri Benc
2005-05-24 17:24 ` Dave Jones
2005-05-24 17:56 ` Thomas Graf
2005-05-24 13:16 ` [3/6] ipw2100: fix after "ieee80211: cleanup" Jiri Benc
2005-05-24 13:18 ` [4/6] ipw2100: fix after "ieee80211_device alignment fix" Jiri Benc
2005-05-24 18:58 ` Pavel Machek
2005-05-24 19:18 ` Jirka Bohac
2005-05-24 13:19 ` [5/6] ipw2200: " Jiri Benc
2005-05-24 13:20 ` [6/6] ipw2200: fix after "ieee80211: ethernet independency" Jiri Benc
2005-05-24 18:52 ` [0/5] Improvements to the ieee80211 layer Pavel Machek
2005-05-25 8:29 ` Jirka Bohac
2005-05-25 9:27 ` Pavel Machek
2005-05-25 9:42 ` Jiri Benc
2005-05-25 6:55 ` Zhu Yi
2005-05-25 11:20 ` Jiri Benc
2005-05-26 3:36 ` Zhu Yi
2005-05-28 3:18 ` Jeff Garzik
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).