linux内核网络钩子函数使用,Linux内核IOCTL网络控制框架实现实例分析

4.6、inet_ioctl函数

由于inet_ioctl函数内容分支很多,但功能、处理不难理解,所以我把一些不常见的内容都省去,挑简单重要的说,完全在于抛砖引玉:

static int inet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)

{

switch(cmd)

{

case FIOSETOWN://设置属主

case SIOCSPGRP://设置进程组

err = get_user(pid, (int *) arg);

if (err)

return err;

if (current->pid != pid && current->pgrp != -pid &&

!capable(CAP_NET_ADMIN))

return -EPERM;

sk->proc = pid;

return(0);

case FIOGETOWN://获取属主

case SIOCGPGRP://获取进程组

return put_user(sk->proc, (int *)arg);

case SIOCGSTAMP://

if(sk->stamp.tv_sec==0)

return -ENOENT;

err = copy_to_user((void *)arg,&sk->stamp,sizeof(struct timeval));

if (err)

err = -EFAULT;

return err;

case SIOCADDRT://增加路由

case SIOCDELRT://删除路由

case SIOCRTMSG:

return(ip_rt_ioctl(cmd,(void *) arg));//IP路由配置

case SIOCDARP://删除arp项

case SIOCGARP://获取arp项

case SIOCSARP://创建/修改arp项

return(arp_ioctl(cmd,(void *) arg));//arp配置

case SIOCGIFADDR://获取接口地址

case SIOCSIFADDR://设置接口地址

case SIOCGIFBRDADDR://获取广播地址

case SIOCSIFBRDADDR://设置广播地址

case SIOCGIFNETMASK://获取网络掩码

case SIOCSIFNETMASK://设置网络掩码

case SIOCGIFDSTADDR://获取p2p地址

case SIOCSIFDSTADDR://设置p2p地址

case SIOCSIFPFLAGS: //

case SIOCGIFPFLAGS:

case SIOCSIFFLAGS://设置接口标志

return(devinet_ioctl(cmd,(void *) arg));//网络接口相关配置,linux内核自带的ifconfig

//的很多处理都是通过这里实现的

case SIOCGIFBR:

case SIOCSIFBR://网桥设置,稍后的实例就是介绍如何截获网桥控制钩子

#if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE) //如果内核支持网桥功能

#ifdef CONFIG_KMOD//若支持内核模块动态加载

if (br_ioctl_hook == NULL)//网桥钩子为空则动态请求模块

request_module("bridge");//加载网桥模块

#endif

if (br_ioctl_hook != NULL)

return br_ioctl_hook(arg);//通过钩子函数处理命令参数

#endif

case SIOCGIFDIVERT://

case SIOCSIFDIVERT:

#ifdef CONFIG_NET_DIVERT

return(divert_ioctl(cmd, (struct divert_cf *) arg));

#else

return -ENOPKG;

#endif     /* CONFIG_NET_DIVERT */

return -ENOPKG;

case SIOCADDDLCI://

case SIOCDELDLCI:// 数据链路连接标识控制

#ifdef CONFIG_DLCI

lock_kernel();

err = dlci_ioctl(cmd, (void *) arg);//控制函数

unlock_kernel();

return err;

#endif

#ifdef CONFIG_DLCI_MODULE

#ifdef CONFIG_KMOD

if (dlci_ioctl_hook == NULL)//如果钩子函数为空,则加载模块

request_module("dlci");

#endif

if (dlci_ioctl_hook) {//钩子函数指针不空

lock_kernel();

err = (*dlci_ioctl_hook)(cmd, (void *) arg);//调用钩子函数

unlock_kernel();

return err;

}

#endif

return -ENOPKG;

default:

return err;

}

/*NOTREACHED*/

return(0);

}

从上面的函数代码来看,同套接字有关的控制请求主要有如下几类:

1、文件操作

2、套接字操作

3、路由选项操作

4、接口操作

5、ARP高速缓存操作

6、网桥控制

7、数据链路连接标识控制

结合代码中的注释,读者不难理解具体的控制分支。具体的控制处理就转到具体的函数里面去处理了,例如关于内核自带的命令工具ifconfig对ip地址的配置处理,基本都在devinet_ioctl函数中;关于arp命令的处理都在arp_ioctl中处理;关于路由配置都在ip_rt_ioctl中处理。其中参数arg是用户空间传来的自定义的数据,可以是结构,可以是联合或其它一些更复杂的类型,由具体的业务模块来解释处理。在随后的实践中,我们就是通过arg的不同解释来做不同的处理。

