nexmon – Rev 1
?pathlinks?
diff -ru linux-wlan-ng-0.2.5/src/p80211/p80211netdev.c linux-wlan-ng-0.2.5-patched/src/p80211/p80211netdev.c
--- linux-wlan-ng-0.2.5/src/p80211/p80211netdev.c 2006-08-31 15:40:47.000000000 +0200
+++ linux-wlan-ng-0.2.5-patched/src/p80211/p80211netdev.c 2007-01-05 09:34:01.000000000 +0100
@@ -511,7 +511,7 @@
* and return success .
* TODO: we need a saner way to handle this
*/
- if(skb->protocol != ETH_P_80211_RAW) {
+ if(skb->protocol != htons(ETH_P_80211_RAW)) {
p80211netdev_start_queue(wlandev);
WLAN_LOG_NOTICE(
"Tx attempt prior to association, frame dropped.\n");
@@ -523,7 +523,7 @@
}
/* Check for raw transmits */
- if(skb->protocol == ETH_P_80211_RAW) {
+ if(skb->protocol == htons(ETH_P_80211_RAW)) {
if (!capable(CAP_NET_ADMIN)) {
result = 1;
goto failed;
@@ -951,8 +951,9 @@
dev->set_mac_address = p80211knetdev_set_mac_address;
#endif
#ifdef HAVE_TX_TIMEOUT
- dev->tx_timeout = &p80211knetdev_tx_timeout;
- dev->watchdog_timeo = (wlan_watchdog * HZ) / 1000;
+// korek: still not implemented
+// dev->tx_timeout = &p80211knetdev_tx_timeout;
+// dev->watchdog_timeo = (wlan_watchdog * HZ) / 1000;
#endif
netif_carrier_off(dev);
}
diff -ru linux-wlan-ng-0.2.5/src/prism2/driver/hfa384x.c linux-wlan-ng-0.2.5-patched/src/prism2/driver/hfa384x.c
--- linux-wlan-ng-0.2.5/src/prism2/driver/hfa384x.c 2006-08-03 16:00:04.000000000 +0200
+++ linux-wlan-ng-0.2.5-patched/src/prism2/driver/hfa384x.c 2007-01-05 09:38:13.000000000 +0100
@@ -1871,8 +1871,16 @@
DBFENTER;
- cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) |
- HFA384x_CMD_AINFO_SET(enable);
+// cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) |
+// HFA384x_CMD_AINFO_SET(enable);
+ if (enable == HFA384x_MONITOR_ENABLE) {
+ // KoreK: get into test mode 0x0a
+ cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) |
+ HFA384x_CMD_AINFO_SET(0x0a);
+ } else {
+ cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) |
+ HFA384x_CMD_AINFO_SET(enable);
+ }
cmd.parm0 = 0;
cmd.parm1 = 0;
cmd.parm2 = 0;
@@ -3112,12 +3120,33 @@
#endif
/* if we're using host WEP, increase size by IV+ICV */
- if (p80211_wep->data) {
- txdesc.data_len = host2hfa384x_16(skb->len+8);
- // txdesc.tx_control |= HFA384x_TX_NOENCRYPT_SET(1);
- } else {
- txdesc.data_len = host2hfa384x_16(skb->len);
- }
+// if (p80211_wep->data) {
+// txdesc.data_len = host2hfa384x_16(skb->len+8);
+// // txdesc.tx_control |= HFA384x_TX_NOENCRYPT_SET(1);
+// } else {
+// txdesc.data_len = host2hfa384x_16(skb->len);
+// }
+
+ if (skb->protocol != htons(ETH_P_80211_RAW)) {
+ /* if we're using host WEP, increase size by IV+ICV */
+ if (p80211_wep->data) {
+ txdesc.data_len = host2hfa384x_16(skb->len+8);
+ // txdesc.tx_control |= HFA384x_TX_NOENCRYPT_SET(1);
+ } else {
+ txdesc.data_len = host2hfa384x_16(skb->len);
+ }
+ } else {
+ /* KoreK: raw injection (monitor mode): pull the rest of
+ the header and ssanity check on txdesc.data_len */
+ memcpy(&(txdesc.data_len), skb->data, 16);
+ skb_pull(skb,16);
+ if (txdesc.data_len != host2hfa384x_16(skb->len)) {
+ printk(KERN_DEBUG "mismatch frame_len, drop frame\n");
+ return 0;
+ }
+
+ txdesc.tx_control |= HFA384x_TX_RETRYSTRAT_SET(1);
+ }
txdesc.tx_control = host2hfa384x_16(txdesc.tx_control);
/* copy the header over to the txdesc */
@@ -3140,7 +3169,8 @@
spin_lock(&hw->cmdlock);
/* Copy descriptor+payload to FID */
- if (p80211_wep->data) {
+// if (p80211_wep->data) {
+ if (p80211_wep->data && (skb->protocol != htons(ETH_P_80211_RAW))) {
result = hfa384x_copy_to_bap4(hw, HFA384x_BAP_PROC, fid, 0,
&txdesc, sizeof(txdesc),
p80211_wep->iv, sizeof(p80211_wep->iv),
@@ -3585,6 +3615,17 @@
switch( HFA384x_RXSTATUS_MACPORT_GET(rxdesc.status) )
{
case 0:
+
+ /* KoreK: this testmode uses macport 0 */
+ if ((wlandev->netdev->type == ARPHRD_IEEE80211) ||
+ (wlandev->netdev->type == ARPHRD_IEEE80211_PRISM)) {
+ if ( ! HFA384x_RXSTATUS_ISFCSERR(rxdesc.status) ) {
+ hfa384x_int_rxmonitor( wlandev, rxfid, &rxdesc);
+ } else {
+ WLAN_LOG_DEBUG(3,"Received monitor frame: FCSerr set\n");
+ }
+ goto done;
+ }
fc = ieee2host16(rxdesc.frame_control);
diff -ru linux-wlan-ng-0.2.5/src/prism2/driver/hfa384x_usb.c linux-wlan-ng-0.2.5-patched/src/prism2/driver/hfa384x_usb.c
--- linux-wlan-ng-0.2.5/src/prism2/driver/hfa384x_usb.c 2006-04-03 18:12:03.000000000 +0200
+++ linux-wlan-ng-0.2.5-patched/src/prism2/driver/hfa384x_usb.c 2007-01-05 09:46:13.000000000 +0100
@@ -1428,8 +1428,16 @@
DBFENTER;
- cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) |
- HFA384x_CMD_AINFO_SET(enable);
+ // cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) |
+ // HFA384x_CMD_AINFO_SET(enable);
+ if (enable == HFA384x_MONITOR_ENABLE) {
+ // KoreK: get into test mode 0x0a
+ cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) |
+ HFA384x_CMD_AINFO_SET(0x0a);
+ } else {
+ cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) |
+ HFA384x_CMD_AINFO_SET(enable);
+ }
cmd.parm0 = 0;
cmd.parm1 = 0;
cmd.parm2 = 0;
@@ -3429,37 +3437,71 @@
HFA384x_TX_MACPORT_SET(0) | HFA384x_TX_STRUCTYPE_SET(1) |
HFA384x_TX_TXEX_SET(0) | HFA384x_TX_TXOK_SET(0);
#endif
- hw->txbuff.txfrm.desc.tx_control =
- host2hfa384x_16(hw->txbuff.txfrm.desc.tx_control);
-
- /* copy the header over to the txdesc */
- memcpy(&(hw->txbuff.txfrm.desc.frame_control), p80211_hdr, sizeof(p80211_hdr_t));
+ // hw->txbuff.txfrm.desc.tx_control =
+ // host2hfa384x_16(hw->txbuff.txfrm.desc.tx_control);
- /* if we're using host WEP, increase size by IV+ICV */
- if (p80211_wep->data) {
- hw->txbuff.txfrm.desc.data_len = host2hfa384x_16(skb->len+8);
- // hw->txbuff.txfrm.desc.tx_control |= HFA384x_TX_NOENCRYPT_SET(1);
- usbpktlen+=8;
- } else {
- hw->txbuff.txfrm.desc.data_len = host2hfa384x_16(skb->len);
+ // /* copy the header over to the txdesc */
+ // memcpy(&(hw->txbuff.txfrm.desc.frame_control), p80211_hdr, sizeof(p80211_hdr_t));
+ if (skb->protocol != htons(ETH_P_80211_RAW)) {
+ hw->txbuff.txfrm.desc.tx_control =
+ host2hfa384x_16(hw->txbuff.txfrm.desc.tx_control);
+
+ /* copy the header over to the txdesc */
+ memcpy(&(hw->txbuff.txfrm.desc.frame_control), p80211_hdr,
+ sizeof(p80211_hdr_t));
+
+ /* if we're using host WEP, increase size by IV+ICV */
+ if (p80211_wep->data) {
+ hw->txbuff.txfrm.desc.data_len = host2hfa384x_16(skb->len+8);
+ // hw->txbuff.txfrm.desc.tx_control |= HFA384x_TX_NOENCRYPT_SET(1);
+ usbpktlen+=8;
+ } else {
+ hw->txbuff.txfrm.desc.data_len = host2hfa384x_16(skb->len);
+ }
+ } else {
+ /* KoreK: raw injection (monitor mode): pull the rest of
+ the header and ssanity check on txdesc.data_len */
+ memcpy(&(hw->txbuff.txfrm.desc.data_len), skb->data, 16);
+ skb_pull(skb,16);
+ if (hw->txbuff.txfrm.desc.data_len != host2hfa384x_16(skb->len)) {
+ printk(KERN_DEBUG "mismatch frame_len, drop frame\n");
+ return 0;
+ }
+ // /* if we're using host WEP, increase size by IV+ICV */
+ // if (p80211_wep->data) {
+ // hw->txbuff.txfrm.desc.data_len = host2hfa384x_16(skb->len+8);
+ // // hw->txbuff.txfrm.desc.tx_control |= HFA384x_TX_NOENCRYPT_SET(1);
+ // usbpktlen+=8;
+ // } else {
+ // hw->txbuff.txfrm.desc.data_len = host2hfa384x_16(skb->len);
+ hw->txbuff.txfrm.desc.tx_control |= HFA384x_TX_RETRYSTRAT_SET(1);
+ hw->txbuff.txfrm.desc.tx_control =
+ host2hfa384x_16(hw->txbuff.txfrm.desc.tx_control);
+
+ /* copy the header over to the txdesc */
+ memcpy(&(hw->txbuff.txfrm.desc.frame_control), p80211_hdr,
+ sizeof(p80211_hdr_t));
}
usbpktlen += skb->len;
/* copy over the WEP IV if we are using host WEP */
ptr = hw->txbuff.txfrm.data;
- if (p80211_wep->data) {
+ // if (p80211_wep->data) {
+ if (p80211_wep->data && skb->protocol != htons(ETH_P_80211_RAW)) {
memcpy(ptr, p80211_wep->iv, sizeof(p80211_wep->iv));
ptr+= sizeof(p80211_wep->iv);
memcpy(ptr, p80211_wep->data, skb->len);
} else {
memcpy(ptr, skb->data, skb->len);
}
+
/* copy over the packet data */
ptr+= skb->len;
/* copy over the WEP ICV if we are using host WEP */
- if (p80211_wep->data) {
+ // if (p80211_wep->data) {
+ if (p80211_wep->data && skb->protocol != htons(ETH_P_80211_RAW)) {
memcpy(ptr, p80211_wep->icv, sizeof(p80211_wep->icv));
}
@@ -4221,6 +4263,17 @@
switch( HFA384x_RXSTATUS_MACPORT_GET(usbin->rxfrm.desc.status) )
{
case 0:
+ /* KoreK: this testmode uses macport 0 */
+ if ((wlandev->netdev->type == ARPHRD_IEEE80211) ||
+ (wlandev->netdev->type == ARPHRD_IEEE80211_PRISM)) {
+ if ( ! HFA384x_RXSTATUS_ISFCSERR(usbin->rxfrm.desc.status) ) {
+ hfa384x_int_rxmonitor(wlandev, &usbin->rxfrm);
+ } else {
+ WLAN_LOG_DEBUG(3,"Received monitor frame: FCSerr set\n");
+ }
+ goto done;
+ }
+
fc = ieee2host16(usbin->rxfrm.desc.frame_control);
/* If exclude and we receive an unencrypted, drop it */
diff -ru linux-wlan-ng-0.2.5/src/prism2/driver/prism2mgmt.c linux-wlan-ng-0.2.5-patched/src/prism2/driver/prism2mgmt.c
--- linux-wlan-ng-0.2.5/src/prism2/driver/prism2mgmt.c 2005-06-22 16:16:55.000000000 +0200
+++ linux-wlan-ng-0.2.5-patched/src/prism2/driver/prism2mgmt.c 2007-01-05 09:49:13.000000000 +0100
@@ -2860,9 +2860,12 @@
}
/* Now if we're already sniffing, we can skip the rest */
- if (wlandev->netdev->type != ARPHRD_ETHER) {
+ // if (wlandev->netdev->type != ARPHRD_ETHER) {
+ if ((wlandev->netdev->type != ARPHRD_IEEE80211) &&
+ (wlandev->netdev->type != ARPHRD_IEEE80211_PRISM)) {
/* Set the port type to pIbss */
- word = HFA384x_PORTTYPE_PSUEDOIBSS;
+ // word = HFA384x_PORTTYPE_PSUEDOIBSS;
+ word = 5; // HFA384x_PORTTYPE_PSUEDOIBSS;
result = hfa384x_drvr_setconfig16(hw,
HFA384x_RID_CNFPORTTYPE, word);
if ( result ) {
@@ -2874,6 +2877,8 @@
}
if ((msg->keepwepflags.status == P80211ENUM_msgitem_status_data_ok) && (msg->keepwepflags.data != P80211ENUM_truth_true)) {
/* Set the wepflags for no decryption */
+ /* doesn't work - done from the CLI */
+ /* Fix? KoreK */
word = HFA384x_WEPFLAGS_DISABLE_TXCRYPT |
HFA384x_WEPFLAGS_DISABLE_RXCRYPT;
result = hfa384x_drvr_setconfig16(hw, HFA384x_RID_CNFWEPFLAGS, word);
@@ -2919,7 +2924,9 @@
goto failed;
}
- if (wlandev->netdev->type == ARPHRD_ETHER) {
+ // if (wlandev->netdev->type == ARPHRD_ETHER) {
+ if ((wlandev->netdev->type != ARPHRD_IEEE80211) &&
+ (wlandev->netdev->type != ARPHRD_IEEE80211_PRISM)) {
WLAN_LOG_INFO("monitor mode enabled\n");
}
diff -ru linux-wlan-ng-0.2.5/src/prism2/driver/prism2sta.c linux-wlan-ng-0.2.5-patched/src/prism2/driver/prism2sta.c
--- linux-wlan-ng-0.2.5/src/prism2/driver/prism2sta.c 2006-01-19 22:25:50.000000000 +0100
+++ linux-wlan-ng-0.2.5-patched/src/prism2/driver/prism2sta.c 2007-01-05 09:49:50.000000000 +0100
@@ -410,7 +410,9 @@
DBFENTER;
/* If necessary, set the 802.11 WEP bit */
- if ((wlandev->hostwep & (HOSTWEP_PRIVACYINVOKED | HOSTWEP_ENCRYPT)) == HOSTWEP_PRIVACYINVOKED) {
+ // if ((wlandev->hostwep & (HOSTWEP_PRIVACYINVOKED | HOSTWEP_ENCRYPT)) == HOSTWEP_PRIVACYINVOKED) {
+ if (((wlandev->hostwep & (HOSTWEP_PRIVACYINVOKED | HOSTWEP_ENCRYPT)) == HOSTWEP_PRIVACYINVOKED)
+ && (skb->protocol != htons(ETH_P_80211_RAW))) {
p80211_hdr->a3.fc |= host2ieee16(WLAN_SET_FC_ISWEP(1));
}