From: James Ketrenos <jketreno@linux.intel.com>
To: "Randy.Dunlap" <rddunlap@osdl.org>
Cc: netdev@oss.sgi.com
Subject: Re: [PATCH] ieee80211 subsystem
Date: Tue, 08 Feb 2005 02:24:49 -0600 [thread overview]
Message-ID: <42087751.3040806@linux.intel.com> (raw)
In-Reply-To: <420828A9.7060306@osdl.org>
[-- Attachment #1: Type: text/plain, Size: 2537 bytes --]
Randy.Dunlap wrote:
> James Ketrenos wrote:
>
>> Attached is the patch against 2.6.11-rc3-mm1 that adds the ieee80211
>> subsystem used by the ipw2100 and ipw2200 projects.
>>
>> I'll be sending out the patches for ipw2100-1.0.0 and ipw2200-1.0.0
>> that use thist stack to the list on Monday.
>>
>> In terms of what the stack currently does:
>>
>> * HW independent -- it only knows about 802.11 data and structures
>> * Performs an 802.3 <-> 802.11 transform for data Tx/Rx
>> * Host based support for fragmentation, WEP, and WPA using the
>> kernel's crypto functions
>> * Beacon and probe response collection and parsing
>> * Default implementation of some of the WE handlers that can be
>> managed without hardware knowledge
>>
>> We are working to merge in Dave Miller's p80211 code into the
>> ieee80211 subsystem so that it hooks into the kernel as a true
>> network layer as opposed to a mutated offspring of ethernet.
>> Once that is done, hopefully the skb to txb code can be reworked and
>> 802.11 fragments can be treated either as normal skbs, or skbs can be
>> modified to directly support them (ideally so that encrypted 802.11
>> frames in support of IP packets can be cached by the stack instead of
>> having to be re-encrypted on TCP retries)
>>
>> Support for HW/FW crypto and fragmentation offload, in a HW
>> independent fashion, is also on the short-term list.
>>
>> When you look through the patch you'll likely notice the #ifdef
>> NOTYET/#endif sequences surrounding portions of code from the hostap
>> project. Portions of this subsystem were based on an earlier version
>> of the hostap project. Those areas that weren't directly supported
>> by the ipw* projects weren't ported to be completely hardware
>> independent (since I don't have the hardware to test it), and so are
>> still wrapped in the ifdefs. These sections mainly cover support for
>> MASTER and WDS modes.
>>
>> Anyway, please let me know what you think. Hopefully I built the
>> patch right...
>
>
> James,
> Can you post a patch that will build? or did you just want
> feedback on the current state of the patch?
Ah; I see my tree that I did the diff on was missing the
wireless/Makefile and the ieee80211/ieee80211_module.c to create the
patch against... sigh. Attached is ieee80211_module.c; you have the
change for the Makefile to include ieee80211.
Later {hopefully today} I'll send a full patch that includes several of
the corrections you called out in your prior patch.
Thanks,
James
>
> Thanks,
[-- Attachment #2: ieee80211_module.c --]
[-- Type: text/x-csrc, Size: 7047 bytes --]
/*******************************************************************************
Copyright(c) 2004 Intel Corporation. All rights reserved.
Portions of this file are based on the WEP enablement code provided by the
Host AP project hostap-drivers v0.1.3
Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
<jkmaline@cc.hut.fi>
Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi>
This program is free software; you can redistribute it and/or modify it
under the terms of version 2 of the GNU General Public License as
published by the Free Software Foundation.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
more details.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59
Temple Place - Suite 330, Boston, MA 02111-1307, USA.
The full GNU General Public License is included in this distribution in the
file called LICENSE.
Contact Information:
James P. Ketrenos <ipw2100-admin@linux.intel.com>
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/
#include <linux/compiler.h>
#include <linux/config.h>
#include <linux/errno.h>
#include <linux/if_arp.h>
#include <linux/in6.h>
#include <linux/in.h>
#include <linux/ip.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/netdevice.h>
#include <linux/pci.h>
#include <linux/proc_fs.h>
#include <linux/skbuff.h>
#include <linux/slab.h>
#include <linux/tcp.h>
#include <linux/types.h>
#include <linux/version.h>
#include <linux/wireless.h>
#include <linux/etherdevice.h>
#include <asm/uaccess.h>
#include <net/arp.h>
#include "ieee80211.h"
MODULE_DESCRIPTION("802.11 data/management/control stack");
MODULE_AUTHOR("Copyright (C) 2004 Intel Corporation <jketreno@linux.intel.com>");
MODULE_LICENSE("GPL");
#define DRV_NAME "ieee80211"
static inline int ieee80211_networks_allocate(struct ieee80211_device *ieee)
{
if (ieee->networks)
return 0;
ieee->networks = kmalloc(
MAX_NETWORK_COUNT * sizeof(struct ieee80211_network),
GFP_KERNEL);
if (!ieee->networks) {
printk(KERN_WARNING "%s: Out of memory allocating beacons\n",
ieee->dev->name);
return -ENOMEM;
}
memset(ieee->networks, 0,
MAX_NETWORK_COUNT * sizeof(struct ieee80211_network));
return 0;
}
static inline void ieee80211_networks_free(struct ieee80211_device *ieee)
{
if (!ieee->networks)
return;
kfree(ieee->networks);
ieee->networks = NULL;
}
static inline void ieee80211_networks_initialize(struct ieee80211_device *ieee)
{
int i;
INIT_LIST_HEAD(&ieee->network_free_list);
INIT_LIST_HEAD(&ieee->network_list);
for (i = 0; i < MAX_NETWORK_COUNT; i++)
list_add_tail(&ieee->networks[i].list, &ieee->network_free_list);
}
struct net_device *alloc_ieee80211(int sizeof_priv)
{
struct ieee80211_device *ieee;
struct net_device *dev;
int err;
IEEE80211_DEBUG_INFO("Initializing...\n");
dev = alloc_etherdev(sizeof(struct ieee80211_device) + sizeof_priv);
if (!dev) {
IEEE80211_ERROR("Unable to network device.\n");
goto failed;
}
ieee = netdev_priv(dev);
dev->hard_start_xmit = ieee80211_xmit;
ieee->dev = dev;
err = ieee80211_networks_allocate(ieee);
if (err) {
IEEE80211_ERROR("Unable to allocate beacon storage: %d\n",
err);
goto failed;
}
ieee80211_networks_initialize(ieee);
/* Default fragmentation threshold is maximum payload size */
ieee->fts = DEFAULT_FTS;
ieee->scan_age = DEFAULT_MAX_SCAN_AGE;
ieee->open_wep = 1;
#ifdef CONFIG_IEEE80211_CRYPT
/* Default to enabling full open WEP with host based encrypt/decrypt */
ieee->host_encrypt = 1;
ieee->host_decrypt = 1;
ieee->ieee802_1x = 1; /* Default to supporting 802.1x */
INIT_LIST_HEAD(&ieee->crypt_deinit_list);
init_timer(&ieee->crypt_deinit_timer);
ieee->crypt_deinit_timer.data = (unsigned long)ieee;
ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler;
#endif
spin_lock_init(&ieee->lock);
#ifdef CONFIG_IEEE80211_WPA
ieee->wpa_enabled = 0;
ieee->tkip_countermeasures = 0;
ieee->drop_unencrypted = 0;
ieee->privacy_invoked = 0;
ieee->ieee802_1x = 1;
#endif /* CONFIG_IEEE80211_WPA */
return dev;
failed:
if (dev)
free_netdev(dev);
return NULL;
}
void free_ieee80211(struct net_device *dev)
{
struct ieee80211_device *ieee = netdev_priv(dev);
#ifdef CONFIG_IEEE80211_CRYPT
int i;
del_timer_sync(&ieee->crypt_deinit_timer);
ieee80211_crypt_deinit_entries(ieee, 1);
for (i = 0; i < WEP_KEYS; i++) {
struct ieee80211_crypt_data *crypt = ieee->crypt[i];
if (crypt) {
if (crypt->ops) {
crypt->ops->deinit(crypt->priv);
module_put(crypt->ops->owner);
}
kfree(crypt);
ieee->crypt[i] = NULL;
}
}
#endif
ieee80211_networks_free(ieee);
free_netdev(dev);
}
#ifdef CONFIG_IEEE80211_DEBUG
static int debug = 0;
u32 ieee80211_debug_level = 0;
struct proc_dir_entry *ieee80211_proc = NULL;
static int show_debug_level(char *page, char **start, off_t offset,
int count, int *eof, void *data)
{
return snprintf(page, count, "0x%08X\n", ieee80211_debug_level);
}
static int store_debug_level(struct file *file, const char *buffer,
unsigned long count, void *data)
{
char buf[] = "0x00000000";
unsigned long len = min(sizeof(buf) - 1, (u32)count);
char *p = (char *)buf;
unsigned long val;
if (copy_from_user(buf, buffer, len))
return count;
buf[len] = 0;
if (p[1] == 'x' || p[1] == 'X' || p[0] == 'x' || p[0] == 'X') {
p++;
if (p[0] == 'x' || p[0] == 'X')
p++;
val = simple_strtoul(p, &p, 16);
} else
val = simple_strtoul(p, &p, 10);
if (p == buf)
printk(KERN_INFO DRV_NAME
": %s is not in hex or decimal form.\n", buf);
else
ieee80211_debug_level = val;
return strnlen(buf, count);
}
static int __init ieee80211_init(void)
{
struct proc_dir_entry *e;
ieee80211_debug_level = debug;
ieee80211_proc = create_proc_entry(DRV_NAME, S_IFDIR, proc_net);
if (ieee80211_proc == NULL) {
IEEE80211_ERROR("Unable to create " DRV_NAME
" proc directory\n");
return -EIO;
}
e = create_proc_entry("debug_level", S_IFREG | S_IRUGO | S_IWUSR,
ieee80211_proc);
if (!e) {
remove_proc_entry(DRV_NAME, proc_net);
ieee80211_proc = NULL;
return -EIO;
}
e->read_proc = show_debug_level;
e->write_proc = store_debug_level;
e->data = NULL;
return 0;
}
static void __exit ieee80211_exit(void)
{
if (ieee80211_proc) {
remove_proc_entry("debug_level", ieee80211_proc);
remove_proc_entry(DRV_NAME, proc_net);
ieee80211_proc = NULL;
}
}
#include <linux/moduleparam.h>
module_param(debug, int, 0444);
MODULE_PARM_DESC(debug, "debug output mask");
module_exit(ieee80211_exit);
module_init(ieee80211_init);
#endif
EXPORT_SYMBOL(alloc_ieee80211);
EXPORT_SYMBOL(free_ieee80211);
next prev parent reply other threads:[~2005-02-08 8:24 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-02-04 18:47 [PATCH] ieee80211 subsystem James Ketrenos
2005-02-04 22:48 ` Jeff Garzik
2005-02-05 6:07 ` Randy.Dunlap
2005-02-08 3:57 ` Jouni Malinen
2005-02-08 9:41 ` James Ketrenos
2005-02-05 8:13 ` Christoph Hellwig
2005-02-08 2:49 ` Randy.Dunlap
2005-02-08 8:24 ` James Ketrenos [this message]
2005-02-10 4:36 ` Randy.Dunlap
2005-02-08 4:29 ` Jouni Malinen
2005-02-08 9:26 ` James Ketrenos
2005-02-08 23:25 ` Jeff Garzik
2005-02-08 23:33 ` James Ketrenos
2005-02-11 0:49 ` James Ketrenos
2005-02-11 21:44 ` Jeff Garzik
2005-02-08 4:45 ` Randy.Dunlap
2005-02-08 19:13 ` Stephen Hemminger
-- strict thread matches above, loose matches on Subject: below --
2005-02-08 21:45 Jean Tourrilhes
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=42087751.3040806@linux.intel.com \
--to=jketreno@linux.intel.com \
--cc=netdev@oss.sgi.com \
--cc=rddunlap@osdl.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.