Ethernet framework层分析

一.应用层及AIDL

1.EthernetManager

1>通过(EthernetManager) context.getSystemService(Context.ETHERNET_SERVICE)获取到EthernetManager
2>IEthernetManager为EthernetServiceImpl.java
EthernetServiceImpl的主要方法如下

  //启动 ,SystemServer创建EthernetService时调用,具体来自http://aospxref.com/android-10.0.0_r47/xref/frameworks/base/services/java/com/android/server/SystemServer.java#1368
public void start() {
        mTracker = new EthernetTracker(mContext, mHandler);
        mTracker.start();
    }
public String[] getAvailableInterfaces() throws RemoteException {
        return mTracker.getInterfaces(checkUseRestrictedNetworksPermission());
    }
public IpConfiguration getConfiguration(String iface) {
        return new IpConfiguration(mTracker.getIpConfiguration(iface));
    }
 public void setConfiguration(String iface, IpConfiguration config) {
        mTracker.updateIpConfiguration(iface, new IpConfiguration(config));
    }

2.DnsManager

原生只在ConnectivityService中调用
主要方法如下

public PrivateDnsConfig getPrivateDnsConfig() {  //获取Global PRIVATE_DNS_DEFAULT_MODE的值
        return getPrivateDnsConfig(mContentResolver);
    }
public PrivateDnsConfig updatePrivateDns(Network network, PrivateDnsConfig cfg) {
        return (cfg != null)
                ? mPrivateDnsMap.put(network.netId, cfg)
                : mPrivateDnsMap.remove(network.netId);
    }
public void setDnsConfigurationForNetwork(int netId, LinkProperties lp, boolean isDefaultNetwork) {
     updateParametersSettings();
      //通过DnsResolver.Stub .asInterface(ServiceManager.getService("dnsresolver"))获取,实现类为DnsResolverService.cpp,对应IDnsResolver
      mDnsResolver.setResolverConfiguration(paramsParcel);
       if (isDefaultNetwork) setDefaultDnsSystemProperties(lp.getDnsServers()); //设置属性net.dns
        flushVmDnsCache();
}
public void removeNetwork(Network network) {
        mPrivateDnsMap.remove(network.netId);
        mPrivateDnsValidationMap.remove(network.netId);
    }

3.IpConnectivityMetrics,对应IIpConnectivityMetrics.aidl

具体由http://aospxref.com/android-10.0.0_r47/xref/frameworks/base/services/java/com/android/server/SystemServer.java#1078启动

主要方法如下

public boolean addNetdEventCallback(int callerType, INetdEventCallback callback) {
            return mNetdListener.addNetdEventCallback(callerType, callback);  //mNetdListener为NetdEventListenerService,继承INetdEventListener
        }
public boolean removeNetdEventCallback(int callerType) {
            return mNetdListener.removeNetdEventCallback(callerType);
 }

4.ConnectivityService ,继承IConnectivityManager

系统网络连接管理服务,主要处理APP网络监听和请求,通知网络变化;处理WiFi/Telephony/Ethernet等各个链路的网络注册,更新链路信息;网络检测/评分与网络选择

具体由http://aospxref.com/android-10.0.0_r47/xref/frameworks/base/services/java/com/android/server/SystemServer.java#1374创建

由ConnectivityManager进行调用

ConnectivityManager可通过(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);调用

主要方法如下:

//ConnectivityManager
 public Network getActiveNetwork() {
            return mService.getActiveNetwork();
    }
 public NetworkInfo getNetworkInfo(int networkType) {
            return mService.getNetworkInfo(networkType);
    }
public Network[] getAllNetworks() {
            return mService.getAllNetworks();
    }
public void setAirplaneMode(boolean enable) { //打开关闭飞行模式
            mService.setAirplaneMode(enable);
}
public int setUsbTethering(boolean enable) {  //设置usb网络共享开关
            String pkgName = mContext.getOpPackageName();
            return mService.setUsbTethering(enable, pkgName);
    }
public void startTethering(int type, boolean showProvisioningUi,//开启usb网络共享
            final OnStartTetheringCallback callback) {
        startTethering(type, showProvisioningUi, callback, null);
    }
public void stopTethering(int type) {
            mService.stopTethering(type, pkgName);
    }
private INetworkManagementService getNetworkManagementService() {
            IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);
            mNMService = INetworkManagementService.Stub.asInterface(b);
            return mNMService;
        }
    }
public void requestNetwork(@NonNull NetworkRequest request,
        NetworkCapabilities nc = request.networkCapabilities;
        sendRequestForNetwork(nc, networkCallback, timeoutMs, REQUEST, legacyType, cbHandler);
    }
 
