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…

iOS - 富文本

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

pdf.js 文字丢失问题 .cmaps

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

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

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

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

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

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

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

eclipse实现Android登录功能,eclipse开发安卓登录

划线的地方怎么解决啊?有没有大佬知道如何修改package com.example.login;import android.app.Activity;import android.content.Context;import android.content.Intent;import android.content.SharedPreferences;import android.content.SharedPreferences.Edito…

android tcp 最优窗口,Android 面试必备 - 计算机网络基本知识(TCP,UDP,Http,https)...

简介HTTP协议(超文本传输协议)和 UDP(用户数据包协议),TCP 协议(传输控制协议)TCP/IP是个协议组,可分为四个层次:网络接口层、网络层、传输层和应用层。在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。在传输层中有TCP协议与UDP…

c语言10个数如何求最大值,C语言,输入10个数怎样输出10个数中最大值,最小值(大一计算机)...

可以参考下面的代码:#include int main(){int loop 10;int min, max, value;do{printf("输入整数:");scanf("%d", &value);if (loop10) {max min value; loop--; continue;} else {if (value > max) max value;if (value loop--;}} …

android波纹效果弹窗,Android自定义View实现波纹效果

Android自定义View实现波纹效果时间:2017-05-27 来源:移动互联网学院1、引言:随着Android智能手机的普及,Android应用得到了大力支持,而Android应用的市场前景也是非常的强势。在Android应用的实际开发中&#xff…

图像滤镜艺术---Oilpaint油画滤镜

图像滤镜艺术---Oilpaint油画滤镜 原文:图像滤镜艺术---Oilpaint油画滤镜Oilpaint油画滤镜 图像油画效果实际上是将图像边缘产生一种朦胧,雾化的效果,同时,将一定的边缘模糊化,这样图像整体上看去像素与像素之间就像雾一样随机呈现…

转:数据库收缩

1. 数据库的相关属性 在MS中创建数据库时会为数据库分配初始的大小(如下图:数据库和日志两个文件),随着数据库的使用文件会逐渐增大。数据库文件大小的增加有两种方式: 自动增长:在自动增长中可以设置每次的…

懒加载与预加载

前端性能优化中图片资源的优化。 1.懒加载(延迟加载) 1.图片进入可视区域之后请求图片资源; 2.对于电商等图片较多,页面很长的业务场景很适用; 3.可以减少无效资源的加载; 4.并发加载的资源过多会阻塞js的加…

8.使用Exists监控ZNode的三大Change事件

一、 zookeeper是一个分布式的协调程序(所有程序都是通过订阅它来相互感知)1. tcp(长链接) watcherserver -》clientclient -》server2. Driver 中的方法 exists() 监控一个znode的 CURD 的操作。client1 client2 同时订阅 baidu…

[SDOI2016]储能表

Description 有一个 n 行 m 列的表格,行从 0 到 n−1 编号,列从 0 到 m−1 编号。每个格子都储存着能量。最初,第 i 行第 j 列的格子储存着 (i xor j) 点能量。所以,整个表格储存的总能量是, 随着时间的推移&#xff0…

html对图片轮播脚本怎么调用,【jquery前端开发】可调整的幻灯片(图片轮播)

第一次写博客,希望接下来写的东西 或多或少能帮到些人,虽然这些东西都是一些大神前辈们写了无数遍的东西,但我尽量以一名小白的视角把代码写得清楚点,好心人的就给点赞吧。1.前期准备这是我们编写代码前必须要做的事,在…

计算机主机信息怎么看,本机电脑硬件配置信息怎么看?Win7/Win10查看详细电脑配置方法...

电脑配置决定了一台电脑的性能好坏,如果电脑配置没有达到游戏或者软件的要求,那么肯定无法流畅运行的。对于一些小白用户不知道如何查看电脑硬件配置,那么本机电脑硬件配置信息怎么看?下面装机之家小编分享一下Win7/Win10查看详细…

《Java技术》第一次作业

(一)、学习总结 1.在java中通过Scanner类完成控制台的输入,查阅JDK帮助文档,Scanner类实现基本数据输入的方法是什么?不能只用文字描述,一定要写代码,通过具体实例加以说明。 文本扫描类Scanner…

计算机主机开机为什么显示器不开,电脑开机后显示器不亮怎么办?电脑开机后显示器没反应的解决办法...

电脑开机后显示器不亮怎么办?电脑开机故障屡见不鲜,最近又有用户反馈开机问题了,一用户反馈说,电脑主机是可以正常开机的,但就是显示器不亮,这是怎么回事呢?出现这种情况可能是显示器或主机故障…

斯坦福-随机图模型-week4.0_

title: 斯坦福-随机图模型-week4.0 tags: note notebook: 6- 英文课程-9-Probabilistic Graphical Models 1: Representation --- 斯坦福-随机图模型-week4.0 最大期望收入模型 简答的决策 我们使用随机图模型进行决策需要的原料是什么ne ? 我们需要决策的情景一些列的可能的行…