summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTodd C. Miller <millert@cvs.openbsd.org>2002-04-11 02:11:20 +0000
committerTodd C. Miller <millert@cvs.openbsd.org>2002-04-11 02:11:20 +0000
commita2d3a7b5b15aeb0cf6fa95837bb4f8637c698178 (patch)
treea919770e659b762165bac288b137d0e8d2d775d6
parentebd09517624cd3eed5723b8c846b80a5b9f85d2a (diff)
Fix Lucent <-> Prism2 WEP interop bug. We only want to set the
EXCLUDE_UNENCRYPTED bit in the WI_RID_P2_ENCRYPTION value if we are in shared key mode. Symbol cards, just to be different, supposedly always want the EXCLUDE_UNENCRYPTED bit set (confirmed with the Linux orinoco and spectrum24 drivers). I have so far been unable to get my Symbol card to interop with Lucent or Prism2 WEP. In BSS mode at least, this Symbol card does not list WEP as a capability it supports. This is, to put it mildly, rather annoying.
-rw-r--r--sys/dev/ic/if_wi.c33
1 files changed, 20 insertions, 13 deletions
diff --git a/sys/dev/ic/if_wi.c b/sys/dev/ic/if_wi.c
index 4995fa2bb44..d81e2fece1b 100644
--- a/sys/dev/ic/if_wi.c
+++ b/sys/dev/ic/if_wi.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_wi.c,v 1.52 2002/04/11 00:08:25 millert Exp $ */
+/* $OpenBSD: if_wi.c,v 1.53 2002/04/11 02:11:19 millert Exp $ */
/*
* Copyright (c) 1997, 1998, 1999
@@ -124,7 +124,7 @@ u_int32_t widebug = WIDEBUG;
#if !defined(lint) && !defined(__OpenBSD__)
static const char rcsid[] =
- "$OpenBSD: if_wi.c,v 1.52 2002/04/11 00:08:25 millert Exp $";
+ "$OpenBSD: if_wi.c,v 1.53 2002/04/11 02:11:19 millert Exp $";
#endif /* lint */
#ifdef foo
@@ -902,6 +902,7 @@ wi_write_record(sc, ltv)
struct wi_ltv_gen *ltv;
{
u_int8_t *ptr;
+ u_int16_t val;
int i;
struct wi_ltv_gen p2ltv;
@@ -935,18 +936,24 @@ wi_write_record(sc, ltv)
case WI_RID_ENCRYPTION:
p2ltv.wi_type = WI_RID_P2_ENCRYPTION;
p2ltv.wi_len = 2;
- if (ltv->wi_val & htole16(0x01))
+ if (ltv->wi_val & htole16(0x01)) {
+ val = PRIVACY_INVOKED;
+ /*
+ * If using shared key WEP we must set the
+ * EXCLUDE_UNENCRYPTED bit. Symbol cards
+ * need this bit set even when not using
+ * shared key. We can't just test for
+ * IEEE80211_AUTH_SHARED since Symbol cards
+ * have 2 shared key modes.
+ */
+ if (sc->wi_authmode != IEEE80211_AUTH_OPEN ||
+ sc->sc_firmware_type == WI_SYMBOL)
+ val |= EXCLUDE_UNENCRYPTED;
+ /* TX encryption is broken in Host AP mode. */
if (sc->wi_ptype == WI_PORTTYPE_AP)
- /* Disable tx encryption...
- * it's broken.
- */
- p2ltv.wi_val = htole16(HOST_ENCRYPT |
- PRIVACY_INVOKED |
- EXCLUDE_UNENCRYPTED);
- else
- p2ltv.wi_val = htole16(PRIVACY_INVOKED |
- EXCLUDE_UNENCRYPTED);
- else
+ val |= HOST_ENCRYPT;
+ p2ltv.wi_val = htole16(val);
+ } else
p2ltv.wi_val = htole16(HOST_ENCRYPT | HOST_DECRYPT);
ltv = &p2ltv;
break;