Main Page | Data Structures | Directories | File List | Data Fields | Globals

packet_anno.h

Go to the documentation of this file.
00001 #ifndef PACKET_ANNO_H
00002 #define PACKET_ANNO_H
00003 /*
00004  * Click packet annotations.
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), // 1
00013   WIFI_EXTRA_TX_FAIL               = (1<<1), // 2
00014   WIFI_EXTRA_TX_USED_ALT_RATE      = (1<<2), // 4
00015   WIFI_EXTRA_RX_ERR                = (1<<3), // 8
00016   WIFI_EXTRA_RX_MORE               = (1<<4), // 16
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)) /* section 4, group 1 */
00076 #define LWNG_CAPHDR_VERSION 0x80211001
00077 
00078 
00079 /* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header
00080  * (from linux-wlan-ng) */
00081 
00082 /*                                                                                  
00083  * For packet capture, define the same physical layer packet header                 
00084  * structure as used in the wlan-ng driver                                          
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);  /* ETH_P_80211_RAW */
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  * Add a prism2 header to a received frame and
00171  * dispatch it to capture tools like kismet.
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         /* Pass up tsf clock in mactime */
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);  /* ETH_P_80211_RAW */
00245 
00246 
00247         return;
00248 }
00249 
00250 
00251 
00252 
00253 
00254 
00255 #endif /* PACKET_ANNO_H */

Generated on Mon Nov 21 15:58:08 2005 for openwifi by  doxygen 1.4.1