Crda daemon代码结构比较简单:见《03_wireless_driver.xlsx》
内核静态编译regulatory数据库
这种情况不需要用户空间CRDA daemon参与。这种情况暂时不讨论
To account for this situation, a configuration option has been provided (i.e. CONFIG_CFG80211_INTERNAL_REGDB). With this option enabled, the wireless database information contained in net/wireless/db.txt is used to generate a data structure encoded in net/wireless/regdb.c. That option also enables code in net/wireless/reg.c which queries the data in regdb.c as an alternative to using CRDA.
The file net/wireless/db.txt should be kept up-to-date with the db.txt file available in the git repository here:
git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-regdb.git
代码分析
关键数据结构:
主要文件:
cfg80211-y += core.o sysfs.o radiotap.o util.o reg.o scan.o nl80211.o cfg80211-y += mlme.o ibss.o sme.o chan.o ethtool.o mesh.o ap.o
cfg80211-$(CONFIG_CFG80211_DEBUGFS) += debugfs.o
cfg80211-$(CONFIG_CFG80211_WEXT) += wext-compat.o wext-sme.o cfg80211-$(CONFIG_CFG80211_INTERNAL_REGDB) += regdb.o
struct regulatory_request: regulatory domain请求,cfg80211根据此请求获取regulatary domain信息。
struct regulatory_request { int wiphy_idx; //具体哪个设备 enum nl80211_reg_initiator initiator; //说明请求发起者:core, user or driver enum nl80211_user_reg_hint_type user_reg_hint_type; char alpha2[2]; //此请求的国家码,可以使特定的几个数字:00- World regulatory domain; u8 dfs_region; //DFS: Dynamic Frequency Selection: bool intersect; bool processed; enum environment_cap country_ie_env; //indoor或者outdoor struct list_head list; };
struct regulatory_request
通过reg_process_hint函数来处理reg_requests_list列表中的regulatory_request,而假如之前有请求都是添加到这个列表中。
内核发送udev event过程
需求可以来自用户空间,kernel,
内核接收CRDA的处理过程
Mesh
Mesh Network也称为“多跳网络”,它是一个动态的可以不断扩展的网络架构,实现无线设备之间的传输。其核心是让网络中的每个节点都发送和接收信号,使普通无线技术过去一直存在的可扩充能力低和传输可靠性差等问题迎刃而解。网络中大量终端设备能自动通过无线连成网状结构,网络中的每个节点都具备自动路由功能,每个节点只和邻近节点进行通信,因此是一种自组织、自管理的智能网络,不需主干网即可构筑富有弹性的网络。传统无线通信网络必须预先设计和布置网络,它的传输路径是固定的,而mesh网络的传输路径是动态。在传统的无线局域网中,用户如果要进行相互通讯的话,那么首先会访问一个固定的接入点(AP),这种访问的方式被称为单跳网络。而在多跳网络中,任何无线设备节点都可以同时作为AP和路由器。这样的好处是:如果最近的节点由于流量大而拥塞的话,那么数据可以重新选择一个小流量路径进行传输。数据包根据网络的情况,从一个节点依次传送到多个节点,最终到达目的地。这样的访问方式就是多跳访问。其实我们熟知的Internet就是一个“有线多跳”网络的典型例子。例如,我们要发送一份电子邮件,电子邮件并不会直接到达收件人的信箱中,而是通过路由器从一个服务器转发到另外一个服务器,最后到达用户的信箱。
在转发的过程中,路由器一般会选择一条较好的路径,使得电子邮件能够尽快投递到用户信箱。所以,Wireless Mesh网络可以称为Internet的一种无线版本,它与传统无线通信系统最大的不同是能够自动寻找最佳路径,将分包数据从一个路由节点传递到另一个路由节点直至到达目的地,这些特点使Wireless Mesh网络与蜂窝通信等传统的点对点和点对多点通信网络相比具有无可比拟的优势。
无线mesh技术有两个发展趋势:其一是宽带和高速的应用场合,能在300km/h的高速运动情况下传输带宽超过50Mb,核心技术可直接应用于第四代移动通信系统(4G);其二是近距离、低功耗、低数据速率、低成本的双向无线通信,主要适合于自动控制和远程监控领域,可以嵌入各种设备中,同时支持地理定位功能,这方面的应用可以形成蓝牙技术(Bluetooth)的下一代产品,ZigBee正是这种技术的商业化命名。ZigBee的网络标准由IEEE 802.15工作组负责制订,被称作IEEE 802.15.4技术标准(于2003年10月完成)。ZigBee协议比蓝牙、高速率个人区域网(PAN)或802.11x无线局域网更简单实用。 依托于这种独特的网络架构,无线网状网具有自组网、自管理、自动修复、自我平衡的特点,它的移动宽带(带宽最大可达6Mbps)、支持多种业务的优势也备受业界推崇,甚至把它看作是无线网络的未来。
参考:http://baike.http://www.wodefanwen.com//view/3033888.htm http://en.wikipedia.org/wiki/Wireless_mesh_network
代码:
nl80211_join_mesh:收到应用层的NL80211_CMD_JOIN_MESH命令 -》cfg80211_join_mesh
-》rdev->ops->join_mesh:对应具体网络设备实现的函数
MLME & SME
802.11 管理架构由三个元件组成:MAC 层管理单元(MAC layer management entity, 简称MLME),物理层管理单元(physical-layer management entity,简称PLME)以及系统管 理单元(system management entity,简称SME)。不同管理单元之间,以及其与802.11 相关 成份之间的关系,如图所示。
SME 是使用者和设备驱动程序跟802.11 网络界面互动和取得状态信息的方式。MAC 与PHY 协议层皆可访问管理信息库(management information base,简称MIB)。MIB 包含了许多物件,有些物件可供查询状态信息,有些则可以启动特定的行为。在这些管理元件之间定义了三个界面。SME 可通过MLME 和PLME 服务界面来更改MAC 与PHY MIB。此外,MAC 有所改变,相对地PHY 也要有所变动,所以在MLME 与PLME 之间必须存在一层界面,让MAC 得以变更PHY。
代码分析:
数据结构:
struct ieee80211_mgmt :帧结构: struct ieee80211_mgmt { __le16 frame_control; __le16 duration; u8 da[6]; u8 sa[6]; u8 bssid[6]; __le16 seq_ctrl; union { struct { __le16 auth_alg; __le16 auth_transaction; __le16 status_code; /* possibly followed by Challenge text */ u8 variable[0]; } __attribute__ ((packed)) auth; struct { __le16 reason_code; } __attribute__ ((packed)) deauth; struct { __le16 capab_info; __le16 listen_interval; /* followed by SSID and Supported rates */ u8 variable[0]; } __attribute__ ((packed)) assoc_req; struct { __le16 capab_info; __le16 status_code; __le16 aid; /* followed by Supported rates */ u8 variable[0]; } __attribute__ ((packed)) assoc_resp, reassoc_resp; 。。。 }
Cfg80211中的mlme.c配合mac80211模块中的mlme一起使用,完成部分MAC的任务。减少firmware的处理
cfg80211中的 mlme.c文件只有在配合mac80211中的mlme.c的时候才生效。 完成工作:完成部分MAC协议的功能,如:assoc, auth, deauth, disassoc,
流程:接收到底层上报的frame做对应的处理,并相应的组帧并向底层驱动发送。
扫描
Cfg80211模块内的扫描功能主要有:
1. 接收上层发起的扫描命令:有两种扫描命令:scan和sched_scan
2. 接收底层上报的扫描结果事件并做相应的处理 3. 扫描过程的帧分析
数据结构:
1. 两个扫描workqueue: 都位于struct cfg80211_registered_device内部
struct work_struct scan_done_wk;
struct work_struct sched_scan_results_wk; 2. 两个扫描命令结构:
struct cfg80211_scan_request *scan_req; /* protected by RTNL */ struct cfg80211_sched_scan_request *sched_scan_req; 3. 两个辅助功能的work_struct:
struct work_struct conn_work; // struct work_struct event_work; struct cfg80211_bss:BSS description
struct cfg80211_bss {
struct ieee80211_channel *channel;
u8 bssid[ETH_ALEN]; u64 tsf;
u16 beacon_interval; u16 capability;
u8 *information_elements;
size_t len_information_elements; u8 *beacon_ies;
size_t len_beacon_ies; u8 *proberesp_ies;
size_t len_proberesp_ies; s32 signal;
void (*free_priv)(struct cfg80211_bss *bss);
u8 priv[0] __attribute__((__aligned__(sizeof(void *)))); };
struct cfg80211_scan_request: scan request description
struct cfg80211_scan_request { struct cfg80211_ssid *ssids; int n_ssids;
u32 n_channels; const u8 *ie; size_t ie_len;
u32 rates[IEEE80211_NUM_BANDS]; struct wireless_dev *wdev; /* internal */
struct wiphy *wiphy; bool aborted; bool no_cck; /* keep last */
struct ieee80211_channel *channels[0]; };
struct cfg80211_sched_scan_request - scheduled scan request description
struct cfg80211_sched_scan_request { struct cfg80211_ssid *ssids; int n_ssids;
u32 n_channels; u32 interval; const u8 *ie;