【Android】(十一) DHCP模块

DHCP Server创建

DHCP Server依赖于 NetworkStack 服务,因此先分析 NetworkStack 服务的创建和启动。

//frameworks/base/services/java/com/android/server/SystemServer.java
t.traceBegin("StartNetworkStack");
try {

    NetworkStackClient.getInstance().start();
} catch (Throwable e) {
    reportWtf("starting Network Stack", e);
}
t.traceEnd();

在 SystemServer 中调用 NetworkStackClient 单例的 start 方法启动 NetworkStack 服务。

//frameworks/base/services/net/java/android/net/NetworkStackClient.java
public void start() {
    mDependencies.getConnectivityModuleConnector().startModuleService(
            INetworkStackConnector.class.getName(), PERMISSION_MAINLINE_NETWORK_STACK,
            new NetworkStackConnection());
    log("Network stack service start requested");
}

start 方法中通过 ConnectivityModuleConnector 的 startModuleService 方法来启动服务。

//frameworks/base/services/net/java/android/net/ConnectivityModuleConnector.java
public void startModuleService(@NonNull String serviceIntentBaseAction, 
        @NonNull String servicePermissionName, 
        @NonNull ModuleServiceCallback callback) {
    //获取Intent对象
    if (!mContext.bindServiceAsUser(intent, 
            new ModuleServiceConnection(packageName, callback),
            Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT, UserHandle.SYSTEM)) {
    //...
    }
}
//packages/modules/NetworkStack/src/com/android/server/NetworkStackService.java
public static synchronized IBinder makeConnector(Context context) {
    if (sConnector == null) {
        sConnector = new NetworkStackConnector(context);
    }
    return sConnector;
}

@Override
public IBinder onBind(Intent intent) {
    return makeConnector(this);
}
//frameworks/base/services/net/java/android/net/NetworkStackClient.java
private class NetworkStackConnection 
    implements ConnectivityModuleConnector.ModuleServiceCallback {
    @Override
    public void onModuleServiceConnected(IBinder service) {
        logi("Network stack service connected");
        registerNetworkStackService(service);
    }
}

private void registerNetworkStackService(@NonNull IBinder service) {
    final INetworkStackConnector connector = INetworkStackConnector.Stub.asInterface(service);
    mDependencies.addToServiceManager(service);
    //....
}

startModuleService 方法通过 bindServiceAsUser 来启动服务,此时 NetworkStackService 的 onBind 方法被调用,返回 IBinder 给服务代理端,此时服务代理端的 registerNetworkStackService 被调用,成功注册服务。

//packages/modules/NetworkStack/src/com/android/server/NetworkStackService.java
public static class NetworkStackConnector 
        extends INetworkStackConnector.Stub
        implements NetworkStackServiceManager {
    @Override
    public void makeDhcpServer(@NonNull String ifName, 
            @NonNull DhcpServingParamsParcel params,
            @NonNull IDhcpServerCallbacks cb) throws RemoteException {
        //...
    }
}

通过调用 NetworkStackConnector 中的 makeDhcpServer 方法可创建 DHCP Server。

接下来分析 makeDhcpServer的具体调用者 : Tethering服务

//frameworks/base/services/java/com/android/server/SystemServer.java
t.traceBegin("StartTethering");
try {
    ConnectivityModuleConnector.getInstance().startModuleService(
            TETHERING_CONNECTOR_CLASS,
            PERMISSION_MAINLINE_NETWORK_STACK, service -> {
                ServiceManager.addService(Context.TETHERING_SERVICE, service,
                    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值