Linux协议栈代码阅读笔记(二)网络接口的配置

时间:2021-11-22 22:43:48

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协议栈代码阅读笔记(二)网络接口的配置的更多相关文章

  1. [置顶] Linux协议栈代码阅读笔记(二)网络接口的配置

    Linux协议栈代码阅读笔记(二)网络接口的配置 (基于linux-2.6.11) (一)用户态通过C库函数ioctl进行网络接口的配置 例如,知名的ifconfig程序,就是通过C库函数sys_io ...

  2. [置顶] Linux协议栈代码阅读笔记(一)

    Linux协议栈代码阅读笔记(一) (基于linux-2.6.21.7) (一)用户态通过诸如下面的C库函数访问协议栈服务 int socket(int domain, int type, int p ...

  3. <<梦断代码>>阅读笔记二

    这是第二篇读书笔记,这本书我已经读了有一大半了,感觉书中所描述的人都是疯子,一群有创造力,却又耐得住寂寞的疯子. 我从书中发现几点我比较感兴趣的内容. 第一个,乐高之梦.将程序用乐高积木一样拼接起来. ...

  4. Detectron2源码阅读笔记-(二)Registry&build_*方法

    ​ Trainer解析 我们继续Detectron2代码阅读笔记-(一)中的内容. 上图画出了detectron2文件夹中的三个子文件夹(tools,config,engine)之间的关系.那么剩下的 ...

  5. Linux-3.0.8 input subsystem代码阅读笔记

    先乱序记录一下阅读Linux input subsystem代码的笔记. 在input device driver的入口代码部分,需要分配并初始化input device结构,内核提供的API是inp ...

  6. 《Java编程思想》阅读笔记二

    Java编程思想 这是一个通过对<Java编程思想>(Think in java)进行阅读同时对java内容查漏补缺的系列.一些基础的知识不会被罗列出来,这里只会列出一些程序员经常会忽略或 ...

  7. Bleve代码阅读(二)——Index Mapping

    引言 Bleve是Golang实现的一个全文检索库,类似Lucene之于Java.在这里通过阅读其代码,来学习如何使用及定制检索功能.也是为了通过阅读代码,学习在具体环境下Golang的一些使用方式. ...

  8. Linux系统运维笔记&lpar;二&rpar;&comma;Linux文件编辑命令

    Linux系统运维笔记 Linux文件编辑命令 首先我们使用命令 vi filename 打开一个文件,这个时候进入到的是命令模式 接下来我们按i,然后键盘随便输入写内容. 然后按ESC重新进入到命令 ...

  9. Java Jdk1&period;8 HashMap源代码阅读笔记二

    三.源代码阅读 3.元素包括containsKey(Object key) /** * Returns <tt>true</tt> if this map contains a ...

随机推荐

  1. iOS 怎么设置 UITabBarController 的第n个item为第一响应者&quest;

    iOS 怎么设置 UITabBarController 的第n个item为第一响应者? UITabBarController 里面有个属性:selectedIndex @property(nonato ...

  2. Unity中各个平台的预编译的运用方式

    1,unity中官方文档的一个操纵关键词   Platform Dependent Compilation 2,常用的预编译关键词    UNITY_EDITOR    编辑器调用.UNITY_STA ...

  3. BufferedReader需要显示关闭

    BufferedReader reader = new BufferedReader(); …… reader.close(); BufferedReader需要显示关闭 解释: 方法调用结束后,这两 ...

  4. ASP&period;NET Core 1:UrlRouting 设置&lpar;不包含MVC6的UrlRouting设置&rpar;

    0.Program.cs using System.IO; using Microsoft.AspNetCore.Hosting; namespace WebApplication1 { public ...

  5. Asp&period;net中基于Forms验证的角色验证授权

    Asp.net的身份验证有有三种,分别是"Windows | Forms | Passport",其中又以Forms验证用的最多,也最灵活. Forms 验证方式对基于用户的验证授 ...

  6. 10&period;使用final关键字修饰一个变量时&period;&period;&period;

    10.使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 答:引用不能变,不能将引用再次指向另一个新的对象,但引用所指向的对象中的内容是可以改变的. 补充: 1.对于基本类型,f ...

  7. javascript动画效果之多物体缓冲运动

    这个是通过一个for循环控制的三个li标签,被鼠标触发则会有一个宽度增加和减少的事件 html和css同样写在一起方便察看,这里就是简单的布局,重点在js <!DOCTYPE html> ...

  8. 在线上服务器上无管理员权限下升级NodeJS版本

    前言 最近发现一个线上机器的问题,是因为node版本过低导致的,线上机器的node版本还是0.x版,遂打算升级node版本. 但是发现常规的npm包的n模块无法使用,提示没有权限创建文件夹,导致nod ...

  9. 常量引用 const T&amp&semi;

    1.引用本身不是对象,只是引用对象的别名,没有内存空间产生 2.引用必须严格类型匹配 3.而常量引用 const T& 可以引用字面值常量及表达式 其实也就是右值,且常量引用的不同与T类型对象 ...

  10. 20165324 Java实验一

    20165324 实验一 一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:何春江 学号:20165324 指导教师:娄嘉鹏 实验日期:2018年4月2日 实验时间:13:45 - 1 ...