netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] hostap: Reduce stack use
@ 2005-03-25  3:21 Jouni Malinen
  0 siblings, 0 replies; only message in thread
From: Jouni Malinen @ 2005-03-25  3:21 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: netdev

Reduce stack use by kmalloc'ing some of the large local variables.

Signed-off-by: Jouni Malinen <jkmaline@cc.hut.fi>


Index: wireless-2.6/drivers/net/wireless/hostap/hostap_cs.c
===================================================================
--- wireless-2.6.orig/drivers/net/wireless/hostap/hostap_cs.c	2005-03-22 20:07:48.000000000 -0800
+++ wireless-2.6/drivers/net/wireless/hostap/hostap_cs.c	2005-03-22 21:12:48.000000000 -0800
@@ -270,19 +270,26 @@
 }
 
 
-static void sandisk_enable_wireless(struct net_device *dev)
+static int sandisk_enable_wireless(struct net_device *dev)
 {
-	int res;
+	int res, ret = 0;
 	conf_reg_t reg;
 	struct hostap_interface *iface = dev->priv;
 	local_info_t *local = iface->local;
 	tuple_t tuple;
-	cisparse_t parse;
+	cisparse_t *parse = NULL;
 	u_char buf[64];
 
 	if (local->link->io.NumPorts1 < 0x42) {
 		/* Not enough ports to be SanDisk multi-function card */
-		return;
+		ret = -ENODEV;
+		goto done;
+	}
+
+	parse = kmalloc(sizeof(cisparse_t), GFP_KERNEL);
+	if (parse == NULL) {
+		ret = -ENOMEM;
+		goto done;
 	}
 
 	tuple.DesiredTuple = CISTPL_MANFID;
@@ -292,19 +299,21 @@
 	tuple.TupleOffset = 0;
 	if (pcmcia_get_first_tuple(local->link->handle, &tuple) ||
 	    pcmcia_get_tuple_data(local->link->handle, &tuple) ||
-	    pcmcia_parse_tuple(local->link->handle, &tuple, &parse) ||
-	    parse.manfid.manf != 0xd601 || parse.manfid.card != 0x0101) {
+	    pcmcia_parse_tuple(local->link->handle, &tuple, parse) ||
+	    parse->manfid.manf != 0xd601 || parse->manfid.card != 0x0101) {
 		/* No SanDisk manfid found */
-		return;
+		ret = -ENODEV;
+		goto done;
 	}
 
 	tuple.DesiredTuple = CISTPL_LONGLINK_MFC;
 	if (pcmcia_get_first_tuple(local->link->handle, &tuple) ||
 	    pcmcia_get_tuple_data(local->link->handle, &tuple) ||
-	    pcmcia_parse_tuple(local->link->handle, &tuple, &parse) ||
-		parse.longlink_mfc.nfn < 2) {
+	    pcmcia_parse_tuple(local->link->handle, &tuple, parse) ||
+		parse->longlink_mfc.nfn < 2) {
 		/* No multi-function links found */
-		return;
+		ret = -ENODEV;
+		goto done;
 	}
 
 	printk(KERN_DEBUG "%s: Multi-function SanDisk ConnectPlus detected"
@@ -319,7 +328,7 @@
 	if (res != CS_SUCCESS) {
 		printk(KERN_DEBUG "%s: SanDisk - COR sreset failed (%d)\n",
 		       dev->name, res);
-		return;
+		goto done;
 	}
 	mdelay(5);
 
@@ -335,7 +344,7 @@
 	if (res != CS_SUCCESS) {
 		printk(KERN_DEBUG "%s: SanDisk - COR sreset failed (%d)\n",
 		       dev->name, res);
-		return;
+		goto done;
 	}
 	mdelay(5);
 
@@ -345,6 +354,10 @@
 	udelay(10);
 	HFA384X_OUTB(0x4b, SANDISK_WLAN_ACTIVATION_OFF);
 	udelay(10);
+
+done:
+	kfree(parse);
+	return ret;
 }
 
 
@@ -594,9 +607,9 @@
 	struct net_device *dev;
 	struct hostap_interface *iface;
 	local_info_t *local;
-	int ret;
+	int ret = 1;
 	tuple_t tuple;
-	cisparse_t parse;
+	cisparse_t *parse;
 	int last_fn, last_ret;
 	u_char buf[64];
 	config_info_t conf;
@@ -604,6 +617,12 @@
 
 	PDEBUG(DEBUG_FLOW, "prism2_config()\n");
 
+	parse = kmalloc(sizeof(cisparse_t), GFP_KERNEL);
+	if (parse == NULL) {
+		ret = -ENOMEM;
+		goto failed;
+	}
+
 	tuple.DesiredTuple = CISTPL_CONFIG;
 	tuple.Attributes = 0;
 	tuple.TupleData = buf;
@@ -611,9 +630,9 @@
 	tuple.TupleOffset = 0;
 	CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link->handle, &tuple));
 	CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link->handle, &tuple));
