blob: 7b1cd61480e0b2182ea7429fa0bfd1113230d41b [file] [log] [blame]
Aaron Huang96011892020-06-27 07:18:23 +08001/*
2 * Copyright (C) 2020 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.server;
18
Aaron Huang96011892020-06-27 07:18:23 +080019import android.content.Context;
Aaron Huang96011892020-06-27 07:18:23 +080020import android.util.Log;
21
paulhu802ab972021-12-14 01:30:22 +000022import com.android.modules.utils.build.SdkLevel;
Remi NGUYEN VAN46d7ddb2022-03-04 15:59:51 +090023import com.android.networkstack.apishim.ConstantsShim;
Xiao Maeaaf7d32022-01-23 16:14:51 +000024import com.android.server.ethernet.EthernetService;
25import com.android.server.ethernet.EthernetServiceImpl;
Remi NGUYEN VAN5906c8b2022-01-20 18:40:29 +090026import com.android.server.nearby.NearbyService;
paulhu802ab972021-12-14 01:30:22 +000027
Aaron Huang96011892020-06-27 07:18:23 +080028/**
29 * Connectivity service initializer for core networking. This is called by system server to create
Remi NGUYEN VAN5906c8b2022-01-20 18:40:29 +090030 * a new instance of connectivity services.
Aaron Huang96011892020-06-27 07:18:23 +080031 */
32public final class ConnectivityServiceInitializer extends SystemService {
33 private static final String TAG = ConnectivityServiceInitializer.class.getSimpleName();
Xiao Maeaaf7d32022-01-23 16:14:51 +000034 private final Context mContext;
Aaron Huang96011892020-06-27 07:18:23 +080035 private final ConnectivityService mConnectivity;
Aaron Huang2e778ee2022-01-06 19:30:43 +080036 private final IpSecService mIpSecService;
paulhu802ab972021-12-14 01:30:22 +000037 private final NsdService mNsdService;
Remi NGUYEN VAN5906c8b2022-01-20 18:40:29 +090038 private final NearbyService mNearbyService;
Xiao Maeaaf7d32022-01-23 16:14:51 +000039 private final EthernetServiceImpl mEthernetServiceImpl;
Aaron Huang96011892020-06-27 07:18:23 +080040
41 public ConnectivityServiceInitializer(Context context) {
42 super(context);
Xiao Maeaaf7d32022-01-23 16:14:51 +000043 mContext = context;
Remi NGUYEN VANe724f632021-01-08 01:19:44 +000044 // Load JNI libraries used by ConnectivityService and its dependencies
45 System.loadLibrary("service-connectivity");
Xiao Maeaaf7d32022-01-23 16:14:51 +000046 mEthernetServiceImpl = createEthernetService(context);
junyulaie7c7d2a2021-01-26 15:29:15 +080047 mConnectivity = new ConnectivityService(context);
Aaron Huang2e778ee2022-01-06 19:30:43 +080048 mIpSecService = createIpSecService(context);
paulhu802ab972021-12-14 01:30:22 +000049 mNsdService = createNsdService(context);
Remi NGUYEN VAN5906c8b2022-01-20 18:40:29 +090050 mNearbyService = createNearbyService(context);
Aaron Huang96011892020-06-27 07:18:23 +080051 }
52
53 @Override
54 public void onStart() {
Xiao Maeaaf7d32022-01-23 16:14:51 +000055 if (mConnectivity.deviceSupportsEthernet(mContext)) {
56 Log.i(TAG, "Registering " + Context.ETHERNET_SERVICE);
57 publishBinderService(Context.ETHERNET_SERVICE, mEthernetServiceImpl,
58 /* allowIsolated= */ false);
59 }
60
Aaron Huang96011892020-06-27 07:18:23 +080061 Log.i(TAG, "Registering " + Context.CONNECTIVITY_SERVICE);
62 publishBinderService(Context.CONNECTIVITY_SERVICE, mConnectivity,
Chiachang Wang96e1a0b2021-03-09 14:55:31 +080063 /* allowIsolated= */ false);
Aaron Huang2e778ee2022-01-06 19:30:43 +080064
65 if (mIpSecService != null) {
66 Log.i(TAG, "Registering " + Context.IPSEC_SERVICE);
67 publishBinderService(Context.IPSEC_SERVICE, mIpSecService, /* allowIsolated= */ false);
68 }
69
paulhu802ab972021-12-14 01:30:22 +000070 if (mNsdService != null) {
71 Log.i(TAG, "Registering " + Context.NSD_SERVICE);
72 publishBinderService(Context.NSD_SERVICE, mNsdService, /* allowIsolated= */ false);
73 }
Remi NGUYEN VAN5906c8b2022-01-20 18:40:29 +090074
75 if (mNearbyService != null) {
Remi NGUYEN VAN46d7ddb2022-03-04 15:59:51 +090076 Log.i(TAG, "Registering " + ConstantsShim.NEARBY_SERVICE);
77 publishBinderService(ConstantsShim.NEARBY_SERVICE, mNearbyService,
Remi NGUYEN VAN5906c8b2022-01-20 18:40:29 +090078 /* allowIsolated= */ false);
79 }
Xiao Maeaaf7d32022-01-23 16:14:51 +000080
Remi NGUYEN VAN5906c8b2022-01-20 18:40:29 +090081 }
82
83 @Override
84 public void onBootPhase(int phase) {
85 if (mNearbyService != null) {
86 mNearbyService.onBootPhase(phase);
87 }
Xiao Maeaaf7d32022-01-23 16:14:51 +000088
89 if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY && mEthernetServiceImpl != null) {
90 mEthernetServiceImpl.start();
91 }
paulhu802ab972021-12-14 01:30:22 +000092 }
93
Aaron Huang2e778ee2022-01-06 19:30:43 +080094 /**
95 * Return IpSecService instance, or null if current SDK is lower than T.
96 */
97 private IpSecService createIpSecService(final Context context) {
98 if (!SdkLevel.isAtLeastT()) return null;
99
100 return new IpSecService(context);
101 }
102
paulhu802ab972021-12-14 01:30:22 +0000103 /** Return NsdService instance or null if current SDK is lower than T */
104 private NsdService createNsdService(final Context context) {
105 if (!SdkLevel.isAtLeastT()) return null;
106 try {
107 return NsdService.create(context);
108 } catch (InterruptedException e) {
109 Log.d(TAG, "Unable to get NSD service", e);
110 return null;
111 }
Aaron Huang96011892020-06-27 07:18:23 +0800112 }
Remi NGUYEN VAN5906c8b2022-01-20 18:40:29 +0900113
114 /** Return Nearby service instance or null if current SDK is lower than T */
115 private NearbyService createNearbyService(final Context context) {
116 if (!SdkLevel.isAtLeastT()) return null;
Remi NGUYEN VAN46d7ddb2022-03-04 15:59:51 +0900117 try {
118 return new NearbyService(context);
119 } catch (UnsupportedOperationException e) {
120 // Nearby is not yet supported in all branches
121 // TODO: remove catch clause when it is available.
122 Log.i(TAG, "Skipping unsupported service " + ConstantsShim.NEARBY_SERVICE);
123 return null;
124 }
Remi NGUYEN VAN5906c8b2022-01-20 18:40:29 +0900125 }
Xiao Maeaaf7d32022-01-23 16:14:51 +0000126
127 /**
128 * Return EthernetServiceImpl instance or null if current SDK is lower than T or Ethernet
129 * service isn't necessary.
130 */
131 private EthernetServiceImpl createEthernetService(final Context context) {
132 if (!SdkLevel.isAtLeastT() || !mConnectivity.deviceSupportsEthernet(context)) {
133 return null;
134 }
135 return EthernetService.create(context);
136 }
Aaron Huang96011892020-06-27 07:18:23 +0800137}