Android10 rk3399 以太网接入流程分析

Netd守护进程服务

  • Netd模块是Android中专门负责网络管理和控制的后台守护进程
  • 开发板路径./etc/init/netd.rc
service netd /system/bin/netdclass mainsocket dnsproxyd stream 0660 root inetsocket mdns stream 0660 root systemsocket fwmarkd stream 0660 root inetonrestart restart zygoteonrestart restart zygote_secondary# b/121354779: netd itself is not updatable, but on startup it dlopen()s the resolver library# from the DNS resolver APEX. Mark it as updatable so init won't start it until all APEX# packages are ready.updatable
~

Netd源码分析

system\netd\server\main.cpp

int main() {Stopwatch s;gLog.info("netd 1.0 starting");android::net::process::removePidFile(PID_FILE_PATH);android::net::process::blockSigPipe();// Before we do anything that could fork, mark CLOEXEC the UNIX sockets that we get from init.// FrameworkListener does this on initialization as well, but we only initialize these// components after having initialized other subsystems that can fork.for (const auto& sock :{DNSPROXYLISTENER_SOCKET_NAME, FwmarkServer::SOCKET_NAME, MDnsSdListener::SOCKET_NAME}) {setCloseOnExec(sock);}// Before we start any threads, populate the resolver stub pointers.resolv_stub_init();// Make sure BPF programs are loaded before doing anythingwhile (!android::base::WaitForProperty("bpf.progs_loaded", "1",std::chrono::seconds(5))) {ALOGD("netd waited 5s for bpf.progs_loaded, still waiting...");}NetlinkManager *nm = NetlinkManager::Instance();if (nm == nullptr) {ALOGE("Unable to create NetlinkManager");exit(1);};

这里会实例NetlinkManager,用来管理网络,同时会实例NetlinkHandler 用于处理网络消息
/system/netd/server/NetlinkManager.cpp

NetlinkHandler *NetlinkManager::setupSocket(int *sock, int netlinkFamily,int groups, int format, bool configNflog) {·········
·········NetlinkHandler *handler = new NetlinkHandler(this, *sock, format);if (handler->start()) {ALOGE("Unable to start NetlinkHandler: %s", strerror(errno));close(*sock);return nullptr;}return handler;
}

NetlinkHandler 网络的变化都会在onEvent里处理

system/netd/server/NetlinkHandler.cpp

····
····
void NetlinkHandler::onEvent(NetlinkEvent *evt) {const char *subsys = evt->getSubsystem();if (!subsys) {ALOGW("No subsystem found in netlink event");return;}if (!strcmp(subsys, "net")) {NetlinkEvent::Action action = evt->getAction();const char *iface = evt->findParam("INTERFACE");if ((action == NetlinkEvent::Action::kAdd) ||(action == NetlinkEvent::Action::kLinkUp) ||(action == NetlinkEvent::Action::kLinkDown)) {const char *ifIndex = evt->findParam("IFINDEX");long ifaceIndex = parseIfIndex(ifIndex);if (ifaceIndex) {gCtls->trafficCtrl.addInterface(iface, ifaceIndex);} else {ALOGE("invalid interface index: %s(%s)", iface, ifIndex);}}if (action == NetlinkEvent::Action::kAdd) {notifyInterfaceAdded(iface);} else if (action == NetlinkEvent::Action::kRemove) {notifyInterfaceRemoved(iface);} else if (action == NetlinkEvent::Action::kChange) {evt->dump();notifyInterfaceChanged("nana", true);} else if (action == NetlinkEvent::Action::kLinkUp) {ALOGW("zzz klinkup");notifyInterfaceLinkChanged(iface, true);} else if (action == NetlinkEvent::Action::kLinkDown) {ALOGW("zzz klinkdown");notifyInterfaceLinkChanged(iface, false);
····
····}

./system/netd/server/binder/android/net/INetdUnsolicitedEventListener.aidl

void NetlinkHandler::notifyInterfaceLinkChanged(const std::string& ifName, bool up) {LOG_EVENT_FUNC(BINDER_RETRY, onInterfaceLinkStateChanged, ifName, up);
}

./frameworks/base/services/core/java/com/android/server/NetworkManagementService.java
onInterfaceLinkStateChanged

   public void onInterfaceLinkStateChanged(String ifName, boolean up)throws RemoteException {Slog.e(TAG, "zzz onInterfaceLinkStateChanged    " + ifName + up);mDaemonHandler.post(() -> notifyInterfaceLinkStateChanged(ifName, up));}

system/netd/server/NetlinkHandler.cpp

//LOG_EVENT_FUNC 宏是一个灵活的工具,用于记录网络事件相关的日志,并结合重试机制来决定是否执行日志记录。
//它通过遍历事件监听器,调用指定的函数,并根据执行结果决定是否记录日志,支持动态的日志内容和自动的执行时间计算。
void NetlinkHandler::notifyInterfaceLinkChanged(const std::string& ifName, bool up) {LOG_EVENT_FUNC(BINDER_RETRY, onInterfaceLinkStateChanged, ifName, up);
}

system/netd/server/binder/android/net/INetdUnsolicitedEventListener.aidl

oneway interface INetdUnsolicitedEventListener {
··········
/**
¦* Notifies that the link state of the specific interface has changed.
¦*
¦* @param ifName the name of the interface whose link state has changed
¦* @param up true for interface link state up, false for link state down
¦*/
void onInterfaceLinkStateChanged(@utf8InCpp String ifName, boolean up);
······
·····
public class NetworkManagementService extends INetworkManagementService.Stub {
·····
private void invokeForAllObservers(NetworkManagementEventCallback eventCallback) {
.........
/**¦* Notify our observers of an interface link state change¦* (typically, an Ethernet cable has been plugged-in or unplugged).¦*/private void notifyInterfaceLinkStateChanged(String iface, boolean up) {¦   invokeForAllObservers(o -> o.interfaceLinkStateChanged(iface, up));}
.........

frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetTracker.java

   private class InterfaceObserver extends BaseNetworkObserver {@Overridepublic void interfaceLinkStateChanged(String iface, boolean up) {if (DBG) {Log.i(TAG, "interfaceLinkStateChanged, iface: " + iface + ", up: " + up);}if(isEthernetInterfaceActive())mHandler.post(() -> updateInterfaceState(iface, up));mHandler.post(() -> mEthernetNetworkFactoryExt.interfaceLinkStateChanged(iface, up));}@Overridepublic void interfaceAdded(String iface) {mHandler.post(() -> maybeTrackInterface(iface));mHandler.post(() -> mEthernetNetworkFactoryExt.interfaceAdded(iface));}@Overridepublic void interfaceRemoved(String iface) {mHandler.post(() -> removeInterface(iface));mHandler.post(() -> mEthernetNetworkFactoryExt.interfaceRemoved(iface));}}

这段代码定义了一个名为 InterfaceObserver 的类,它继承自 BaseNetworkObserver
并重写了 BaseNetworkObserver 中的三个方法:interfaceLinkStateChanged、interfaceAdded 和 interfaceRemoved。这些方法用于监听网络接口的状态变化,并根据变化做相应的处理。
具体来说,这些方法会在网络接口状态发生变化时调用,并通过 mHandler 将相应的操作(如更新接口状态、添加或移除接口)异步地提交到主线程进行处理

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

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

相关文章

框架专题:反射

1. 什么是反射? 简单来说,反射是一种程序自省的能力,即在程序运行时动态地获取其结构信息或操作其行为。这包括类、方法、属性等元信息。反射的核心在于让代码变得更加动态化,从而突破静态语言的限制。 以Java为例,反…

Git:查看分支、创建分支、合并分支

一、查看分支 查看的git命令如下: git branch # 列出本地已经存在的分支,并且当前分支会用*标记 git branch -r # 查看远程版本库的分支列表 git branch -a # 查看所有分支列表(包括本地和远程,remotes/开头的表示远程分支&…

【深度学习】论文复现-对论文数据集的一些处理

如何书写伪代码: ref:https://www.bilibili.com/video/BV12D4y1j7Zf/?vd_source3f7ae4b9d3a2d84bf24ff25f3294d107 i14时产出的图片比较合理 import json import os.path from matplotlib.ticker import FuncFormatter import pandas as pd import matplotlib.py…

C#调用WebService的方法

一、前言 在日常工作中,如果涉及到与第三方进行接口对接,有的会使用WebService的方式,这篇文章主要讲解在.NET Framework中如何调用WebService。 1.创建WebService (1)新建项目——模板选择ASP.NET Web 应用程序 &a…

Java CPU飙升 排查

一、概述 CPU 是整个电脑的核心计算资源,CPU的最小执行单元是 线程; 在现代操作系统中,进程和线程是两种主要的调度单位; 进程是程序中正在运行的一个应用程序,而线程是系统分配处理器时间资源的基本单位。一个进程至少…

Qt creator ,语言家功能缺失解决方法

1、找到工具->外部->配置 2、添加目录,双击命名语言家 3、在语言家目录下,添加工具 双击重命名lupdate,即更新翻译 %{CurrentDocument:Project:QT_INSTALL_BINS}\lupdate%{CurrentDocument:Project:FilePath}%{CurrentDocument:Projec…

12寸半导体厂等保安全的设计思路

等级保护(等保)二级和三级的主要区别在于安全要求的严格程度、所需部署的安全措施和设备、以及对安全事件响应和处理的能力。以下是等保二级和三级之间的一些关键区别: 一、 安全要求严格程度: - 等保二级:适用于需要较高安全保护的信息系统,要求能够防范轻微的恶意攻击…

Docker Compose 配置指南

目录 1. Docker Compose 配置1.1 基本配置结构1.2 docker-compose.yml 的各部分1.3 常用配置选项 2. Docker Compose 使用方法2.1 创建 Docker Compose 配置文件2.2 启动服务2.3 查看容器状态2.4 查看服务日志2.5 停止服务2.6 重新构建服务 3. Docker Compose 常用命令3.1 dock…

Taro小程序开发性能优化实践

我们团队在利用Taro进行秒送频道小程序的同时,一直在探索性能优化的最佳实践。随着需求的不断迭代,项目中的性能问题难免日积月累,逐渐暴露出来影响用户体验。适逢双十一大促,我们趁着这个机会统一进行了Taro性能优化实践&#xf…

手动修改nginx-rtmp模块,让nginx-rtmp-module支持LLHLS

文章目录 1. 背景2. 开发环境搭建2.1 ffmpeg在ubuntu上安装2.2 nginx-rtmp-module在ubuntu上安装2.3 安装vscode环境2. 修改nginx-rtmp-module2.1 主要更新内容2.2 新增配置项2.3 代码更新3. LLHLS验证方法3.1 配置验证3.2 功能验证4. 注意事项5. 已知问题6. 后续计划1. 背景 …

Git的简介

文章目录 一.Git是什么二.核心概念三.工作流程四.Git的优势 下载Git 推荐官网下载 官网地址 一.Git是什么 Git是一个分布式版本控制系统,用于跟踪文件的变化并协调多人对同一项目的开发工作。它就像是一个时光机器,能够记录文件在不同时间点的状态&…

springboot471基于协同过滤算法商品推荐系统(论文+源码)_kaic

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装协同过滤算法商品推荐系统软件来发挥其高效地信息处理的作用…

进程间关系与守护进程

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 进程间关系与守护进程 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 1. 进程组 什…

【NLP 16、实践 ③ 找出特定字符在字符串中的位置】

看着父亲苍老的白发和渐渐老态的面容 希望时间再慢一些 —— 24.12.19 一、定义模型 1.初始化模型 ① 初始化父类 super(TorchModel, self).__init__(): 调用父类 nn.Module 的初始化方法,确保模型能够正确初始化。 ② 创建嵌入层 self.embedding n…

javaEE-多线程编程-3

目录 java 常见的包 : 回调函数: 什么是线程: 第一个线程: 验证多线程执行: 内核: 调用sleep()方法: 执行结果分析: 线程创建的几种方式: 1.继承Thread类,重写run()方法. 2.实现Runnable接口,重写run()方法. 3.继承Thread类,重写run()方法.但使用匿名内部类 4.实现…

怎么在idea中创建springboot项目

最近想系统学习下springboot,尝试一下全栈路线 从零开始,下面将叙述下如何创建项目 环境 首先确保自己环境没问题 jdkMavenidea 创建springboot项目 1.打开idea,选择file->New->Project 2.选择Spring Initializr->设置JDK->…

设计模式期末复习

一、设计模式的概念以及分类 是一套被反复使用,多数人知晓,经过分类编目,代码设计经验的总结,描述了在软件设计的过程中不断重复发生的问题,以及该问题的解决方案,他是解决特定问题的一系列套路&#xff0c…

哔哩哔哩视频能保存到本地吗

哔哩哔哩(B站)视频可以保存到本地,但需要根据具体情况选择方法。以下是一些常见的方式: 使用B站客户端的离线功能 B站官方客户端(移动端或PC端)提供了离线下载功能,适用于已开通权限的视频。 离…

FreeMarker语法

1. 查找转移 <#function getSubSlot x > <#return (x) ? switch( "1", "L", "2", "R", "" )> </#function> 2. 转换数字 ?number ${mergedMap[placement.sequence].material.subs…

OCR(五)linux 环境 基于c++的 paddle ocr 编译【CPU版本 】

1. 下载 下载opencv4.10 2. 编译opencv 2.1 安装依赖库 sudo apt install -y g ++ sudo apt install -y cmake sudo apt install -y make sudo apt install -y wget sudo apt install -y unzip sudo apt-get install build-essential libgtk2.0-dev libgtk-3-devlibavcodec-…