Patch from upstream to fix broadcast issues and compile problems with older wireless...
authorHenrik Brix Andersen <brix@gentoo.org>
Thu, 20 Oct 2005 13:25:28 +0000 (13:25 +0000)
committerHenrik Brix Andersen <brix@gentoo.org>
Thu, 20 Oct 2005 13:25:28 +0000 (13:25 +0000)
Package-Manager: portage-2.0.51.22-r3

net-wireless/ipw2200/ChangeLog
net-wireless/ipw2200/files/digest-ipw2200-1.0.7-r1 [new file with mode: 0644]
net-wireless/ipw2200/files/ipw2200-1.0.7-broadcast.patch [new file with mode: 0644]
net-wireless/ipw2200/files/ipw2200-1.0.7-wireless_ext-capa.patch [new file with mode: 0644]
net-wireless/ipw2200/ipw2200-1.0.7-r1.ebuild [new file with mode: 0644]

index 759926b4b17a597a768cfb359162915072d3b534..77eab5a95a4b5c2c801a04c3856fa66ef8c40f90 100644 (file)
@@ -1,6 +1,14 @@
 # ChangeLog for net-wireless/ipw2200
 # Copyright 1999-2005 Gentoo Foundation; Distributed under the GPL v2
-# $Header: /var/cvsroot/gentoo-x86/net-wireless/ipw2200/ChangeLog,v 1.47 2005/10/18 18:26:12 brix Exp $
+# $Header: /var/cvsroot/gentoo-x86/net-wireless/ipw2200/ChangeLog,v 1.48 2005/10/20 13:25:28 brix Exp $
+
+*ipw2200-1.0.7-r1 (20 Oct 2005)
+
+  20 Oct 2005; Henrik Brix Andersen <brix@gentoo.org>
+  +files/ipw2200-1.0.7-broadcast.patch,
+  +files/ipw2200-1.0.7-wireless_ext-capa.patch, +ipw2200-1.0.7-r1.ebuild:
+  Patch from upstream to fix broadcast issues and compile problems with older
+  wireless extensions.
 
 *ipw2200-1.0.7 (18 Oct 2005)
 
