32 --> 详解 OpenWRT系统框架基础软件模块之netifd

2023-11-13

一、简介
OpenWrt路由操作系统的框架基础软件有很多,大部分是通用的软件模块,如 dhcp 、dnsmasq、iproute、cmwp、vpn、ipsec等等;OpenWrt还集成部分具有专属特征软件模块,也是OpenWRT系统核心框架软件组件,从此篇开始分析 《OpenWrt系统框架基础软件模块》系列文章。
OpenWrt 核心软件:procd、uci、libubox、ubus、ubox、luci、netifd 软件组件内容,此部分软件模块是构成OpenWrt框架基础软件。
因为OpenWRT是小型软路由操作系统、网络协议栈知识内容十分丰富、望而生畏;我们先把庞大网络协议栈知识放一下,从易于入手的OpenWRT这个开源软路由开始入手,无论是网络协议栈还是OpenWRT的学习,总是要找到起点或入口;OpenWRT入口处就是 libubox ,因为其他软件是依托libubox库 api 接口构建起来的应用,请参考《详解 OpenWRT系统框架基础软件模块之libubox》。

OpenWRT 系统中,netif软件模块可谓是 OpenWRT路由操作系统核心软件组件、负责网络设备、网络接口、网络协议栈、防火墙等与网络相关功能的管理和维护。

二、netifd 软件框架

我们在回顾OpenWRT系统总线ubus,它类似于Linux桌面操作系统的d-Bus,目标是提供系统级的进程间通信(IPC/RPC)功能。ubus在设计理念上与d-Bus基本保持一致,提供了系统级总线功能,与d-Bus相比减少了系统内存占用空间,这样可以适应于嵌入式Linux操作系统的低内存和低端CPU性能的特殊环境。ubus是OpenWrt的RPC/IPC工具,是OpenWrt的微系统总线架构。

OpenWRT 系统中各软件组件之间的关系,如下图:
在这里插入图片描述
netifd 通过系统总线 ubus 注册有线网络设备、无线设备、网络接口,源码如下:
设备状态检测方法回调。

// device
static const struct blobmsg_policy dev_policy[__DEV_MAX] = {
	[DEV_NAME] = { .name = "name", .type = BLOBMSG_TYPE_STRING },
};

static struct ubus_method dev_object_methods[] = {
	UBUS_METHOD("status", netifd_dev_status, dev_policy),         //UBUS_METHOD 采用宏方式初始化全局 各类结构体
	UBUS_METHOD("set_alias", netifd_handle_alias, alias_attrs),
	UBUS_METHOD("set_state", netifd_handle_set_state, dev_state_policy),
};

static struct ubus_object_type dev_object_type = 
	UBUS_OBJECT_TYPE("device", dev_object_methods);

static struct ubus_object dev_object = {
	.name = "network.device",
	.type = &dev_object_type,
	.methods = dev_object_methods,
	.n_methods = ARRAY_SIZE(dev_object_methods),
};

无线设备状态检测。

// device
static const struct blobmsg_policy dev_policy[__DEV_MAX] = {
	[DEV_NAME] = { .name = "name", .type = BLOBMSG_TYPE_STRING },
};

static struct ubus_method dev_object_methods[] = {
	UBUS_METHOD("status", netifd_dev_status, dev_policy),         //UBUS_METHOD 采用宏方式初始化全局 各类结构体
	UBUS_METHOD("set_alias", netifd_handle_alias, alias_attrs),
	UBUS_METHOD("set_state", netifd_handle_set_state, dev_state_policy),
};

static struct ubus_object_type dev_object_type =
	UBUS_OBJECT_TYPE("device", dev_object_methods);

static struct ubus_object dev_object = {
	.name = "network.device",
	.type = &dev_object_type,
	.methods = dev_object_methods,
	.n_methods = ARRAY_SIZE(dev_object_methods),
};

由此看到,OpenWRT路由操作系统,把有线和无线网络设备是分开管理。

// network
static struct ubus_method main_object_methods[] = {
	{ .name = "restart", .handler = netifd_handle_restart },
	{ .name = "reload", .handler = netifd_handle_reload },
	UBUS_METHOD("add_host_route", netifd_add_host_route, route_policy),
	{ .name = "get_proto_handlers", .handler = netifd_get_proto_handlers },
	UBUS_METHOD("add_dynamic", netifd_add_dynamic, dynamic_policy),
};

