diff options
author | Henrik Brix Andersen <brix@gentoo.org> | 2006-03-24 16:38:33 +0000 |
---|---|---|
committer | Henrik Brix Andersen <brix@gentoo.org> | 2006-03-24 16:38:33 +0000 |
commit | 7a0df5814fbde46afddc526e1eaaeb75b6944369 (patch) | |
tree | f1ddc91fc3c4b44f7559ada064014dc4c6750bbe /net-wireless/ipw2200 | |
parent | Version bumped to 0.0.13 and closing bug #94365. (diff) | |
download | gentoo-2-7a0df5814fbde46afddc526e1eaaeb75b6944369.tar.gz gentoo-2-7a0df5814fbde46afddc526e1eaaeb75b6944369.tar.bz2 gentoo-2-7a0df5814fbde46afddc526e1eaaeb75b6944369.zip |
Added various updates from upstream.
(Portage version: 2.0.54)
Diffstat (limited to 'net-wireless/ipw2200')
-rw-r--r-- | net-wireless/ipw2200/ChangeLog | 10 | ||||
-rw-r--r-- | net-wireless/ipw2200/Manifest | 7 | ||||
-rw-r--r-- | net-wireless/ipw2200/files/digest-ipw2200-1.1.1-r1 | 1 | ||||
-rw-r--r-- | net-wireless/ipw2200/files/ipw2200-1.1.1-diversity.patch | 24 | ||||
-rw-r--r-- | net-wireless/ipw2200/files/ipw2200-1.1.1-fw_endian.patch | 75 | ||||
-rw-r--r-- | net-wireless/ipw2200/files/ipw2200-1.1.1-rtap_iface.patch | 780 | ||||
-rw-r--r-- | net-wireless/ipw2200/ipw2200-1.1.1-r1.ebuild | 104 |
7 files changed, 999 insertions, 2 deletions
diff --git a/net-wireless/ipw2200/ChangeLog b/net-wireless/ipw2200/ChangeLog index f3f6f2122e05..9c2fe26a7b75 100644 --- a/net-wireless/ipw2200/ChangeLog +++ b/net-wireless/ipw2200/ChangeLog @@ -1,6 +1,14 @@ # ChangeLog for net-wireless/ipw2200 # Copyright 1999-2006 Gentoo Foundation; Distributed under the GPL v2 -# $Header: /var/cvsroot/gentoo-x86/net-wireless/ipw2200/ChangeLog,v 1.61 2006/03/08 13:47:30 brix Exp $ +# $Header: /var/cvsroot/gentoo-x86/net-wireless/ipw2200/ChangeLog,v 1.62 2006/03/24 16:38:33 brix Exp $ + +*ipw2200-1.1.1-r1 (24 Mar 2006) + + 24 Mar 2006; Henrik Brix Andersen <brix@gentoo.org> + +files/ipw2200-1.1.1-diversity.patch, + +files/ipw2200-1.1.1-fw_endian.patch, + +files/ipw2200-1.1.1-rtap_iface.patch, +ipw2200-1.1.1-r1.ebuild: + Added various updates from upstream. *ipw2200-1.1.1 (08 Mar 2006) diff --git a/net-wireless/ipw2200/Manifest b/net-wireless/ipw2200/Manifest index 8ef96565785f..b40ebc1a3b9d 100644 --- a/net-wireless/ipw2200/Manifest +++ b/net-wireless/ipw2200/Manifest @@ -1,4 +1,4 @@ -MD5 67857eaafd59b00320eac960380a0afe ChangeLog 11646 +MD5 f75e7a705949ba4993a0390639761ad3 ChangeLog 11920 MD5 0366dc766d77664dcfbe0f210a501c6a files/digest-ipw2200-1.0.10 63 MD5 da6616526b85364cf6ef78ee68e00556 files/digest-ipw2200-1.0.11 63 MD5 da6616526b85364cf6ef78ee68e00556 files/digest-ipw2200-1.0.11-r1 63 @@ -8,11 +8,15 @@ MD5 88eeaaf4fc0ffcfd41dd873a1d085cb3 files/digest-ipw2200-1.0.8-r1 62 MD5 a6b695cd887ebc8ee6d37d99971ff62e files/digest-ipw2200-1.0.9 62 MD5 25bb7a22f5d3b003a58fc7a82d6b85d2 files/digest-ipw2200-1.1.0 62 MD5 d65480e8077954294f049d6c4d023b3c files/digest-ipw2200-1.1.1 62 +MD5 d65480e8077954294f049d6c4d023b3c files/digest-ipw2200-1.1.1-r1 62 MD5 91e9ccbbcf86cc2b81eff3fc853cb760 files/ipw2200-1.0.11-debug.patch 3496 MD5 a3a2dd68cce2a4d05217369daab108f1 files/ipw2200-1.0.8-broadcast.patch 594 MD5 a2de4d35e783a2aae5708846d8a7637c files/ipw2200-1.0.8-slabcorrupt.patch 522 MD5 dd96f1bc93f2c8f03a81b87f641a5329 files/ipw2200-1.0.8-txbusy.patch 811 MD5 e994df0999ba085974a28e98e317f702 files/ipw2200-1.0.9-qos.patch 918 +MD5 89bdf40b614036a932f84192e4092e9c files/ipw2200-1.1.1-diversity.patch 1165 +MD5 646b7e5aba19613998313aeb286f3e40 files/ipw2200-1.1.1-fw_endian.patch 2543 +MD5 a0eeb90732292916bc559e3591d44e94 files/ipw2200-1.1.1-rtap_iface.patch 23653 MD5 fa29197797ebbf5db95a303892a231f1 ipw2200-1.0.10.ebuild 2883 MD5 ed815b8c793ab509c84913c0c16e06e4 ipw2200-1.0.11-r1.ebuild 2946 MD5 b9e8e1f57e42dc0faca0530fb8d34c37 ipw2200-1.0.11.ebuild 2885 @@ -21,5 +25,6 @@ MD5 4d394f10dcd1d2c3ed0654daa3f072fc ipw2200-1.0.13.ebuild 2889 MD5 df20ef6eba3b168c1a8ff98961179b7b ipw2200-1.0.8-r1.ebuild 3017 MD5 d1428344ca6c3b3ece77f85fde18d2f0 ipw2200-1.0.9.ebuild 2935 MD5 7eb15912f846735e9934a3dd461636b2 ipw2200-1.1.0.ebuild 2888 +MD5 33a8e232ede3fedc0c00656a1b2a14d7 ipw2200-1.1.1-r1.ebuild 2999 MD5 a51b1ea769eb184cdae3610ef0be015b ipw2200-1.1.1.ebuild 2890 MD5 b280eebc74d70d85e664debf1adce2c3 metadata.xml 255 diff --git a/net-wireless/ipw2200/files/digest-ipw2200-1.1.1-r1 b/net-wireless/ipw2200/files/digest-ipw2200-1.1.1-r1 new file mode 100644 index 000000000000..d715d8c81939 --- /dev/null +++ b/net-wireless/ipw2200/files/digest-ipw2200-1.1.1-r1 @@ -0,0 +1 @@ +MD5 1a179639c51a8344830039258a62bccf ipw2200-1.1.1.tgz 127447 diff --git a/net-wireless/ipw2200/files/ipw2200-1.1.1-diversity.patch b/net-wireless/ipw2200/files/ipw2200-1.1.1-diversity.patch new file mode 100644 index 000000000000..e034069adcc8 --- /dev/null +++ b/net-wireless/ipw2200/files/ipw2200-1.1.1-diversity.patch @@ -0,0 +1,24 @@ +Fix problem with diversity algorithm causing disassocaition in 1.1.1 + +In 1.1.1 a patch went in which enables the "slow diversity" algorithm. +This algorithm forces one antenna or the other, if the background noise is +significantly quieter in one than the other. It favors the quieter +antenna, and won't kick in unless the difference is significant. + +This is showing to be problematic in some environments and is reverted +by this patch. + +Signed-off-by: James Ketrenos <jketreno@linux.intel.com> + +diff -Nupr ipw2200-1.1.1-orig/ipw2200.c ipw2200-1.1.1/ipw2200.c +--- ipw2200-1.1.1-orig/ipw2200.c 2006-03-08 06:42:55.000000000 -0600 ++++ ipw2200-1.1.1/ipw2200.c 2006-03-08 14:32:20.000000000 -0600 +@@ -10198,7 +10198,7 @@ static void init_sys_config(struct ipw_s + sys_config->disable_unicast_decryption = 1; + sys_config->exclude_multicast_unencrypted = 0; + sys_config->disable_multicast_decryption = 1; +- sys_config->antenna_diversity = CFG_SYS_ANTENNA_SLOW_DIV; ++ sys_config->antenna_diversity = CFG_SYS_ANTENNA_BOTH; + sys_config->pass_crc_to_host = 0; /* TODO: See if 1 gives us FCS */ + sys_config->dot11g_auto_detection = 0; + sys_config->enable_cts_to_self = 0; diff --git a/net-wireless/ipw2200/files/ipw2200-1.1.1-fw_endian.patch b/net-wireless/ipw2200/files/ipw2200-1.1.1-fw_endian.patch new file mode 100644 index 000000000000..c62c08880126 --- /dev/null +++ b/net-wireless/ipw2200/files/ipw2200-1.1.1-fw_endian.patch @@ -0,0 +1,75 @@ +ipw2200: Fix endian issues with v3.0 fw image format + +This patch corrects endian issues with the v3.0 fw image format. + + ipw2200.c | 23 ++++++++++++----------- + 1 file changed, 12 insertions(+), 11 deletions(-) + +diff -Nupr ipw2200-1.1.1-orig/ipw2200.c ipw2200-1.1.1/ipw2200.c +--- ipw2200-1.1.1-orig/ipw2200.c 2006-03-08 06:42:55.000000000 -0600 ++++ ipw2200-1.1.1/ipw2200.c 2006-03-08 13:30:32.000000000 -0600 +@@ -3194,10 +3194,10 @@ static int ipw_reset_nic(struct ipw_priv + } + + struct ipw_fw { +- u32 ver; +- u32 boot_size; +- u32 ucode_size; +- u32 fw_size; ++ __le32 ver; ++ __le32 boot_size; ++ __le32 ucode_size; ++ __le32 fw_size; + u8 data[0]; + }; + +@@ -3221,8 +3221,8 @@ static int ipw_get_fw(struct ipw_priv *p + + fw = (void *)(*raw)->data; + +- if ((*raw)->size < sizeof(*fw) + +- fw->boot_size + fw->ucode_size + fw->fw_size) { ++ if ((*raw)->size < sizeof(*fw) + le32_to_cpu(fw->boot_size) + ++ le32_to_cpu(fw->ucode_size) + le32_to_cpu(fw->fw_size)) { + IPW_ERROR("%s is too small or corrupt (%zd)\n", + name, (*raw)->size); + return -EINVAL; +@@ -3324,8 +3324,9 @@ static int ipw_load(struct ipw_priv *pri + + fw = (void *)raw->data; + boot_img = &fw->data[0]; +- ucode_img = &fw->data[fw->boot_size]; +- fw_img = &fw->data[fw->boot_size + fw->ucode_size]; ++ ucode_img = &fw->data[le32_to_cpu(fw->boot_size)]; ++ fw_img = &fw->data[le32_to_cpu(fw->boot_size) + ++ le32_to_cpu(fw->ucode_size)]; + + if (rc < 0) + goto error; +@@ -3359,7 +3360,7 @@ static int ipw_load(struct ipw_priv *pri + IPW_NIC_SRAM_UPPER_BOUND - IPW_NIC_SRAM_LOWER_BOUND); + + /* DMA the initial boot firmware into the device */ +- rc = ipw_load_firmware(priv, boot_img, fw->boot_size); ++ rc = ipw_load_firmware(priv, boot_img, le32_to_cpu(fw->boot_size)); + if (rc < 0) { + IPW_ERROR("Unable to load boot firmware: %d\n", rc); + goto error; +@@ -3381,7 +3382,7 @@ static int ipw_load(struct ipw_priv *pri + ipw_write32(priv, IPW_INTA_RW, IPW_INTA_BIT_FW_INITIALIZATION_DONE); + + /* DMA the ucode into the device */ +- rc = ipw_load_ucode(priv, ucode_img, fw->ucode_size); ++ rc = ipw_load_ucode(priv, ucode_img, le32_to_cpu(fw->ucode_size)); + if (rc < 0) { + IPW_ERROR("Unable to load ucode: %d\n", rc); + goto error; +@@ -3391,7 +3392,7 @@ static int ipw_load(struct ipw_priv *pri + ipw_stop_nic(priv); + + /* DMA bss firmware into the device */ +- rc = ipw_load_firmware(priv, fw_img, fw->fw_size); ++ rc = ipw_load_firmware(priv, fw_img, le32_to_cpu(fw->fw_size)); + if (rc < 0) { + IPW_ERROR("Unable to load firmware: %d\n", rc); + goto error; diff --git a/net-wireless/ipw2200/files/ipw2200-1.1.1-rtap_iface.patch b/net-wireless/ipw2200/files/ipw2200-1.1.1-rtap_iface.patch new file mode 100644 index 000000000000..0187b71fe2fc --- /dev/null +++ b/net-wireless/ipw2200/files/ipw2200-1.1.1-rtap_iface.patch @@ -0,0 +1,780 @@ +Enable rtap interface for RF promiscuous mode while associated + +With this patch, a new promiscuous mode is enabled. Once applied, +when you load the module with the rtap_iface=1 module parameter, two +interfaces will be created (instead of just one). + +The second interface is prefixed 'rtap' and provides received +802.11 frames on the current channel to user space in a radiotap header +format. + +Example usage: + + % modprobe ipw2200 rtap_iface=1 + % iwconfig eth1 essid MyNetwork + % dhcpcd eth1 + % tcpdump -i rtap0 + +If you do not specify 'rtap_iface=1' then the rtap interface will +not be created and you will need to turn it on via: + + % echo 1 > /sys/bus/pci/drivers/ipw2200/*/rtap_iface + +Signed-off-by: James Ketrenos <jketreno@linux.intel.com> + +diff -Nupr ipw2200-1.1.1/Makefile ipw2200-1.1.1-rtap/Makefile +--- ipw2200-1.1.1/Makefile 2006-03-08 06:42:54.000000000 -0600 ++++ ipw2200-1.1.1-rtap/Makefile 2006-03-20 22:00:12.000000000 -0600 +@@ -28,7 +28,16 @@ CONFIG_IPW2200_MONITOR=y + + # If you are interested in using radiotap headers in monitor mode, + # simply uncomment: +-#CONFIG_IEEE80211_RADIOTAP=y ++# ++# NOTE: To use RADIOTAP you must also enable MONITOR above. ++# CONFIG_IEEE80211_RADIOTAP=y ++ ++# The above monitor mode provides standard monitor mode. The following ++# will create a new interface (named rtap%d) which will be sent all ++# 802.11 frames received on the interface ++# ++# NOTE: To use PROMISCUOUS you must also enable MONITOR above. ++# CONFIG_IPW2200_PROMISCUOUS=y + + endif + +@@ -83,6 +92,9 @@ EXTRA_CFLAGS += -DCONFIG_IPW2200_MONITOR + ifdef CONFIG_IEEE80211_RADIOTAP + EXTRA_CFLAGS += -DCONFIG_IEEE80211_RADIOTAP=$(CONFIG_IEEE80211_RADIOTAP) + endif ++ifdef CONFIG_IPW2200_PROMISCUOUS ++EXTRA_CFLAGS += -DCONFIG_IPW2200_PROMISCUOUS=$(CONFIG_IPW2200_PROMISCUOUS) ++endif + endif + ifdef CONFIG_IPW_QOS + EXTRA_CFLAGS += -DCONFIG_IPW_QOS=$(CONFIG_IPW_QOS) +@@ -184,6 +196,7 @@ patch_kernel: + "obj-\$$(CONFIG_IPW2200) += ipw2200.o" >> \ + ${KSRC}/drivers/net/wireless/Makefile) + @cp README.ipw2200 ${KSRC}/Documentation/networking ++ @cp ipw2200.{c,h} ${KSRC}/drivers/net/wireless + @cp in-tree/Kconfig.ipw2200 ${KSRC}/drivers/net/wireless + @(grep -q "Kconfig\.ipw2200" ${KSRC}/drivers/net/wireless/Kconfig || \ + grep -q "IPW2200" ${KSRC}/drivers/net/wireless/Kconfig || \ +diff -Nupr ipw2200-1.1.1/in-tree/Kconfig.ipw2200 ipw2200-1.1.1-rtap/in-tree/Kconfig.ipw2200 +--- ipw2200-1.1.1/in-tree/Kconfig.ipw2200 1969-12-31 18:00:00.000000000 -0600 ++++ ipw2200-1.1.1-rtap/in-tree/Kconfig.ipw2200 2006-03-20 12:20:08.000000000 -0600 +@@ -0,0 +1,86 @@ ++config IPW2200 ++ tristate "Intel PRO/Wireless 2200BG and 2915ABG Network Connection" ++ depends on IEEE80211 && PCI && NET_RADIO ++ select FW_LOADER ++ ---help--- ++ A driver for the Intel PRO/Wireless 2200BG and 2915ABG Network ++ Connection adapters. ++ ++ See <file:Documentation/networking/README.ipw2200> for ++ information on the capabilities currently enabled in this ++ driver and for tips for debugging issues and problems. ++ ++ In order to use this driver, you will need a firmware image for it. ++ You can obtain the firmware from ++ <http://ipw2200.sf.net/>. See the above referenced README.ipw2200 ++ for information on where to install the firmare images. ++ ++ You will also very likely need the Wireless Tools in order to ++ configure your card: ++ ++ <http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html>. ++ ++ If you want to compile the driver as a module ( = code which can be ++ inserted in and remvoed from the running kernel whenever you want), ++ say M here and read <file:Documentation/modules.txt>. The module ++ will be called ipw2200.ko. ++ ++config IPW_DEBUG ++ bool "Enable full debugging output in IPW2200 module." ++ depends on IPW2200 ++ ---help--- ++ This option will enable debug tracing output for the IPW2200. ++ ++ This will result in the kernel module being ~100k larger. You can ++ control which debug output is sent to the kernel log by setting the ++ value in ++ ++ /sys/bus/pci/drivers/ipw2200/debug_level ++ ++ This entry will only exist if this option is enabled. ++ ++ To set a value, simply echo an 8-byte hex value to the same file: ++ ++ % echo 0x00000FFO > /sys/bus/pci/drivers/ipw2200/debug_level ++ ++ You can find the list of debug mask values in ++ drivers/net/wireless/ipw2200.h ++ ++ If you are not trying to debug or develop the IPW2200 driver, you ++ most likely want to say N here. ++ ++config IPW2200_MONITOR ++ bool "Enable RF monitor mode" ++ depends on IPW2200 ++ ---help--- ++ Enables monitor (aka promiscuous) mode support for the ipw2200 ++ driver. With this feature compiled into the driver, you can ++ switch to monitor mode via the Wireless Tool's mode command. ++ While in monitor mode, no packets can be sent. ++ ++config IPW2200_PROMISCUOUS ++ bool "Enable creation of a RF radiotap promiscuous interface." ++ depends on IPW2200 ++ select IEEE80211_RADIOTAP ++ ---help--- ++ Enables the creation of a second interface is prefixed 'rtap'. ++ This second interface will provide every received in radiotap ++ format. ++ ++ NOTE: This does not provide *all* wireless frames -- only ++ those targetted to this adapter. ++ ++ This is useful for performing wireless network analysis while ++ maintaining an active association. ++ ++ Example usage: ++ ++ % modprobe ipw2200 rtap_iface=1 ++ % ifconfig rtap0 up ++ % tethereal -i rtap0 ++ ++ If you do not specify 'rtap_iface=1' as a module parameter then ++ the rtap interface will not be created and you will need to turn ++ it on via sysfs: ++ ++ % echo 1 > /sys/bus/pci/drivers/ipw2200/*/rtap_iface +diff -Nupr ipw2200-1.1.1/ipw2200.c ipw2200-1.1.1-rtap/ipw2200.c +--- ipw2200-1.1.1/ipw2200.c 2006-03-08 06:42:55.000000000 -0600 ++++ ipw2200-1.1.1-rtap/ipw2200.c 2006-03-20 22:07:51.000000000 -0600 +@@ -46,7 +46,9 @@ MODULE_AUTHOR(DRV_COPYRIGHT); + MODULE_LICENSE("GPL"); + + static int cmdlog = 0; ++#ifdef CONFIG_IPW2200_DEBUG + static int debug = 0; ++#endif + static int channel = 0; + static int mode = 0; + +@@ -62,6 +64,11 @@ static const char ipw_modes[] = { + 'a', 'b', 'g', '?' + }; + ++#ifdef CONFIG_IPW2200_PROMISCUOUS ++static int rtap_iface = 0; /* def: 0 -- do not create rtap interface */ ++#endif ++ ++ + #ifdef CONFIG_IPW_QOS + static int qos_enable = 0; + static int qos_burst_enable = 0; +@@ -1286,6 +1293,76 @@ static ssize_t show_cmd_log(struct devic + + static DEVICE_ATTR(cmd_log, S_IRUGO, show_cmd_log, NULL); + ++#ifdef CONFIG_IPW2200_PROMISCUOUS ++static void ipw_prom_free(struct ipw_priv *priv); ++static int ipw_prom_alloc(struct ipw_priv *priv); ++static ssize_t store_rtap_iface(struct device *d, ++#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,12) ++ struct device_attribute *attr, ++#endif ++ const char *buf, size_t count) ++{ ++ struct ipw_priv *priv = dev_get_drvdata(d); ++ int rc = 0; ++ ++ if (count < 1) ++ return -EINVAL; ++ ++ switch (buf[0]) { ++ case '0': ++ if (!rtap_iface) ++ return count; ++ ++ if (netif_running(priv->prom_net_dev)) { ++ IPW_WARNING("Interface is up. Cannot unregister.\n"); ++ return count; ++ } ++ ++ ipw_prom_free(priv); ++ rtap_iface = 0; ++ break; ++ ++ case '1': ++ if (rtap_iface) ++ return count; ++ ++ rc = ipw_prom_alloc(priv); ++ if (!rc) ++ rtap_iface = 1; ++ break; ++ ++ default: ++ return -EINVAL; ++ } ++ ++ if (rc) { ++ IPW_ERROR("Failed to register promiscuous network " ++ "device (error %d).\n", rc); ++ } ++ ++ return count; ++} ++ ++static ssize_t show_rtap_iface(struct device *d, ++#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,12) ++ struct device_attribute *attr, ++#endif ++ char *buf) ++{ ++ struct ipw_priv *priv = dev_get_drvdata(d); ++ if (rtap_iface) ++ return sprintf(buf, "%s", priv->prom_net_dev->name); ++ else { ++ buf[0] = '-'; ++ buf[1] = '1'; ++ buf[2] = '\0'; ++ return 3; ++ } ++} ++ ++static DEVICE_ATTR(rtap_iface, S_IWUSR | S_IRUSR, show_rtap_iface, store_rtap_iface); ++#endif ++ + static ssize_t show_scan_age(struct device *d, + #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,12) + struct device_attribute *attr, +@@ -2117,16 +2194,11 @@ static int ipw_send_host_complete(struct + return ipw_send_cmd_simple(priv, IPW_CMD_HOST_COMPLETE); + } + +-static int ipw_send_system_config(struct ipw_priv *priv, +- struct ipw_sys_config *config) ++static int ipw_send_system_config(struct ipw_priv *priv) + { +- if (!priv || !config) { +- IPW_ERROR("Invalid args\n"); +- return -1; +- } +- +- return ipw_send_cmd_pdu(priv, IPW_CMD_SYSTEM_CONFIG, sizeof(*config), +- config); ++ return ipw_send_cmd_pdu(priv, IPW_CMD_SYSTEM_CONFIG, ++ sizeof(priv->sys_config), ++ &priv->sys_config); + } + + static int ipw_send_ssid(struct ipw_priv *priv, u8 * ssid, int len) +@@ -3787,7 +3859,17 @@ static void ipw_bg_disassociate(void *da + static void ipw_system_config(void *data) + { + struct ipw_priv *priv = data; +- ipw_send_system_config(priv, &priv->sys_config); ++ ++#ifdef CONFIG_IPW2200_PROMISCUOUS ++ if (priv->prom_net_dev && netif_running(priv->prom_net_dev)) { ++ priv->sys_config.accept_all_data_frames = 1; ++ priv->sys_config.accept_non_directed_frames = 1; ++ priv->sys_config.accept_all_mgmt_bcpr = 1; ++ priv->sys_config.accept_all_mgmt_frames = 1; ++ } ++#endif ++ ++ ipw_send_system_config(priv); + } + + struct ipw_status_code { +@@ -7686,7 +7768,7 @@ static int ipw_associate_network(struct + else + priv->sys_config.answer_broadcast_ssid_probe = 0; + +- err = ipw_send_system_config(priv, &priv->sys_config); ++ err = ipw_send_system_config(priv); + if (err) { + IPW_DEBUG_HC("Attempt to send sys config command failed.\n"); + return err; +@@ -8007,15 +8089,7 @@ static void ipw_handle_data_packet_monit + /* Magic struct that slots into the radiotap header -- no reason + * to build this manually element by element, we can write it much + * more efficiently than we can parse it. ORDER MATTERS HERE */ +- struct ipw_rt_hdr { +- struct ieee80211_radiotap_header rt_hdr; +- u8 rt_flags; /* radiotap packet flags */ +- u8 rt_rate; /* rate in 500kb/s */ +- u16 rt_channel; /* channel in mhz */ +- u16 rt_chbitmask; /* channel bitfield */ +- s8 rt_dbmsignal; /* signal in dbM, kluged to signed */ +- u8 rt_antenna; /* antenna number */ +- } *ipw_rt; ++ struct ipw_rt_hdr *ipw_rt; + + short len = le16_to_cpu(pkt->u.frame.length); + +@@ -8069,9 +8143,11 @@ static void ipw_handle_data_packet_monit + /* Big bitfield of all the fields we provide in radiotap */ + ipw_rt->rt_hdr.it_present = + ((1 << IEEE80211_RADIOTAP_FLAGS) | ++ (1 << IEEE80211_RADIOTAP_TSFT) | + (1 << IEEE80211_RADIOTAP_RATE) | + (1 << IEEE80211_RADIOTAP_CHANNEL) | + (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | ++ (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE) | + (1 << IEEE80211_RADIOTAP_ANTENNA)); + + /* Zero the flags, we'll add to them as we go */ +@@ -8157,6 +8233,173 @@ static void ipw_handle_data_packet_monit + } + #endif + ++#ifdef CONFIG_IPW2200_PROMISCUOUS ++static void ipw_handle_promiscuous_rx(struct ipw_priv *priv, ++ struct ipw_rx_mem_buffer *rxb, ++ struct ieee80211_rx_stats *stats) ++{ ++ struct ipw_rx_packet *pkt = (struct ipw_rx_packet *)rxb->skb->data; ++ struct ipw_rx_frame *frame = &pkt->u.frame; ++ struct ipw_rt_hdr *ipw_rt; ++ ++ /* First cache any information we need before we overwrite ++ * the information provided in the skb from the hardware */ ++ u16 channel = frame->received_channel; ++ u8 phy_flags = frame->antennaAndPhy; ++ s8 signal = frame->rssi_dbm - IPW_RSSI_TO_DBM; ++ s8 noise = frame->noise; ++ u8 rate = frame->rate; ++ short len = le16_to_cpu(pkt->u.frame.length); ++ u64 tsf = 0; ++ struct sk_buff *skb; ++ ++ if (!noise) ++ noise = priv->last_noise; ++ ++ /* We received data from the HW, so stop the watchdog */ ++ priv->prom_net_dev->trans_start = jiffies; ++ ++ if (unlikely((len + IPW_RX_FRAME_SIZE) > skb_tailroom(rxb->skb))) { ++ priv->prom_priv->ieee->stats.rx_errors++; ++ IPW_DEBUG_DROP("Corruption detected! Oh no!\n"); ++ return; ++ } ++ ++ /* We only process data packets if the interface is open */ ++ if (unlikely(!netif_running(priv->prom_net_dev))) { ++ priv->prom_priv->ieee->stats.rx_dropped++; ++ IPW_DEBUG_DROP("Dropping packet while interface is not up.\n"); ++ return; ++ } ++ ++ /* Libpcap 0.9.3+ can handle variable length radiotap, so we'll use ++ * that now */ ++ if (len > IPW_RX_BUF_SIZE - sizeof(struct ipw_rt_hdr)) { ++ /* FIXME: Should alloc bigger skb instead */ ++ priv->prom_priv->ieee->stats.rx_dropped++; ++ IPW_DEBUG_DROP("Dropping too large packet in monitor\n"); ++ return; ++ } ++ ++ /* Copy the SKB since this is for the promiscuous side */ ++ skb = skb_copy(rxb->skb, GFP_ATOMIC); ++ if (skb == NULL) { ++ IPW_ERROR("skb_clone failed for promiscuous copy.\n"); ++ return; ++ } ++ ++ /* copy the frame data to write after where the radiotap header goes */ ++ ipw_rt = (void *)skb->data; ++ memcpy(ipw_rt->payload, ++ rxb->skb->data + IPW_RX_FRAME_SIZE, len); ++ ++ /* Zero the radiotap static buffer ... We only need to zero the bytes ++ * NOT part of our real header, saves a little time. ++ * ++ * No longer necessary since we fill in all our data. Purge before ++ * merging patch officially. ++ * memset(rxb->skb->data + sizeof(struct ipw_rt_hdr), 0, ++ * IEEE80211_RADIOTAP_HDRLEN - sizeof(struct ipw_rt_hdr)); ++ */ ++ ++ ipw_rt->rt_hdr.it_version = PKTHDR_RADIOTAP_VERSION; ++ ipw_rt->rt_hdr.it_pad = 0; /* always good to zero */ ++ ipw_rt->rt_hdr.it_len = sizeof(*ipw_rt); /* total header+data */ ++ ++ /* Set the size of the skb to the size of the frame */ ++ skb_put(skb, ipw_rt->rt_hdr.it_len + len); ++ ++ /* Big bitfield of all the fields we provide in radiotap */ ++ ipw_rt->rt_hdr.it_present = ++ ((1 << IEEE80211_RADIOTAP_FLAGS) | ++ (1 << IEEE80211_RADIOTAP_TSFT) | ++ (1 << IEEE80211_RADIOTAP_RATE) | ++ (1 << IEEE80211_RADIOTAP_CHANNEL) | ++ (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | ++ (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE) | ++ (1 << IEEE80211_RADIOTAP_ANTENNA)); ++ ++ /* Zero the flags, we'll add to them as we go */ ++ ipw_rt->rt_flags = 0; ++ ++ ipw_rt->rt_tsf = tsf; ++ ++ /* Convert to DBM */ ++ ipw_rt->rt_dbmsignal = signal; ++ ipw_rt->rt_dbmnoise = noise; ++ ++ /* Convert the channel data and set the flags */ ++ ipw_rt->rt_channel = cpu_to_le16(ieee80211chan2mhz(channel)); ++ if (channel > 14) { /* 802.11a */ ++ ipw_rt->rt_chbitmask = ++ cpu_to_le16((IEEE80211_CHAN_OFDM | IEEE80211_CHAN_5GHZ)); ++ } else if (phy_flags & (1 << 5)) { /* 802.11b */ ++ ipw_rt->rt_chbitmask = ++ cpu_to_le16((IEEE80211_CHAN_CCK | IEEE80211_CHAN_2GHZ)); ++ } else { /* 802.11g */ ++ ipw_rt->rt_chbitmask = ++ (IEEE80211_CHAN_OFDM | IEEE80211_CHAN_2GHZ); ++ } ++ ++ /* set the rate in multiples of 500k/s */ ++ switch (rate) { ++ case IPW_TX_RATE_1MB: ++ ipw_rt->rt_rate = 2; ++ break; ++ case IPW_TX_RATE_2MB: ++ ipw_rt->rt_rate = 4; ++ break; ++ case IPW_TX_RATE_5MB: ++ ipw_rt->rt_rate = 10; ++ break; ++ case IPW_TX_RATE_6MB: ++ ipw_rt->rt_rate = 12; ++ break; ++ case IPW_TX_RATE_9MB: ++ ipw_rt->rt_rate = 18; ++ break; ++ case IPW_TX_RATE_11MB: ++ ipw_rt->rt_rate = 22; ++ break; ++ case IPW_TX_RATE_12MB: ++ ipw_rt->rt_rate = 24; ++ break; ++ case IPW_TX_RATE_18MB: ++ ipw_rt->rt_rate = 36; ++ break; ++ case IPW_TX_RATE_24MB: ++ ipw_rt->rt_rate = 48; ++ break; ++ case IPW_TX_RATE_36MB: ++ ipw_rt->rt_rate = 72; ++ break; ++ case IPW_TX_RATE_48MB: ++ ipw_rt->rt_rate = 96; ++ break; ++ case IPW_TX_RATE_54MB: ++ ipw_rt->rt_rate = 108; ++ break; ++ default: ++ ipw_rt->rt_rate = 0; ++ break; ++ } ++ ++ /* antenna number */ ++ ipw_rt->rt_antenna = (phy_flags & 3); ++ ++ /* set the preamble flag if we have it */ ++ if (phy_flags & (1 << 6)) ++ ipw_rt->rt_flags |= IEEE80211_RADIOTAP_F_SHORTPRE; ++ ++ IPW_DEBUG_RX("Rx packet of %d bytes.\n", skb->len); ++ ++ if (!ieee80211_rx(priv->prom_priv->ieee, skb, stats)) { ++ priv->prom_priv->ieee->stats.rx_errors++; ++ dev_kfree_skb_any(skb); ++ } ++} ++#endif ++ + static int is_network_packet(struct ipw_priv *priv, + struct ieee80211_hdr_4addr *header) + { +@@ -8383,15 +8626,21 @@ static void ipw_rx(struct ipw_priv *priv + + priv->rx_packets++; + ++#ifdef CONFIG_IPW2200_PROMISCUOUS ++ if (priv->prom_net_dev && netif_running(priv->prom_net_dev)) ++ ipw_handle_promiscuous_rx(priv, rxb, &stats); ++#endif ++ + #ifdef CONFIG_IPW2200_MONITOR + if (priv->ieee->iw_mode == IW_MODE_MONITOR) { + #ifdef CONFIG_IEEE80211_RADIOTAP +- ipw_handle_data_packet_monitor(priv, +- rxb, +- &stats); ++ ++ ipw_handle_data_packet_monitor(priv, ++ rxb, ++ &stats); + #else +- ipw_handle_data_packet(priv, rxb, +- &stats); ++ ipw_handle_data_packet(priv, rxb, ++ &stats); + #endif + break; + } +@@ -10912,12 +11161,21 @@ static int ipw_config(struct ipw_priv *p + |= CFG_BT_COEXISTENCE_OOB; + } + ++#ifdef CONFIG_IPW2200_PROMISCUOUS ++ if (priv->prom_net_dev && netif_running(priv->prom_net_dev)) { ++ priv->sys_config.accept_all_data_frames = 1; ++ priv->sys_config.accept_non_directed_frames = 1; ++ priv->sys_config.accept_all_mgmt_bcpr = 1; ++ priv->sys_config.accept_all_mgmt_frames = 1; ++ } ++#endif ++ + if (priv->ieee->iw_mode == IW_MODE_ADHOC) + priv->sys_config.answer_broadcast_ssid_probe = 1; + else + priv->sys_config.answer_broadcast_ssid_probe = 0; + +- if (ipw_send_system_config(priv, &priv->sys_config)) ++ if (ipw_send_system_config(priv)) + goto error; + + init_supported_rates(priv, &priv->rates); +@@ -11562,6 +11820,9 @@ static struct attribute *ipw_sysfs_entri + &dev_attr_led.attr, + &dev_attr_speed_scan.attr, + &dev_attr_net_stats.attr, ++#ifdef CONFIG_IPW2200_PROMISCUOUS ++ &dev_attr_rtap_iface.attr, ++#endif + NULL + }; + +@@ -11570,6 +11831,109 @@ static struct attribute_group ipw_attrib + .attrs = ipw_sysfs_entries, + }; + ++#ifdef CONFIG_IPW2200_PROMISCUOUS ++static int ipw_prom_open(struct net_device *dev) ++{ ++ struct ipw_prom_priv *prom_priv = ieee80211_priv(dev); ++ struct ipw_priv *priv = prom_priv->priv; ++ ++ IPW_DEBUG_INFO("prom dev->open\n"); ++ netif_carrier_off(dev); ++ netif_stop_queue(dev); ++ ++ if (priv->ieee->iw_mode != IW_MODE_MONITOR) { ++ priv->sys_config.accept_all_data_frames = 1; ++ priv->sys_config.accept_non_directed_frames = 1; ++ priv->sys_config.accept_all_mgmt_bcpr = 1; ++ priv->sys_config.accept_all_mgmt_frames = 1; ++ ++ ipw_send_system_config(priv); ++ } ++ ++ return 0; ++} ++ ++static int ipw_prom_stop(struct net_device *dev) ++{ ++ struct ipw_prom_priv *prom_priv = ieee80211_priv(dev); ++ struct ipw_priv *priv = prom_priv->priv; ++ ++ IPW_DEBUG_INFO("prom dev->stop\n"); ++ ++ if (priv->ieee->iw_mode != IW_MODE_MONITOR) { ++ priv->sys_config.accept_all_data_frames = 0; ++ priv->sys_config.accept_non_directed_frames = 0; ++ priv->sys_config.accept_all_mgmt_bcpr = 0; ++ priv->sys_config.accept_all_mgmt_frames = 0; ++ ++ ipw_send_system_config(priv); ++ } ++ ++ return 0; ++} ++ ++static int ipw_prom_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) ++{ ++ IPW_DEBUG_INFO("prom dev->xmit\n"); ++ netif_stop_queue(dev); ++ return -EOPNOTSUPP; ++} ++ ++static struct net_device_stats *ipw_prom_get_stats(struct net_device *dev) ++{ ++ struct ipw_prom_priv *prom_priv = ieee80211_priv(dev); ++ return &prom_priv->ieee->stats; ++} ++ ++static int ipw_prom_alloc(struct ipw_priv *priv) ++{ ++ int rc = 0; ++ ++ if (priv->prom_net_dev) ++ return -EPERM; ++ ++ priv->prom_net_dev = alloc_ieee80211(sizeof(struct ipw_prom_priv)); ++ if (priv->prom_net_dev == NULL) ++ return -ENOMEM; ++ ++ priv->prom_priv = ieee80211_priv(priv->prom_net_dev); ++ priv->prom_priv->ieee = netdev_priv(priv->prom_net_dev); ++ priv->prom_priv->priv = priv; ++ ++ strcpy(priv->prom_net_dev->name, "rtap%d"); ++ ++ priv->prom_net_dev->type = ARPHRD_IEEE80211_RADIOTAP; ++ priv->prom_net_dev->open = ipw_prom_open; ++ priv->prom_net_dev->stop = ipw_prom_stop; ++ priv->prom_net_dev->get_stats = ipw_prom_get_stats; ++ priv->prom_net_dev->hard_start_xmit = ipw_prom_hard_start_xmit; ++ ++ priv->prom_priv->ieee->iw_mode = IW_MODE_MONITOR; ++ ++ rc = register_netdev(priv->prom_net_dev); ++ if (rc) { ++ free_ieee80211(priv->prom_net_dev); ++ priv->prom_net_dev = NULL; ++ return rc; ++ } ++ ++ return 0; ++} ++ ++static void ipw_prom_free(struct ipw_priv *priv) ++{ ++ if (!priv->prom_net_dev) ++ return; ++ ++ unregister_netdev(priv->prom_net_dev); ++ free_ieee80211(priv->prom_net_dev); ++ ++ priv->prom_net_dev = NULL; ++} ++ ++#endif ++ ++ + static int ipw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) + { + int err = 0; +@@ -11710,6 +12074,18 @@ static int ipw_pci_probe(struct pci_dev + goto out_remove_sysfs; + } + ++#ifdef CONFIG_IPW2200_PROMISCUOUS ++ if (rtap_iface) { ++ err = ipw_prom_alloc(priv); ++ if (err) { ++ IPW_ERROR("Failed to register promiscuous network " ++ "device (error %d).\n", err); ++ unregister_netdev(priv->net_dev); ++ goto out_remove_sysfs; ++ } ++ } ++#endif ++ + printk(KERN_INFO DRV_NAME ": Detected geography %s (%d 802.11bg " + "channels, %d 802.11a channels)\n", + priv->ieee->geo.name, priv->ieee->geo.bg_channels, +@@ -11789,6 +12165,10 @@ static void ipw_pci_remove(struct pci_de + priv->error = NULL; + } + ++#ifdef CONFIG_IPW2200_PROMISCUOUS ++ ipw_prom_free(priv); ++#endif ++ + free_irq(pdev->irq, priv); + iounmap(priv->hw_base); + pci_release_regions(pdev); +@@ -11934,6 +12314,11 @@ MODULE_PARM_DESC(debug, "debug output ma + module_param(channel, int, 0444); + MODULE_PARM_DESC(channel, "channel to limit associate to (default 0 [ANY])"); + ++#ifdef CONFIG_IPW2200_PROMISCUOUS ++module_param(rtap_iface, int, 0444); ++MODULE_PARM_DESC(rtap_iface, "create the rtap interface (1 - create, default 0)"); ++#endif ++ + #ifdef CONFIG_IPW_QOS + module_param(qos_enable, int, 0444); + MODULE_PARM_DESC(qos_enable, "enable all QoS functionalitis"); +diff -Nupr ipw2200-1.1.1/ipw2200.h ipw2200-1.1.1-rtap/ipw2200.h +--- ipw2200-1.1.1/ipw2200.h 2006-03-08 06:42:55.000000000 -0600 ++++ ipw2200-1.1.1-rtap/ipw2200.h 2006-03-20 22:08:13.000000000 -0600 +@@ -797,7 +797,7 @@ struct ipw_sys_config { + u8 bt_coexist_collision_thr; + u8 silence_threshold; + u8 accept_all_mgmt_bcpr; +- u8 accept_all_mgtm_frames; ++ u8 accept_all_mgmt_frames; + u8 pass_noise_stats_to_host; + u8 reserved3; + } __attribute__ ((packed)); +@@ -1130,6 +1130,35 @@ struct ipw_fw_error { + u8 payload[0]; + } __attribute__ ((packed)); + ++#ifdef CONFIG_IPW2200_PROMISCUOUS ++struct ipw_priv; ++struct ipw_prom_priv { ++ struct ipw_priv *priv; ++ struct ieee80211_device *ieee; ++ int tx_packets; ++ int rx_packets; ++}; ++#endif ++ ++#if defined(CONFIG_IEEE80211_RADIOTAP) || defined(CONFIG_IPW2200_PROMISCUOUS) ++/* Magic struct that slots into the radiotap header -- no reason ++ * to build this manually element by element, we can write it much ++ * more efficiently than we can parse it. ORDER MATTERS HERE ++ */ ++struct ipw_rt_hdr { ++ struct ieee80211_radiotap_header rt_hdr; ++ u64 rt_tsf; /* TSF */ ++ u8 rt_flags; /* radiotap packet flags */ ++ u8 rt_rate; /* rate in 500kb/s */ ++ u16 rt_channel; /* channel in mhz */ ++ u16 rt_chbitmask; /* channel bitfield */ ++ s8 rt_dbmsignal; /* signal in dbM, kluged to signed */ ++ s8 rt_dbmnoise; ++ u8 rt_antenna; /* antenna number */ ++ u8 payload[0]; /* payload... */ ++} __attribute__ ((packed)); ++#endif ++ + struct ipw_priv { + /* ieee device used by generic ieee processing code */ + struct ieee80211_device *ieee; +@@ -1141,6 +1173,12 @@ struct ipw_priv { + struct pci_dev *pci_dev; + struct net_device *net_dev; + ++#ifdef CONFIG_IPW2200_PROMISCUOUS ++ /* Promiscuous mode */ ++ struct ipw_prom_priv *prom_priv; ++ struct net_device *prom_net_dev; ++#endif ++ + /* pci hardware address support */ + void __iomem *hw_base; + unsigned long hw_len; diff --git a/net-wireless/ipw2200/ipw2200-1.1.1-r1.ebuild b/net-wireless/ipw2200/ipw2200-1.1.1-r1.ebuild new file mode 100644 index 000000000000..14c55ee8a212 --- /dev/null +++ b/net-wireless/ipw2200/ipw2200-1.1.1-r1.ebuild @@ -0,0 +1,104 @@ +# Copyright 1999-2006 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/net-wireless/ipw2200/ipw2200-1.1.1-r1.ebuild,v 1.1 2006/03/24 16:38:33 brix Exp $ + +inherit eutils linux-mod + +# The following works with both pre-releases and releases +MY_P=${P/_/-} +S=${WORKDIR}/${MY_P} + +IEEE80211_VERSION="1.1.12" +FW_VERSION="3.0" + +DESCRIPTION="Driver for the Intel PRO/Wireless 2200BG/2915ABG miniPCI and 2225BG PCI adapters" +HOMEPAGE="http://ipw2200.sourceforge.net/" +SRC_URI="mirror://sourceforge/${PN}/${MY_P}.tgz" + +LICENSE="GPL-2" +SLOT="0" +KEYWORDS="~amd64 ~x86" + +IUSE="debug radiotap" +DEPEND=">=net-wireless/ieee80211-${IEEE80211_VERSION} + sys-apps/sed" +RDEPEND=">=net-wireless/ieee80211-${IEEE80211_VERSION} + >=net-wireless/ipw2200-firmware-${FW_VERSION} + net-wireless/wireless-tools" + +BUILD_TARGETS="all" +MODULE_NAMES="ipw2200(net/wireless:)" +MODULESD_IPW2200_DOCS="README.ipw2200" + +CONFIG_CHECK="NET_RADIO FW_LOADER !IPW2200" +ERROR_NET_RADIO="${P} requires support for Wireless LAN drivers (non-hamradio) & Wireless Extensions (CONFIG_NET_RADIO)." +ERROR_FW_LOADER="${P} requires Hotplug firmware loading support (CONFIG_FW_LOADER)." +ERROR_IPW2200="${P} requires the in-kernel version of the IPW2200 driver to be disabled (CONFIG_IPW2200)" + +pkg_setup() { + linux-mod_pkg_setup + + if kernel_is 2 4; then + die "${P} does not support building against kernel 2.4.x" + fi + + if [[ ! -f /lib/modules/${KV_FULL}/net/ieee80211/ieee80211.${KV_OBJ} ]]; then + eerror + eerror "Looks like you forgot to remerge net-wireless/ieee80211 after" + eerror "upgrading your kernel." + eerror + eerror "Hint: use sys-kernel/module-rebuild for keeping track of which" + eerror "modules needs to be remerged after a kernel upgrade." + eerror + die "/lib/modules/${KV_FULL}/net/ieee80211/ieee80211.${KV_OBJ} not found" + fi + + BUILD_PARAMS="KSRC=${KV_DIR} KSRC_OUTPUT=${KV_OUT_DIR} IEEE80211_INC=/usr/include" +} + +src_unpack() { + local debug="n" radiotap="n" + + unpack ${A} + + cd ${S} + epatch ${FILESDIR}/${P}-diversity.patch + epatch ${FILESDIR}/${P}-fw_endian.patch + epatch ${FILESDIR}/${P}-rtap_iface.patch + + use debug && debug="y" + sed -i -e "s:^\(CONFIG_IPW2200_DEBUG\)=.*:\1=${debug}:" ${S}/Makefile + + use radiotap && radiotap="y" + sed -i -e "s:^# \(CONFIG_IEEE80211_RADIOTAP\)=.*:\1=${radiotap}:" ${S}/Makefile + sed -i -e "s:^# \(CONFIG_IPW2200_PROMISCUOUS\)=.*:\1=${radiotap}:" ${S}/Makefile +} + +src_compile() { + linux-mod_src_compile + + einfo + einfo "You may safely ignore any warnings from above compilation about" + einfo "undefined references to the ieee80211 subsystem." + einfo +} + +src_install() { + linux-mod_src_install + + dodoc CHANGES ISSUES +} + +pkg_postinst() { + linux-mod_pkg_postinst + + if [ -f /lib/modules/${KV_FULL}/net/${PN}.ko ]; then + einfo + einfo "Modules from an earlier installation detected. You will need to manually" + einfo "remove those modules by running the following commands:" + einfo " # rm -f /lib/modules/${KV_FULL}/net/${PN}.ko" + einfo " # rm -f /lib/modules/${KV_FULL}/net/ieee80211*.ko" + einfo " # depmod -a" + einfo + fi +} |