//ConnectivityService
 private void makeDefault(NetworkAgentInfo newNetwork) {   //切换网络,由updateNetworkInfo调用,来自其它模块调用NetworkAgent.java中的sendNetworkInfo发送EVENT_NETWORK_INFO_CHANGED
        if (DBG) log("Switching to new default network: " + newNetwork);
 
        try {
            mNMS.setDefaultNetId(newNetwork.network.netId);
        } catch (Exception e) {
            loge("Exception setting default network :" + e);
        }
 
        notifyLockdownVpn(newNetwork);
        handleApplyDefaultProxy(newNetwork.linkProperties.getHttpProxy());
        updateTcpBufferSizes(newNetwork.linkProperties.getTcpBufferSizes());
        mDnsManager.setDefaultDnsSystemProperties(newNetwork.linkProperties.getDnsServers());
        notifyIfacesChangedForNetworkStats();
        // Fix up the NetworkCapabilities of any VPNs that don't specify underlying networks.
        updateAllVpnsCapabilities();
    }

5.NsdService 继承INsdManager,外部接口类NsdManager

由http://aospxref.com/android-10.0.0_r47/xref/frameworks/base/services/java/com/android/server/SystemServer.java#1387创建

NsdManager可通过 (NsdManager) getContext().getSystemService(Context.NSD_SERVICE)获取,其主要方法如下:

public void resolveService(NsdServiceInfo serviceInfo, ResolveListener listener) {
        mAsyncChannel.sendMessage(RESOLVE_SERVICE, 0, key, serviceInfo);
    }
public void setEnabled(boolean enabled) {  //设置Settings.Global.NSD_ON的值
            mService.setEnabled(enabled);
    }

6.NetworkPolicyManagerService ,继承INetworkPolicyManager,外部类NetworkPolicyManager

网络策略管理服务,这些策略一般指对APP的网络和限制和放行,通过netfilter来实现

由http://aospxref.com/android-10.0.0_r47/xref/frameworks/base/services/java/com/android/server/SystemServer.java#1316创建

主要方法如下:

public void setUidPolicy(int uid, int policy) {
            mService.setUidPolicy(uid, policy);
    }
public void setNetworkPolicies(NetworkPolicy[] policies) {
            mService.setNetworkPolicies(policies);
    }

7.NetworkStatsService 继承INetworkStatsService

这个服务主要收集网络数据,如各个Iface上下行网络流量的字节数等。APP或者其他服务可以通过该服务获取网络流量信息等

由http://aospxref.com/android-10.0.0_r47/xref/frameworks/base/services/java/com/android/server/SystemServer.java#1307创建

可通过INetworkStatsService.Stub.asInterface(ServiceManager.getService(Context.NETWORK_STATS_SERVICE))调用

里面的mNetworkManager为NetworkManagementService

二.framework层分析

1.ConnectivityService

//getActiveNetwork

public Network getActiveNetwork() {
        return getActiveNetworkForUidInternal(Binder.getCallingUid(), false);
    }
 private Network getActiveNetworkForUidInternal(final int uid, boolean ignoreBlocked) {
        nai = getDefaultNetwork();
        return nai != null ? nai.network : null;
    }
 private NetworkAgentInfo getDefaultNetwork() {
        return getNetworkForRequest(mDefaultRequest.requestId);
    }
private NetworkAgentInfo getNetworkForRequest(int requestId) {
        synchronized (mNetworkForRequestId) {
            return mNetworkForRequestId.get(requestId);
        }
    }
1.mDefaultRequest.requestId
mDefaultRequest = createDefaultInternetRequestForTransport(-1, NetworkRequest.Type.REQUEST);
  return new NetworkRequest(netCap, TYPE_NONE, nextNetworkRequestId(), type);  //来自nextNetworkRequestId
 private synchronized int nextNetworkRequestId() {
        return mNextNetworkRequestId++;  //mNextNetworkRequestId最初为1,new NetworkRequest时便会加1
    }
2.mNetworkForRequestId
 private void setNetworkForRequest(int requestId, NetworkAgentInfo nai) {
        synchronized (mNetworkForRequestId) {
            mNetworkForRequestId.put(requestId, nai);//保存requestId和NetworkAgentInfo的对应关系
        }
    }