-	CS_CHECK(ParseTuple, pcmcia_parse_tuple(link->handle, &tuple, &parse));
-	link->conf.ConfigBase = parse.config.base;
-	link->conf.Present = parse.config.rmask[0];
+	CS_CHECK(ParseTuple, pcmcia_parse_tuple(link->handle, &tuple, parse));
+	link->conf.ConfigBase = parse->config.base;
+	link->conf.Present = parse->config.rmask[0];
 
 	CS_CHECK(GetConfigurationInfo,
 		 pcmcia_get_configuration_info(link->handle, &conf));
@@ -625,11 +644,11 @@
 	tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
 	CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link->handle, &tuple));
 	for (;;) {
-		cistpl_cftable_entry_t *cfg = &(parse.cftable_entry);
+		cistpl_cftable_entry_t *cfg = &(parse->cftable_entry);
 		CFG_CHECK2(GetTupleData,
 			   pcmcia_get_tuple_data(link->handle, &tuple));
 		CFG_CHECK2(ParseTuple,
-			   pcmcia_parse_tuple(link->handle, &tuple, &parse));
+			   pcmcia_parse_tuple(link->handle, &tuple, parse));
 
 		if (cfg->flags & CISTPL_CFTABLE_DEFAULT)
 			dflt = *cfg;
@@ -792,14 +811,16 @@
 		if (ret == 0 && local->ddev)
 			strcpy(local->node.dev_name, local->ddev->name);
 	}
+	kfree(parse);
 	return ret;
 
  cs_failed:
 	cs_error(link->handle, last_fn, last_ret);
 
  failed:
+	kfree(parse);
 	prism2_release((u_long)link);
-	return 1;
+	return ret;
 }
 
 
Index: wireless-2.6/drivers/net/wireless/hostap/hostap_ioctl.c
===================================================================
--- wireless-2.6.orig/drivers/net/wireless/hostap/hostap_ioctl.c	2005-03-22 20:07:48.000000000 -0800
+++ wireless-2.6/drivers/net/wireless/hostap/hostap_ioctl.c	2005-03-22 21:15:44.000000000 -0800
@@ -519,8 +519,8 @@
 {
 	struct hostap_interface *iface;
 	local_info_t *local;
-	struct sockaddr addr[IW_MAX_AP];
-	struct iw_quality qual[IW_MAX_AP];
+	struct sockaddr *addr;
+	struct iw_quality *qual;
 
 	iface = netdev_priv(dev);
 	local = iface->local;
@@ -532,12 +532,24 @@
 		return -EOPNOTSUPP;
 	}
 
+	addr = kmalloc(sizeof(struct sockaddr) * IW_MAX_AP, GFP_KERNEL);
+	qual = kmalloc(sizeof(struct iw_quality) * IW_MAX_AP, GFP_KERNEL);
+	if (addr == NULL || qual == NULL) {
+		kfree(addr);
+		kfree(qual);
+		data->length = 0;
+		return -ENOMEM;
+	}
+
 	data->length = prism2_ap_get_sta_qual(local, addr, qual, IW_MAX_AP, 1);
 
