修改beacon帧结构(1)帧的写入和发送过程【linux内核-OpenWRT】

    最近需要对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
  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值