xref: /aosp_15_r20/external/webrtc/sdk/android/src/jni/android_network_monitor.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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