修改WiFi beacon幀


http://blog.csdn.net/UsSam/article/details/18040871

 

最近需要對OpenWRT內核中的beacon幀做修改

要修改beacon幀,就需要了解幀的寫入和發送的過程

beacon幀發送機制:
    beacon幀的發送是通過tasklet機制實現的,tasklet是軟中斷實現的下半部處理機制,用於中斷處理流程的下半部。核心函數是beacon.c中的ath9k_beacon_tasklet函數,(將該函數的指針傳遞給tasklet_init()即可實現tasklet_struct的動態創建,當tasklet被調度以后,ath9k_beacon_tasklet函數會被執行)。函數體如下所示:

  1. void ath9k_beacon_tasklet(unsigned long data)  
  2. {  
  3.     struct ath_softc *sc = (struct ath_softc *)data;  
  4.     struct ath_hw *ah = sc->sc_ah;  
  5.     struct ath_common *common = ath9k_hw_common(ah);  
  6.     struct ath_buf *bf = NULL;  
  7.     ...  
  8.       
  9.     bf = ath9k_beacon_generate(sc->hw, vif);  
  10.       
  11.     ...   
  12.     if (bf) {  
  13.         ath9k_reset_beacon_status(sc);  
  14.   
  15.   
  16.         ath_dbg(common, BEACON, "Transmitting beacon for slot: %d\n", slot);  
  17.   
  18.   
  19.         /* NB: cabq traffic should already be queued and primed */  
  20.         ath9k_hw_puttxbuf(ah, sc->beacon.beaconq, bf->bf_daddr);  
  21.           
  22.         if (!edma)  
  23.         {  
  24.             ath9k_hw_txstart(ah, sc->beacon.beaconq);  
  25.         }  
  26.     }  

研究收發機制是為了修改beacon幀,因此接下來我們看一看beacon幀是如何產生的。這就要研究剛才提到的ath9k_beacon_generate函數了。ath9k_beacon_generate函數體如下所示:

  1. static struct ath_buf *ath9k_beacon_generate(struct ieee80211_hw *hw, struct ieee80211_vif *vif)  
  2. {  
  3.     struct ath_softc *sc = hw->priv;  
  4.     struct ath_common *common = ath9k_hw_common(sc->sc_ah);  
  5.     struct ath_buf *bf;  
  6.     struct ath_vif *avp = (void *)vif->drv_priv;  
  7.     struct sk_buff *skb;  
  8.     struct ath_txq *cabq = sc->beacon.cabq;  
  9.     struct ieee80211_tx_info *info;  
  10.     struct ieee80211_mgmt *mgmt_hdr;  
  11.     int cabq_depth;  
  12.   
  13.   
  14.     if (avp->av_bcbuf == NULL)  
  15.         return NULL;  
  16.   
  17.   
  18.     bf = avp->av_bcbuf;  
  19.     skb = bf->bf_mpdu;  
  20.     if (skb) {  
  21.         dma_unmap_single(sc->dev, bf->bf_buf_addr, skb->len, DMA_TO_DEVICE);  
  22.         dev_kfree_skb_any(skb);  
  23.         bf->bf_buf_addr = 0;  
  24.         bf->bf_mpdu = NULL;              /*清空緩存*/  
  25.     }  
  26.   
  27.   
  28.       
  29.     skb = ieee80211_beacon_get(hw, vif);<strong>  
  30. </strong>  
  31.   
  32.           
  33.     if (skb == NULL)  
  34.         return NULL;                    /*skb生成失敗退出*/  
  35.       
  36.     bf->bf_mpdu = skb;                   /*將生成的beacon幀緩存賦給bf結構體,此處是指針賦值,可以只用任一指針對對象進行修改*/  
  37.   
  38.   
  39.       
  40.   
  41.   
  42.     mgmt_hdr = (struct ieee80211_mgmt *)skb->data;  
  43.     mgmt_hdr->u.beacon.timestamp = avp->tsf_adjust;       /*用ieee80211_mgmt結構體將skb->data中的前面若干個字段提取出來(包括frame_control,duration,da,sa,bssid,seqctrl,以及beacon幀特有的timestamp,beacon interval,capability information,variable字段),並對其timestamp字段進行數據的寫入*/  
  44.   
  45.   
  46.     ...  
  47.       
  48.     return bf;  
  49. }  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM