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,一经查实,立即删除!

相关文章

C#调用WebService的方法

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

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

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

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

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

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…

Github——网页版上传文件夹

第一步:创建一个新的仓库或进入已存在的仓库页面 第二步:点进对应的文件夹下,然后 点击 “Upload files” 第三步:将文件夹拖拽到上传区域 打开资源管理器,将要上传的文件夹从计算机中拖拽到上传区域。 注意&#xf…

高级的SQL查询技巧有哪些?

成长路上不孤单😊😊😊😊😊😊 【14后😊///C爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于高级SQL查询技巧方面的相关内容&#xf…

FastStone 10.x 注册码

简介 FastStone Capture是一款经典好用的屏幕截图软件,在屏幕截图领域具有广泛的应用和众多优势。 软件基本信息 FastStone Capture体积小巧,占用内存少,这使得它在运行时不会给计算机系统带来过多的负担,即使在配置较低的电脑…

K8S详解(5万字详细教程)

目录 ​编辑 一、集群管理命令 二、命名空间 1. 获取命名空间列表 2. 创建命名空间 3. 删除命名空间 4. 查看命名空间详情 三、Pod 1. Pod概述 2. Pod相位状态 3. 管理命令 3.1 获取命名空间下容器(pod)列表 3.2 查看pod的详细信息 3.3 创建 && 运行 3.4 …

费舍尔信息矩阵全面讲述

费舍尔信息矩阵(Fisher Information Matrix) 费舍尔信息矩阵是统计学中一个非常重要的概念,尤其在参数估计、最大似然估计(MLE)和贝叶斯推断中具有广泛的应用。它反映了参数估计的不确定性程度,也可以用来…

Zookeeper的监听机制

Zookeeper的监听机制是其实现分布式协调服务的一个核心功能。 它允许客户端注册Watcher(观察者)来监听特定的Znode(节点)上的事件,当Znode的状态发生变化时,Zookeeper会向注册了Watcher的客户端发送通知。…

[原创](Modern C++)现代C++的第三方库的导入方式: 例如Visual Studio 2022导入GSL 4.1.0

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共23年] 职业生涯: 21年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delphi、XCode、Eclipse…

2002 - Can‘t connect to server on ‘192.168.1.XX‘ (36)

参考:2002 - Can‘t connect to server on ‘192.168.1.XX‘ (36) ubantu20.04,mysql5.7.13 navicat 远程连接数据库报错 2002 - Can’t connect to server on ‘192.168.1.61’ (36) 一、查看数据库服务是否有启动,发现有启动 systemctl status mysql…

漏洞检测工具:允许TRACE方法漏洞

允许TRACE方法漏洞 漏洞定义 TRACE方法是HTTP协议中定义的一种调试方法,主要用于测试或诊断Web服务器连接。Web服务器在配置时未正确禁用HTTP TRACE方法,从而允许客户端向服务器发送TRACE请求,并导致服务器返回可能包含敏感信息的响应。 漏…

linux socket编程之udp_dict_serve服务端--引入配置文件

注意:本篇博客只是对上一篇博客功能的增加 1.创建配置文件(翻译) Dict.txt apple: 苹果 banana: 香蕉 cat: 猫 dog: 狗 book: 书 pen: 笔 happy: 快乐的 sad: 悲伤的 run: 跑 jump: 跳 teacher: 老师 student: 学生 car: 汽车 bus: 公交车 love: 爱 hate: 恨 hell…

ESP32S3 使用LVGL驱动LCD屏(ST7789主控)

ESP32S3 使用LVGL驱动LCD屏(ST7789主控) 目录 1 分析原理图 2 驱动、点亮LCD(ST7789) 2.1 在工程中添加目录、文件 2.2 添加esp_lvgl_port组件 2.3 对工程进行必要的配置 2.4 编写必要代码 3 烧录、验证 1 分析原理图 要使用SOC驱动LCD屏&#…