4.7、网络主要结构相关字段相互引用图

通过上面的分析,大家应该大致明白了linux内核网络ioctl控制框架的实现了。下面是在内核网络组件初始化后,ipv4相关的结构字段之间相互引用图,供大家阅读是参考:

结合前面主要函数调用关系图与源码分析,读者可以很清晰的顺着上图所示的箭头,从ioctl入口函数开始,方便地找到具体的处理模块.其中,文件操作对象 socket_file_ops调用sock_ioctl()时,通过inode节点的socket_i字段最终找到inet_ioctl()函数.

88addbb77cf534ffaa8f930592d75491.bmp0b1331709591d260c1c78e86d0c51c18.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/571111.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(转)递归转非递归的思路和例子

转自:http://blog.51cto.com/cnn237111/1241956 某些算法逻辑,用递归很好表述,程序也很好写。理论上所有的递归都是可以转换成非递归的。如果有些场合要求不得使用递归,那就只好改成非递归了。 通常改成非递归算法的思路&#xff…

Linux自动亮度,ubuntu亮度无法自动调节终极解决方案

关于ubuntu亮度无法自动调节的问题,纠结了我快两年,主要是自己懒,写了个脚本来调节亮度,不过还是稍显不便。近日兴起折腾了一番,终于找到问题根结了。There are many ways to control brightness. According to this d…

NHibernate:no persister for 异常

几种原因&#xff1a; 1、配置文件后缀名写错 mapping file 必须是.hbm.xml结尾 2、Web.config配置里面引用实体 <session-factory> ........................ <mapping assembly"Project.DomainModel"/> <!-- Here --> </session-factory>…

拦截器的的调用顺序

拦截器的的调用顺序 a&#xff1a;首先&#xff0c;要找到它自己有没有声明拦截器的引用&#xff0c;即<action>元素有没有<interceptor-ref>子元素&#xff0c;如果有&#xff0c;则不用继续寻找&#xff08;即不会再使用b,c即默认的拦截器栈等&#xff09;&#…

嵌入式linux 试卷,嵌入式Linux模拟试卷

B. 在目标机上开发&#xff0c;在宿主机上运行C. 在宿主机上开发&#xff0c;在宿主机上运行D. 在目标机上开发&#xff0c;在目标机上运行10. ARM9寄存器组有______个寄存器。【2.0分】A. 7B. 32C. 6D. 3711. 以下叙述中&#xff0c;不符合RICS特征的是______。【2.0分】A. 指…

iOS - 富文本

iOS--NSAttributedString超全属性详解及应用&#xff08;富文本、图文混排&#xff09; ios项目中经常需要显示一些带有特殊样式的文本&#xff0c;比如说带有下划线、删除线、斜体、空心字体、背景色、阴影以及图文混排&#xff08;一种文字中夹杂图片的显示效果&#xff09;。…

运维工程师必会的linux命令下载,运维工程师必会的109个Linux命令.pdf

Linux公社运维工程师必会的109 个Linux 命令版本 1.0崔存新目录1 文件管理 51.1 basename 51.2 cat 51.3 cd 61.4 chgrp 61.5 chmod 71.6 chown 81.7 comm 91.8 cp91.9 cut 101.10 dd 111.11 diff 121.12 dir 131.13 dos2unix 151.14 egrep 161.15 fgrep 161.16 file 161.17 fi…

pdf.js 文字丢失问题 .cmaps

使用pdf.js 展示pdf文件 需求&#xff1a;电子发票类的pdf文件&#xff0c;以base64流的形式请求到&#xff0c;在浏览器中展示pdf文件 遇到的问题&#xff1a; 正常展示后&#xff0c;部分文字无法正常显示&#xff0c; 正常显示如下&#xff1a; 文件目录&#xff1a; js:fun…

