diff -uNr kismet-devel/README kismet-madwifi/README --- kismet-devel/README 2003-08-04 23:43:40.000000000 -0600 +++ kismet-madwifi/README 2003-10-24 13:38:15.000000000 -0600 @@ -23,6 +23,7 @@ 8. drone 9. airport (viha) 10. acx100 + 11. atheros 7. GPS Support 8. Compiling 9. Configuration @@ -338,6 +339,22 @@ Capture interface: wlanX Notes: Drivers available from http://acx100.sourceforge.net. + 11. ATHEROS + Cards: 802.11 devices using Atheros 5000 series chipsets + Notes: Drivers available from http://madwifi.sourceforge.net. + Some Atheros chipsets are also supported by vt_ar5k above. + Dual-band multi-mode Atheros cards can hop channels across + both bands when configured as madwifi_ab or madwifi_ag. + o 'madwifi_a': 802.11a mode + Capture interface: athX + o 'madwifi_b': 802.11b mode + Capture interface: athX + o 'madwifi_g': 802.11g mode + Capture interface: athX + o 'madwifi_ab': 802.11a/b multi-mode + Capture interface: athX + o 'madwifi_ag': 802.11a/g multi-mode + Capture interface: athX 7. GPS SUPPORT GPS support is provided via the GPSD daemon, available at http://russnelson.com/gpsd/. GPSD is also included with the diff -uNr kismet-devel/conf/kismet.conf.in kismet-madwifi/conf/kismet.conf.in --- kismet-devel/conf/kismet.conf.in 2003-08-04 23:43:40.000000000 -0600 +++ kismet-madwifi/conf/kismet.conf.in 2003-10-24 12:33:15.000000000 -0600 @@ -30,6 +30,11 @@ # wtapfile - Saved file of packets readable by libwiretap # pcapfile - Saved file of packets readable by libpcap # ar5k - ar5k 802.11a using the vt_ar5k drivers +# madwifi_a - atheros 802.11a mode using the madwifi drivers +# madwifi_b - atheros 802.11b mode using the madwifi drivers +# madwifi_g - atheros 802.11g mode using the madwifi drivers +# madwifi_ab - atheros 802.11a/b multi-mode using the madwifi drivers +# madwifi_ag - atheros 802.11a/g multi-mode using the madwifi drivers # drone - Kismet remote drone # viha - Mac OSX Airport drivers # Capture interface - Specifies the network interface Kismet will watch for @@ -89,6 +94,8 @@ # Most won't support all of these, so you'll have to tweak it to what your # system supports. # 80211achannels=36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,149,153,157,161,184,188,192,196,200,204,208,212,216 +# Dual-band multi-mode cards hop across both bands according to: +80211abchannels=1,6,11,2,7,3,8,4,9,5,10,36,40,44,48,52,56,60,64 # Fine-tuning channel hopping control: # The sourcechannels option can be used to set the channel hopping for diff -uNr kismet-devel/conf/kismet_drone.conf kismet-madwifi/conf/kismet_drone.conf --- kismet-devel/conf/kismet_drone.conf 2003-06-04 18:36:38.000000000 -0600 +++ kismet-madwifi/conf/kismet_drone.conf 2003-10-24 12:57:57.000000000 -0600 @@ -36,6 +36,11 @@ # wsp100 - WSP100 embedded remote sensor. # wtapfile - Saved file of packets readable by libwiretap # ar5k - ar5k 802.11a using the vt_ar5k drivers +# madwifi_a - atheros 802.11a mode using the madwifi drivers +# madwifi_b - atheros 802.11b mode using the madwifi drivers +# madwifi_g - atheros 802.11g mode using the madwifi drivers +# madwifi_ab - atheros 802.11a/b multi-mode using the madwifi drivers +# madwifi_ag - atheros 802.11a/g multi-mode using the madwifi drivers # Capture interface - Specifies the network interface Kismet will watch for # packets to come in on. Typically "ethX" or "wlanX". For the WSP100 capture # engine, the WSP100 device sends packets via a UDP stream, so the capture @@ -78,6 +83,9 @@ # list: # 80211bchannels=1,7,13,2,8,3,14,9,4,10,5,11,6,12 80211achannels=36,40,44,48,52,56,60,64 +# Dual-band multi-mode cards hop across both bands according to: +80211abchannels=1,6,11,2,7,3,8,4,9,5,10,36,40,44,48,52,56,60,64 + # Fine-tuning channel hopping control: # The sourcechannels option can be used to set the channel hopping for diff -uNr kismet-devel/conf/zaurus_kismet.conf kismet-madwifi/conf/zaurus_kismet.conf --- kismet-devel/conf/zaurus_kismet.conf 2003-01-26 19:14:04.000000000 -0700 +++ kismet-madwifi/conf/zaurus_kismet.conf 2003-10-24 13:39:20.000000000 -0600 @@ -46,6 +46,11 @@ # prism2_legacy - Prism2 using wlan-ng drivers without pcap support (0.1.9) # prism2_bsd - Prism2 on *BSD # orinoco - Orinoco cards using Snax's patched driers +# madwifi_a - atheros 802.11a mode using the madwifi drivers +# madwifi_b - atheros 802.11b mode using the madwifi drivers +# madwifi_g - atheros 802.11g mode using the madwifi drivers +# madwifi_ab - atheros 802.11a/b multi-mode using the madwifi drivers +# madwifi_ag - atheros 802.11a/g multi-mode using the madwifi drivers # generic - Generic card with no specific support. You will have # to put this into monitor mode yourself! # wsp100 - WSP100 embedded remote sensor. diff -uNr kismet-devel/docs/README.html kismet-madwifi/docs/README.html --- kismet-devel/docs/README.html 2003-08-04 23:43:40.000000000 -0600 +++ kismet-madwifi/docs/README.html 2003-10-24 13:19:59.000000000 -0600 @@ -34,6 +34,7 @@
  • drone
  • airport (viha)
  • acx100 +
  • atheros
  • GPS Support
  • Compiling @@ -381,6 +382,25 @@ Notes: Drivers available from http://acx100.sourceforge.net.
    +
  • ATHEROS +
    + Cards: 802.11 devices using Atheros 5000 series chipsets +
    + Notes: Drivers available from http://madwifi.sourceforge.net. Some Atheros chipsets are also + supported by vt_ar5k above. Dual-band multi-mode Atheros cards can hop channels across both bands + when configured as madwifi_ab or madwifi_ag. +
  • GPS SUPPORT
    diff -uNr kismet-devel/kismet_drone.cc kismet-madwifi/kismet_drone.cc --- kismet-devel/kismet_drone.cc 2003-08-10 12:36:20.000000000 -0600 +++ kismet-madwifi/kismet_drone.cc 2003-10-24 12:30:05.000000000 -0600 @@ -195,6 +195,7 @@ // Default channel hop sequences vector channel_def80211b; vector channel_def80211a; + vector channel_def80211ab; // We don't actually use this but we need it for calls map bssid_wep_map; @@ -531,11 +532,12 @@ // Parse our default channel listing channel_def80211a = ParseChannelLine(conf->FetchOpt("80211achannels")); channel_def80211b = ParseChannelLine(conf->FetchOpt("80211bchannels")); + channel_def80211ab = ParseChannelLine(conf->FetchOpt("80211abchannels")); // Parse and assign our channels vector sourcechannellines = conf->FetchOptVec("sourcechannels"); ParseSetChannels(&sourcechannellines, &packet_sources, channel_split, - &channel_def80211a, &channel_def80211b); + &channel_def80211a, &channel_def80211b, &channel_def80211ab); } diff -uNr kismet-devel/kismet_server.cc kismet-madwifi/kismet_server.cc --- kismet-devel/kismet_server.cc 2003-08-10 12:36:20.000000000 -0600 +++ kismet-madwifi/kismet_server.cc 2003-10-24 12:30:22.000000000 -0600 @@ -1089,6 +1089,7 @@ // Default channel hop sequences vector channel_def80211b; vector channel_def80211a; + vector channel_def80211ab; int beacon_log = 1; @@ -1504,11 +1505,12 @@ // Parse our default channel listing channel_def80211a = ParseChannelLine(conf->FetchOpt("80211achannels")); channel_def80211b = ParseChannelLine(conf->FetchOpt("80211bchannels")); + channel_def80211ab = ParseChannelLine(conf->FetchOpt("80211abchannels")); // Parse and assign our channels vector sourcechannellines = conf->FetchOptVec("sourcechannels"); ParseSetChannels(&sourcechannellines, &packet_sources, channel_split, - &channel_def80211a, &channel_def80211b); + &channel_def80211a, &channel_def80211b, &channel_def80211ab); } // Now parse the rest of our options diff -uNr kismet-devel/man/kismet.conf.5 kismet-madwifi/man/kismet.conf.5 --- kismet-devel/man/kismet.conf.5 2003-08-04 23:43:40.000000000 -0600 +++ kismet-madwifi/man/kismet.conf.5 2003-10-24 13:40:42.000000000 -0600 @@ -201,6 +201,16 @@ .PP ar5k - AR5K-based 802.11a cards using the vt_ar5k drivers. .PP +madwifi_a - Atheros cards using the madwifi drivers in 802.11a mode. +.PP +madwifi_b - Atheros cards using the madwifi drivers in 802.11b mode. +.PP +madwifi_g - Atheros cards using the madwifi drivers in 802.11g mode. +.PP +madwifi_ab - Atheros cards using the madwifi drivers in 802.11a/b multi-mode. +.PP +madwifi_ag - Atheros cards using the madwifi drivers in 802.11a/g multi-mode. +.PP drone - Kismet remote drone. .PP viha - Viha OSX Airport drivers. diff -uNr kismet-devel/packetsource.h kismet-madwifi/packetsource.h --- kismet-devel/packetsource.h 2003-08-04 23:43:40.000000000 -0600 +++ kismet-madwifi/packetsource.h 2003-10-24 13:20:43.000000000 -0600 @@ -46,7 +46,12 @@ card_ar5k, card_drone, card_prism2_avs, - card_acx100 + card_acx100, + card_madwifi_a, + card_madwifi_b, + card_madwifi_g, + card_madwifi_ab, + card_madwifi_ag }; // Packet capture source superclass diff -uNr kismet-devel/packetsourceutil.cc kismet-madwifi/packetsourceutil.cc --- kismet-devel/packetsourceutil.cc 2003-09-14 11:08:08.000000000 -0600 +++ kismet-madwifi/packetsourceutil.cc 2003-10-24 13:24:07.000000000 -0600 @@ -41,7 +41,12 @@ "ar5k", "drone", "prism2_avs", - "acx100" + "acx100", + "madwifi_a", + "madwifi_b", + "madwifi_g", + "madwifi_ab", + "madwifi_ag" }; @@ -138,6 +143,16 @@ csrc->cardtype = card_prism2_avs; else if (!strcasecmp(sctype, "acx100")) csrc->cardtype = card_acx100; + else if (!strcasecmp(sctype, "madwifi_a")) + csrc->cardtype = card_madwifi_a; + else if (!strcasecmp(sctype, "madwifi_b")) + csrc->cardtype = card_madwifi_b; + else if (!strcasecmp(sctype, "madwifi_g")) + csrc->cardtype = card_madwifi_g; + else if (!strcasecmp(sctype, "madwifi_ab")) + csrc->cardtype = card_madwifi_ab; + else if (!strcasecmp(sctype, "madwifi_ag")) + csrc->cardtype = card_madwifi_ag; else { fprintf(stderr, "FATAL: Source %d (%s): Unknown card type '%s'\n", src, csrc->name.c_str(), sctype); exit(1); @@ -158,7 +173,9 @@ } else if (ctype == card_cisco || ctype == card_cisco_cvs || ctype == card_cisco_bsd || ctype == card_prism2 || ctype == card_prism2_bsd || ctype == card_prism2_hostap || ctype == card_orinoco || ctype == card_generic || ctype == card_ar5k || - ctype == card_prism2_avs || ctype == card_acx100) { + ctype == card_prism2_avs || ctype == card_acx100 || ctype == card_madwifi_a || + ctype == card_madwifi_b || ctype == card_madwifi_g || ctype == card_madwifi_ab || + ctype == card_madwifi_ag) { #ifdef HAVE_LIBPCAP if (csrc->interface == "") { fprintf(stderr, "FATAL: Source %d (%s): No capture device specified.\n", src, csrc->name.c_str()); @@ -358,7 +375,8 @@ // This is a really big, really scary function that handles figuring out who gets custom channels, // who gets default channels, and how those channels get split over multiple capture sources. int ParseSetChannels(vector *in_sourcechanlines, vector *in_capsources, - int in_chsplit, vector *in_80211adefaults, vector *in_80211bdefaults) { + int in_chsplit, vector *in_80211adefaults, vector *in_80211bdefaults, + vector *in_80211abdefaults) { // Capname to sequence ID map - this links multisources on a single sequence, and defaults map cap_seqid_map; // Sequence ID to channel sequences @@ -375,6 +393,8 @@ seqid_count_map[-2] = 0; seqid_seq_map[-1] = (*in_80211adefaults); seqid_seq_map[-2] = (*in_80211bdefaults); + seqid_count_map[-3] = 0; + seqid_seq_map[-3] = (*in_80211abdefaults); // Temporary vectors of capnames and such vector sourcecaps; @@ -426,10 +446,14 @@ csrc->cardtype == card_cisco_cvs) { // non-hopping cap types continue; - } else if (csrc->cardtype == card_ar5k) { + } else if (csrc->cardtype == card_ar5k || csrc->cardtype == card_madwifi_a) { // 802.11a seqid_count_map[-1]++; cap_seqid_map[csrc->name] = -1; + } else if (csrc->cardtype == card_madwifi_ab || csrc->cardtype == card_madwifi_ag) { + // 802.11a and 802.11b/g + seqid_count_map[-3]++; + cap_seqid_map[csrc->name] = -3; } else { // Everything else is 802.11b seqid_count_map[-2]++; @@ -886,14 +910,14 @@ data[0] = pak.data[0]; } else if (pak.packtype == CAPPACK_PACKET) { // Handle reading packets - we have the kis_packet struct and then the data - // also assmble the pointers + // also assemble the pointers memcpy(packet, pak.data, sizeof(kis_packet)); memcpy(data, &pak.data[sizeof(kis_packet)], packet->len); packet->data = data; packet->moddata = moddata; } else if (pak.packtype == CAPPACK_TEXT) { // Its a string, we'll memcpy it tho just to make sure its null terminated - // correcly + // correctly memcpy(status, pak.data, kismin(STATUS_MAX, pak.datalen)); status[kismin(STATUS_MAX, pak.datalen)] = 0; (*in_text) = status; diff -uNr kismet-devel/packetsourceutil.h kismet-madwifi/packetsourceutil.h --- kismet-devel/packetsourceutil.h 2003-09-14 11:08:08.000000000 -0600 +++ kismet-madwifi/packetsourceutil.h 2003-10-24 12:58:12.000000000 -0600 @@ -78,7 +78,8 @@ Timetracker *in_tracker, GPSD *in_gps); vector ParseChannelLine(string in_channels); int ParseSetChannels(vector *in_sourcechanlines, vector *in_capsources, - int in_chsplit, vector *in_80211adefaults, vector *in_80211bdefaults); + int in_chsplit, vector *in_80211adefaults, vector *in_80211bdefaults, + vector *in_80211abdefaults); // negative numbers are commands, positive numbers are a channel set. All commands are // one byte. diff -uNr kismet-devel/pcapsource.cc kismet-madwifi/pcapsource.cc --- kismet-devel/pcapsource.cc 2003-08-04 23:43:40.000000000 -0600 +++ kismet-madwifi/pcapsource.cc 2003-10-24 13:36:06.000000000 -0600 @@ -125,7 +125,9 @@ // Set up the ioctl stuff for pcap cards that work via the ioctl extentions #ifdef HAVE_LINUX_WIRELESS - if (ctype == card_prism2 || ctype == card_prism2_hostap || ctype == card_orinoco || ctype == card_acx100) { + if (ctype == card_prism2 || ctype == card_prism2_hostap || ctype == card_orinoco || + ctype == card_acx100 || cardtype == card_madwifi_a || cardtype == card_madwifi_b || + cardtype == card_madwifi_g || cardtype == card_madwifi_ab || cardtype == card_madwifi_ag) { // Cribbed from the wireless tools static const int families[] = { AF_INET, AF_IPX, AF_AX25, AF_APPLETALK @@ -322,10 +324,15 @@ packet->channel = p2head->channel.data; - // For now, anything not the ar5k is 802.11b - if (cardtype == card_ar5k) + if (cardtype == card_ar5k || cardtype == card_madwifi_a) // ar5k and madwifi_a are 802.11a packet->carrier = carrier_80211a; - else + else if (cardtype == card_madwifi_g) // madwifi_g is 802.11g + packet->carrier = carrier_80211g; + else if (cardtype == card_madwifi_ab) // madwifi_ab could be either 802.11a or 802.11b + packet->carrier = (packet->channel > 14) ? carrier_80211a : carrier_80211b; + else if (cardtype == card_madwifi_ag) // madwifi_ag could be either 802.11a or 802.11g + packet->carrier = (packet->channel > 14) ? carrier_80211a : carrier_80211g; + else // everything else is 802.11b packet->carrier = carrier_80211b; } @@ -358,7 +365,7 @@ packet->signal = bsdhead->wi_signal; packet->noise = bsdhead->wi_silence; packet->quality = ((packet->signal - packet->noise) * 100) / 256; - + // Set our offset callback_offset = sizeof(bsd_80211_header); @@ -450,6 +457,23 @@ char shellcmd[1024]; int ret = 0; + // Switch to appropriate carrier for new channel if necessary. + if (cardtype == card_madwifi_ab) { + // Only set carrier if new channel is in different band than old channel or if + // we are setting the channel for the first time. + // Channels 1-14 are a different band than channels >14. Kind of crude, but it + // works well at least until there are various multi-carrier scenarios. + if ((!channel || channel <= 14) && chan > 14) + SetCarrier(carrier_80211a); + else if ((!channel || channel > 14) && chan <= 14) + SetCarrier(carrier_80211g); + } else if (cardtype == card_madwifi_ag) { + if ((!channel || channel <= 14) && chan > 14) + SetCarrier(carrier_80211a); + else if ((!channel || channel > 14) && chan <= 14) + SetCarrier(carrier_80211g); + } + if (cardtype == card_prism2) { snprintf(shellcmd, 1024, "wlanctl-ng %s lnxreq_wlansniff channel=%d enable=true prismheader=true >/dev/null", carddev, chan); @@ -464,7 +488,9 @@ snprintf(shellcmd, 1024, "prism2ctl %s -f %d >/dev/null", carddev, chan); if ((ret = PcapShellCmd(shellcmd)) > 0) channel = chan; - } else if (cardtype == card_prism2_hostap || cardtype == card_ar5k) { + } else if (cardtype == card_prism2_hostap || cardtype == card_ar5k || cardtype == card_madwifi_a || + cardtype == card_madwifi_b || cardtype == card_madwifi_g || cardtype == card_madwifi_ab || + cardtype == card_madwifi_ag) { snprintf(shellcmd, 1024, "iwconfig %s channel %d >/dev/null", carddev, chan); if ((ret = PcapShellCmd(shellcmd)) > 0) channel = chan; @@ -483,10 +509,40 @@ return ret; } +int PcapSource::SetCarrier(carrier_type car) { + char shellcmd[1024]; + int ret = 0; + + if (cardtype == card_madwifi_ab || cardtype == card_madwifi_ag) { + int mode = 0; + if (car == carrier_80211a) { + mode = 1; + } else if (car == carrier_80211b) { + mode = 2; + } else if (car == carrier_80211g) { + mode = 3; + } else { + snprintf(errstr, 1024, "pcapsource: don't know how to change to carrier %d for cardtype %d", car, cardtype); + return 0; + } + snprintf(shellcmd, 1024, "iwpriv %s mode %d >/dev/null", carddev, mode); + if ((ret = PcapShellCmd(shellcmd)) > 0) { + // madwifi drops out of monitor mode when changing bands + snprintf(shellcmd, 1024, "iwconfig %s mode monitor >/dev/null", carddev); + ret = PcapShellCmd(shellcmd); + } + } else { + snprintf(errstr, 1024, "pcapsource: don't know how to change carrier for cardtype %d", cardtype); + } + return ret; +} + int PcapSource::FetchChannel() { #ifdef HAVE_LINUX_WIRELESS // Use ioctl's to get the current channel if we're a card type that supports them - if (cardtype == card_prism2 || cardtype == card_prism2_hostap || cardtype == card_orinoco || cardtype == card_acx100) { + if (cardtype == card_prism2 || cardtype == card_prism2_hostap || cardtype == card_orinoco || + cardtype == card_acx100 || cardtype == card_madwifi_a || cardtype == card_madwifi_b || + cardtype == card_madwifi_g || cardtype == card_madwifi_ab || cardtype == card_madwifi_ag) { iwreq wrq; strncpy(wrq.ifr_name, carddev, IFNAMSIZ); if (ioctl(ioctl_sock, SIOCGIWFREQ, &wrq) < 0) { diff -uNr kismet-devel/pcapsource.h kismet-madwifi/pcapsource.h --- kismet-devel/pcapsource.h 2003-08-04 23:43:40.000000000 -0600 +++ kismet-madwifi/pcapsource.h 2003-10-23 17:20:45.000000000 -0600 @@ -62,6 +62,8 @@ int SetChannel(unsigned int chan); + int SetCarrier(carrier_type carrier); + int FetchChannel(); protected: diff -uNr kismet-devel/scripts/kismet_monitor.in kismet-madwifi/scripts/kismet_monitor.in --- kismet-devel/scripts/kismet_monitor.in 2003-07-17 19:25:09.000000000 -0600 +++ kismet-madwifi/scripts/kismet_monitor.in 2003-10-24 13:37:12.000000000 -0600 @@ -125,6 +125,36 @@ iwconfig $DEVICE mode monitor ifconfig $DEVICE promisc up ;; + "madwifi_a") + echo "Enabling monitor mode for an 802.11a madwifi atheros card on $DEVICE" + iwpriv $DEVICE mode 1 + iwconfig $DEVICE mode monitor + ifconfig $DEVICE promisc up + ;; + "madwifi_b") + echo "Enabling monitor mode for an 802.11b madwifi atheros card on $DEVICE" + iwpriv $DEVICE mode 2 + iwconfig $DEVICE mode monitor + ifconfig $DEVICE promisc up + ;; + "madwifi_g") + echo "Enabling monitor mode for an 802.11g madwifi atheros card on $DEVICE" + iwpriv $DEVICE mode 3 + iwconfig $DEVICE mode monitor + ifconfig $DEVICE promisc up + ;; + "madwifi_ab") + echo "Enabling monitor mode for an 802.11a/b madwifi atheros card on $DEVICE" + iwpriv $DEVICE mode 1 + iwconfig $DEVICE mode monitor + ifconfig $DEVICE promisc up + ;; + "madwifi_ag") + echo "Enabling monitor mode for an 802.11a/g madwifi atheros card on $DEVICE" + iwpriv $DEVICE mode 1 + iwconfig $DEVICE mode monitor + ifconfig $DEVICE promisc up + ;; *) exit 0 ;; diff -uNr kismet-devel/scripts/kismet_unmonitor.in kismet-madwifi/scripts/kismet_unmonitor.in --- kismet-devel/scripts/kismet_unmonitor.in 2003-04-24 13:40:10.000000000 -0600 +++ kismet-madwifi/scripts/kismet_unmonitor.in 2003-10-24 13:37:44.000000000 -0600 @@ -180,6 +180,36 @@ echo "Disabling monitore mode for an ar5k 802.11a on $DEVICE (setting to managed)" iwconfig $DEVICE mode managed ;; + "madwifi_a") + echo "Disabling monitor mode for an 802.11a madwifi atheros card on $DEVICE" + iwpriv $DEVICE mode 0 + iwconfig $DEVICE mode managed + ifconfig $DEVICE -promisc up + ;; + "madwifi_b") + echo "Disabling monitor mode for an 802.11b madwifi atheros card on $DEVICE" + iwpriv $DEVICE mode 0 + iwconfig $DEVICE mode managed + ifconfig $DEVICE -promisc up + ;; + "madwifi_g") + echo "Disabling monitor mode for an 802.11g madwifi atheros card on $DEVICE" + iwpriv $DEVICE mode 0 + iwconfig $DEVICE mode managed + ifconfig $DEVICE -promisc up + ;; + "madwifi_ab") + echo "Disabling monitor mode for an 802.11a/b madwifi atheros card on $DEVICE" + iwpriv $DEVICE mode 0 + iwconfig $DEVICE mode managed + ifconfig $DEVICE -promisc up + ;; + "madwifi_ag") + echo "Disabling monitor mode for an 802.11a/g madwifi atheros card on $DEVICE" + iwpriv $DEVICE mode 0 + iwconfig $DEVICE mode managed + ifconfig $DEVICE -promisc up + ;; *) echo "Unknown card type '$CARDTYPE'. Doing nothing." ;;