static struct ubus_object_type main_object_type =
	UBUS_OBJECT_TYPE("netifd", main_object_methods);

static struct ubus_object main_object = {
	.name = "network",
	.type = &main_object_type,
	.methods = main_object_methods,
	.n_methods = ARRAY_SIZE(main_object_methods),
};

当网络设备驱动产生状态变化时,内核通过netlink-Kobject的 kevent 事件通知到用户空间,ubusd 守护线程接收到此事件后,就执行
netifd在 ubus 总线注册的回调函数,会触发 netifd_get_proto_handlers 、netifd_add_host_route 回调函数执行;

netifd_get_proto_handlers () 函数根据 /etc/config/network 配置项,重新设置设备协议相关参数;

netifd_add_host_route () 函数会通过 netlink-routing 通讯,触发内核的路由子系统,为依附于该设备的 interface 接口,配置路由信息;至于路由子系统工作原理(四表五链)和运作机制,请关注笔者的《Linux 网络协议栈》子栏目,笔者将梳理内核的网络协议栈的路由子系统系列文章。

netifd 子系统的内容丰富,由于个人时间的问题,暂时先到此处;后面会进一步说明。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

32 --> 详解 OpenWRT系统框架基础软件模块之netifd 的相关文章

  • Android学习路线

    Android学习路线 绝对干货
  • CVE-2021-44228-log4j2复现详细版本-简单教程。

    0x01 前言 昨晚爆出的log4j rce 是通过lookup触发的漏洞 但jdk1 8 191以上默认不支持ldap协议 对于高版本jdk 则需要一定的依赖 不过为了给大家最简单的说明 我这里还是用jdk1 8 144的版本来运行 0x
  • Pytorch-torch.nn.identity()方法详解

    Pytorch torch nn identity 方法详解 identity模块不改变输入 直接return input 一种编码技巧吧 比如我们要加深网络 有些层是不改变输入数据的维度的 在增减网络的过程中我们就可以用identity占
  • Web 前端常用正则校验规则

    Web 前端常用正则校验规则 作为 Web 前端开发 常用的正则校验规则有很多 下面是一些常见的示例 1 校验手机号码 手机号码的正则表达式可以根据不同国家和地区的手机号码格式进行调整 以下是中国大陆的手机号码正则表达式 const reg
  • 关于C语言fgets函数要注意的地方

    关于C语言fgets函数要注意的地方 fgets函数一般用来读入文件内容 每次读一行 然后存入缓存区 有人问那怎么读下一行 直至读完整个文本文件的内容 其实很简单 只要循环用fgets就行 如果你这次把第一行读完了 那么下一次文件指针就会从
  • 关于springboot中编写继承JpaRepository这个接口类时出现报红,不能继承这个接口的问题之解决方法

    这是第二次遇到这个问题只能怪自己之前没有习惯去记录遇到的问题 这次还是关于Jpa的 真的是在找博客的时候看到好多说在入口类里添加 EnableJpaRepositories basePackages xxx xxx xxx 这个注解的 我就
  • el-table-column中运用三元运算符

    在el table column中是不能直接运用三元运算符的 需要转化一下
  • Nacos2.2版本发布了,我为其贡献了几行代码并适配了PostgreSQL插件

    目录 一 背景 二 个人贡献 三 Nacos使用适配的PostgreSQL插件 3 1 插件源码工程项目结构 3 2 打包加载插件 3 3 修改配置文件为PostgreSQL连接字符串 3 4 导入数据库脚本文件 四 总结 一 背景 Nac
  • Springmvc 学习心得

    1 三层架构的介绍和mvc的设计模式 Springmvc的特点 清晰的角色划分 每个功能模块对应一个组件 1 前端控制器 DispatchServlet 2 处理器映射器 HanderMapping 根据 requestMapping 找到
  • Java单元测试框架-1-TestNg初识

    目录 1 1xUnit整体作用 1 2着重介绍Junit TestNg 1 3TestNg测试框架介绍 1 4Eclipse安装TestNG 1 5TestNg测试 1 1xUnit整体作用 xUnit是各种代码驱动测试框架的统称 这些框架
  • @property详细解读

    property 这个关键字 学过iOS的一定会经常用 但是如果你问一个人 property是干嘛用的 可能就会有人一脸茫然地问你 不就是声明属性用的么 这话当然对 那么 property的背后的机制是什么 是如果声明属性 做了哪些事情呢
  • 谈谈代码走读

    代码走读的重要性就不说了 我想谈谈对代码走读的总体认识 首先代码走读前 代码必须编译通过 强类型检查的语言 比如JAVA 自带的编译器就够了 如果是弱类型检查的语言 比如C C 应该用辅助的静态检查工具 比如lint 进行检查 毕竟机器发现
  • 刷题集——POJ 2179 Fliptile(枚举+模拟)

    Fliptile Time Limit 2000MS Memory Limit 65536K Total Submissions 28860 Accepted 10139 Description Farmer John knows that
  • vue element-ui 侧边栏刷新高亮丢失问题解决

    改造之前 侧边栏刷新高亮丢失 用的是rooter link包裹 代码如下
  • JS逆向steam登录

    JS逆向steam登录 前言 我们爬虫有时候 会遇到登录才能获取到数据的情况 最开始的时候我们只需要加入请求的data参数就可以 可是现在网站为了反爬 对登录的密码或者账号都做了加密处理 如果我们不破解出这些加密的密码或者账号 就没办法实现
  • 数据库报Connection is read-only. Queries leading to data modification are not allowed

    数据库报Connection is read only Queries leading to data modification are not allowed 具体是某张表的插入操作时报的错误 问题排查过程 这个超过是批量操作发生的 第一
  • Linux-du命令

    du命令 说明 du命令也是查看使用空间的 但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看 还是和df命令有一些区别的 参数 a或 all 显示目录中个别文件的大小 b或 bytes 显示目录或文件大小时 以b
  • EL表达式语言

    引用 http blog 163 com s zhchluo blog static 1501470820075205739439 基本语法 一 EL简介 1 语法结构 expression 2 与 运算符 EL 提供 和 两种运算符来存取