-	memcpy(extra, &addr, sizeof(addr[0]) * data->length);
+	memcpy(extra, &addr, sizeof(struct sockaddr) * data->length);
 	data->flags = 1; /* has quality information */
-	memcpy(extra + sizeof(addr[0]) * data->length, &qual,
-	       sizeof(qual[0]) * data->length);
+	memcpy(extra + sizeof(struct sockaddr) * data->length, &qual,
+	       sizeof(struct iw_quality) * data->length);
+
+	kfree(addr);
+	kfree(qual);
 
 	return 0;
 }
@@ -1794,7 +1806,7 @@
 	u8 *pos;
 	u8 *ssid;
 	size_t ssid_len;
-	char buf[MAX_WPA_IE_LEN * 2 + 30];
+	char *buf;
 
 	if (bss) {
 		ssid = bss->ssid;
@@ -1916,7 +1928,8 @@
 	}
 
 	/* TODO: add BeaconInt,resp_rate,atim into BSS table */
-	if (scan || hscan) {
+	buf = kmalloc(MAX_WPA_IE_LEN * 2 + 30, GFP_KERNEL);
+	if (buf && (scan || hscan)) {
 		memset(&iwe, 0, sizeof(iwe));
 		iwe.cmd = IWEVCUSTOM;
 		sprintf(buf, "bcn_int=%d",
@@ -1944,6 +1957,7 @@
 							  &iwe, buf);
 		}
 	}
+	kfree(buf);
 
 	if (bss && bss->wpa_ie_len > 0 && bss->wpa_ie_len <= MAX_WPA_IE_LEN) {
 		memset(&iwe, 0, sizeof(iwe));
Index: wireless-2.6/drivers/net/wireless/hostap/hostap_plx.c
===================================================================
--- wireless-2.6.orig/drivers/net/wireless/hostap/hostap_plx.c	2005-03-22 20:07:48.000000000 -0800
+++ wireless-2.6/drivers/net/wireless/hostap/hostap_plx.c	2005-03-22 21:06:23.000000000 -0800
@@ -333,11 +333,15 @@
 #define CISTPL_MANFID 0x20
 #define CISTPL_END 0xFF
 #define CIS_MAX_LEN 256
-	u8 cis[CIS_MAX_LEN];
+	u8 *cis;
 	int i, pos;
 	unsigned int rmsz, rasz, manfid1, manfid2;
 	struct prism2_plx_manfid *manfid;
 
+	cis = kmalloc(CIS_MAX_LEN, GFP_KERNEL);
+	if (cis == NULL)
+		return -ENOMEM;
+
 	/* read CIS; it is in even offsets in the beginning of attr_mem */
 	for (i = 0; i < CIS_MAX_LEN; i++)
 		cis[i] = readb(attr_mem + 2 * i);
@@ -373,6 +377,7 @@
 			if (*cor_offset > attr_len) {
 				printk(KERN_ERR "%s: COR offset not within "
 				       "attr_mem\n", dev_info);
+				kfree(cis);
 				return -1;
 			}
 			break;
@@ -394,8 +399,10 @@
 		goto cis_error;
 
 	for (manfid = prism2_plx_known_manfids; manfid->manfid1 != 0; manfid++)
-		if (manfid1 == manfid->manfid1 && manfid2 == manfid->manfid2)
+		if (manfid1 == manfid->manfid1 && manfid2 == manfid->manfid2) {
+			kfree(cis);
 			return 0;
+		}
 
 	printk(KERN_INFO "%s: unknown manfid 0x%04x, 0x%04x - assuming this is"
 	       " not supported card\n", dev_info, manfid1, manfid2);
@@ -405,6 +412,7 @@
 	printk(KERN_WARNING "%s: invalid CIS data\n", dev_info);
 
  fail:
+	kfree(cis);
 	if (ignore_cis) {
 		printk(KERN_INFO "%s: ignore_cis parameter set - ignoring "
 		       "errors during CIS verification\n", dev_info);

-- 
Jouni Malinen                                            PGP id EFC895FA

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2005-03-25  3:21 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-03-25  3:21 [PATCH] hostap: Reduce stack use Jouni Malinen

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).