diff --git a/net-wireless/ipw2200/files/digest-ipw2200-1.0.7-r1 b/net-wireless/ipw2200/files/digest-ipw2200-1.0.7-r1
new file mode 100644 (file)
index 0000000..2c7bb25
--- /dev/null
@@ -0,0 +1 @@
+MD5 52fde406d510099dac34f5cccc009673 ipw2200-1.0.7.tgz 211838
diff --git a/net-wireless/ipw2200/files/ipw2200-1.0.7-broadcast.patch b/net-wireless/ipw2200/files/ipw2200-1.0.7-broadcast.patch
new file mode 100644 (file)
index 0000000..da91fe3
--- /dev/null
@@ -0,0 +1,61 @@
+diff -urp ipw2200-1.0.7/ipw2200.c ipw2200-1.0.7-broadcast/ipw2200.c
+--- ipw2200-1.0.7/ipw2200.c    2005-10-14 02:11:50.000000000 +0800
++++ ipw2200-1.0.7-broadcast/ipw2200.c  2005-10-19 15:47:10.000000000 +0800
+@@ -7982,6 +7982,12 @@ static void ipw_rebuild_decrypted_skb(st
+       }
+ }
+ 
++static inline int ipw_is_broadcast_ether_addr(const u8 * addr)
++{
++      return (addr[0] & 0xff && addr[1] & 0xff && addr[2] & 0xff &&
++              addr[3] & 0xff && addr[4] & 0xff && addr[5] & 0xff);
++}
++
+ static void ipw_handle_data_packet(struct ipw_priv *priv,
+                                  struct ipw_rx_mem_buffer *rxb,
+                                  struct ieee80211_rx_stats *stats)
+@@ -8018,8 +8024,9 @@ static void ipw_handle_data_packet(struc
+       /* HW decrypt will not clear the WEP bit, MIC, PN, etc. */
+       hdr = (struct ieee80211_hdr_4addr *)rxb->skb->data;
+       if (priv->ieee->iw_mode != IW_MODE_MONITOR &&
+-          (is_multicast_ether_addr(hdr->addr1) ?
+-           !priv->ieee->host_mc_decrypt : !priv->ieee->host_decrypt))
++          ((is_multicast_ether_addr(hdr->addr1) ||
++            ipw_is_broadcast_ether_addr(hdr->addr1)) ?
++            !priv->ieee->host_mc_decrypt : !priv->ieee->host_decrypt))
+               ipw_rebuild_decrypted_skb(priv, rxb->skb);
+ 
+       if (!ieee80211_rx(priv->ieee, rxb->skb, stats))
+@@ -8197,12 +8204,6 @@ static void ipw_handle_data_packet_monit
+ }
+ #endif
+ 
+-static inline int ipw_is_broadcast_ether_addr(const u8 * addr)
+-{
+-      return (addr[0] & 0xff && addr[1] & 0xff && addr[2] & 0xff &&
+-              addr[3] & 0xff && addr[4] & 0xff && addr[5] & 0xff);
+-}
+-
+ static inline int is_network_packet(struct ipw_priv *priv,
+                                   struct ieee80211_hdr_4addr *header)
+ {
+@@ -10225,7 +10226,8 @@ static inline int ipw_tx_skb(struct ipw_
+       switch (priv->ieee->iw_mode) {
+       case IW_MODE_ADHOC:
+               hdr_len = IEEE80211_3ADDR_LEN;
+-              unicast = !is_multicast_ether_addr(hdr->addr1);
++              unicast = !(is_multicast_ether_addr(hdr->addr1) ||
++                          ipw_is_broadcast_ether_addr(hdr->addr1));
+               id = ipw_find_station(priv, hdr->addr1);
+               if (id == IPW_INVALID_STATION) {
+                       id = ipw_add_station(priv, hdr->addr1);
+@@ -10240,7 +10242,8 @@ static inline int ipw_tx_skb(struct ipw_
+ 
+       case IW_MODE_INFRA:
+       default:
+-              unicast = !is_multicast_ether_addr(hdr->addr3);
++              unicast = !(is_multicast_ether_addr(hdr->addr3) ||
++                          ipw_is_broadcast_ether_addr(hdr->addr3));
+               hdr_len = IEEE80211_3ADDR_LEN;
+               id = 0;
+               break;
diff --git a/net-wireless/ipw2200/files/ipw2200-1.0.7-wireless_ext-capa.patch b/net-wireless/ipw2200/files/ipw2200-1.0.7-wireless_ext-capa.patch
new file mode 100644 (file)
index 0000000..7447115
--- /dev/null
@@ -0,0 +1,40 @@
+diff -Nup ipw2200-1.0.7-orig/ipw2200.c ipw2200-1.0.7/ipw2200.c
+--- ipw2200-1.0.7-orig/ipw2200.c       2005-10-19 15:21:46.000000000 -0500
++++ ipw2200-1.0.7/ipw2200.c    2005-10-19 15:21:40.000000000 -0500
+@@ -8980,11 +8980,13 @@ static int ipw_wx_get_range(struct net_d
+ 
+       up(&priv->sem);
+ 
++#if WIRELESS_EXT >= 17
+       /* Event capability (kernel + driver) */
+       range->event_capa[0] = (IW_EVENT_CAPA_K_0 |
+                               IW_EVENT_CAPA_MASK(SIOCGIWTHRSPY) |
+                               IW_EVENT_CAPA_MASK(SIOCGIWAP));
+       range->event_capa[1] = IW_EVENT_CAPA_K_1;
++#endif
+ 
+       IPW_DEBUG_WX("GET Range\n");
+       return 0;
+@@ -10102,7 +10104,9 @@ static struct iw_handler_def ipw_wx_hand
+       .num_private_args = ARRAY_SIZE(ipw_priv_args),
+       .private = ipw_priv_handler,
+       .private_args = ipw_priv_args,
++#if WIRELESS_EXT >= 17
+       .get_wireless_stats = ipw_get_wireless_stats,
++#endif
+ };
+ 
+ /*
+@@ -11622,9 +11626,12 @@ static int ipw_pci_probe(struct pci_dev 
+       priv->wireless_data.ieee80211 = priv->ieee;
+       net_dev->wireless_data = &priv->wireless_data;
+ #else
++      net_dev->get_wireless_stats = ipw_get_wireless_stats;
++#if WIRELESS_EXT == 16
+       ipw_wx_handler_def.spy_offset = offsetof(struct ieee80211_device,
+                                                spy_data);
+ #endif
++#endif
+       net_dev->wireless_handlers = &ipw_wx_handler_def;
+       net_dev->ethtool_ops = &ipw_ethtool_ops;
+       net_dev->irq = pdev->irq;
diff --git a/net-wireless/ipw2200/ipw2200-1.0.7-r1.ebuild b/net-wireless/ipw2200/ipw2200-1.0.7-r1.ebuild
new file mode 100644 (file)
index 0000000..4fa0bc1
--- /dev/null
@@ -0,0 +1,103 @@
+# Copyright 1999-2005 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/net-wireless/ipw2200/ipw2200-1.0.7-r1.ebuild,v 1.1 2005/10/20 13:25:28 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.5-r1"
+FW_VERSION="2.4"
+
+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}-broadcast.patch
+       epatch ${FILESDIR}/${P}-wireless_ext-capa.patch
+
+       use debug && debug="y"
+       sed -i -e "s:^\(CONFIG_IPW_DEBUG\)=.*:\1=${debug}:" ${S}/Makefile
+
+
+       use radiotap && radiotap="y"
+       sed -i -e "s:^#\(CONFIG_IEEE80211_RADIOTAP\)=.*:\1=${radiotap}:" ${S}/Makefile || die
+}
+
+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
+}