1
--- rtl8187_linux_26.1010.0622.2006/beta-8187/ieee80211.h 2006-06-06 04:58:02.000000000 +0200
2
+++ rtl8187_prismhdr/beta-8187/ieee80211.h 2006-11-29 20:28:16.152853116 +0100
7
+#define LWNG_CAP_DID_BASE (4 | (1 << 6)) /* section 4, group 1 */
8
+#define IW_MODE_MONITOR_PRISM 15
9
+/* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header
10
+ * (from linux-wlan-ng) */
11
+struct linux_wlan_ng_val {
15
+} __attribute__ ((packed));
17
+struct linux_wlan_ng_prism_hdr {
18
+ u32 msgcode, msglen;
20
+ struct linux_wlan_ng_val hosttime, mactime, channel, rssi, sq, signal,
21
+ noise, rate, istx, frmlen;
22
+} __attribute__ ((packed));
24
struct ieee80211_hdr {
27
--- rtl8187_linux_26.1010.0622.2006/beta-8187/r8187_core.c 2006-06-22 07:43:30.000000000 +0200
28
+++ rtl8187_prismhdr/beta-8187/r8187_core.c 2006-12-16 16:44:12.244211046 +0100
29
@@ -1112,7 +1112,10 @@
30
struct ieee80211_hdr *h = (struct ieee80211_hdr *) skb->data;
32
if (le16_to_cpu(h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS)
35
+ if(priv->ieee80211->iw_mode != IW_MODE_MONITOR || priv->ieee80211->raw_tx != 1)
38
// DMESG("%x %x", h->frame_ctl, h->seq_ctl);
40
* This function doesn't require lock because we make
43
if( flen <= rx_urb->actual_length){
45
- stats.signal = (desc[1] & 0x7f00)>>8;
46
+// stats.signal = (desc[1] & 0x7f00)>>8;
47
+ stats.signal = (desc[1] & 0xff00)>>8;
48
stats.noise = desc[1] &0xff;
49
stats.rate = desc[0] >> 20 & 0xf;
50
stats.mac_time[0] = desc[2];
53
// priv->tempstats = &stats;
56
+ stats.signal -= stats.noise;
57
if(!ieee80211_rx(priv->ieee80211,
59
dev_kfree_skb_any(skb);
60
--- rtl8187_linux_26.1010.0622.2006/beta-8187/r8187.h 2006-06-06 08:48:10.000000000 +0200
61
+++ rtl8187_prismhdr/beta-8187/r8187.h 2006-12-16 16:44:31.418296142 +0100
63
u8 challow[15]; //channels from 1 to 14, 0 not used
65
short crcmon; //if 1 allow bad crc frame reception in monitor mode
69
// struct timer_list scan_timer;
71
--- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211.h 2006-06-06 04:57:56.000000000 +0200
72
+++ rtl8187_prismhdr/ieee80211/ieee80211.h 2006-11-29 20:45:25.190415628 +0100
74
struct list_head list;
77
+#define LWNG_CAP_DID_BASE (4 | (1 << 6)) /* section 4, group 1 */
78
+/* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header
79
+ * (from linux-wlan-ng) */
80
+struct linux_wlan_ng_val {
84
+} __attribute__ ((packed));
86
+struct linux_wlan_ng_prism_hdr {
87
+ u32 msgcode, msglen;
89
+ struct linux_wlan_ng_val hosttime, mactime, channel, rssi, sq, signal,
90
+ noise, rate, istx, frmlen;
91
+} __attribute__ ((packed));
93
struct ieee80211_hdr {
96
--- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_rx.c 2006-06-06 04:58:00.000000000 +0200
97
+++ rtl8187_prismhdr/ieee80211/ieee80211_rx.c 2006-12-14 11:40:23.461865287 +0100
100
struct ieee80211_rx_stats *rx_stats)
102
- struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
103
- u16 fc = le16_to_cpu(hdr->frame_ctl);
104
+ struct ieee80211_hdr *hdr1 = (struct ieee80211_hdr *)skb->data;
105
+ u16 fc = le16_to_cpu(hdr1->frame_ctl);
107
+ int hdrlen, phdrlen, head_need, tail_need;
109
+ if (ieee->dev->type == ARPHRD_IEEE80211_PRISM) {
111
+ phdrlen = sizeof(struct linux_wlan_ng_prism_hdr);
117
+ hdrlen = ieee80211_get_hdrlen(fc);
119
+ /* check if there is enough room for extra data; if not, expand skb
120
+ * buffer to be large enough for the changes */
121
+ head_need = phdrlen;
123
+#ifdef PRISM2_ADD_BOGUS_CRC
125
+#endif /* PRISM2_ADD_BOGUS_CRC */
127
+ head_need -= skb_headroom(skb);
128
+ tail_need -= skb_tailroom(skb);
130
+ if (head_need > 0 || tail_need > 0) {
131
+ if (pskb_expand_head(skb, head_need > 0 ? head_need : 0,
132
+ tail_need > 0 ? tail_need : 0,
134
+ printk(KERN_DEBUG "%s: ieee80211_rx failed to "
135
+ "reallocate skb buffer\n", ieee->dev->name);
136
+ dev_kfree_skb_any(skb);
141
+ if (prism_header == 1) {
142
+ struct linux_wlan_ng_prism_hdr *hdr;
143
+ hdr = (struct linux_wlan_ng_prism_hdr *)
144
+ skb_push(skb, phdrlen);
145
+ memset(hdr, 0, phdrlen);
146
+ hdr->msgcode = LWNG_CAP_DID_BASE;
147
+ hdr->msglen = sizeof(*hdr);
148
+ memcpy(hdr->devname, ieee->dev->name, sizeof(hdr->devname));
149
+#define LWNG_SETVAL(f,i,s,l,d) \
150
+hdr->f.did = LWNG_CAP_DID_BASE | (i << 12); \
151
+hdr->f.status = s; hdr->f.len = l; hdr->f.data = d
152
+ LWNG_SETVAL(hosttime, 1, 0, 4, jiffies);
153
+ LWNG_SETVAL(mactime, 2, 0, 4, rx_stats->mac_time);
154
+ LWNG_SETVAL(channel, 3, 1 /* no value */, 4, 0);
155
+ LWNG_SETVAL(rssi, 4, 1 /* no value */, 4, 0);
156
+ LWNG_SETVAL(sq, 5, 1 /* no value */, 4, 0);
157
+ LWNG_SETVAL(signal, 6, 0, 4, rx_stats->signal);
158
+ LWNG_SETVAL(noise, 7, 0, 4, rx_stats->noise);
159
+ LWNG_SETVAL(rate, 8, 0, 4, rx_stats->rate / 5);
160
+ LWNG_SETVAL(istx, 9, 0, 4, 0);
161
+ LWNG_SETVAL(frmlen, 10, 0, 4, skb->len - phdrlen);
165
skb->dev = ieee->dev;
166
skb->mac.raw = skb->data;
167
- skb_pull(skb, ieee80211_get_hdrlen(fc));
168
+ skb_pull(skb, hdrlen);
170
+ skb_pull(skb, phdrlen);
171
skb->pkt_type = PACKET_OTHERHOST;
172
skb->protocol = __constant_htons(ETH_P_80211_RAW);
173
memset(skb->cb, 0, sizeof(skb->cb));
174
--- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_tx.c 2006-06-06 04:57:54.000000000 +0200
175
+++ rtl8187_prismhdr/ieee80211/ieee80211_tx.c 2006-12-16 11:57:57.695139366 +0100
180
- if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) {
181
+// if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) {
182
+ if (unlikely(skb->len < 14)) {
183
printk(KERN_WARNING "%s: skb too small (%d).\n",
184
ieee->dev->name, skb->len);
186
--- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_softmac_wx.c 2006-06-06 04:57:54.000000000 +0200
187
+++ rtl8187_prismhdr/ieee80211/ieee80211_softmac_wx.c 2006-11-29 20:43:49.275996836 +0100
191
if (wrqu->mode == IW_MODE_MONITOR){
193
- ieee->dev->type = ARPHRD_IEEE80211;
194
+ ieee->dev->type = ARPHRD_IEEE80211_PRISM;
196
ieee->dev->type = ARPHRD_ETHER;