九阳神功爱喝茶 发表于 2015-12-01 19:11

数据报文驱动接收的问题。

本帖最后由 九阳神功爱喝茶 于 2015-12-01 19:13 编辑

下面的代码是路由器的无线网卡ath9k接收中断处理部分的代码,其中函数ieee80211_rx(hw, skb);将数据报文从驱动传递到MAC层。在进入MAC层之前,我加了个函数tdma_set_slot_param来设置驱动的参数。int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp)
{。
        struct ath_rxbuf *bf;
        struct sk_buff *skb = NULL, *requeue_skb, *hdr_skb;


//added by shenlei 2015 11 30
                u8 *macaddr = common->macaddr;
                tdma_set_slot_param(skb,macaddr);
               
               ieee80211_rx(hw, skb);
        return 0;
}
实验是在通过发送特定格式的数据到AP,AP的驱动直接通过读取用户数据,来设置参数。我遇到的问题是:
1)802.11头部比较复杂分别有三地址和四地址模式以及是否有QOS控制字段,对应的报头长度分别为32 30 36 24 ,我不是很清楚这两个参数的具体作用和使用场景,忘大神讲讲。
2)每次我都直接发送udp广播报文,数据四个字段是0x88 0x6a 0x01 0x02;通过AP下的另一个电脑的无线网可以看到,接收数据完全正确,但是由于我的网卡和驱动的问题只能看到以太网的帧格式,无法看到802.11帧格式,所以无法确定在AP的驱动中的skb的结构来获得数据报文。还请各位前辈指导一下,万分感激。int tdma_set_slot_param(struct sk_buff *skb,u8 localmacaddrlastbyte){
       
        /*8==sizeof(udphdr)
        32==sizeof(ieee80211_hdr) try32 30 26 24
        20==sizeof(iphdr)*/
        //printk(KERN_ERR"INTO tdma_set_slot_param");
        u8 *data = skb->data+24+20+8;
        if(*data==0x88){
          printk(KERN_ERR"SATISFY flag bytes");
          data++;
}

九阳神功爱喝茶 发表于 2015-12-03 10:51

最后解决了,我在MAC层当802.11帧转换成以太网头部之后,再获取数据,反过来设置驱动层的参数。
页: [1]
查看完整版本: 数据报文驱动接收的问题。