内核注册一个新的协议族

网络子系统79_inet协议族 // inet协议族默认支持的协议类型 // 在inet_init中,通过inet_register_protosw注册到inetsw邻接表 1.1 static struct inet_protosw inetsw_array[] = { //流类型 { .type = SOCK_STREAM, .protocol = IPPROTO_TCP, .prot = 阅读详情
    说到注册新的协议族(下文用family描述),我们需要再次描述一下数组net_families,这个数组共有NPROTO(32)项,其每一项都固 定分配给一个family使用。比如,AF_INET(因特网协议)固定占用net_families[2],如果net_families[2]== NULL,则表示当前内核没有AF_INET模块,不支持因特网协议。net_families的每一项是一个结构体指针,指向一个描述family的结 构体:
        struct net_proto_family {
            int family;
            int (*create) (struct socket * sock, int protocol);
            short       authentication;
            short       encryption;
            short       encrypt_net;
            struct module   *owner;
        };
     成员变量family用于描述family类型,成员函数create指向该family的创建函数,用于创建一个socket。
     net_families数组当前总共被使用掉了28项(包括第0项保留,其中我们熟悉的UNIX域协议占第1项,因特网协议占第2项),还有 27,28,29,30项未使用。所以,我们可以利用这四个空项编译新的模块,向内核注释新的family。
     我们现在的目标是克隆一个AF_INET,通过抄写,调试代码,熟悉其实现原理,直至能够提出精简,优化方案。所以,我们定义:
    #define MY_PF_INET  30
    使用第30项,重新写一个AF_INET,下面是模块的初始代码:

    #include <linux/net.h>
    #include <linux/init.h>
    #include <linux/module.h>

    #include "my_inet.h"

    static int myinet_create(struct socket *sock, int protocol)
    {
        printk(KERN_INFO "register myinet family successed!/n");
        return -ESOCKTNOSUPPORT;
    }

    static struct net_proto_family myinet_family_ops = {
        .family = MY_PF_INET,
        .create = myinet_create,
        .owner  = THIS_MODULE,
    };

    static int __init myinet_init(void)
    {
        (void)sock_register( &myinet_family_ops );
        return 0;
    }

    static void __exit myinet_exit(void)
    {
    }

    module_init( myinet_init )
    module_exit( myinet_exit )

    模块初始化函数myinet_init的主要作用是把myinet_family_ops的地址赋给net_families数组的第30项,让内核看到该family的存在。函数sock_register完成这个功能。insmod之后,内核的日志输出:
    NET: Registered protocol family 30
    表示注册成功。

    成功之后,我们测试一下其功能,写一个简单的应用程序:
    #include <sys/types.h>
    #include <sys/socket.h>

    int main()
    {
        socket( 30, 1, 1 );
        return 0;
    }
    socket系统调用的执行流程:
    1、调用sys_socket (net/socket.c 1180行)
    2、调用__create_socket (net/socket.c 1069行)
    3、调用net_families[family]->create,即我们的myinet_create函数,由于当前没有实现,只简单返回不支持,但我们可以看到日志输出,表示确行执行到了这里。
Linux 内核中协议族与套接字类型的实现机制 协议族通过create函数隐式声明支持的套接字类型在create函数中处理sock->type并绑定对应的proto_ops。套接字创建是分层的协作过程协议族层(绑定操作集)→ 传输层(初始化协议)→ VFS 层(绑定文件描述符)。可靠性依赖全局资源与正确性即使create返回 0,仍需系统资源(如 fd)和协议实现的正确性支持。通过理解这一流程,开发者可以更高效地实现自定义协议族或调试内核网络问题。对于标准协议(如 TCP/IP),内核已确保其完整性与高性能,但对定制协议(如内核模块)需严格验证。 阅读详情

相关推荐

Linux内核IPv4协议族架构解析:协议注册与分层机制

