[Midnightbsd-cvs] src: if_ndis.c: Fix a problem with broadcom and marvell wifi using ndis.

laffer1 at midnightbsd.org laffer1 at midnightbsd.org
Tue Jan 20 14:40:54 EST 2009


Log Message:
-----------
Fix a problem with broadcom and marvell wifi using ndis.  Scan results are not stored properly as some do not give a desired buffer length.  Make a default.  This fixes problems with some macbooks too

Modified Files:
--------------
    src/sys/dev/if_ndis:
        if_ndis.c (r1.4 -> r1.5)

-------------- next part --------------
Index: if_ndis.c
===================================================================
RCS file: /home/cvs/src/sys/dev/if_ndis/if_ndis.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -L sys/dev/if_ndis/if_ndis.c -L sys/dev/if_ndis/if_ndis.c -u -r1.4 -r1.5
--- sys/dev/if_ndis/if_ndis.c
+++ sys/dev/if_ndis/if_ndis.c
@@ -2544,13 +2544,20 @@
 		return(ENOENT);
 	}
 
-	len = 4;
-	error = ndis_get_info(sc, OID_802_11_BSSID_LIST, NULL, &len);
-	if (error != ENOSPC)
-		len = 65536;
+	len = sizeof(uint32_t) + (sizeof(ndis_wlan_bssid_ex) * 16);
+	bl = malloc(len, M_TEMP, M_NOWAIT | M_ZERO);
+	if (bl == NULL)
+		return (ENOMEM);
 
-	bl = malloc(len, M_TEMP, M_NOWAIT|M_ZERO);
 	error = ndis_get_info(sc, OID_802_11_BSSID_LIST, bl, &len);
+	if (error == ENOSPC) {
+		free(bl, M_TEMP);
+		bl = malloc(len, M_TEMP, M_NOWAIT | M_ZERO);
+		if (bl == NULL)
+			return (ENOMEM);
+
+		error = ndis_get_info(sc, OID_802_11_BSSID_LIST, bl, &len);
+	}
 	if (error) {
 		free(bl, M_TEMP);
 		device_printf(sc->ndis_dev, "bssid_list failed\n");
@@ -3317,13 +3324,22 @@
 	uint8_t rates[2+IEEE80211_RATE_MAXSIZE];
 	uint8_t *frm, *efrm;
 
-	len = 0;
 	noise = -96;
-	error = ndis_get_info(sc, OID_802_11_BSSID_LIST, NULL, &len);
-	if (error != ENOSPC)
-		len = 65536;
+
+	len = sizeof(uint32_t) + (sizeof(ndis_wlan_bssid_ex) * 16);
 	bl = malloc(len, M_DEVBUF, M_NOWAIT | M_ZERO);
+	if (bl == NULL)
+		return;
+
 	error = ndis_get_info(sc, OID_802_11_BSSID_LIST, bl, &len);
+	if (error == ENOSPC) {
+		free(bl, M_DEVBUF);
+		bl = malloc(len, M_DEVBUF, M_NOWAIT | M_ZERO);
+		if (bl == NULL)
+			return;
+
+		error = ndis_get_info(sc, OID_802_11_BSSID_LIST, bl, &len);
+	}
 	if (error) {
 		DPRINTF(("%s: failed to read\n", __func__));
 		free(bl, M_DEVBUF);


More information about the Midnightbsd-cvs mailing list