private void rematchNetworkAndRequests(NetworkAgentInfo newNetwork,
            ReapUnvalidatedNetworks reapUnvalidatedNetworks, long now) {
       for (NetworkRequestInfo nri : mNetworkRequests.values()) {
      setNetworkForRequest(nri.request.requestId, newNetwork); //network为EVENT_NETWORK_INFO_CHANGED传进来的
}
mDefaultRequest = createDefaultInternetRequestForTransport(-1, NetworkRequest.Type.REQUEST);
NetworkRequestInfo defaultNRI = new NetworkRequestInfo(null, mDefaultRequest, new Binder());
mNetworkRequests.put(mDefaultRequest, defaultNRI);  //报存NetworkRequest和NetworkRequestInfo的对应关系,NetworkRequest存在requestId
private void handleRegisterNetworkRequest(NetworkRequestInfo nri) {
    mNetworkRequests.put(nri.request, nri);
}
<--处理消息EVENT_REGISTER_NETWORK_REQUEST_WITH_INTENT或者EVENT_REGISTER_NETWORK_REQUEST

//getAllNetworks

public Network[] getAllNetworks() {
                result[i] = mNetworkForNetId.valueAt(i).network;
    }
private void handleRegisterNetworkAgent(NetworkAgentInfo nai, INetworkMonitor networkMonitor) {
            mNetworkForNetId.put(nai.network.netId, nai);
        }

2.EthernetTracker

主要方法如下

void start() {
        mConfigStore.read();  //为EthernetConfigStore
        final ArrayMap<String, IpConfiguration> configs = mConfigStore.getIpConfigurations();
        for (int i = 0; i < configs.size(); i++) {
            mIpConfigurations.put(configs.keyAt(i), configs.valueAt(i));
        }
        try {
            mNMService.registerObserver(new InterfaceObserver());//mNMService为INetworkManagementService,具体实现类NetworkManagementService
    }
void updateIpConfiguration(String iface, IpConfiguration ipConfiguration) {
        mConfigStore.write(iface, ipConfiguration);
        mIpConfigurations.put(iface, ipConfiguration);
        mHandler.post(() -> mFactory.updateIpConfiguration(iface, ipConfiguration));
    }
String[] getInterfaces(boolean includeRestricted) {
        return mFactory.getAvailableInterfaces(includeRestricted);//mFactory为EthernetNetworkFactory
    }

3.NetworkManagementService 继承INetworkManagementService

网络管理服务,NetworkManagementService为ConnectivityService和其他Framework中的服务建立了与Netd之间通信的渠道,NetworkPolicyManagerService对各个UID的策略最终都会通过 NetworkManagementService向Netd发送;另外,NetworkManagementService还会监听Netd服务的状态,处理Socket返回的消息

里面的mNetdService为NetdNativeService.cpp

private void connectNativeNetdService() {
        mNetdService = mServices.getNetd();//mServices为NetworkManagementService
    }
public INetd getNetd() {
            return NetdService.get();
        }
//NetdService
public static INetd getInstance() {
    final INetd netdInstance = INetd.Stub.asInterface(ServiceManager.getService(Context.NETD_SERVICE));
}
public static INetd get(long maxTimeoutMs) {
    final INetd netdInstance = getInstance();
}

4.EthernetNetworkFactory

主要方法如下:

private void start() {
            mNetworkInfo.setDetailedState(DetailedState.OBTAINING_IPADDR, null, mHwAddress);
            mIpClientCallback = new IpClientCallbacksImpl();
            IpClientUtil.makeIpClient(mContext, name, mIpClientCallback);//调用NetworkStackClient.makeIpClient
            mIpClientCallback.awaitIpClientStart();
            provisionIpClient(mIpClient, mIpConfig, sTcpBufferSizes);
        }
public void register() {
          mMessenger = new Messenger(this);
            mSerialNumber = ConnectivityManager.from(mContext).registerNetworkFactory(mMessenger,
                    LOG_TAG);  //LOG_TAG为EthernetNetworkFactory创建时传进,具体为Ethernet
    }
 public int registerNetworkFactory(Messenger messenger, String name) {
            return mService.registerNetworkFactory(messenger, name); //将自己注册到ConnectivityService中
    }
//ConnectivityService 
public int registerNetworkFactory(Messenger messenger, String name) {
        NetworkFactoryInfo nfi = new NetworkFactoryInfo(name, messenger, new AsyncChannel(),
                NetworkFactory.SerialNumber.nextSerialNumber());
        mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_FACTORY, nfi));
        return nfi.factorySerialNumber;
    }
private void handleRegisterNetworkFactory(NetworkFactoryInfo nfi) {
        mNetworkFactoryInfos.put(nfi.messenger, nfi);
        nfi.asyncChannel.connect(mContext, mTrackerHandler, nfi.messenger);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Ethernet(以太网)是一种计算机网络技术,其物理是指网络中传输数据所需的硬件和电气特性。在以太网中,物理主要负责定义网络中的电气信号传输方式、传输介质以及信号调制和解调方式。 首先,以太网的物理定义了一种常用的传输介质,即双绞线,也可以使用光缆或同轴电缆。双绞线是一对相互绕在一起的铜线,通过这对线传输数据。光缆则使用光信号来传输数据,具有更高的传输速率和更远的传输距离,适用于长距离通信。 其次,物理确定了在双绞线或光缆中传输数据所需的电气特性。例如,以太网物理规定了传输线路的电压水平以及数据的编码和调制方式。一个常见的编码方式是差分曼彻斯特编码,通过判断信号的电平变化来识别数据位。另外,物理还定义了时钟信号的格式以确保数据的同步传输。 最后,以太网的物理还规定了数据帧的格式和传输方式。数据帧是以太网中最基本的数据单元,包含源地址、目标地址、长度和数据字段等信息。物理通过定义帧的长度和帧同步方式来实现数据的传输和接收。 总之,以太网的物理定义了网络通信中的硬件和电气特性,包括传输介质的选择、电气信号的传输方式、数据的编码和调制方式以及数据帧的格式和传输方式。这些规定保证了以太网的稳定性、可靠性和高效性,使得各种设备在网络中能够进行快速和准确的数据交换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值