在编写linux内核中的网络模块时,用到了钩子函数也就是hook函数。现在来看看linux是如何实现hook函数的。

先介绍一个结构体:

struct nf_hook_ops,这个结构体是实现钩子函数必须要用到的结构体,其实际的定义为:

其中的成员信息为:

hook  :是一个函数指针,可以将自定义的函数赋值给它,来实现当有数据包到达是调用你自定义的函数。自定义函数的返回值为:

owner:是模块的所有者,一般owner = THIS_MODULE ;

pf   :是protocol flags,其取值范围为:

hooknum :中存放的是用户自定义的钩子函数的调用时机,其取值为:

其中的每个值的含义为:

priority : 为所定义的钩子函数的优先级,其取值为份两种:分别为IPV4 和 IPV6;

priority 的IPV4取值为:

priority 的IPV6取值为:

以上是对struct nf_hook_ops结构体中的每个字段的详解;

现在举例:struct nf_hook_ops  my_hook = {

.hook = myfunction,

.owner = THIS_MODULE ,

.pf = NFPROTO_IPV4,

.hooknum = NET_INET_FORWARD ,

.priority = NF_IP4_PRI_FIRST };

unsigned int myfunction( unsigend int hooknum,  struct sk_buff *skb,

const struct net_device *in,

const struct net_device *out,

int (*okfn)(struct sk_buff *) )

{

}

如上面的代码一样,当定义一个struct nf_hook_ops结构体,并且对其完成了初始化以后,需要将这个结构体进行注册,之后这个结构体以及其中的自定义函数才会其作用。

注册一个struct nf_hook_ops需要用到的函数为:

int  nf_register_hook( struct nf_hook_ops *reg )

其实这个 int nf_register_hook()函数在内核中的实现也没有多么的复杂,

来看看它是如何实现的:

当不再需要使用这个struct nf_hook_ops时,需要注销这个结构体,其可用的函数为:

void nf_unregister_hook( struct nf_hook_ops *reg )

当一次需要注册多个struct nf_hook_ops结构体,如:

struct nf_hook_ops myhooks[n]时,使用:

int nf_register_hooks( struct nf_hook_ops *regs, unsigned int n );

同样,当一次需要注销多个struct nf_hook_ops结构体是,使用:

void nf_unregister_hoos( struct nf_hook_ops *regs, unsigned int n );

总结:

struct nf_hook_ops

int nf_register_hook( struct nf_hook_ops *reg );

void nf_unregister_hook( struct nf_hook_ops *reg );

int nf_register_hooks( struct nf_hook_ops *regs, unsigend int n );

void nf_unregister_hooks( struct nf_hook_ops *regs, unsigned int n );

linux内核中的hook函数详解,linux内核中的hook函数详解相关推荐

  1. Linux内核出错的栈打印详解,linux内核中打印栈回溯信息 - dump_stack()函数分析

    简介 当内核出现比较严重的错误时,例如发生Oops错误或者内核认为系统运行状态异常,内核就会打印出当前进程的栈回溯信息,其中包含当前执行代码的位置以及相邻的指令.产生错误的原因.关键寄存器的值以及函数 ...

  2. CVE-2021-20226:详解 Linux 内核 IO_URING 子系统中的引用计数漏洞

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士 趋势科技 ZDI 发布文章,详细描述了2020年6月收到的最近引入的 io_uring 子系统的引用计数漏洞情况.该漏洞导致在任意 fil ...

  3. Linux内核中的vfs,详解linux内核VFS

    虚拟文件系统(VFS) 在我看来, "虚拟"二字主要有两层含义: 1, 在同一个目录结构中, 可以挂载着若干种不同的文件系统. VFS隐藏了它们的实现细节, 为使用者提供统一的接口 ...

  4. Linux中free函数头文件,Linux C 堆内存管理函数malloc()、calloc()、realloc()、free()详解...

    C 编程中,经常需要操作的内存可分为下面几个类别: 堆栈区(stack):由编译器自动分配与释放,存放函数的参数值,局部变量,临时变量等等,它们获取的方式都是由编译器自动执行的 堆区(heap):一般 ...

  5. Linux驱动开发必看详解神秘内核(完全转载)

    Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html IT168 技术文档]在开始步入Lin ...

  6. 【正点原子Linux连载】第三十五章 Linux内核顶层Makefile详解 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  7. 详解Linux内核之双向循环链表 By邪恶八进制

    [转载]详解Linux内核之双向循环链表 详解Linux内核之双向循环链表 信息来源:邪恶八进制信息安全团队(www.eviloctal.com) 摘要:      本文详解了内核中面向对象的list ...

  8. linux中的shell有printf吗,Linux Shell系列教程之(八)Shell printf命令详解

    在上一篇:Linux Shell系列教程之(七)Shell输出这篇文章中,已经对Shell printf命令有了一个简略的介绍,本篇给大家详细介绍下Shell中的printf命令. 一.Shell p ...

  9. linux中which命令详解,Linux下which命令使用详解(转)

    我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索: which 查看可执行文件的位置. whereis 查看文件的位置. locate 配合数据库查看文件位置. f ...

  10. linux abs函数怎么用,Linux输入子系统详解

    原标题:Linux输入子系统详解 纯手工打造每一篇开源资讯与技术干货,数十万程序员和Linuxer已经关注. 导读 linux输入子系统由驱动层.输入子系统核心.事件处理层三部分组成.一个输入事件,如 ...

最新文章

  1. LUOGU P4587 [FJOI2016]神秘数(主席树)
  2. sshpass做秘钥分发,ansible做自动化运维工具
  3. jsp内置对象(四)-----session对象
  4. 网络开发必备的HTTP协议知识
  5. 如何使用 Python 实现微信消息防撤回
  6. showdialog url访问页面_静态url在搜索引擎优化中的重要作用
  7. MYSQL 4种插入数据的方式比较
  8. Hibernate之多对多映射
  9. xshell如何设置选中复制_Xshell
  10. ET Reporter
  11. 有关结合律和优先规律
  12. msp430f149最小核心板和bsl下载器连线
  13. 企业风险管理与内部控制常见问题与思考
  14. 如果你已经厌倦了情人节的玫瑰
  15. 软件开发中 常见英文文档 缩写(转)
  16. nginx配置文件的基本参数略解
  17. XC3071充电IC(耐高压,带OVP)
  18. 淘宝产品详情页 上拉加载图片详情 效果实现
  19. 为什么他们不用996,却能做到“永不宕机”?
  20. 遇到oracle错误1445,sql附加数据库失败

热门文章

  1. [SoapUI] 在SoapUI中通过Groovy脚本执行window命令杀掉进程
  2. .net 裁剪图片(不压缩)
  3. JAVA本地文本读取---解决中文乱码
  4. 如何开发FineReport的自定义控件?
  5. lintcode:合并排序数组
  6. linux 下安装maven
  7. extJS 中 ext.data 介绍
  8. 解决ViewPager添加点击监听器无触发的问题
  9. React 的 Hello World
  10. flutter 日志输出,Flutter打印日志,flutter log,flutter 真机日志