VSOMEIP代码阅读整理(1) - 网卡状态监听

一. 概述

在routing进程所使用的配置文件中,存在如下配置项目:
{"unicast" : "192.168.56.101",..."service-discovery" :{"enable" : "true","multicast" : "224.244.224.245",...}
}
其中有 "unicast" : "192.168.56.101"和	"multicast" : "224.244.224.245" 两个通信地址,这两个地址一个是用于vsomeip用于对外通信的单播地址,另一个配置的是service-discovery功能依赖的组播的地址。作为routingmanager的进程需要监听这个单播地址和组播地址所在的网卡的状态,这部分功能主要在netlink_connector中实现,routing_manager_imp依赖netlink_connector来监听网卡状态,并且在网卡状态ready的情况下才会启动routing。netlink_connector中使用到了linux平台的netlink协议用于监听内核上网卡相关事件。

二. netlink protocol

netlink是linux平台上第一种IPC机制,主要用于用户态进程与内核进程通信,此外还可以用于用户态进程之间通信(这个使用unix domain socket)也可以做到。netlink和传统的和内核通信的机制(ioctl,sysfs属性)等不同,netlink是支持全双工的通信的,也就是可以异步通信的,而其他几种传统的内核通信的机制只支持半双工同步通信的方式。在这种情况下,内核甚至支持主动发起通信,而不是由应用发起通信。此外,netlink支持组播的方式,以组播的方式将消息发给多个进程(根据groupid)。

img

netlink的通信方式使用的是socket API,创建NETLINK socket的时候,需要指定NETLINK socket的协议类型类型()
sock = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);   // NETLINK_ROUTE是协议类型
目前的linxu系统中支持32中协议类型,个人认为这个协议类型就是事件组(网卡/路由/安全/审计/SCSI设备...等等)。
#define NETLINK_ROUTE        0    /* 用于设置和查询路由表等网络核心模块*/
#define NETLINK_UNUSED        1    /* Unused number                */
#define NETLINK_USERSOCK    2    /* Reserved for user mode socket protocols,保留用于用户态进程间通信     */
#define NETLINK_FIREWALL    3    /* Unused number, formerly ip_queue        */
#define NETLINK_SOCK_DIAG    4    /* socket monitoring                */
#define NETLINK_NFLOG        5    /* netfilter/iptables ULOG */
...
...
NETLINK socket需要做bind操作绑定NETLINK的地址,NETLINK地址结构如下:
struct sockaddr_nl {__kernel_sa_family_t    nl_family;    /* 协议族 AF_NETLINK    */unsigned short    nl_pad;        /* 固定填写0 zero        */__u32        nl_pid;        /* 端口ID,内核填0,应用进程填PID port ID    */__u32        nl_groups;    /* 广播组 multicast groups mask */
};
除了nl_pad固定为0以外,其他参数需要填写
struct sockaddr_nl addr;
memset(&addr, 0, sizeof(addr));
addr.nl_family = AF_NETLINK;    // 协议族
// RTMGRP_LINK: 网卡UP/DOWN
// RTMGRP_IPV4_IFADDR: ip地址变化
addr.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR;    // 广播组(事件组中的具体事件)
  设置好NETLINK地址后,将其绑定到socket上面
