玩无线网络

怎么就到网络了呢,还是因为猴哥的好奇心很重,搞明白了文件系统之后[在此猴哥就不谦虚了],对IO产生了浓厚的兴趣,那么在整个计算机中IO主要来自于两个模块:1)存储 2)网络。

存储部分,主要是处理pagecache中的page和盘上的block之间的对应关系,那么网络呢?

猴哥本子上的无线网卡型号是:

04:00.0 Network controller: Intel Corporation Wireless 7260 (rev 6b)
	Subsystem: Intel Corporation Wireless-N 7260
	Flags: bus master, fast devsel, latency 0, IRQ 35
	Memory at f1400000 (64-bit, non-prefetchable) [size=8K]
	Capabilities: [c8] Power Management version 3
	Capabilities: [d0] MSI: Enable+ Count=1/1 Maskable- 64bit+
	Capabilities: [40] Express Endpoint, MSI 00
	Capabilities: [100] Advanced Error Reporting
	Capabilities: [140] Device Serial Number 28-b2-bd-ff-ff-eb-1a-77
	Capabilities: [14c] Latency Tolerance Reporting
	Capabilities: [154] Vendor Specific Information: ID=cafe Rev=1 Len=014 <?>
	Kernel driver in use: iwlwifi
	Kernel modules: iwlwifi

 所以,找到对应的源码是:drivers/net/wireless/iwlwifi

许多教科书中都告诉说:当接受数据块的时候,是在驱动中分配了skb_buffer结构体,发现这个函数是:iwl_mvm_rx_rx_mpdu使用perf抓这个函数调用栈,是怎么样一步步来到iwl_mvm_rx_rx_mpdu呢?

iwl_pcie_irq_handler

---->iwl_mvm_rx

------->iwl_mvm_rx_rx_mpdu

在 iwl_mvm_rx_rx_mpdu 中会调用调用 alloc_skb 去分配一个 sk_buff 来整真正的数据。

如果从iwl_mvm_rx_rx_mpdu处层层向上去解析,你就真的能看到这个数据包是怎么一步步解析出来的,真的很爽,不同于文件系统,这里的内存是驱动分配出来的,并且是从slab中调用kmem_cache_alloc_node分配出来的,也就是说,kmem_cache_alloc_node中进行的内存的分配,谁告诉我不能在中断里进行内存分配的来着?????

再看__alloc_skb中的代码,里面有对其中重要数据结构初始化的代码,太重要了,建议先把那本大红书中关于sk_buff结构体看看。

------------------------

可以先说下对网络的几个疑问,首先,存储中的IO是通过page关联在一起的,那么网络中的IO是通过什么呢?也就是说我随便拿到一个包,怎么知道这个包应该传给哪个进程?这里我感觉应该是TCP/IP协议中的传输层的事情,想到了端口的概念,上学时,端口的意思不就是服务吗?其实对应的就是个进程。理理,这个包经过层层的解析,解析到端口的时候,我们就知道了这个包应该给哪个进程了,怎么通知这个进程?我才这里可能是用到了那种阻塞读/堵塞写等。

还是要看看这个信息传递机制。

一次刨根问底的socket收包过程:

http://blog.csdn.net/bluecloudmatrix/article/details/43501887

ieee80211_queue_work 基本驱动的部分就处理完了吧?

原文地址:https://www.cnblogs.com/honpey/p/6158654.html