Linux内核的网络子系统是互联网通信的核心引擎,其中IPv4协议族的实现体现了典型的分层架构思想。本文以协议注册机制为切入点,深入解析IPv4协议的分层管理机制,揭示传输层协议与网络层协议在实现上的本质差异。1.1 分层协议模型IPv4协议族严格遵循网络分层模型,可分为两大类别:1.2 代码可见协议实例 // 内核协议注册代码片段 proto_register(&tcp_prot, 1); // TCP协议 proto_register(&udp_prot, 1); /

数字人生 337

linux系统日志报错kernel,Linux日志出现大量"kernel: NET: Registered protocol family 36"

一台Linux服务器的系统错误日志出现大量的“kernel: NET: Registered protocol family 36”错误信息,如下所示:Jul 2 05:27:45 xxxxxx kernel: NET: Registered protocol family 36Jul 2 05:27:45 xxxxxx kernel: NET: Unregistered protocol f...

weixin_39572168的博客 731

Linux内核中inet协议族的注册机制:为何没有sock_unregister?

1. 核心原则稳定性优先:核心协议族与内核同生命周期,规避动态管理风险。模块化扩展:非核心功能通过动态加载实现灵活迭代。2. 现实意义避免修改核心协议族生命周期:如需扩展功能,通过钩子函数或Netfilter框架实现。自定义协议族按需模块化:确保注册/注销逻辑完备,资源管理严格。3. 未来演进随着内核热补丁(如Kpatch/Ksplice)技术的发展,未来或实现核心协议族的安全热更新,但静态设计仍将是主流。通过剖析inet协议族的注册机制,我们得以窥见Linux内核在稳定性与灵活性。

数字人生 198

协议栈(Internet协议族)

net_proto_family // net_families数组,NPROTO为37,表示最多支持37种协议族 static const struct net_proto_family *net_families[NPROTO] __read_mostly; // Internet协议族 #define AF_INET 2 /* Internet IP Protocol ...

Jiajun Zhu 1766

如何在 Linux 内核中实现自定义协议族并使用 Socket 通信

协议族(Protocol Family)是指一组相关的网络协议,通常通过一个唯一的标识符(如AF_INET表示 IPv4 协议族)来标识。每个协议族都有自己的协议操作函数集,用于定义如何创建套接字、发送数据、接收数据等。首先,需要为自定义协议族分配一个唯一的编号。通常,这个编号是一个大于AF_MAX的整数(AF_MAX是当前已定义的最大协议族编号)。#define AF_MYPROTO 42 // 自定义协议族编号。

数字人生 329

Linux 内核自定义协议族开发:从 “No buffer space available“ 错误到解决方案

错误的本质是协议族号超出内核管理范围。静态数组限制:内核通过AF_MAX硬编码管理协议族,不可动态扩展。兼容性优先:优先复用空闲协议族号,避免修改内核代码。严格验证:在内核模块中实现健壮的错误处理和日志机制。通过遵循上述实践,开发者可高效规避协议族注册中的常见陷阱,确保内核模块的稳定性和兼容性。内核文件中定义了多种地址族(Address Families),这些地址族用于指定通信协议族。: 未指定的地址族,通常用于表示未知或不特定的地址族。和: 用于本地进程间通信的 Unix 域套接字。

数字人生 752

linux-2.6.14移植:NET: Registered protocol family 1卡住

linux-2.6.14移植:NET: Registered protocol family 1卡住 修改好内核源码,并增加了yaffs源码,开始make,出现如下错误: U-Boot 1.1.6 (Mar 21 2012 - 07:03:29)DRAM: 64 MBFlash: 2 MBNAND: 256 MiB*** Warning - bad CRC or NAND, using defau...

系统运维 674

通过理解 sk_buff 深入掌握 Linux 内核自定义协议族的开发实现

在。

数字人生 458

套接字基础

一、套接字与套接字接口 套接字是应用程序访问系统网络服务的接口。端到端的通信通过一对套接字来实现,一个套接字对应一个通信端点。 从实现来看,套接字是端端通信的抽象描述。在应用程序里,套接字对应一个整数值(套接字描述符);在内核里,套接字对应一个管理通信过程的对象(struct socket结构)。该结构与前面所说的整数值一一对应。 在Linux系统内核中,struct socket结构对象不...

