Tethering: Add WiGig support

This change is a combination of following changes:

1) Tethering: add TETHERING_WIGIG type
   Currently both WIFI and WIGIG use the same tethering type,
   TETHERING_WIFI. This causes conflicts between the frameworks,
   when both WIFI and WIGIG SoftAPs are started, one or both will
   not work.
   Fix this by using a seperate tethering type for WIGIG.

2) Tethering: remove TETHERING_WIGIG state machine on interface down
   The wigig state machine relies on a TETHERING_STATE_CHANGED broadcast
   that is sent when the tethering state machine is first created, during
   interface up. Currently the tethering state machine is not removed
   on interface down except for TETHERING_BLUETOOTH, and as a result
   wigig tethering only works the first time SoftAP is started.
   In order to fix this, remove the tethering state machine on interface
   down for TETHERING_WIGIG as well.

Bug: 143356416
Test: TetheringCoverageTests

Change-Id: Ic4d3aca0ed69234093af7f0206dab3335938c52a
This commit is contained in:
Dedy Lansky
2019-11-21 00:36:14 +02:00
committed by markchien
parent 4c9428a135
commit 6896f6193f
6 changed files with 30 additions and 2 deletions

View File

@@ -171,6 +171,14 @@ public class TetheringManager {
*/ */
public static final int TETHERING_ETHERNET = 5; public static final int TETHERING_ETHERNET = 5;
/**
* WIGIG tethering type. Use a separate type to prevent
* conflicts with TETHERING_WIFI
* This type is only used internally by the tethering module
* @hide
*/
public static final int TETHERING_WIGIG = 6;
/** @hide */ /** @hide */
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
@IntDef(value = { @IntDef(value = {

View File

@@ -42,6 +42,13 @@
<item>"softap\\d"</item> <item>"softap\\d"</item>
</string-array> </string-array>
<!-- List of regexpressions describing the interface (if any) that represent tetherable
WiGig interfaces. If the device doesn't want to support tethering over WiGig this
should be empty. An example would be "wigig\\d" -->
<string-array translatable="false" name="config_tether_wigig_regexs">
<item>"wigig\\d"</item>
</string-array>
<!-- List of regexpressions describing the interface (if any) that represent tetherable <!-- List of regexpressions describing the interface (if any) that represent tetherable
Wifi P2P interfaces. If the device doesn't want to support tethering over Wifi P2p this Wifi P2P interfaces. If the device doesn't want to support tethering over Wifi P2p this
should be empty. An example would be "p2p-p2p.*" --> should be empty. An example would be "p2p-p2p.*" -->

View File

@@ -20,6 +20,7 @@
<item type="array" name="config_tether_usb_regexs"/> <item type="array" name="config_tether_usb_regexs"/>
<item type="array" name="config_tether_ncm_regexs" /> <item type="array" name="config_tether_ncm_regexs" />
<item type="array" name="config_tether_wifi_regexs"/> <item type="array" name="config_tether_wifi_regexs"/>
<item type="array" name="config_tether_wigig_regexs"/>
<item type="array" name="config_tether_wifi_p2p_regexs"/> <item type="array" name="config_tether_wifi_p2p_regexs"/>
<item type="array" name="config_tether_bluetooth_regexs"/> <item type="array" name="config_tether_bluetooth_regexs"/>
<item type="array" name="config_tether_dhcp_range"/> <item type="array" name="config_tether_dhcp_range"/>

View File

@@ -616,7 +616,8 @@ public class IpServer extends StateMachine {
final Boolean setIfaceUp; final Boolean setIfaceUp;
if (mInterfaceType == TetheringManager.TETHERING_WIFI if (mInterfaceType == TetheringManager.TETHERING_WIFI
|| mInterfaceType == TetheringManager.TETHERING_WIFI_P2P || mInterfaceType == TetheringManager.TETHERING_WIFI_P2P
|| mInterfaceType == TetheringManager.TETHERING_ETHERNET) { || mInterfaceType == TetheringManager.TETHERING_ETHERNET
|| mInterfaceType == TetheringManager.TETHERING_WIGIG) {
// The WiFi and Ethernet stack has ownership of the interface up/down state. // The WiFi and Ethernet stack has ownership of the interface up/down state.
// It is unclear whether the Bluetooth or USB stacks will manage their own // It is unclear whether the Bluetooth or USB stacks will manage their own
// state. // state.

View File

@@ -40,6 +40,7 @@ import static android.net.TetheringManager.TETHERING_NCM;
import static android.net.TetheringManager.TETHERING_USB; import static android.net.TetheringManager.TETHERING_USB;
import static android.net.TetheringManager.TETHERING_WIFI; import static android.net.TetheringManager.TETHERING_WIFI;
import static android.net.TetheringManager.TETHERING_WIFI_P2P; import static android.net.TetheringManager.TETHERING_WIFI_P2P;
import static android.net.TetheringManager.TETHERING_WIGIG;
import static android.net.TetheringManager.TETHER_ERROR_INTERNAL_ERROR; import static android.net.TetheringManager.TETHER_ERROR_INTERNAL_ERROR;
import static android.net.TetheringManager.TETHER_ERROR_NO_ERROR; import static android.net.TetheringManager.TETHER_ERROR_NO_ERROR;
import static android.net.TetheringManager.TETHER_ERROR_SERVICE_UNAVAIL; import static android.net.TetheringManager.TETHER_ERROR_SERVICE_UNAVAIL;
@@ -495,7 +496,8 @@ public class Tethering {
if (up) { if (up) {
maybeTrackNewInterfaceLocked(iface); maybeTrackNewInterfaceLocked(iface);
} else { } else {
if (ifaceNameToType(iface) == TETHERING_BLUETOOTH) { if (ifaceNameToType(iface) == TETHERING_BLUETOOTH
|| ifaceNameToType(iface) == TETHERING_WIGIG) {
stopTrackingInterfaceLocked(iface); stopTrackingInterfaceLocked(iface);
} else { } else {
// Ignore usb0 down after enabling RNDIS. // Ignore usb0 down after enabling RNDIS.
@@ -517,6 +519,8 @@ public class Tethering {
if (cfg.isWifi(iface)) { if (cfg.isWifi(iface)) {
return TETHERING_WIFI; return TETHERING_WIFI;
} else if (cfg.isWigig(iface)) {
return TETHERING_WIGIG;
} else if (cfg.isWifiP2p(iface)) { } else if (cfg.isWifiP2p(iface)) {
return TETHERING_WIFI_P2P; return TETHERING_WIFI_P2P;
} else if (cfg.isUsb(iface)) { } else if (cfg.isUsb(iface)) {

View File

@@ -92,6 +92,7 @@ public class TetheringConfiguration {
public final String[] tetherableUsbRegexs; public final String[] tetherableUsbRegexs;
public final String[] tetherableWifiRegexs; public final String[] tetherableWifiRegexs;
public final String[] tetherableWigigRegexs;
public final String[] tetherableWifiP2pRegexs; public final String[] tetherableWifiP2pRegexs;
public final String[] tetherableBluetoothRegexs; public final String[] tetherableBluetoothRegexs;
public final String[] tetherableNcmRegexs; public final String[] tetherableNcmRegexs;
@@ -125,6 +126,7 @@ public class TetheringConfiguration {
// us an interface name. Careful consideration needs to be given to // us an interface name. Careful consideration needs to be given to
// implications for Settings and for provisioning checks. // implications for Settings and for provisioning checks.
tetherableWifiRegexs = getResourceStringArray(res, R.array.config_tether_wifi_regexs); tetherableWifiRegexs = getResourceStringArray(res, R.array.config_tether_wifi_regexs);
tetherableWigigRegexs = getResourceStringArray(res, R.array.config_tether_wigig_regexs);
tetherableWifiP2pRegexs = getResourceStringArray( tetherableWifiP2pRegexs = getResourceStringArray(
res, R.array.config_tether_wifi_p2p_regexs); res, R.array.config_tether_wifi_p2p_regexs);
tetherableBluetoothRegexs = getResourceStringArray( tetherableBluetoothRegexs = getResourceStringArray(
@@ -167,6 +169,11 @@ public class TetheringConfiguration {
return matchesDownstreamRegexs(iface, tetherableWifiRegexs); return matchesDownstreamRegexs(iface, tetherableWifiRegexs);
} }
/** Check whether input interface belong to wigig.*/
public boolean isWigig(String iface) {
return matchesDownstreamRegexs(iface, tetherableWigigRegexs);
}
/** Check whether this interface is Wifi P2P interface. */ /** Check whether this interface is Wifi P2P interface. */
public boolean isWifiP2p(String iface) { public boolean isWifiP2p(String iface) {
return matchesDownstreamRegexs(iface, tetherableWifiP2pRegexs); return matchesDownstreamRegexs(iface, tetherableWifiP2pRegexs);