ieee80211rx.c(E:\code\linux\net\ieee80211)

所有接收到的帧都送到这个函数中去

int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,struct ieee80211_rx_stats *rx_stats) 进行处理。

函数的实现过程如下:

(1)判断接收的帧的长度是否符合数据帧或管理帧的长度。若不符合,则丢弃。

   fc = le16_to_cpu(hdr->frame_ctl);

hdrlen = ieee80211_get_hdrlen(fc);

if (skb->len < hdrlen) {

     printk(KERN_INFO "%s: invalid SKB length %d\n",

    dev->name, skb->len);

    goto rx_dropped;

  }

(2)如果ap处于监听模式IW_MODE_MONITOR

ieee80211_monitor_rx(ieee, skb, rx_stats);

(3)

=================================================

补充:

1、ieee80211_get_hdrlen

作用:根据传入的帧的类型进行长度的判断。 对于802.11的帧,只有数据帧和管理帧这两类。

2、在双向列表末尾插入

static inline void __skb_queue_tail(struct sk_buff_head *list,        struct sk_buff *newsk)

{

struct sk_buff *prev, *next;

list->qlen++;

next = (struct sk_buff *)list;

prev = next->prev;

newsk->next = next;

newsk->prev = prev;

next->prev  = prev->next = newsk;

}

3、static void ieee80211_monitor_rx(struct ieee80211_device *ieee,      struct sk_buff *skb,      struct ieee80211_rx_stats *rx_stats)  {   netif_rx(skb);  } 4、传统方法处理报文的网络层代码

将接收到的报文放到特定CPU的等待队列中,并退出中断上下文

int netif_rx(struct sk_buff *skb)    {

/* if netpoll wants it, pretend we never saw it */

if (netpoll_rx(skb))/* netpoll功能需要处理该报文,退出。该功能用于内核调试 */

return NET_RX_DROP;    }

5、处理ieee80211管理帧

static int   ieee80211_rx_frame_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb,     struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype)   {

}

6、帧类型的定义

#define IEEE80211_FTYPE_MGMT  0x0000   // 管理帧

#define IEEE80211_FTYPE_CTL  0x0004     // 控制帧

#define IEEE80211_FTYPE_DATA  0x0008   // 数据帧

7、从跟ap连接的sta中查找相关

sta static struct sta_info* ap_get_sta(struct ap_data *ap, u8 *sta)

{

struct sta_info *s;

s = ap->sta_hash[STA_HASH(sta)];

while (s != NULL && memcmp(s->addr, sta, ETH_ALEN) != 0)

s = s->hnext;

return s;

}

ieee80211_rx的更多相关文章

  1. 浅谈 Linux 内核无线子系统

    浅谈 Linux 内核无线子系统 本文目录 1. 全局概览 2. 模块间接口 3. 数据路径与管理路径 4. 数据包是如何被发送? 5. 谈谈管理路径 6. 数据包又是如何被接收? 7. 总结一下 L ...

  2. IEEE802.11数据帧在Linux上的抓取

    IEEE802.11数据帧在Linux上的抓取终于得到了梦寐的<802.11无线网络权威指南>,虽然是复印版本,看起来也一样舒服,光看书是不行的,关键还是自己练习,这就需要搭建一个舒服的实 ...

  3. Linux 内核无线子系统

    Linux 内核无线子系统 浅谈 Linux 内核无线子系统 Table of Contents 1. 全局概览 2. 模块间接口 3. 数据路径与管理路径 4. 数据包是如何被发送? 5. 谈谈管理 ...

  4. IEEE802.11数据帧在Linux上的抓取 80211格式转8023帧格式

    转:http://blog.csdn.net/dog250/article/details/7749372 终于得到了梦寐的<802.11无线网络权威指南>,虽然是复印版本,看起来也一样舒 ...

  5. (转)浅谈 Linux 内核无线子系统

    前言 Linux 内核是如何实现无线网络接口呢?数据包是通过怎样的方式被发送和接收呢? 刚开始工作接触 Linux 无线网络时,我曾迷失在浩瀚的基础代码中,寻找具有介绍性的材料来回答如上面提到的那些高 ...

随机推荐

  1. Java中新建子文件夹和新建文件

    File file = new File("地址"); file.mkdirs(); //新建文件夹,当没有父文件夹时,但是不会自动创建父文件夹 file.mkdirs(); // ...

  2. css3实现进度条

    HTML 结构很简单,但不是 Single Element: <div class="spinner"><i></i></div> ...

  3. 关于并行计算的Scan操作

    simple and common parallel algorithm building block is the all-prefix-sums operation. In this chapte ...

  4. 查询被收录页面中的死链接 By SEO

    朋友说他的站挂了,想知道被收录的页面有多少是死链,于是我就想了一下流程,从Site获得收录数量当然是不精准的,不过也没有更好的地了,真实的收录只有搜索引擎数据库里面才有... 查询被收录页面的状态码, ...

  5. linux下文件搜索

    常用: grep -nr "关键字" 搜索当前目录下所有匹配关键字的文件 grep -nr "关键字" *php  搜索当前目录下所有匹配关键字的php文件 f ...

  6. 在 Sublime Text 3 中快捷打开 git-gui

    在文件夹右键菜单上可以方便的打开 git-gui,在 st 里面也可以添加这个右键菜单. 步骤如下: 安装 SideBarEnhancements 插件. 在 SideBarEnhancements ...

  7. tomcat Server.xml Context配置问题

    有时候需要在tomcat里面做特殊的配置,来进行访问: 例如你的程序 名字是hello端口是80  这时候你要访问你的程序 就要用 localhost/hello 来访问了. 但是怎么直接用 loca ...

  8. hdu_4283_You Are the One(区间DP)

    题目链接:hdu_4283_You Are the One 题意: 有n个人,每个人有个屌丝值,如果果他是第K个上场,不开心指数就为(K-1)*D,然后有个小黑屋,可以调整他们的出场顺序,现在让你调整 ...

  9. 8、Spring+Struts2+MyBaits(Spring注解+jdbc属性文件+log4j属性文件)

    一.注解理论 使用注解来构造IoC容器 用注解来向Spring容器注册Bean.需要在applicationContext.xml中注册<context:component-scan base- ...

  10. sqlite 学习

    到谷歌上搜sqlite,第一项便是官方网站:www.sqlite.org.进去后,先了解一下大体,感觉还不错. 进入Document页面,大标题SQLite Programming Interface ...