weixin_34355881的博客 250

Linux内核协议栈深度解析:从自定义协议族到TCP桥接的完整实践

通过.create = ib_create, // 套接字创建回调// 模块初始化时注册本文通过协议族注册、协议桥接、地址转换、操作函数集注册等关键技术点的系统实践,完整展示了如何将自定义协议族无缝集成到Linux内核协议栈。该方案在保持TCP协议栈完整功能的同时,为上层应用提供了透明的协议扩展能力。硬件卸载集成:在ib_sendmsg中集成RDMA硬件加速协议特征扩展:通过实现定制化拥塞控制算法多协议支持:动态选择TCP/UDP/QUIC等底层协议。

数字人生 243

Linux内核自定义协议族开发指南:理解net_device_ops、proto_ops与net_proto_family

注册协议族,提供套接字创建入口。proto_ops实现协议对套接字操作的支持,处理用户空间数据。管理物理/虚拟设备的数据收发。通过分层次实现并确保各层间的正确交互,可以构建高效可靠的自定义网络协议栈。在 Linux 内核网络协议栈中,数据发送是一个涉及多个层次的复杂过程。用户空间的send调用最终需要通过内核中的多个关键函数协作,才能将数据传递到物理网络设备。其中,sendmsg和是两个核心函数,分别负责套接字层和网络设备层的数据处理。本文将深入解析这两个函数的作用、协作流程以及它们在协议栈中的重要性。

数字人生 937

Linux网络体系结构

Linux网络体系结构   2010-08-29 18:48:38|  分类:网络 |  标签:|字号大中小 订阅   一 内核结构     按功能,Linux内核可以划分为5个不同的部分,每一部分处理一项明确的功能,同时又向其他内核组件提供这项功能。这种结构也反映到内核的源代码上——这5部分都形成了自己的子树。   1进程管理 2内存管理 3文件系统 4设备驱

wocao1226的专栏 671

Win11注册表没有MMC的解决方法

本文详细介绍了在Win11系统中解决注册表没有MMC项的问题的方法。通过创建并导入注册表修复文件,我们可以成功地在注册表中添加缺失的MMC项。在操作过程中,需要注意备份注册表、以管理员身份运行工具以及系统更新等事项。希望本文能够帮助到遇到类似问题的用户,提高系统管理的效率和便捷性。如果你还有其他关于Windows操作系统的问题或疑问,欢迎随时提问并寻求帮助。

nntxthml的博客 1552

向内核注册一个新的协议族

说到注册新的协议族(下文用family描述),我们需要再次描述一下数组net_families,这个数组共有NPROTO(32)项,其每一项都固定分配给一个family使用。比如,AF_INET(因特网协议)固定占用net_families[2],如果net_families[2]== NULL,则表示当前内核没有AF_INET模块,不支持因特网协议。net_families的每一项是一个结构体指

Luohsh1的专栏 745

深信服AC1000-B1200到手第一步:从开箱到激活上网的保姆级图文指南

本文提供深信服AC1000-B1200企业级行为管理设备的详细开局使用指南,涵盖从开箱验机、物理连接到网络配置、安全加固及设备激活的全流程。通过图文并茂的步骤解析,帮助用户快速完成设备初始化并实现安全上网,特别适合初次接触该设备的网络管理员参考。

weixin_42546392的博客 547

FPGA篮球计分器:从需求分析到模块化实现的实战指南

本文详细介绍了FPGA篮球计分器的设计与实现,涵盖需求分析、模块化设计及实战调试。重点解析了24秒精确倒计时、12分钟比赛计时、比分统计和数码管显示等核心模块的Verilog实现,提供了按键消抖、状态机设计和BCD码处理等关键技术细节,帮助开发者掌握FPGA数字系统设计方法。

sql99的博客 218

linux内核套接字协议族

主要介绍主流的协议族,以及协议族的设计和不同的协议族和vfs的关系。

weixin_41374218的博客 575

