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

本文介绍了如何在OpenWRT内核中修改beacon帧,详细讲解了帧的生成和发送过程。主要关注ieee80211_beacon_get函数和sk_buff结构体在生成beacon帧时的作用,为读者提供修改beacon帧的参考。
摘要由CSDN通过智能技术生成

    最近需要对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
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值