bind(sock, (struct sockaddr *)&addr, sizeof(addr);
接着,就可以使用该socket和内核进行netlink通信了,通过标准recv接口从内核接收消息
while (running && (len = recv(sock, buffer, 4096, 0)) > 0) {nlh = (struct nlmsghdr *)buffer;while (NLMSG_OK(nlh, len) && (nlh->nlmsg_type != NLMSG_DONE)) {// 解析不同类型的NetLink消息...// 下一条消息nlh = NLMSG_NEXT(nlh, len);}
}
close(sock);

三. netlink_connector

​ netlink_connector类依赖了NETLINK通信机制和内核进行通信,用于监控网卡的状态,根据传入的单播地址和组播地址监控。

​ 首先netlink_connector类中也创建了用于NETLINK通信的socket

class netlink_connector : public std::enable_shared_from_this<netlink_connector> {...
private:...boost::asio::basic_raw_socket<nl_protocol> socket_;  // nl_protocol结构体中默认famliy为PF_NETLINK, type为SOCK_RAW...
}void netlink_connector::start() {...socket_.open(nl_protocol(NETLINK_ROUTE), ec);   // 协议类型为NETLINK_ROUTE,用于设置和查询路由表等网络核心模块...socket_.bind(nl_endpoint<nl_protocol>(RTMGRP_LINK |        // - 当网卡变动时会触发这个多播组RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR |  // 当ipv4/ipv6地址变动时会触发这个多播组RTMGRP_IPV4_ROUTE | RTMGRP_IPV6_ROUTE |    // 当ipv4/ipv6路由变动时会触发这个多播组RTMGRP_IPV4_MROUTE | RTMGRP_IPV6_MROUTE), ec);   // 当多播路由发生更新时会触发这个多播组

​ 然后,使用创建的socket接收内核的消息并且解析,根据不同的事件回调上层routing_manager_impl

socket_.async_receive(boost::asio::buffer(&recv_buffer_[0], recv_buffer_size),std::bind(&netlink_connector::receive_cbk,shared_from_this(),std::placeholders::_1,std::placeholders::_2)
);void netlink_connector::receive_cbk(boost::system::error_code const &_error,std::size_t _bytes) {while ((NLMSG_OK(nlh, len)) && (nlh->nlmsg_type != NLMSG_DONE)) {char ifname[IF_NAMESIZE];switch (nlh->nlmsg_type) { // 根据多播组内的消息类型分别处理case RTM_NEWADDR: {    // IP地址变化// 解析出消息中的IP地址,如果该IP是VSOMEIP配置的单播地址,则往下// 根据IP地址找到网卡,获取其状态(UP/DOWN)// 通知上层handler处理(handler第一个参数标志是单播还是组播地址的网卡)}break;case RTM_NEWLINK: {    // 网卡变化// 获取网卡IP,如果该IP是VSOMEIP配置的单播地址,则往下// 获取网卡状态// 通知上层handler处理}break;case RTM_NEWROUTE: {   // 路由添加check_sd_multicast_route_match(...) {// 读取路由项的目标地址(RTA_DST),判断地址是否为SD的组播地址// 读取路由项的输出网络设备索引,判断设备索引是否为单播地址通信使用的网络设备的索引// 读取路由项的网关地址// 1. 如果单播地址通信使用的网络设备被加到SD的组播中,返回true// 2. 如果单播地址通信使用的网络设备被添加到组播,但是组播地址长度为0,返回true(使用默认路由作为SD的地址)// 3. 不满足上面两种情况,返回false}// check_sd_multicast_route_match返回true,则通知上层组播准备好了}break;case RTM_DELROUTE: {   // 路由删除check_sd_multicast_route_match(...) {...}// check_sd_multicast_route_match返回true,则通知上层组播未准备好}break;...}
}

​ 对于netlink_connector,其监听网卡以及组播路由的变化事件。routing_manager_impl则是这些事件的消费者

void routing_manager_impl::start() {...netlink_connector_->register_net_if_changes_handler(std::bind(&routing_manager_impl::on_net_interface_or_route_state_changed,this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));...
}

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

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

相关文章

Oracle 表空间时间点恢复

已有一个数据库全备&#xff0c;在PDB中恢复被drop掉的表空间 1.新建表空间 create tablespace PITR_TBS datafile /u01/app/oracle/oradata/PRODCDB/PDBPROD2/PITR_TBS01.dbf size 10m; 2.使用RMAN备份. backup as compressed backupset database INCLUDE CURRENT CONTROLFI…

从零开始搭建UVM平台(八)-加入agent

书接上回&#xff1a; 从零开始搭建UVM平台&#xff08;一&#xff09;-只有uvm_driver的验证平台 从零开始搭建UVM平台&#xff08;二&#xff09;-加入factory机制 从零开始搭建UVM平台&#xff08;三&#xff09;-加入objection机制 从零开始搭建UVM平台&#xff08;四&…

Cortex微控制器软件接口标准(CMSIS)

Cortex微控制器软件接口标准 目前&#xff0c;软件开发已经是嵌入式系统行业公认的主要开发成本&#xff0c;通过将所有Cortex-M芯片供应商产品的软件接口标准化&#xff0c;能有效降低这一成本&#xff0c;尤其是进行新产品开发或者将现有项目或软件移植到基于不同厂商MCU的产…

react-问卷星项目(4)

项目实战 使用CSS 尽量不要使用内联CSS 内联style代码多&#xff0c;性能差&#xff0c;扩展性差外链css文件可复用代码&#xff0c;可单独缓存文件 元素内联style 和HTMl元素的style相似必须用JS写法&#xff0c;不能是字符串&#xff0c;里面必须是对象 <span style…

进阶数据库系列(十三):PostgreSQL 分区分表

概述 在组件开发迭代的过程中&#xff0c;随着使用时间的增加&#xff0c;数据库中的数据量也不断增加&#xff0c;因此数据库查询越来越慢。 通常加速数据库的方法很多&#xff0c;如添加特定的索引&#xff0c;将日志目录换到单独的磁盘分区&#xff0c;调整数据库引擎的参…

无人化焦炉四大车系统 武汉正向科技 工业机车无人远程控制系统

焦炉四大车无人化系统介绍 采用格雷母线光编码尺双冗余定位技术&#xff0c;炉门视觉定位自学习技术&#xff0c;wifi5G无线通讯技术&#xff0c;激光雷达安全识别技术&#xff0c;焦化智慧调度&#xff0c;手机APP监控功能。 焦炉四大车无人化系统功能 该系统能自动生成生产…

IDTL:茶叶病害识别数据集(猫脸码客 第205期)

Identifying Disease in Tea Leaves茶叶病害识别数据集 一、引言 在农业领域&#xff0c;茶叶作为一种重要的经济作物&#xff0c;其生产过程中的病害防治是确保茶叶质量和产量的关键环节。然而&#xff0c;传统的病害识别方法主要依赖于人工观察和经验判断&#xff0c;这不仅…

Nature Machine Intelligence 基于强化学习的扑翼无人机机翼应变飞行控制

尽管无人机技术发展迅速&#xff0c;但复制生物飞行的动态控制和风力感应能力&#xff0c;仍然遥不可及。生物学研究表明&#xff0c;昆虫翅膀上有机械感受器&#xff0c;即钟形感受器campaniform sensilla&#xff0c;探测飞行敏捷性至关重要的复杂气动载荷。 近日&#xff0…

STM32引脚PB3、PB4、PA15作为输入输出的特殊配置

一、问题描述 简单描述&#xff1a; 最近做的一个项目中&#xff0c;PB3端口配置为输入&#xff0c;不管外部输入是高电平还是低电平&#xff0c;一直读取到的是低电平。 调试过程&#xff1a;在撰写代码过程中&#xff0c;又发现新的问题&#xff0c;Enter按键无法控制屏幕数…

【Python】ftfy 使用指南:修复 Unicode 编码问题

ftfy&#xff08;fixes text for you&#xff09;是一个专为修复各种文本编码错误而设计的 Python 工具。它的主要目标是将损坏的 Unicode 文本恢复为正确的 Unicode 格式。ftfy 并非用于处理非 Unicode 编码&#xff0c;而是旨在修复因为编码不一致、解码错误或混合编码导致的…

物流行业中的AI平台架构与智能化应用

随着物流行业的迅速发展&#xff0c;尤其是电商、仓储、运输的需求日益增多&#xff0c;AI技术逐渐成为推动物流企业高效运营、提升服务水平的关键力量。AI平台架构为物流行业的各个环节提供了智能化解决方案&#xff0c;助力物流企业在仓储管理、运输调度、客户服务等方面实现…

Redis: Sentinel工作原理和故障迁移流程

Sentinel 哨兵几个核心概念 1 ) 定时任务 Sentinel 它是如何工作的&#xff0c;是如何感知到其他的 Sentinel 节点以及 Master/Slave节点的就是通过它的一系列定时任务来做到的&#xff0c;它内部有三个定时任务 第一个就是每一秒每个 Sentinel 对其他 Sentinel 和 Redis 节点…

【2023工业3D异常检测文献】Shape-Guided: 基于形状引导和双记忆库的异常检测方法

Shape-Guided Dual-Memory Learning for 3D Anomaly Detection 1、Background 提出了一个以形状为指导的专家学习框架&#xff0c;用于解决无监督3D异常检测的问题。 该方法建立在两个专门的专家模型及其协同作用的基础上&#xff0c;以从颜色和形状模态中定位异常区域。 第…

基于单片机跑步机控制系统设计

** 文章目录 前言概要功能设计设计思路 软件设计效果图 程序文章目录 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对…

详细分析BigDecimal基本知识(附Demo)

目录 前言1. 基本知识2. Demo 前言 之所以深入了解这个函数的用法&#xff0c;发现还可这么使用 基本的Java知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;【Java项目】实战CRUD的功能整理&#xff08;持续更…

多区域OSPF路由协议

前言 之前也有过关于OSPF路由协议的博客&#xff0c;但都不是很满意&#xff0c;不是很完整。现在也是听老师讲解完OSPF路由协议&#xff0c;感触良多&#xff0c;所以这里重新整理一遍。这次应该是会满意的 一些相关概念 链路状态 链路指路由器上的一个接口&#xff0c;链路状…

ChatGPT实时语音将于本周向免费用户推出:OpenAI DevDay 2024详细解读

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

Windows 环境搭建 CUDA 和 cuDNN 详细教程

CUDA CUDA&#xff08;Compute Unified Device Architecture&#xff09;是由NVIDIA公司推出的一个并行计算平台和编程模型&#xff0c;它允许开发者使用NVIDIA GPU进行通用计算&#xff08;即GPGPU&#xff09;&#xff0c;从而加速各种计算密集型任务。CUDA提供了一套基于C/C…

深度学习:cGAN和pix2pix图像转换

cGAN和pix2pix的基础概念 cGAN cGAN是条件生成对抗网络&#xff08;Conditional Generative Adversarial Networks&#xff09;的简称。 它是一种基于基础GAN&#xff08;Generative Adversarial Networks&#xff09;架构的变体&#xff0c;通过给GAN模型引入额外的信息或条…

【零基础入门产品经理】学习准备篇 | 需要学一些什么呢?

前言&#xff1a; 零实习转行产品经理经验分享01-学习准备篇_哔哩哔哩_bilibili 该篇内容主要是对bilibili这个视频的观后笔记~谢谢美丽滴up主友情分享。 全文摘要&#xff1a;如何在0实习且没有任何产品相关经验下&#xff0c;如何上岸产品经理~ 目录 一、想清楚为什么…