Linux协议栈代码阅读笔记(二)网络接口的配置
Linux协议栈代码阅读笔记(二)网络接口的配置
(基于linux-2.6.11)
(一)用户态通过C库函数ioctl进行网络接口的配置
例如,知名的ifconfig程序,就是通过C库函数sys_ioctl实现网络接口的配置的。
具体方法大致如下,即建立一个socket,得到一个fd,然后在此fd上执行ioctl即可完成各种操作(例如,查询/配置mac、ip、mtu,启动/停止网络接口)。
int fd = socket(AF_INET, SOCK_DGRAM, 0);
ioctl(fd, SIOCGIFFLAGS, (caddr_t)&ifr);
(二)上述C库函数如何与内核交互
C库代码准备好相应的工作后(例如,设置系统调用号啦、参数构造啦、栈啦、寄存器设置啦),通过系统调用指令,进入内核态。从内核返回后,C库函数再做相应的善后工作,然后将结果返回给用户程序。
这部分代码,不同架构的处理器,有不同的实现。
(三)内核态如何处理用户的网络通讯请求
上一步,C库发起了系统调用,根据系统调用号,进入系统调用表的相应表目。ioctl对应的是54号系统调用,即sys_ioctl函数。
此函数的代码如下(源码文件:fs\Ioctl.c),最终通过vfs_ioctl完成操作。
asmlinkage long sys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
{
struct file * filp;
int error = -EBADF;
int fput_needed;
filp = fget_light(fd, &fput_needed);
if (!filp)
goto out;
error = security_file_ioctl(filp, cmd, arg);
if (error)
goto out_fput;
error = vfs_ioctl(filp, fd, cmd, arg);
out_fput:
fput_light(filp, fput_needed);
out:
return error;
}
(四)vfs_ioctl内部的执行路径
由于我们的fd对应的是一个socket,并且我们的操作是配置网络接口。因此,进入vfs_ioctl后的函数执行路径如下:
do_ioctl
filp->f_op->ioctl(即socket_file_ops.unlocked_ioctl,也就是sock_ioctl)
sock->ops->ioctl(即inet_dgram_ops.ioctl,也就是inet_ioctl)
接下来的工作,就看具体的操作了。下面列出部分操作对应的函数。
1)设置/查询ip、广播地址等操作,执行devinet_ioctl函数。
2)设置/查询接口名称、mac地址、mtu等,执行dev_ioctl函数。
这些操作,有些还需要调用驱动中的相关函数。
例如,设置mtu涉及到的执行路径:
dev_ifsioc
dev_set_mtu
dev->change_mtu(以Intel(R)的e1000网卡为例,dev->change_mtu对应的函数是网卡驱动中的e1000_change_mtu。源码:drivers\net\e1000\E1000_main.c)
再有,设置mac地址涉及的执行路径有:
dev_ifsioc
dev->set_mac_address(以Intel(R)的e1000网卡为例,dev->set_mac_address对应的函数是网卡驱动中的e1000_set_mac。源码:drivers\net\e1000\E1000_main.c)
最后,有些设置完成后,还需要通知内核中关心此事件的模块。
例如,mac地址变化后,就需要通知那些注册了关心此事件的内核模块。
具体代码如下:
notifier_call_chain(&netdev_chain, NETDEV_CHANGEADDR, dev);
Linux协议栈代码阅读笔记(二)网络接口的配置的更多相关文章
- [置顶] Linux协议栈代码阅读笔记(二)网络接口的配置
Linux协议栈代码阅读笔记(二)网络接口的配置 (基于linux-2.6.11) (一)用户态通过C库函数ioctl进行网络接口的配置 例如,知名的ifconfig程序,就是通过C库函数sys_io ...
- [置顶] Linux协议栈代码阅读笔记(一)
Linux协议栈代码阅读笔记(一) (基于linux-2.6.21.7) (一)用户态通过诸如下面的C库函数访问协议栈服务 int socket(int domain, int type, int p ...
- <<梦断代码>>阅读笔记二
这是第二篇读书笔记,这本书我已经读了有一大半了,感觉书中所描述的人都是疯子,一群有创造力,却又耐得住寂寞的疯子. 我从书中发现几点我比较感兴趣的内容. 第一个,乐高之梦.将程序用乐高积木一样拼接起来. ...
- Detectron2源码阅读笔记-(二)Registry&build_*方法
Trainer解析 我们继续Detectron2代码阅读笔记-(一)中的内容. 上图画出了detectron2文件夹中的三个子文件夹(tools,config,engine)之间的关系.那么剩下的 ...
- Linux-3.0.8 input subsystem代码阅读笔记
先乱序记录一下阅读Linux input subsystem代码的笔记. 在input device driver的入口代码部分,需要分配并初始化input device结构,内核提供的API是inp ...
- 《Java编程思想》阅读笔记二
Java编程思想 这是一个通过对<Java编程思想>(Think in java)进行阅读同时对java内容查漏补缺的系列.一些基础的知识不会被罗列出来,这里只会列出一些程序员经常会忽略或 ...
- Bleve代码阅读(二)——Index Mapping
引言 Bleve是Golang实现的一个全文检索库,类似Lucene之于Java.在这里通过阅读其代码,来学习如何使用及定制检索功能.也是为了通过阅读代码,学习在具体环境下Golang的一些使用方式. ...
- Linux系统运维笔记(二),Linux文件编辑命令
Linux系统运维笔记 Linux文件编辑命令 首先我们使用命令 vi filename 打开一个文件,这个时候进入到的是命令模式 接下来我们按i,然后键盘随便输入写内容. 然后按ESC重新进入到命令 ...
- Java Jdk1.8 HashMap源代码阅读笔记二
三.源代码阅读 3.元素包括containsKey(Object key) /** * Returns <tt>true</tt> if this map contains a ...
随机推荐
- IIS8报错 403 404
当IIS报403错误,而打开目录浏览权限后,又出404错误,这种错误很可能是.net的版本安装问题 注意勾选上asp.net4.5
- 218. The Skyline Problem
题目: A city's skyline is the outer contour of the silhouette formed by all the buildings in that city ...
- Java命令行实用工具jps和jstat
在Linux或其他UNIX和类UNIX环境下,ps命令想必大家都不陌生,我相信也有不少同学写过 ps aux | grep java | grep -v grep | awk '{print $2}' ...
- JavaScript DOM高级程序设计 7.向应用程序加入Ajax--我要坚持到底!
有时候,或许是因为理解能力,也或许是因为浮躁,看东西总是不入心,而且还老是想跳过本节,或者赶紧看完本节,这样的恶性循环,让我在即没有真正的学习到知识,又打击我的学习信心,还浪费了我很多事件,我想,当遇 ...
- poj 2996 Help Me with the Game(模拟)
题目:http://poj.org/problem?id=2996 题意:给出 棋盘 情况 输出 白棋 和 黑棋在 棋盘上的 白棋为大写字母 黑棋为小写字母 棋盘 左下点为原点(1,a) 输出 是 按 ...
- JXL获取excel批注
/** * Jxl.jar(2.6.12) * @author lmiky * @date 2011-11-26 */ public class JxlTest { /** * 测试获取批注 * @a ...
- poj2373
其实这道题不是很难,不难想到f[i]表示覆盖到[0,i]的最少喷头数 很明显是一个dp+单调队列的问题 但是细节问题比较多,首先是不能覆盖到[0,l]外面,所以长度为奇数不能被完全覆盖 还有一些区间[ ...
- javascript中this的使用
终于知道某些大神在写js插件的时候为什么第一句都是"var that=this",来看看下面的这个例子,大家都会懂啦: <script type="text/jav ...
- [LOJ 1027] Dangerous Maze
A - A Dangerous Maze Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu ...
- 剑指Offer:二进制中1的个数
题目:输入一个整数,输出该数二进制表示中1的个数. // 二进制中1的个数 #include <stdio.h> int wrong_count_1_bits(int n) // 错误解法 ...