00001 #ifndef PACKET_ANNO_H
00002 #define PACKET_ANNO_H
00003
00004
00005
00006
00007
00008 #define EXTRA_HEADER_CB_OFFSET 16
00009 #define CB_SIZE 48
00010 #define WIFI_EXTRA_MAGIC 0x7492001
00011 enum {
00012 WIFI_EXTRA_TX = (1<<0),
00013 WIFI_EXTRA_TX_FAIL = (1<<1),
00014 WIFI_EXTRA_TX_USED_ALT_RATE = (1<<2),
00015 WIFI_EXTRA_RX_ERR = (1<<3),
00016 WIFI_EXTRA_RX_MORE = (1<<4),
00017 WIFI_EXTRA_NO_SEQ = (1<<5),
00018 WIFI_EXTRA_NO_TXF = (1<<6),
00019 WIFI_EXTRA_DO_RTS_CTS = (1<<7),
00020 WIFI_EXTRA_DO_CTS = (1<<8),
00021 };
00022
00023
00024
00025 struct click_wifi_extra {
00026 u_int32_t magic;
00027 u_int32_t flags;
00028
00029 u_int8_t rssi;
00030 u_int8_t silence;
00031 u_int8_t power;
00032 u_int8_t pad;
00033
00034 u_int8_t rate;
00035 u_int8_t rate1;
00036 u_int8_t rate2;
00037 u_int8_t rate3;
00038
00039 u_int8_t max_retries;
00040 u_int8_t max_retries1;
00041 u_int8_t max_retries2;
00042 u_int8_t max_retries3;
00043
00044 u_int8_t virt_col;
00045 u_int8_t retries;
00046 u_int16_t len;
00047 };
00048
00049
00050 typedef struct {
00051 u_int32_t did;
00052 u_int16_t status;
00053 u_int16_t len;
00054 u_int32_t data;
00055 } p80211item_uint32_t;
00056
00057 typedef struct {
00058 u_int32_t msgcode;
00059 u_int32_t msglen;
00060 #define WLAN_DEVNAMELEN_MAX 16
00061 u_int8_t devname[WLAN_DEVNAMELEN_MAX];
00062 p80211item_uint32_t hosttime;
00063 p80211item_uint32_t mactime;
00064 p80211item_uint32_t channel;
00065 p80211item_uint32_t rssi;
00066 p80211item_uint32_t sq;
00067 p80211item_uint32_t signal;
00068 p80211item_uint32_t noise;
00069 p80211item_uint32_t rate;
00070 p80211item_uint32_t istx;
00071 p80211item_uint32_t frmlen;
00072 } wlan_ng_prism2_header;
00073
00074
00075 #define LWNG_CAP_DID_BASE (4 | (1 << 6))
00076 #define LWNG_CAPHDR_VERSION 0x80211001
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086 enum {
00087 DIDmsg_lnxind_wlansniffrm = 0x00000044,
00088 DIDmsg_lnxind_wlansniffrm_hosttime = 0x00010044,
00089 DIDmsg_lnxind_wlansniffrm_mactime = 0x00020044,
00090 DIDmsg_lnxind_wlansniffrm_channel = 0x00030044,
00091 DIDmsg_lnxind_wlansniffrm_rssi = 0x00040044,
00092 DIDmsg_lnxind_wlansniffrm_sq = 0x00050044,
00093 DIDmsg_lnxind_wlansniffrm_signal = 0x00060044,
00094 DIDmsg_lnxind_wlansniffrm_noise = 0x00070044,
00095 DIDmsg_lnxind_wlansniffrm_rate = 0x00080044,
00096 DIDmsg_lnxind_wlansniffrm_istx = 0x00090044,
00097 DIDmsg_lnxind_wlansniffrm_frmlen = 0x000A0044
00098 };
00099 enum {
00100 P80211ENUM_msgitem_status_no_value = 0x00
00101 };
00102 enum {
00103 P80211ENUM_truth_false = 0x00
00104 };
00105
00106
00107
00108 static inline struct sk_buff *
00109 push_wifi_extra_header(struct sk_buff *skb) {
00110 struct click_wifi_extra *ceh;
00111
00112 skb = skb_unshare(skb, GFP_ATOMIC);
00113 if (!skb) {
00114 return NULL;
00115 }
00116 if (skb_headroom(skb) < sizeof(struct click_wifi_extra) &&
00117 pskb_expand_head(skb, sizeof(struct click_wifi_extra), 0, GFP_ATOMIC)) {
00118 printk (KERN_WARNING "couldn't pskb_expand_head\n");
00119 dev_kfree_skb_any(skb);
00120 return NULL;
00121 }
00122 ceh = (struct click_wifi_extra *) skb_push(skb, sizeof(struct click_wifi_extra));
00123
00124 memcpy(ceh, skb->cb + EXTRA_HEADER_CB_OFFSET, sizeof(struct click_wifi_extra));
00125
00126 skb->mac.raw = skb->data;
00127 skb->ip_summed = CHECKSUM_NONE;
00128 skb->pkt_type = PACKET_OTHERHOST;
00129 skb->protocol = __constant_htons(0x0019);
00130 return skb;
00131 }
00132
00133
00134 static inline void
00135 pull_wifi_extra_header(struct sk_buff *skb) {
00136 struct click_wifi_extra *ceh;
00137
00138 ceh = (struct click_wifi_extra *) skb->data;
00139
00140 if (ceh->magic != WIFI_EXTRA_MAGIC) {
00141 memset(skb->cb, 0x00, CB_SIZE);
00142 } else {
00143 memcpy(skb->cb + EXTRA_HEADER_CB_OFFSET, ceh, sizeof(struct click_wifi_extra));
00144 skb_pull(skb, sizeof(struct click_wifi_extra));
00145 }
00146 ceh = (struct click_wifi_extra *) (skb->cb + EXTRA_HEADER_CB_OFFSET);
00147 ceh->magic = WIFI_EXTRA_MAGIC;
00148 }
00149
00150 static void
00151 pull_prism2_header(struct sk_buff *skb)
00152 {
00153 wlan_ng_prism2_header *ph = NULL;
00154 ph = (wlan_ng_prism2_header *) skb->data;
00155 if (ph->msgcode == DIDmsg_lnxind_wlansniffrm) {
00156 if (ph->rate.did == DIDmsg_lnxind_wlansniffrm_rate) {
00157 struct click_wifi_extra *ceh = (struct click_wifi_extra *) (skb->cb + EXTRA_HEADER_CB_OFFSET);
00158 if (ceh->magic != WIFI_EXTRA_MAGIC) {
00159 memset(ceh, 0x0, sizeof(struct click_wifi_extra));
00160 ceh->magic = WIFI_EXTRA_MAGIC;
00161 ceh->rate = ph->rate.data;
00162 }
00163 }
00164 skb_pull(skb, sizeof(wlan_ng_prism2_header));
00165 }
00166
00167 }
00168
00169
00170
00171
00172
00173 static void
00174 push_prism2_header(struct net_device *dev, struct sk_buff *skb,
00175 int len, int rssi, int rate,
00176 int tx,
00177 u_int32_t tsf)
00178 {
00179 wlan_ng_prism2_header *ph;
00180
00181
00182 if (skb_headroom(skb) < sizeof(wlan_ng_prism2_header) &&
00183 pskb_expand_head(skb, sizeof(wlan_ng_prism2_header), 0, GFP_ATOMIC)) {
00184 return;
00185 }
00186 ph = (wlan_ng_prism2_header *) skb_push(skb, sizeof(wlan_ng_prism2_header));
00187
00188 if (!ph) {
00189 printk (KERN_WARNING "%s: ph was null!\n",
00190 dev->name);
00191 return;
00192 }
00193
00194 memset(ph, 0, sizeof(wlan_ng_prism2_header));
00195 ph->msgcode = DIDmsg_lnxind_wlansniffrm;
00196 ph->msglen = sizeof(wlan_ng_prism2_header);
00197 strcpy(ph->devname, dev->name);
00198
00199 ph->hosttime.did = DIDmsg_lnxind_wlansniffrm_hosttime;
00200 ph->hosttime.status = 0;
00201 ph->hosttime.len = 4;
00202 ph->hosttime.data = jiffies;
00203
00204
00205 ph->mactime.did = DIDmsg_lnxind_wlansniffrm_mactime;
00206 ph->mactime.status = 0;
00207 ph->mactime.len = 4;
00208 ph->mactime.data = tsf;
00209
00210 ph->istx.did = DIDmsg_lnxind_wlansniffrm_istx;
00211 ph->istx.status = 0;
00212 ph->istx.len = 4;
00213 ph->istx.data = tx;
00214
00215 ph->frmlen.did = DIDmsg_lnxind_wlansniffrm_frmlen;
00216 ph->frmlen.status = 0;
00217 ph->frmlen.len = 4;
00218 ph->frmlen.data = len;
00219
00220 ph->channel.did = DIDmsg_lnxind_wlansniffrm_channel;
00221 ph->channel.status = 0;
00222 ph->channel.len = 4;
00223 ph->channel.data = 0;
00224
00225 ph->rssi.did = DIDmsg_lnxind_wlansniffrm_rssi;
00226 ph->rssi.status = P80211ENUM_msgitem_status_no_value;
00227 ph->rssi.len = 4;
00228 ph->rssi.data = rssi;
00229
00230 ph->signal.did = DIDmsg_lnxind_wlansniffrm_signal;
00231 ph->signal.status = 0;
00232 ph->signal.len = 4;
00233 ph->signal.data = rssi;
00234
00235 ph->rate.did = DIDmsg_lnxind_wlansniffrm_rate;
00236 ph->rate.status = 0;
00237 ph->rate.len = 4;
00238 ph->rate.data = rate;
00239
00240 skb->dev = dev;
00241 skb->mac.raw = skb->data;
00242 skb->ip_summed = CHECKSUM_NONE;
00243 skb->pkt_type = PACKET_OTHERHOST;
00244 skb->protocol = __constant_htons(0x0019);
00245
00246
00247 return;
00248 }
00249
00250
00251
00252
00253
00254
00255 #endif