diff -burN linux-2.4.26-pre1-orinoco-0.13e-monitor/drivers/net/wireless/hermes.h linux-2.4.26-pre1-orinoco-0.13e-dragorn3/drivers/net/wireless/hermes.h --- linux-2.4.26-pre1-orinoco-0.13e-monitor/drivers/net/wireless/hermes.h Fri Mar 5 12:01:22 2004 +++ linux-2.4.26-pre1-orinoco-0.13e-dragorn3/drivers/net/wireless/hermes.h Fri Mar 5 12:01:36 2004 @@ -152,6 +152,30 @@ #define HERMES_MONITOR_ENABLE (0x000b) #define HERMES_MONITOR_DISABLE (0x000f) +/* + * Configuration RIDs + */ + +#define HERMES_RID_CNF_PORTTYPE (0xfc00) +#define HERMES_RID_CNF_CHANNEL (0xfc03) +#define HERMES_RID_CNF_PRISM2_WEP_ON (0xfc28) + +/*-- Status Fields --*/ +#define HERMES_RXSTATUS_MSGTYPE (0xE000) +#define HERMES_RXSTATUS_MACPORT (0x0700) +#define HERMES_RXSTATUS_UNDECR (0x0002) +#define HERMES_RXSTATUS_FCSERR (0x0001) + +/*-------------------------------------------------------------------- +Communication Frames: Test/Get/Set Field Values for Receive Frames +--------------------------------------------------------------------*/ +#define HERMES_RXSTATUS_MSGTYPE_GET(value) (((value) & HERMES_RXSTATUS_MSGTYPE) >> 13) +#define HERMES_RXSTATUS_MSGTYPE_SET(value) ((value) << 13) +#define HERMES_RXSTATUS_MACPORT_GET(value) (((value) & HERMES_RXSTATUS_MACPORT) >> 8) +#define HERMES_RXSTATUS_MACPORT_SET(value) ((value) << 8) +#define HERMES_RXSTATUS_ISUNDECR(value) ((value) & HERMES_RXSTATUS_UNDECR) +#define HERMES_RXSTATUS_ISFCSERR(value) ((value) & HERMES_RXSTATUS_FCSERR) + /*-------------------------------------------------------------------- Communication Frames: Field Masks for Receive Frames --------------------------------------------------------------------*/ @@ -183,7 +207,6 @@ #define HERMES_RXSTAT_BADCRC (0x0001) #define HERMES_RXSTAT_UNDECRYPTABLE (0x0002) #define HERMES_RXSTAT_MACPORT (0x0700) -#define HERMES_RXSTAT_GET_MACPORT(s) (((s) & HERMES_RXSTAT_MACPORT) >> 8) #define HERMES_RXSTAT_PCF (0x1000) /* Frame was received in CF period */ #define HERMES_RXSTAT_MSGTYPE (0xE000) #define HERMES_RXSTAT_1042 (0x2000) /* RFC-1042 frame */ diff -burN linux-2.4.26-pre1-orinoco-0.13e-monitor/drivers/net/wireless/orinoco.c linux-2.4.26-pre1-orinoco-0.13e-dragorn3/drivers/net/wireless/orinoco.c --- linux-2.4.26-pre1-orinoco-0.13e-monitor/drivers/net/wireless/orinoco.c Fri Mar 5 12:01:22 2004 +++ linux-2.4.26-pre1-orinoco-0.13e-dragorn3/drivers/net/wireless/orinoco.c Fri Mar 5 12:01:36 2004 @@ -458,6 +458,7 @@ #endif static int suppress_linkstatus; /* = 0 */ +static int suppress_linkstatus_copy; /* = 0 */ MODULE_PARM(suppress_linkstatus, "i"); /********************************************************************/ @@ -1732,6 +1732,8 @@ stats->rx_errors++; goto drop; } + /* Now handle frame based on port# */ - switch (HERMES_RXSTAT_GET_MACPORT(status)) { + switch (HERMES_RXSTATUS_MACPORT_GET(status)) + { case 0: @@ -1811,32 +1813,25 @@ return; case 7: - if (status & HERMES_RXSTAT_BADCRC) { - printk(KERN_DEBUG "%s: Received monitor frame: " - "BADCRC set\n", dev->name); - goto drop; - } - - err = hermes_bap_pread(hw, IRQ_BAP, &hdr80211, - sizeof(hdr80211), - rxfid, HERMES_RX_80211HDR_OFF); - - if (err) { - printk(KERN_ERR "%s: error %d reading monitor frame. " - "Frame dropped.\n", dev->name, err); + if ( ! HERMES_RXSTATUS_ISFCSERR(status) ) { + if (hermes_bap_pread(hw, IRQ_BAP, &hdr80211, sizeof(hdr80211), + rxfid, HERMES_RX_80211HDR_OFF)) { stats->rx_errors++; - goto drop; } - - orinoco_int_rxmonitor(dev, rxfid, length, - &desc, &hdr80211); + else { + /* Copy to wlansnif skb */ + orinoco_int_rxmonitor( priv, rxfid, length, &desc, &hdr80211); + } + } else { + printk("Received monitor frame: FCSerr set\n"); + } break; - default: printk("Received frame on unsupported port=%d\n", - HERMES_RXSTAT_GET_MACPORT(status)); + HERMES_RXSTATUS_MACPORT_GET(status) ); break; } + drop: stats->rx_dropped++; @@ -2479,6 +2474,24 @@ return err; } +//#define SET_MAC_ADDRESS +#ifdef SET_MAC_ADDRESS +static int +orinoco_set_mac_address(struct net_device *dev, void *addr) +{ + struct orinoco_private *priv = dev->priv; + struct sockaddr *mac = addr; + + /* Copy the address */ + memcpy(dev->dev_addr, mac->sa_data, WLAN_ADDR_LEN); + + /* Reconfig the beast */ + orinoco_reset(priv); + + return 0; +} +#endif /* SET_MAC_ADDRESS */ + static void orinoco_tx_timeout(struct net_device *dev) { @@ -3631,143 +3644,155 @@ return 0; } +/*---------------------------------------------------------------- +* orinoco_wlansniff +* +* Start or stop sniffing. +* +* Arguments: +* wlandev wlan device structure +* msgp ptr to msg buffer +* +* Returns: +* 0 success and done +* <0 success, but we're waiting for something to finish. +* >0 an error occurred while handling the message. +* Side effects: +* +* Call context: +* process thread (usually) +* interrupt +----------------------------------------------------------------*/ static int orinoco_wlansniff(struct net_device *dev, struct iwreq *wrq) { struct orinoco_private *priv = dev->priv; - hermes_t *hw = &priv->hw; - int err = 0; - u16 word; + hermes_t *hw = &(priv->hw); + hermes_response_t resp; + int result = 0; + uint16_t word; + int *parms = (int *) wrq->u.name; int enable = parms[0] > 0; unsigned long flags; + int noMonitor = dev->type != ARPHRD_IEEE80211_PRISM && + dev->type != ARPHRD_IEEE80211; - err = orinoco_lock(priv, &flags); - if (err) - return err; + orinoco_lock(priv, &flags); - switch (enable) { - case 0: + switch (enable) + { + case P80211ENUM_truth_false: /* Confirm that we're in monitor mode */ - if (dev->type == ARPHRD_ETHER) - err = -EFAULT; - + if ( noMonitor ) { + result = -EFAULT; + } /* Disable monitor mode */ + suppress_linkstatus = suppress_linkstatus_copy; word = HERMES_CMD_MONITOR | (HERMES_MONITOR_DISABLE << 8); - err = hermes_docmd_wait(hw, word, 0, NULL); - if (err) - break; + result = hermes_docmd_wait(hw, word, 0, &resp); + + if ( result ) break; /* Disable port 0 */ - err = hermes_disable_port(hw, 0); - if (err) - break; + result = hermes_disable_port(hw, 0); + if ( result ) break; /* Clear the driver state */ dev->type = ARPHRD_ETHER; - /* Restore the wepflags */ /*Orinoco doesn't like this*/ -#if 0 - err = hermes_write_wordrec(hw, USER_BAP, - HERMES_RID_CNFWEPFLAGS_INTERSIL, + /* Restore the wepflags */ //Orinoco doesn't like this +/* + result = hermes_write_wordrec(hw, USER_BAP, + HERMES_RID_CNF_PRISM2_WEP_ON, priv->presniff_wepflags); - if (err) - break; -#endif /* 0 */ + if ( result ) break; +*/ /* Set the port to its prior type and enable (if necessary) */ if (priv->presniff_port_type != 0) { word = priv->presniff_port_type; - err = hermes_write_wordrec(hw, USER_BAP, - HERMES_RID_CNFPORTTYPE, - word); - if (err) - break; + result = hermes_write_wordrec(hw, USER_BAP, + HERMES_RID_CNF_PORTTYPE, word); + if ( result ) break; /* Enable the port */ - err = hermes_enable_port(hw, 0); - if (err) - break; + result = hermes_enable_port(hw, 0); + if ( result ) break; + } break; - - case 1: + case P80211ENUM_truth_true: + // Only do this if we're not in monitor mode already + if (noMonitor) { /* Re-initialize the card before changing channel as advised at * http://lists.samba.org/pipermail/wireless/2002-June/004491.html * by Ian Goldberg. Implementation by Pat Swieskowski. */ -/* __orinoco_down(dev); */ + // __orinoco_down(dev); hermes_set_irqmask(hw, 0); hermes_init(hw); -/* __orinoco_up(dev); */ + // _orinoco_up(dev); hermes_set_irqmask(hw, ORINOCO_INTEN); + suppress_linkstatus = 1; + /* + __orinoco_stop_irqs(priv); + hermes_reset(hw); + __orinoco_start_irqs(priv, HERMES_EV_RX | HERMES_EV_ALLOC | + HERMES_EV_TX | HERMES_EV_TXEXC | + HERMES_EV_WTERR | HERMES_EV_INFO | + HERMES_EV_INFDROP); + */ /* Disable the port (if enabled), only check Port 0 */ - if (hw->port_enabled[0]) { + if ( hw->port_enabled[0] ) { /* Save macport 0 state */ - err = hermes_read_wordrec(hw, USER_BAP, - HERMES_RID_CNFPORTTYPE, + result = hermes_read_wordrec(hw, USER_BAP, + HERMES_RID_CNF_PORTTYPE, &(priv->presniff_port_type)); - if (err) - break; + if ( result ) break; /* Save the wepflags state */ - err = hermes_read_wordrec(hw, USER_BAP, - HERMES_RID_CNFWEPFLAGS_INTERSIL, + result = hermes_read_wordrec(hw, USER_BAP, + HERMES_RID_CNF_PRISM2_WEP_ON, &(priv->presniff_wepflags)); - if (err) - break; - err = hermes_disable_port(hw, 0); - if (err) - break; - } else { + if ( result ) break; + } + else { priv->presniff_port_type = 0; } + } + + // Disable the port + result = hermes_disable_port(hw, 0); + if ( result ) break; /* Set the channel we wish to sniff */ - if ((parms[1] > 0) && (parms[1] < 15)) { + if (parms[1] > 0 && parms[1] < 15) { word = parms[1]; - err = hermes_write_wordrec(hw, USER_BAP, - HERMES_RID_CNFOWNCHANNEL, - word); + result = hermes_write_wordrec(hw, USER_BAP, + HERMES_RID_CNF_CHANNEL, word); } else { - err = -EFAULT; + result = -EFAULT; } - if (err) - break; + if ( result ) break; + if (noMonitor) { /* Set the port type to pIbss */ word = HFA384x_PORTTYPE_IBSS; - err = hermes_write_wordrec(hw, USER_BAP, - HERMES_RID_CNFPORTTYPE, word); - if (err) - break; - -#if 0 - if ( (msg->keepwepflags.status == P80211ENUM_msgitem_status_data_ok) && - (msg->keepwepflags.data != 1)) { - /* Set the wepflags for no decryption */ - /* Orinoco doesn't like this */ - word = HFA384x_WEPFLAGS_DISABLE_TXCRYPT | - HFA384x_WEPFLAGS_DISABLE_RXCRYPT; - err = hermes_write_wordrec(hw, USER_BAP, - HERMES_RID_CNFWEPFLAGS_INTERSIL, - word); /*won't work with the bits above */ - } - if (err) - break; -#endif /* 0 */ - /* Enable the port */ - err = hermes_enable_port(hw, 0); - if (err) - break; + result = hermes_write_wordrec(hw, USER_BAP, + HERMES_RID_CNF_PORTTYPE, word); + if ( result ) break; /* Enable monitor mode */ word = HERMES_CMD_MONITOR | (HERMES_MONITOR_ENABLE << 8); - err = hermes_docmd_wait(hw, word, 0, NULL); - if (err) - break; + result = hermes_docmd_wait(hw, word, 0, &resp); + if ( result ) break; + } + /* Enable the port */ + result = hermes_enable_port(hw, 0); + if ( result ) break; /* Set the driver state */ /* Do we want the prism2 header? */ if (parms[0] == 1) @@ -3776,12 +3801,11 @@ dev->type = ARPHRD_IEEE80211; break; default: - BUG(); + result = -EFAULT; break; } - orinoco_unlock(priv, &flags); - return err; + return result; } static int @@ -4345,6 +4369,9 @@ dev->tx_timeout = orinoco_tx_timeout; dev->watchdog_timeo = HZ; /* 1 second timeout */ dev->get_stats = orinoco_get_stats; +#ifdef SET_MAC_ADDRESS + dev->set_mac_address = orinoco_set_mac_address; +#endif /* SET_MAC_ADDRESS */ dev->get_wireless_stats = orinoco_get_wireless_stats; dev->do_ioctl = orinoco_ioctl; dev->change_mtu = orinoco_change_mtu; @@ -4373,63 +4400,68 @@ /*---------------------------------------------------------------- * orinoco_int_rxmonitor * -* Handles monitor frames. Note that this function allocates space for -* the FCS and sets it to 0xffffffff. The hfa384x doesn't give us the -* FCS value but the higher layers expect it. 0xffffffff is used as a -* flag to indicate the FCS is bogus. +* Helper function for int_rx. Handles monitor frames. +* Note that this function allocates space for the FCS and sets it +* to 0xffffffff. The hfa384x doesn't give us the FCS value but the +* higher layers expect it. 0xffffffff is used as a flag to indicate +* the FCS is bogus. * * Arguments: * dev wlan device structure * rxfid received FID * rxdesc rx descriptor read from card in int_rx * +* Returns: +* nothing +* * Side effects: * Allocates an skb and passes it up via the PF_PACKET interface. * Call context: * interrupt ----------------------------------------------------------------*/ -void orinoco_int_rxmonitor(struct net_device *dev, u16 rxfid, - int len, struct hermes_rx_descriptor *rxdesc, - struct ieee802_11_hdr *hdr) +void orinoco_int_rxmonitor( struct orinoco_private *dev, uint16_t rxfid, int len, + struct hermes_rx_descriptor *rxdesc, struct ieee802_11_hdr *hdr) { - struct orinoco_private *priv = dev->priv; - hermes_t *hw = &priv->hw; - u32 hdrlen = 0; - u32 datalen = 0; - u32 skblen = 0; + hermes_t *hw = &(dev->hw); + uint32_t hdrlen = 0; + uint32_t datalen = 0; + uint32_t skblen = 0; p80211msg_lnxind_wlansniffrm_t *msg; - struct net_device_stats *stats = &priv->stats; - u8 *datap; - u16 fc; + struct net_device_stats *stats = &dev->stats; + + + uint8_t *datap; + uint16_t fc; struct sk_buff *skb; - /* Don't forget the status, time, and data_len fields are in - * little-endian order */ + /* Don't forget the status, time, and data_len fields are in host order */ /* Figure out how big the frame is */ fc = le16_to_cpu(hdr->frame_ctl); - switch (fc & IEEE802_11_FCTL_FTYPE) { - case IEEE802_11_FTYPE_DATA: - if ((fc & IEEE802_11_FCTL_TODS) - && (fc & IEEE802_11_FCTL_FROMDS)) + switch ( WLAN_GET_FC_FTYPE(fc) ) + { + case WLAN_FTYPE_DATA: + if ( WLAN_GET_FC_TODS(fc) && WLAN_GET_FC_FROMDS(fc) ) { hdrlen = WLAN_HDR_A4_LEN; - else + } else { hdrlen = WLAN_HDR_A3_LEN; + } datalen = len; break; - case IEEE802_11_FTYPE_MGMT: + case WLAN_FTYPE_MGMT: hdrlen = WLAN_HDR_A3_LEN; datalen = len; break; - case IEEE802_11_FTYPE_CTL: - switch (fc & IEEE802_11_FCTL_STYPE) { - case IEEE802_11_STYPE_PSPOLL: - case IEEE802_11_STYPE_RTS: - case IEEE802_11_STYPE_CFEND: - case IEEE802_11_STYPE_CFENDACK: + case WLAN_FTYPE_CTL: + switch ( WLAN_GET_FC_FSTYPE(fc) ) + { + case WLAN_FSTYPE_PSPOLL: + case WLAN_FSTYPE_RTS: + case WLAN_FSTYPE_CFEND: + case WLAN_FSTYPE_CFENDCFACK: hdrlen = 16; break; - case IEEE802_11_STYPE_CTS: - case IEEE802_11_STYPE_ACK: + case WLAN_FSTYPE_CTS: + case WLAN_FSTYPE_ACK: hdrlen = 10; break; } @@ -4446,8 +4478,8 @@ /* sanity check the length */ if ( skblen > - ( (sizeof(p80211msg_lnxind_wlansniffrm_t) + - WLAN_HDR_A4_LEN + WLAN_DATA_MAXLEN + WLAN_CRC_LEN) ) ) { + (sizeof(p80211msg_lnxind_wlansniffrm_t) + + WLAN_HDR_A4_LEN + WLAN_DATA_MAXLEN + WLAN_CRC_LEN) ) { printk("overlen frm: len=%d\n", skblen - sizeof(p80211msg_lnxind_wlansniffrm_t)); } @@ -4458,7 +4490,7 @@ } /* only prepend the prism header if in the right mode */ - if (dev->type != ARPHRD_IEEE80211_PRISM) { + if (dev->ndev->type != ARPHRD_IEEE80211_PRISM) { skb_put(skb, skblen - sizeof(p80211msg_lnxind_wlansniffrm_t)); datap = skb->data; } else { @@ -4469,7 +4501,7 @@ /* Initialize the message members */ msg->msgcode = DIDmsg_lnxind_wlansniffrm; msg->msglen = sizeof(p80211msg_lnxind_wlansniffrm_t); - strcpy(msg->devname, dev->name); + strcpy(msg->devname, dev->ndev->name); msg->hosttime.did = DIDmsg_lnxind_wlansniffrm_hosttime; msg->hosttime.status = 0; @@ -4514,7 +4546,7 @@ msg->istx.did = DIDmsg_lnxind_wlansniffrm_istx; msg->istx.status = 0; msg->istx.len = 4; - msg->istx.data = 0; + msg->istx.data = P80211ENUM_truth_false; msg->frmlen.did = DIDmsg_lnxind_wlansniffrm_frmlen; msg->frmlen.status = 0; @@ -4522,24 +4554,24 @@ msg->frmlen.data = hdrlen + datalen; } - /* Copy the 802.11 header to the skb (ctl frames may be less - * than a full header) */ - memcpy(datap, &(hdr->frame_ctl), hdrlen); + /* Copy the 802.11 header to the skb (ctl frames may be less than a full header) */ + memcpy( datap, &(hdr->frame_ctl), hdrlen); /* If any, copy the data from the card to the skb */ - if (datalen > 0) { + if ( datalen > 0 ) + { hermes_bap_pread(hw, IRQ_BAP, datap + hdrlen, (datalen+1)&~1, rxfid, HERMES_RX_DATA_OFF); /* check for unencrypted stuff if WEP bit set. */ - if (datap[1] & 0x40) /* wep set */ - if ((datap[hdrlen] == 0xaa) - && (datap[hdrlen+1] == 0xaa)) - datap[1] &= 0xbf; /* clear wep; it's the 802.2 header! */ + if (*(datap+1) & 0x40) // wep set + if ((*(datap+hdrlen) == 0xaa) && (*(datap+hdrlen+1) == 0xaa)) + *(datap+1) &= 0xbf; // clear wep; it's the 802.2 header! } /* pass it up via the PF_PACKET interface */ - skb->dev = dev; + { + skb->dev = dev->ndev; skb->dev->last_rx = jiffies; skb->mac.raw = skb->data ; @@ -4551,6 +4583,7 @@ stats->rx_bytes += skb->len; netif_rx(skb); + } return; } @@ -4575,6 +4608,7 @@ static int __init init_orinoco(void) { printk(KERN_DEBUG "%s\n", version); + suppress_linkstatus_copy = suppress_linkstatus; return 0; } diff -burN linux-2.4.26-pre1-orinoco-0.13e-monitor/drivers/net/wireless/orinoco.h linux-2.4.26-pre1-orinoco-0.13e-dragorn3/drivers/net/wireless/orinoco.h --- linux-2.4.26-pre1-orinoco-0.13e-monitor/drivers/net/wireless/orinoco.h Fri Mar 5 12:01:22 2004 +++ linux-2.4.26-pre1-orinoco-0.13e-dragorn3/drivers/net/wireless/orinoco.h Fri Mar 5 12:01:36 2004 @@ -37,6 +37,10 @@ /* To enable debug messages */ //#define ORINOCO_DEBUG 3 +#ifndef ETH_P_ECONET +#define ETH_P_ECONET 0x0018 /* needed for 2.2.x kernels */ +#endif + #define ETH_P_80211_RAW (ETH_P_ECONET + 1) #ifndef ARPHRD_IEEE80211 @@ -64,17 +68,24 @@ HERMES_EV_TXEXC | HERMES_EV_WTERR | HERMES_EV_INFO | \ HERMES_EV_INFDROP ) - #define WLAN_DEVNAMELEN_MAX 16 /* message data item for INT, BOUNDEDINT, ENUMINT */ -typedef struct p80211item_uint32 { - u32 did; - u16 status; - u16 len; - u32 data; +typedef struct p80211item_uint32 +{ + uint32_t did __attribute__ ((packed)); + uint16_t status __attribute__ ((packed)); + uint16_t len __attribute__ ((packed)); + uint32_t data __attribute__ ((packed)); } __attribute__ ((packed)) p80211item_uint32_t; +typedef struct p80211msg +{ + uint32_t msgcode __attribute__ ((packed)); + uint32_t msglen __attribute__ ((packed)); + uint8_t devname[WLAN_DEVNAMELEN_MAX] __attribute__ ((packed)); +} __attribute__ ((packed)) p80211msg_t; + #define DIDmsg_lnxind_wlansniffrm 0x0041 #define DIDmsg_lnxind_wlansniffrm_hosttime 0x1041 #define DIDmsg_lnxind_wlansniffrm_mactime 0x2041 @@ -87,10 +98,11 @@ #define DIDmsg_lnxind_wlansniffrm_istx 0x9041 #define DIDmsg_lnxind_wlansniffrm_frmlen 0xA041 -typedef struct p80211msg_lnxind_wlansniffrm { - u32 msgcode; - u32 msglen; - u8 devname[WLAN_DEVNAMELEN_MAX]; +typedef struct p80211msg_lnxind_wlansniffrm +{ + uint32_t msgcode; + uint32_t msglen; + uint8_t devname[WLAN_DEVNAMELEN_MAX]; p80211item_uint32_t hosttime; p80211item_uint32_t mactime; p80211item_uint32_t channel; @@ -103,6 +115,20 @@ p80211item_uint32_t frmlen; } __attribute__ ((packed)) p80211msg_lnxind_wlansniffrm_t; +#define P80211ENUM_truth_false 0 +#define P80211ENUM_truth_true 1 +#define P80211ENUM_resultcode_success 1 +#define P80211ENUM_resultcode_invalid_parameters 2 +#define P80211ENUM_resultcode_not_supported 3 +#define P80211ENUM_resultcode_timeout 4 +#define P80211ENUM_resultcode_too_many_req 5 +#define P80211ENUM_resultcode_refused 6 +#define P80211ENUM_resultcode_bss_already 7 +#define P80211ENUM_resultcode_invalid_access 8 +#define P80211ENUM_resultcode_invalid_mibattribute 9 +#define P80211ENUM_resultcode_cant_set_readonly_mib 10 +#define P80211ENUM_resultcode_implementation_failure 11 +#define P80211ENUM_resultcode_cant_get_writeonly_mib 12 #define P80211ENUM_msgitem_status_data_ok 0 #define P80211ENUM_msgitem_status_no_value 1 #define P80211ENUM_msgitem_status_invalid_itemname 2 @@ -120,12 +146,81 @@ #define P80211ENUM_msgitem_status_invalid_did 14 #define P80211ENUM_msgitem_status_missing_print_func 15 +#define WLAN_GET_FC_FTYPE(n) (((n) & 0x0C) >> 2) +#define WLAN_GET_FC_FSTYPE(n) (((n) & 0xF0) >> 4) +#define WLAN_GET_FC_TODS(n) (((n) & 0x0100) >> 8) +#define WLAN_GET_FC_FROMDS(n) (((n) & 0x0200) >> 9) + /*--- Sizes -----------------------------------------------*/ +#define WLAN_ADDR_LEN 6 #define WLAN_CRC_LEN 4 +#define WLAN_BSSID_LEN 6 +#define WLAN_BSS_TS_LEN 8 #define WLAN_HDR_A3_LEN 24 #define WLAN_HDR_A4_LEN 30 +#define WLAN_SSID_MAXLEN 32 #define WLAN_DATA_MAXLEN 2312 +/*--- Frame Control Field -------------------------------------*/ +/* Frame Types */ +#define WLAN_FTYPE_MGMT 0x00 +#define WLAN_FTYPE_CTL 0x01 +#define WLAN_FTYPE_DATA 0x02 + +/* Frame subtypes */ +/* Management */ +#define WLAN_FSTYPE_ASSOCREQ 0x00 +#define WLAN_FSTYPE_ASSOCRESP 0x01 +#define WLAN_FSTYPE_REASSOCREQ 0x02 +#define WLAN_FSTYPE_REASSOCRESP 0x03 +#define WLAN_FSTYPE_PROBEREQ 0x04 +#define WLAN_FSTYPE_PROBERESP 0x05 +#define WLAN_FSTYPE_BEACON 0x08 +#define WLAN_FSTYPE_ATIM 0x09 +#define WLAN_FSTYPE_DISASSOC 0x0a +#define WLAN_FSTYPE_AUTHEN 0x0b +#define WLAN_FSTYPE_DEAUTHEN 0x0c + +/* Control */ +#define WLAN_FSTYPE_PSPOLL 0x0a +#define WLAN_FSTYPE_RTS 0x0b +#define WLAN_FSTYPE_CTS 0x0c +#define WLAN_FSTYPE_ACK 0x0d +#define WLAN_FSTYPE_CFEND 0x0e +#define WLAN_FSTYPE_CFENDCFACK 0x0f + +/* Data */ +#define WLAN_FSTYPE_DATAONLY 0x00 +#define WLAN_FSTYPE_DATA_CFACK 0x01 +#define WLAN_FSTYPE_DATA_CFPOLL 0x02 +#define WLAN_FSTYPE_DATA_CFACK_CFPOLL 0x03 +#define WLAN_FSTYPE_NULL 0x04 +#define WLAN_FSTYPE_CFACK 0x05 +#define WLAN_FSTYPE_CFPOLL 0x06 +#define WLAN_FSTYPE_CFACK_CFPOLL 0x07 + +/*----------------------------------------------------------------*/ +/* Magic number, a quick test to see we're getting the desired struct */ + +#define P80211_IOCTL_MAGIC (0x4a2d464dUL) + +/*================================================================*/ +/* Types */ + +/*----------------------------------------------------------------*/ +/* A ptr to the following structure type is passed as the third */ +/* argument to the ioctl system call when issuing a request to */ +/* the p80211 module. */ + +typedef struct p80211ioctl_req +{ + char name[WLAN_DEVNAMELEN_MAX] __attribute__ ((packed)); + void *data __attribute__ ((packed)); + uint32_t magic __attribute__ ((packed)); + uint16_t len __attribute__ ((packed)); + uint32_t result __attribute__ ((packed)); +} __attribute__ ((packed)) p80211ioctl_req_t; + struct orinoco_private { void *card; /* Pointer to card dependent structure */ int (*hard_reset)(struct orinoco_private *); @@ -188,8 +283,8 @@ int port_type, createibss; int promiscuous, mc_count; - u16 presniff_port_type; - u16 presniff_wepflags; + uint16_t presniff_port_type; + uint16_t presniff_wepflags; }; #ifdef ORINOCO_DEBUG @@ -236,5 +331,13 @@ { spin_unlock_irqrestore(&priv->lock, *flags); } + +/*================================================================*/ +/* Function Declarations */ + +struct ieee802_11_hdr; + +void orinoco_int_rxmonitor( struct orinoco_private *dev, uint16_t rxfid, int len, + struct hermes_rx_descriptor *rxdesc, struct ieee802_11_hdr *hdr); #endif /* _ORINOCO_H */