1 /* 2 * Copyright 2015 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef SDK_ANDROID_SRC_JNI_ANDROID_NETWORK_MONITOR_H_ 12 #define SDK_ANDROID_SRC_JNI_ANDROID_NETWORK_MONITOR_H_ 13 14 #include <stdint.h> 15 16 #include <map> 17 #include <string> 18 #include <vector> 19 20 #include "absl/strings/string_view.h" 21 #include "absl/types/optional.h" 22 #include "api/field_trials_view.h" 23 #include "api/task_queue/pending_task_safety_flag.h" 24 #include "rtc_base/network_monitor.h" 25 #include "rtc_base/network_monitor_factory.h" 26 #include "rtc_base/string_utils.h" 27 #include "rtc_base/thread.h" 28 #include "rtc_base/thread_annotations.h" 29 #include "sdk/android/src/jni/jni_helpers.h" 30 31 namespace webrtc { 32 namespace test { 33 class AndroidNetworkMonitorTest; 34 } // namespace test 35 36 namespace jni { 37 38 typedef int64_t NetworkHandle; 39 40 // c++ equivalent of java NetworkChangeDetector.ConnectionType. 41 enum NetworkType { 42 NETWORK_UNKNOWN, 43 NETWORK_ETHERNET, 44 NETWORK_WIFI, 45 NETWORK_5G, 46 NETWORK_4G, 47 NETWORK_3G, 48 NETWORK_2G, 49 NETWORK_UNKNOWN_CELLULAR, 50 NETWORK_BLUETOOTH, 51 NETWORK_VPN, 52 NETWORK_NONE 53 }; 54 55 // The information is collected from Android OS so that the native code can get 56 // the network type and handle (Android network ID) for each interface. 57 struct NetworkInformation { 58 std::string interface_name; 59 NetworkHandle handle; 60 NetworkType type; 61 NetworkType underlying_type_for_vpn; 62 std::vector<rtc::IPAddress> ip_addresses; 63 64 NetworkInformation(); 65 NetworkInformation(const NetworkInformation&); 66 NetworkInformation(NetworkInformation&&); 67 ~NetworkInformation(); 68 NetworkInformation& operator=(const NetworkInformation&); 69 NetworkInformation& operator=(NetworkInformation&&); 70 71 std::string ToString() const; 72 }; 73 74 class AndroidNetworkMonitor : public rtc::NetworkMonitorInterface { 75 public: 76 AndroidNetworkMonitor(JNIEnv* env, 77 const JavaRef<jobject>& j_application_context, 78 const FieldTrialsView& field_trials); 79 ~AndroidNetworkMonitor() override; 80 81 // TODO(sakal): Remove once down stream dependencies have been updated. SetAndroidContext(JNIEnv * jni,jobject context)82 static void SetAndroidContext(JNIEnv* jni, jobject context) {} 83 84 void Start() override; 85 void Stop() override; 86 87 // Does `this` NetworkMonitorInterface implement BindSocketToNetwork? 88 // Only Android returns true. SupportsBindSocketToNetwork()89 virtual bool SupportsBindSocketToNetwork() const override { return true; } 90 91 rtc::NetworkBindingResult BindSocketToNetwork( 92 int socket_fd, 93 const rtc::IPAddress& address, 94 absl::string_view if_name) override; 95 96 InterfaceInfo GetInterfaceInfo(absl::string_view if_name) override; 97 98 // Always expected to be called on the network thread. 99 void SetNetworkInfos(const std::vector<NetworkInformation>& network_infos); 100 101 void NotifyConnectionTypeChanged(JNIEnv* env, 102 const JavaRef<jobject>& j_caller); 103 void NotifyOfNetworkConnect(JNIEnv* env, 104 const JavaRef<jobject>& j_caller, 105 const JavaRef<jobject>& j_network_info); 106 void NotifyOfNetworkDisconnect(JNIEnv* env, 107 const JavaRef<jobject>& j_caller, 108 jlong network_handle); 109 void NotifyOfActiveNetworkList(JNIEnv* env, 110 const JavaRef<jobject>& j_caller, 111 const JavaRef<jobjectArray>& j_network_infos); 112 void NotifyOfNetworkPreference(JNIEnv* env, 113 const JavaRef<jobject>& j_caller, 114 const JavaRef<jobject>& j_connection_type, 115 jint preference); 116 117 // Visible for testing. 118 void OnNetworkConnected_n(const NetworkInformation& network_info); 119 120 // Visible for testing. 121 absl::optional<NetworkHandle> FindNetworkHandleFromAddressOrName( 122 const rtc::IPAddress& address, 123 absl::string_view ifname) const; 124 125 private: 126 void reset(); 127 void OnNetworkDisconnected_n(NetworkHandle network_handle); 128 void OnNetworkPreference_n(NetworkType type, 129 rtc::NetworkPreference preference); 130 131 rtc::NetworkPreference GetNetworkPreference(rtc::AdapterType) const; 132 absl::optional<NetworkHandle> FindNetworkHandleFromIfname( 133 absl::string_view ifname) const; 134 135 const int android_sdk_int_; 136 ScopedJavaGlobalRef<jobject> j_application_context_; 137 ScopedJavaGlobalRef<jobject> j_network_monitor_; 138 rtc::Thread* const network_thread_; 139 bool started_ RTC_GUARDED_BY(network_thread_) = false; 140 std::map<std::string, NetworkHandle, rtc::AbslStringViewCmp> 141 network_handle_by_if_name_ RTC_GUARDED_BY(network_thread_); 142 std::map<rtc::IPAddress, NetworkHandle> network_handle_by_address_ 143 RTC_GUARDED_BY(network_thread_); 144 std::map<NetworkHandle, NetworkInformation> network_info_by_handle_ 145 RTC_GUARDED_BY(network_thread_); 146 std::map<rtc::AdapterType, rtc::NetworkPreference> 147 network_preference_by_adapter_type_ RTC_GUARDED_BY(network_thread_); 148 bool find_network_handle_without_ipv6_temporary_part_ 149 RTC_GUARDED_BY(network_thread_) = false; 150 bool surface_cellular_types_ RTC_GUARDED_BY(network_thread_) = false; 151 152 // NOTE: if bind_using_ifname_ is TRUE 153 // then the adapter name is used with substring matching as follows: 154 // An adapater name repored by android as 'wlan0' 155 // will be matched with 'v4-wlan0' ("v4-wlan0".find("wlan0") != npos). 156 // This applies to adapter_type_by_name_, vpn_underlying_adapter_type_by_name_ 157 // and FindNetworkHandleFromIfname. 158 bool bind_using_ifname_ RTC_GUARDED_BY(network_thread_) = true; 159 160 // NOTE: disable_is_adapter_available_ is a kill switch for the impl. 161 // of IsAdapterAvailable(). 162 bool disable_is_adapter_available_ RTC_GUARDED_BY(network_thread_) = false; 163 164 rtc::scoped_refptr<PendingTaskSafetyFlag> safety_flag_ 165 RTC_PT_GUARDED_BY(network_thread_) = nullptr; 166 167 const FieldTrialsView& field_trials_; 168 169 friend class webrtc::test::AndroidNetworkMonitorTest; 170 }; 171 172 class AndroidNetworkMonitorFactory : public rtc::NetworkMonitorFactory { 173 public: 174 // Deprecated. Pass in application context to this class. 175 AndroidNetworkMonitorFactory(); 176 177 AndroidNetworkMonitorFactory(JNIEnv* env, 178 const JavaRef<jobject>& j_application_context); 179 180 ~AndroidNetworkMonitorFactory() override; 181 182 rtc::NetworkMonitorInterface* CreateNetworkMonitor( 183 const FieldTrialsView& field_trials) override; 184 185 private: 186 ScopedJavaGlobalRef<jobject> j_application_context_; 187 }; 188 189 } // namespace jni 190 } // namespace webrtc 191 192 // TODO(magjed): Remove once external clients are updated. 193 namespace webrtc_jni { 194 195 using webrtc::jni::AndroidNetworkMonitor; 196 using webrtc::jni::AndroidNetworkMonitorFactory; 197 198 } // namespace webrtc_jni 199 200 #endif // SDK_ANDROID_SRC_JNI_ANDROID_NETWORK_MONITOR_H_ 201