linux红黑树节点没有数据,真正理解红黑树,真正的(Linux内核里大量用到的数据 -电脑资料...

作为一种数据结构&#xff0c;红黑树可谓不算朴素&#xff0c;因为各种宣传让它过于神秘&#xff0c;网上搜罗了一大堆的关于红黑树的文章&#xff0c;不外乎千篇一律&#xff0c;介绍概念&#xff0c;分析性能&#xff0c;贴上代码&#xff0c;然后给上罪恶的一句话&#xff0…

bzoj3631: [JLOI2014]松鼠的新家

容易发现是树剖裸题。 然后毒瘤选手AKC表示好像可以用树上差分LCA做。 就这样。水题。 诶那你咋没秒切。 妈也看错样例&#xff0c;然后画错图&#xff0c;接着就是理解错题目&#xff0c;最后R成傻逼之时发现我ST表开数组的顺序错了。。。 废物。 #include<cstdio> #inc…

超过4g的文件怎么上传到linux,怎么免费上传大于4G的文件到百度云 大于4G的文件不开会员怎么上传到百度云...

4G管家appv1.0 安卓版类型&#xff1a;系统工具大小&#xff1a;13.1M语言&#xff1a;中文 评分&#xff1a;10.0标签&#xff1a;立即下载百度云可以非常方便大家存储一些大文件资料&#xff0c;而且百度云的容量也非常高&#xff0c;不过如果你是普通用户的话要想上传大于4g…

scanf和printf在c语言中的作用,C语言中的scanf与printf

最初学习C语言程序设计时&#xff0c;经常需要通过键盘交互方式请用户输入内容&#xff0c;并需要将用户计算的结果在屏幕上输出。为实现这样的操作&#xff0c;C语言提供了scanf与printf两个函数&#xff0c;使用它们之前&#xff0c;一般需要包含stdio.h头文件。语法是&#…

linux sed 循环多行,linux sed 多行处理详细总结

在正常情况下&#xff0c;sed将待处理的行读入模式空间&#xff0c;脚本中的命令就一条接着一条的对该行进行处理&#xff0c;直到脚本执行完毕&#xff0c;然后该行被输出&#xff0c;模式空间请空&#xff1b;然后重复刚才的动作&#xff0c;文件中的新的一行被读入&#xff…

c语言第六次上机作业,C语言第五次上机作业参考答案

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#define N 3void average(int x[N][10]);void findgood(int x[N][10]);void findfail(int x[N][10]);void main(){//0:学号,1-5:成绩,6:平均分,7:第一门平均分,8:是否及格,9:是否优秀int stu[N][10]{0},i,j,s[N]{0};printf…

华农c语言实验1007答案,华农C语言题目及答案(完整版).docx

[题目6567&#xff1a;The first C Program]将下列程序输入visual c&#xff0c;编译、连接和运行该程序。#include"stdio.h"main(){printf("The first C Program\n");}答案#include #include int main(){printf("The first C Program\n");retur…

C语言中声明复数用什么字母,用c语言定义复数-20210407134457.docx-原创力文档

标准化管理处编码[BBX968T-XBB8968-NNJ668-MM9N]标准化管理处编码[BBX968T-XBB8968-NNJ668-MM9N]用c语言定义复数实验0 预备实验实验题目&#xff1a;用c语言的结构类型定义表示复数(1)用浮点型(2)实行-*、/运算实验代码&#xff1a;#include<>typedef struct{int e1,e2;…

go语言 c# 混合编程 pdf,C# 结合 Golang 开发

1. 实现方式与语法形式基本方式&#xff1a;将 Go 程序编译成 DLL 供 C# 调用。1.1 Go代码注意&#xff1a;代码中 export 的注释是定义的入口描述不能省略package mainimport "C"import "fmt"func main() {fmt.Println(Test())}var _count 0//Test ://ex…

android 屏幕坐标色彩,Android自定义View实现颜色选取器

Android 自定义View 颜色选取器&#xff0c;可以实现水平、竖直选择颜色类似 SeekBar 的方式通过滑动选择颜色。效果图xml 属性1.indicatorColor 指示点颜色2.indicatorEnable 是否使用指示点3.orientation 方向horizontal 水平vertical 竖直使用复制 \library\src…\ColorPick…

android移除动画,android – 如何使用ObjectAnimator删除动画的慢端?

我有这个ObjectAnimator&#xff1a;cloudAnim2 ObjectAnimator.ofFloat(cloud2ImageView,"x",500,1000);cloudAnim2.setDuration(3000);cloudAnim2.setRepeatCount(ValueAnimator.INFINITE);cloudAnim2.setRepeatMode(ValueAnimator.RESTART);cloudAnim2.start();c…

linux右键菜单的截图,Linux: 给右键菜单加一个“转换图片为jpg格式”

Linux上通常都会安装imagemagick这个小巧但又异常强大的工具。这个软件提供了一系列很好用的功能。这里说一说如何使用它的convert命令转换图片为jpg格式&#xff0c;以及如何把它添加到Thunar的右键菜单。convert转换图片为jpg格式用起来超简单&#xff1a;convert -format jp…