Python+AI能源管理实战:从电力负荷预测到智能调度的全流程开发

本系统展示了Python在能源管理领域的强大能力,通过AI技术实现了从预测到优化的智能决策闭环。随着碳中和目标的推进,智能能源系统将成为新型电力系统的核心大脑。📌 专业建议:系统部署需考虑网络安全防护,关键控制指令应设置多重验证机制!关注我的优快云账号获取能源系统安全最佳实践~下期预告:我们将探索Python在智慧医疗中的应用,开发基于多模态数据的智能诊断辅助系统。想提前获取代码?评论区留言"智慧医疗"获取GitHub源码链接!

资深全栈架构师,乐于在 优快云 分享技术见解,与大家携手共进,共攀技术巅峰! 625

Netlink协议族

文章目录数据结构协议对象: netlink_table协议族初始化Netlink协议管理Netlink协议注册: netlink_kernel_create()Netlink消息消息头消息整体格式相关API消息payload格式相关API消息属性格式相关API内核其它消息API消息的构造消息的解析消息的发送消息属性相关API用户态消息宏 这篇笔记记录了Netlink协议族的初始化,并对Netlink消息格式及对应的内核态API进行了详细解释。Netlink用户态编程麻烦的一点是用户态对Neltink消息的处

九天小哥的专栏 2769

【零基础教程】HEC-RAS 1D/2D全流程模拟指南|从水动力到水质建模一次搞定!

HEC-RAS由美国陆军工程兵团水文研究中心研制,具有完整的一二维耦合的水动力及水环境模拟功能,也具有闸、涵洞、桥梁以及泵站等水利构筑物的模拟能力;同时也可以与HEC研制的水文模型(HMS)、洪水淹没风险和损失分析软件(FDA)等耦合,是免费软件中使用最方便、应用最广泛的软件之一。2.HEC-RAS与HEC-HMS的耦合(不详细讲HEC-HMS)3.淹没风险分析软件HEC-FDA与HEC-RAS耦合。案例十八:HEC-RAS与HEC-HMS的耦合。案例十九:HEC-RAS与HEC-FDA的耦合。

weixin_48230888的博客 872

46.qt quick-自定义非常好看的qml虚拟软键盘-支持换肤、动态加载移除语言(二)

在上章我们学习了45.qt quick-qml虚拟软键盘详解(一)_诺谦的博客-优快云博客 接下来我们便来自定义一款好看的qml软键盘.如下图所示: 支持背景更换、支持动图: 支持动态加载移除语言: 支持拖拽、自由缩小放大: 支持定位坐标: ...

抵抗时间扭曲,坚持做一件有意义的事 4674

实现Linux平台自定义协议族

我们常常在Linux系统中编写socket接收TCP/UDP协议数据,大家有没有想过它怎么实现的,如果我们要实现socket接收自定义的协议数据又该怎么做呢?带着这个疑问,我们一起往下看吧~~//ops: 指向一个描述套接字协议族的 net_proto_family 结构体。这个结构体定义了://协议族编号(family),比如 AF_INET(IPv4)或 AF_INET6(IPv6)。//与此协议族关联的 create 函数,用于创建套接字。

weixin_46564301的博客 1333

【Mode】多模干涉仪的设计 Multi-mode interferometer(MMI)

与 Splitter 器件一样,MMI 器件也是一种常见的分光器件,可以根据用户的需求将光束分成不同的比例。本文,我们将介绍如何仿真 MMI 器件。这里我们使用的是 1x2 MMI,其本质上是由四个部分组成的,中间的矩形多模式干涉区域以及左右两侧的三个 taper 模式转换区域。之前的教程中我们也提及了,为了获取稳定的模式场分布,通常,我们需要进行模式收敛性扫描。这里以官网给出的案例为例。如何提取 S 参数我们先暂时不做介绍,后续有时间了我们再做介绍。

u011699626的博客 1212
上一篇: 提高Linux系统应对短连接的负载能力
下一篇: 剖析RedHat Linux中三个重要内核文件
guowake
博客等级 码龄19年 62粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值