协议栈
无忧老猪
老码农一名:)
展开
-
Linux网卡驱动代码阅读杂记
RealTek 8169/8168/8101的驱动代码,一共就一个文件(drivers/net/r8169.c),而且总代码行也就5千行左右,很适合新手入门学习。而像intel e1000e的驱动,包含了较多的文件(总入口文件:drivers/net/e1000e/netdev.c),总代码行至少在1万行以上。先来看看r8169的相关代码:rtl8169_open中,用dma_原创 2016-07-19 15:47:32 · 4497 阅读 · 0 评论 -
代码学习-Linux内核网卡收包过程(NAPI)
本文通过学习RealTek8169/8168/8101网卡的驱动代码(drivers/net/r8169.c),梳理一下Linux下网卡的收包过程。在下水平相当有限,有不当之处,还请大家斧正^_^ 驱动的初始化如下的rtl8169_init_module函数是此驱动的初始化代码,此函数只干了一件事,就是向内核注册一个pci驱动rtl8169_pci_driver。static原创 2015-06-02 19:02:54 · 6762 阅读 · 1 评论 -
Linux网卡名称的生成规则
eth0, eth1这些名称是怎么来的呢?内核发现一个pci网卡设备,调用网卡驱动的probe函数。probe函数在做完一定的初始化之后,会调用内核接口register_netdev向内核注册一个新的net_device设备。这个设备的名字,网卡驱动程序往往只决定其中一部分。就像下面这种方式,网卡驱动提供一个“eth%d”这样的名称,然后调用内核接口register_n原创 2015-01-23 14:04:19 · 7023 阅读 · 0 评论 -
Linux协议栈代码阅读笔记(三)报文接收
(基于linux-2.6.21.7)(一)网卡接收报文以Intel PRO/1000网卡为例。网卡收到报文后,产生中断。驱动程序的中断处理函数e1000_intr(源码文件:\drivers\net\e1000\e1000_main.c)对报文进行接收。中断处理程序先做一些基本的接收工作,然后开始如下的执行路径(从e1000_intr内部开始):(注原创 2013-12-02 13:58:23 · 3487 阅读 · 0 评论 -
Linux协议栈代码阅读笔记(二)网络接口的配置
Linux协议栈代码阅读笔记(二)网络接口的配置(基于linux-2.6.11)(一)用户态通过C库函数ioctl进行网络接口的配置例如,知名的ifconfig程序,就是通过C库函数sys_ioctl实现网络接口的配置的。具体方法大致如下,即建立一个socket,得到一个fd,然后在此fd上执行ioctl即可完成各种操作(例如,查询/配置mac、ip、mtu,启动/停止网络接口)。原创 2013-10-10 21:09:02 · 2202 阅读 · 0 评论 -
Linux协议栈对vlan的处理
(基于linux-2.6.x)从代码上看,Linux对VLAN的处理方式如下。1. vlan的处理,主要是依靠网卡本身。 有的网卡不支持vlan,如老的3com网卡3c501。 intel的ixgb(PRO/10GbE)和e1000(PRO/1000)网卡是支持vlan的。 其他的一些网卡驱动,从代码上来看,还未完整支持。 例如,有个网卡驱动(源原创 2013-12-02 16:11:00 · 8343 阅读 · 1 评论 -
Linux内核协议栈IP报文的上送转发及下发
这里主要分析在网络功能简单配置,且报文正常的情况下,报文的处理过程。网卡接收到IP报文,经过一些执行路径后,最终进入ip_rcv做处理。 ip_rcv在网络功能简单配置,且报文正常的情况下,就是简单的通过ip_rcv_finish完成后续的全部处理工作。ip_rcv_finish通过查找路由,为此报文找到一个dst_entry,然后即由skb_dst(skb)->input(skb);原创 2016-07-21 16:29:30 · 4988 阅读 · 0 评论 -
Linux协议栈代码阅读笔记(一)
Linux协议栈代码阅读笔记(一)(基于linux-2.6.21.7)(一)用户态通过诸如下面的C库函数访问协议栈服务int socket(int domain, int type, int protocol);int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);int connect(in原创 2013-09-26 23:08:00 · 2620 阅读 · 0 评论 -
Linux静态IP及DNS配置
以eth0为例,下面是其配置文件示例。主要是配置红色部分。[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0DEVICE=eth0HWADDR=00:0C:29:A3:48:38TYPE=EthernetUUID=afeca381-c5c1-4dfe-9e8a-ec573dbd04f7ONB原创 2016-08-07 19:05:28 · 8400 阅读 · 2 评论