随机推荐

  • 【uniapp】this有时为啥打印的是undefined?(箭头函数修改this)

    博主 初映CY的前说 前端领域 本文核心 uniapp中this指向问题 前言 this大家知道是我们当前项目的实例 我们可以在这个this上面拿到我们原型上的全部数据 这个常用在我们在方法中调用其他方法使用 一 uniapp中this指向
  • Cplex—java集成,idea配置 步骤大全 windows版本

    首先搜索官网cplex下载安装包 本次示例以windows版本 1 双击打开安装包 2 选择简体中文 3 都是默认 修改路径的同学请记得自己的安装路径后面配置环境变量要用 4 这里我已经安装过了中间步骤直接跳过 5 接下来我们需要在java
  • 郑州大学校园网故障问题解决方法

    1 郑州大学校园网学生用户使用指南 可进入郑州大学网络管理中心网站 校园网交流QQ群 群一475137403 群二685466506 微信公众号 郑州大学网络管理中心 一 校园网注册 1 微信扫码并关注 郑州大学网络管理中心 点击进入微信公
  • FFMPEG对于rtp的推流以及VLC验证

    前言 参考资料 https blog csdn net zhoubotong2012 article details 86711097 https blog csdn net zhoubotong2012 article details 8
  • 2021-10-23

    对于算法题 还是要及时地进行总结和收获 不然 对于核心的知识掌握过几天就忘记了 相当于之前付出的努力都打了水漂 多浪费啊 LRU缓存机制 LRU 缓存机制 运用你所掌握的数据结构 设计和实现一个 LRU 最近最少使用 缓存机制 实现 LRU
  • 【转】在java中,OOA是什么?OOD是什么?OOP是什么?

    Object Oriented Analysis 面向对象分析方法 是在一个系统的开发过程中进行了系统业务调查以后 按照面向对象的思想来分析问题 OOA与结构化分析有较大的区别 OOA所强调的是在系统调查资料的基础上 针对OO方法所需要的素
  • C++ vector容器-44-vector插入和删除以及存取

    本篇继续学习vector容器 前面学习了vector是一个单端数组 也就是说vector的插入和删除 基本上都是在数组的末端进行 本篇要学习的vector插入和删除的方法就能体现这个特点 最后学习vector的存取操作 1 vector的插
  • 论文笔记 2023.5.22

    图像分类的深度卷积神经网络模型综述 图像分类的过程 图像预处理 图像特征提取 人工提取 传统图像分类算法 卷积操作提取 卷积神经网络 使用分类器对图像进行分类 以图像分类为载体 深度卷积神经网络模型主要包括以下四个类别 1 经典深度卷积神经
  • KVM处理器管理和硬件辅助虚拟化技术

    KVM处理器管理和硬件辅助虚拟化技术 Intel 在2006年发布了硬件虚拟化技术 其中支持X86体系结构的称为Intel VT x技术 AMD称为SVM技术 VT x引入了一种新的处理器操作 叫做VMX Virtual MachineEx
  • 基于多项贝叶斯的三分类的情感分析实现

    写在前面 本实验报告是一篇很水的水课的期末大作业 代码 数据集均为原创 意在用最少的代码和最简单的数据集完成老师留下的题目 仅供交流学习使用 禁止直接洗稿嗷 目录 写在前面 一 实验目的 二 实验手段和方法 三 实验内容 四 实验总结 一
  • 量子计算(13)基础知识4:量子测量

    量子测量是量子电路中最后一个元素 在电路中我们经常用到 下面 我将描述量子测量的数学依据以及与量子测量相关的科学定理 目录 一 量子测量 1 理论知识 2 计算基下测量单量子比特 二 两个原理 1 延迟测量原理 2 隐含测量原理 一 量子测
  • Linux下查找文件(日志)中的关键字

    进入到需要查看日志文件的目录 执行以下命令 即可快速定位到想要查看日志内容所在行 1 查看日志 前 n行 cat 或者 tail 日志文件名 head n 数量 示例1 cat api log head n 200 查看log前200行 示
  • three.js加载纹理总是黑色的问题

    什么是纹理 简单理解就是贴在几何体或平面的纹路 就比如一个杯子上的图案 菜鸟 包括我 根据three js教程上代码敲上去之后 纹理没有效果 查阅了半天 总结有以下几个原因 1 图片路径 谷歌浏览器需要在属性中按照如图配置 allow fi
  • SYS_PTRACE容器

    docker run cap add SYS PTRACE security opt seccomp unconfined security opt apparmor unconfined
  • 基于springboot+vue的电影视频订票咨询网站系统-Java项目毕业设计

    项目介绍 随着网络不断的普及发展 影城管理系统依靠网络技术的支持得到了快速的发展 首先要从用户的实际需求出发 通过了解用户的需求开发出具有针对性的首页 电影信息 电影资讯 个人中心 后台管理 在线客服功能 影城管理系统的主要使用者分为管理员
  • 全数字锁相环的研究与设计

    参考文档 http www doc88 com p 4364928925689 html 一篇硕士学位论文 全数字锁相环的研究与设计 https www docin com p 1390623327 html 基于延迟锁定环的TDC的设计
  • mysql 连接池断开后自动连接

    MySQL对所有连接的有效时间默认为28800秒 正好8小时 也就是说 如果一个连接8小时没有请求和操作 就会自动断开 但是对于 Hibernate来说 它的连接池并不知道它所管理的连接中是否有被MySQL断开的 如果一个程序要使用数据库连
  • 实时数仓之实际落地如何选型和构建

    往期类似文章 实时数仓之 Kappa 架构与 Lambda 架构 奔跑者 辉的博客 CSDN博客 企业级 实时数仓架构图 奔跑者 辉的博客 CSDN博客 第一部分 Spark基础篇 奔跑者 辉的博客 CSDN博客 第一部分 Flink基础篇
  • 找不到msvcp120dll,无法继续执行代码的修复方法

    本教程操作系统 Windows系统 msvcp120 dll是电脑文件中的dll文件 动态链接库文件 如果计算机中丢失了某个dll文件 可能会导致某些软件和游戏等程序无法正常启动运行 并且导致电脑系统弹窗报错 msvcp120 dll文件丢
  • 32 --> 详解 OpenWRT系统框架基础软件模块之netifd

    一 简介 OpenWrt路由操作系统的框架基础软件有很多 大部分是通用的软件模块 如 dhcp dnsmasq iproute cmwp vpn ipsec等等 OpenWrt还集成部分具有专属特征软件模块 也是OpenWRT系统核心框架软