最近需要对OpenWRT内核中的beacon帧做修改,在网上找了很久也没找到相关的帖子,现在自己把修改的方法给弄明白了,写出来供大家参考一下,里面有错误的地方希望诸位大神能给我指出来,小白先在此谢过了。
要修改beacon帧,就需要了解帧的写入和发送的过程,今天我们就来研究一下beacon帧的写入和发送过程。
beacon帧发送机制:
beacon帧的发送是通过tasklet机制实现的,tasklet是软中断实现的下半部处理机制,用于中断处理流程的下半部。核心函数是beacon.c中的ath9k_beacon_tasklet函数,(将该函数的指针传递给tasklet_init()即可实现tasklet_struct的动态创建,当tasklet被调度以后,ath9k_beacon_tasklet函数会被执行)。函数体如下所示:
void ath9k_beacon_tasklet(unsigned long data)
{
struct ath_softc *sc = (struct ath_softc *)data;
struct ath_hw *ah = sc->sc_ah;
struct ath_common *common = ath9k_hw_common(ah);
struct ath_buf *bf = NULL;
...
bf = ath9k_beacon_generate(sc->hw, vif);
...
if (bf) {
ath9k_reset_beacon_status(sc);
ath_dbg(common, BEACON, "Transmitting beacon for slot: %d\n", slot);
/* NB: cabq traffic should already be queued and primed */
ath9k_hw_puttxbuf(ah, sc->beacon.beaconq, bf->bf_daddr);
if (!edma)
{
ath9k_hw_txstart(ah, sc->beacon.beaconq);
}
}
}
struct ath_softc中的struct ath_beacon_config cur_beacon_conf成员中定义了名为beacon_interval的int型变量,每隔一个beacon_interval(即beacon帧的帧间隔),系统就尝试发送一个beacon帧,此时开启中断,tasklet就被调度,执行ath9k_beacon_tasklet函数,该函数就会调用ath9k_beacon_generate生成beacon帧,然后调用ath9k_hw_puttxbuf将beacon帧放入发送缓存队列中,接着调用ath9k_hw_txstart将beacon帧发送出去。
研究收发机制是为了修改beacon帧,因此接下来我们看一看beacon帧是如何产生的。这就要研究刚才提到的ath9k_beacon_gene