Merge "[Tether03] Migrate IpServer into module"

am: 634c6a512f

Change-Id: I28ef3693ade9dc0fd53437b0157d47237e6a3f93
This commit is contained in:
Mark Chien
2019-10-24 23:59:25 -07:00
committed by android-build-merger
12 changed files with 164 additions and 98 deletions

View File

@@ -24,6 +24,8 @@ java_defaults {
], ],
static_libs: [ static_libs: [
"androidx.annotation_annotation", "androidx.annotation_annotation",
"netd_aidl_interface-java",
"networkstack-aidl-interfaces-java",
"tethering-client", "tethering-client",
], ],
manifest: "AndroidManifestBase.xml", manifest: "AndroidManifestBase.xml",
@@ -68,5 +70,10 @@ filegroup {
name: "tethering-services-srcs", name: "tethering-services-srcs",
srcs: [ srcs: [
"src/com/android/server/connectivity/tethering/TetheringConfiguration.java", "src/com/android/server/connectivity/tethering/TetheringConfiguration.java",
"src/android/net/dhcp/DhcpServerCallbacks.java",
"src/android/net/dhcp/DhcpServingParamsParcelExt.java",
"src/android/net/ip/IpServer.java",
"src/android/net/ip/RouterAdvertisementDaemon.java",
"src/android/net/util/InterfaceSet.java",
], ],
} }

View File

@@ -16,7 +16,7 @@
package android.net.ip; package android.net.ip;
import static android.net.NetworkUtils.numericToInetAddress; import static android.net.InetAddresses.parseNumericAddress;
import static android.net.dhcp.IDhcpServer.STATUS_SUCCESS; import static android.net.dhcp.IDhcpServer.STATUS_SUCCESS;
import static android.net.util.NetworkConstants.FF; import static android.net.util.NetworkConstants.FF;
import static android.net.util.NetworkConstants.RFC7421_PREFIX_LENGTH; import static android.net.util.NetworkConstants.RFC7421_PREFIX_LENGTH;
@@ -77,6 +77,7 @@ public class IpServer extends StateMachine {
public static final int STATE_TETHERED = 2; public static final int STATE_TETHERED = 2;
public static final int STATE_LOCAL_ONLY = 3; public static final int STATE_LOCAL_ONLY = 3;
/** Get string name of |state|.*/
public static String getStateString(int state) { public static String getStateString(int state) {
switch (state) { switch (state) {
case STATE_UNAVAILABLE: return "UNAVAILABLE"; case STATE_UNAVAILABLE: return "UNAVAILABLE";
@@ -103,15 +104,16 @@ public class IpServer extends StateMachine {
// TODO: have this configurable // TODO: have this configurable
private static final int DHCP_LEASE_TIME_SECS = 3600; private static final int DHCP_LEASE_TIME_SECS = 3600;
private final static String TAG = "IpServer"; private static final String TAG = "IpServer";
private final static boolean DBG = false; private static final boolean DBG = false;
private final static boolean VDBG = false; private static final boolean VDBG = false;
private static final Class[] messageClasses = { private static final Class[] sMessageClasses = {
IpServer.class IpServer.class
}; };
private static final SparseArray<String> sMagicDecoderRing = private static final SparseArray<String> sMagicDecoderRing =
MessageUtils.findMessageNames(messageClasses); MessageUtils.findMessageNames(sMessageClasses);
/** IpServer callback. */
public static class Callback { public static class Callback {
/** /**
* Notify that |who| has changed its tethering state. * Notify that |who| has changed its tethering state.
@@ -131,11 +133,14 @@ public class IpServer extends StateMachine {
public void updateLinkProperties(IpServer who, LinkProperties newLp) {} public void updateLinkProperties(IpServer who, LinkProperties newLp) {}
} }
/** Capture IpServer dependencies, for injection. */
public static class Dependencies { public static class Dependencies {
/** Create a RouterAdvertisementDaemon instance to be used by IpServer.*/
public RouterAdvertisementDaemon getRouterAdvertisementDaemon(InterfaceParams ifParams) { public RouterAdvertisementDaemon getRouterAdvertisementDaemon(InterfaceParams ifParams) {
return new RouterAdvertisementDaemon(ifParams); return new RouterAdvertisementDaemon(ifParams);
} }
/** Get |ifName|'s interface information.*/
public InterfaceParams getInterfaceParams(String ifName) { public InterfaceParams getInterfaceParams(String ifName) {
return InterfaceParams.getByName(ifName); return InterfaceParams.getByName(ifName);
} }
@@ -244,25 +249,51 @@ public class IpServer extends StateMachine {
setInitialState(mInitialState); setInitialState(mInitialState);
} }
public String interfaceName() { return mIfaceName; } /** Interface name which IpServer served.*/
public String interfaceName() {
public int interfaceType() { return mInterfaceType; } return mIfaceName;
}
public int lastError() { return mLastError; }
public int servingMode() { return mServingMode; }
public LinkProperties linkProperties() { return new LinkProperties(mLinkProperties); }
public void stop() { sendMessage(CMD_INTERFACE_DOWN); }
public void unwanted() { sendMessage(CMD_TETHER_UNREQUESTED); }
/** /**
* Internals. * Tethering downstream type. It would be one of ConnectivityManager#TETHERING_*.
*/ */
public int interfaceType() {
return mInterfaceType;
}
private boolean startIPv4() { return configureIPv4(true); } /** Last error from this IpServer. */
public int lastError() {
return mLastError;
}
/** Serving mode is the current state of IpServer state machine. */
public int servingMode() {
return mServingMode;
}
/** The properties of the network link which IpServer is serving. */
public LinkProperties linkProperties() {
return new LinkProperties(mLinkProperties);
}
/** Stop this IpServer. After this is called this IpServer should not be used any more. */
public void stop() {
sendMessage(CMD_INTERFACE_DOWN);
}
/**
* Tethering is canceled. IpServer state machine will be available and wait for
* next tethering request.
*/
public void unwanted() {
sendMessage(CMD_TETHER_UNREQUESTED);
}
/** Internals. */
private boolean startIPv4() {
return configureIPv4(true);
}
/** /**
* Convenience wrapper around INetworkStackStatusCallback to run callbacks on the IpServer * Convenience wrapper around INetworkStackStatusCallback to run callbacks on the IpServer
@@ -410,7 +441,7 @@ public class IpServer extends StateMachine {
prefixLen = WIFI_P2P_IFACE_PREFIX_LENGTH; prefixLen = WIFI_P2P_IFACE_PREFIX_LENGTH;
} else { } else {
// BT configures the interface elsewhere: only start DHCP. // BT configures the interface elsewhere: only start DHCP.
final Inet4Address srvAddr = (Inet4Address) numericToInetAddress(BLUETOOTH_IFACE_ADDR); final Inet4Address srvAddr = (Inet4Address) parseNumericAddress(BLUETOOTH_IFACE_ADDR);
return configureDhcp(enabled, srvAddr, BLUETOOTH_DHCP_PREFIX_LENGTH); return configureDhcp(enabled, srvAddr, BLUETOOTH_DHCP_PREFIX_LENGTH);
} }
@@ -422,7 +453,7 @@ public class IpServer extends StateMachine {
return false; return false;
} }
InetAddress addr = numericToInetAddress(ipAsString); InetAddress addr = parseNumericAddress(ipAsString);
linkAddr = new LinkAddress(addr, prefixLen); linkAddr = new LinkAddress(addr, prefixLen);
ifcg.setLinkAddress(linkAddr); ifcg.setLinkAddress(linkAddr);
if (mInterfaceType == ConnectivityManager.TETHERING_WIFI) { if (mInterfaceType == ConnectivityManager.TETHERING_WIFI) {
@@ -473,7 +504,7 @@ public class IpServer extends StateMachine {
private String getRandomWifiIPv4Address() { private String getRandomWifiIPv4Address() {
try { try {
byte[] bytes = numericToInetAddress(WIFI_HOST_IFACE_ADDR).getAddress(); byte[] bytes = parseNumericAddress(WIFI_HOST_IFACE_ADDR).getAddress();
bytes[3] = getRandomSanitizedByte(DOUG_ADAMS, asByte(0), asByte(1), FF); bytes[3] = getRandomSanitizedByte(DOUG_ADAMS, asByte(0), asByte(1), FF);
return InetAddress.getByAddress(bytes).getHostAddress(); return InetAddress.getByAddress(bytes).getHostAddress();
} catch (Exception e) { } catch (Exception e) {

View File

@@ -119,6 +119,7 @@ public class RouterAdvertisementDaemon {
private volatile MulticastTransmitter mMulticastTransmitter; private volatile MulticastTransmitter mMulticastTransmitter;
private volatile UnicastResponder mUnicastResponder; private volatile UnicastResponder mUnicastResponder;
/** Encapsulate the RA parameters for RouterAdvertisementDaemon.*/
public static class RaParams { public static class RaParams {
// Tethered traffic will have the hop limit properly decremented. // Tethered traffic will have the hop limit properly decremented.
// Consequently, set the hoplimit greater by one than the upstream // Consequently, set the hoplimit greater by one than the upstream
@@ -150,10 +151,12 @@ public class RouterAdvertisementDaemon {
dnses = (HashSet) other.dnses.clone(); dnses = (HashSet) other.dnses.clone();
} }
// Returns the subset of RA parameters that become deprecated when /**
// moving from announcing oldRa to announcing newRa. * Returns the subset of RA parameters that become deprecated when
// * moving from announcing oldRa to announcing newRa.
// Currently only tracks differences in |prefixes| and |dnses|. *
* Currently only tracks differences in |prefixes| and |dnses|.
*/
public static RaParams getDeprecatedRaParams(RaParams oldRa, RaParams newRa) { public static RaParams getDeprecatedRaParams(RaParams oldRa, RaParams newRa) {
RaParams newlyDeprecated = new RaParams(); RaParams newlyDeprecated = new RaParams();
@@ -179,7 +182,9 @@ public class RouterAdvertisementDaemon {
private final HashMap<IpPrefix, Integer> mPrefixes = new HashMap<>(); private final HashMap<IpPrefix, Integer> mPrefixes = new HashMap<>();
private final HashMap<Inet6Address, Integer> mDnses = new HashMap<>(); private final HashMap<Inet6Address, Integer> mDnses = new HashMap<>();
Set<IpPrefix> getPrefixes() { return mPrefixes.keySet(); } Set<IpPrefix> getPrefixes() {
return mPrefixes.keySet();
}
void putPrefixes(Set<IpPrefix> prefixes) { void putPrefixes(Set<IpPrefix> prefixes) {
for (IpPrefix ipp : prefixes) { for (IpPrefix ipp : prefixes) {
@@ -193,7 +198,9 @@ public class RouterAdvertisementDaemon {
} }
} }
Set<Inet6Address> getDnses() { return mDnses.keySet(); } Set<Inet6Address> getDnses() {
return mDnses.keySet();
}
void putDnses(Set<Inet6Address> dnses) { void putDnses(Set<Inet6Address> dnses) {
for (Inet6Address dns : dnses) { for (Inet6Address dns : dnses) {
@@ -207,7 +214,9 @@ public class RouterAdvertisementDaemon {
} }
} }
boolean isEmpty() { return mPrefixes.isEmpty() && mDnses.isEmpty(); } boolean isEmpty() {
return mPrefixes.isEmpty() && mDnses.isEmpty();
}
private boolean decrementCounters() { private boolean decrementCounters() {
boolean removed = decrementCounter(mPrefixes); boolean removed = decrementCounter(mPrefixes);
@@ -219,7 +228,7 @@ public class RouterAdvertisementDaemon {
boolean removed = false; boolean removed = false;
for (Iterator<Map.Entry<T, Integer>> it = map.entrySet().iterator(); for (Iterator<Map.Entry<T, Integer>> it = map.entrySet().iterator();
it.hasNext();) { it.hasNext();) {
Map.Entry<T, Integer> kv = it.next(); Map.Entry<T, Integer> kv = it.next();
if (kv.getValue() == 0) { if (kv.getValue() == 0) {
it.remove(); it.remove();
@@ -240,6 +249,7 @@ public class RouterAdvertisementDaemon {
mDeprecatedInfoTracker = new DeprecatedInfoTracker(); mDeprecatedInfoTracker = new DeprecatedInfoTracker();
} }
/** Build new RA.*/
public void buildNewRa(RaParams deprecatedParams, RaParams newParams) { public void buildNewRa(RaParams deprecatedParams, RaParams newParams) {
synchronized (mLock) { synchronized (mLock) {
if (deprecatedParams != null) { if (deprecatedParams != null) {
@@ -260,6 +270,7 @@ public class RouterAdvertisementDaemon {
maybeNotifyMulticastTransmitter(); maybeNotifyMulticastTransmitter();
} }
/** Start router advertisement daemon. */
public boolean start() { public boolean start() {
if (!createSocket()) { if (!createSocket()) {
return false; return false;
@@ -274,6 +285,7 @@ public class RouterAdvertisementDaemon {
return true; return true;
} }
/** Stop router advertisement daemon. */
public void stop() { public void stop() {
closeSocket(); closeSocket();
// Wake up mMulticastTransmitter thread to interrupt a potential 1 day sleep before // Wake up mMulticastTransmitter thread to interrupt a potential 1 day sleep before
@@ -362,8 +374,12 @@ public class RouterAdvertisementDaemon {
} }
} }
private static byte asByte(int value) { return (byte) value; } private static byte asByte(int value) {
private static short asShort(int value) { return (short) value; } return (byte) value;
}
private static short asShort(int value) {
return (short) value;
}
private static void putHeader(ByteBuffer ra, boolean hasDefaultRoute, byte hopLimit) { private static void putHeader(ByteBuffer ra, boolean hasDefaultRoute, byte hopLimit) {
/** /**
@@ -384,14 +400,14 @@ public class RouterAdvertisementDaemon {
+-+-+-+-+-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+-+-+-+-+-
*/ */
ra.put(ICMPV6_ND_ROUTER_ADVERT) ra.put(ICMPV6_ND_ROUTER_ADVERT)
.put(asByte(0)) .put(asByte(0))
.putShort(asShort(0)) .putShort(asShort(0))
.put(hopLimit) .put(hopLimit)
// RFC 4191 "high" preference, iff. advertising a default route. // RFC 4191 "high" preference, iff. advertising a default route.
.put(hasDefaultRoute ? asByte(0x08) : asByte(0)) .put(hasDefaultRoute ? asByte(0x08) : asByte(0))
.putShort(hasDefaultRoute ? asShort(DEFAULT_LIFETIME) : asShort(0)) .putShort(hasDefaultRoute ? asShort(DEFAULT_LIFETIME) : asShort(0))
.putInt(0) .putInt(0)
.putInt(0); .putInt(0);
} }
private static void putSlla(ByteBuffer ra, byte[] slla) { private static void putSlla(ByteBuffer ra, byte[] slla) {
@@ -408,11 +424,12 @@ public class RouterAdvertisementDaemon {
// Only IEEE 802.3 6-byte addresses are supported. // Only IEEE 802.3 6-byte addresses are supported.
return; return;
} }
final byte ND_OPTION_SLLA = 1;
final byte SLLA_NUM_8OCTETS = 1; final byte nd_option_slla = 1;
ra.put(ND_OPTION_SLLA) final byte slla_num_8octets = 1;
.put(SLLA_NUM_8OCTETS) ra.put(nd_option_slla)
.put(slla); .put(slla_num_8octets)
.put(slla);
} }
private static void putExpandedFlagsOption(ByteBuffer ra) { private static void putExpandedFlagsOption(ByteBuffer ra) {
@@ -428,13 +445,13 @@ public class RouterAdvertisementDaemon {
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/ */
final byte ND_OPTION_EFO = 26; final byte nd_option__efo = 26;
final byte EFO_NUM_8OCTETS = 1; final byte efo_num_8octets = 1;
ra.put(ND_OPTION_EFO) ra.put(nd_option__efo)
.put(EFO_NUM_8OCTETS) .put(efo_num_8octets)
.putShort(asShort(0)) .putShort(asShort(0))
.putInt(0); .putInt(0);
} }
private static void putMtu(ByteBuffer ra, int mtu) { private static void putMtu(ByteBuffer ra, int mtu) {
@@ -449,12 +466,12 @@ public class RouterAdvertisementDaemon {
| MTU | | MTU |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/ */
final byte ND_OPTION_MTU = 5; final byte nd_option_mtu = 5;
final byte MTU_NUM_8OCTETS = 1; final byte mtu_num_8octs = 1;
ra.put(ND_OPTION_MTU) ra.put(nd_option_mtu)
.put(MTU_NUM_8OCTETS) .put(mtu_num_8octs)
.putShort(asShort(0)) .putShort(asShort(0))
.putInt((mtu < IPV6_MIN_MTU) ? IPV6_MIN_MTU : mtu); .putInt((mtu < IPV6_MIN_MTU) ? IPV6_MIN_MTU : mtu);
} }
private static void putPio(ByteBuffer ra, IpPrefix ipp, private static void putPio(ByteBuffer ra, IpPrefix ipp,
@@ -486,22 +503,22 @@ public class RouterAdvertisementDaemon {
if (prefixLength != 64) { if (prefixLength != 64) {
return; return;
} }
final byte ND_OPTION_PIO = 3; final byte nd_option_pio = 3;
final byte PIO_NUM_8OCTETS = 4; final byte pio_num_8octets = 4;
if (validTime < 0) validTime = 0; if (validTime < 0) validTime = 0;
if (preferredTime < 0) preferredTime = 0; if (preferredTime < 0) preferredTime = 0;
if (preferredTime > validTime) preferredTime = validTime; if (preferredTime > validTime) preferredTime = validTime;
final byte[] addr = ipp.getAddress().getAddress(); final byte[] addr = ipp.getAddress().getAddress();
ra.put(ND_OPTION_PIO) ra.put(nd_option_pio)
.put(PIO_NUM_8OCTETS) .put(pio_num_8octets)
.put(asByte(prefixLength)) .put(asByte(prefixLength))
.put(asByte(0xc0)) /* L & A set */ .put(asByte(0xc0)) /* L & A set */
.putInt(validTime) .putInt(validTime)
.putInt(preferredTime) .putInt(preferredTime)
.putInt(0) .putInt(0)
.put(addr); .put(addr);
} }
private static void putRio(ByteBuffer ra, IpPrefix ipp) { private static void putRio(ByteBuffer ra, IpPrefix ipp) {
@@ -524,16 +541,16 @@ public class RouterAdvertisementDaemon {
if (prefixLength > 64) { if (prefixLength > 64) {
return; return;
} }
final byte ND_OPTION_RIO = 24; final byte nd_option_rio = 24;
final byte RIO_NUM_8OCTETS = asByte( final byte rio_num_8octets = asByte(
(prefixLength == 0) ? 1 : (prefixLength <= 8) ? 2 : 3); (prefixLength == 0) ? 1 : (prefixLength <= 8) ? 2 : 3);
final byte[] addr = ipp.getAddress().getAddress(); final byte[] addr = ipp.getAddress().getAddress();
ra.put(ND_OPTION_RIO) ra.put(nd_option_rio)
.put(RIO_NUM_8OCTETS) .put(rio_num_8octets)
.put(asByte(prefixLength)) .put(asByte(prefixLength))
.put(asByte(0x18)) .put(asByte(0x18))
.putInt(DEFAULT_LIFETIME); .putInt(DEFAULT_LIFETIME);
// Rely upon an IpPrefix's address being properly zeroed. // Rely upon an IpPrefix's address being properly zeroed.
if (prefixLength > 0) { if (prefixLength > 0) {
@@ -566,12 +583,12 @@ public class RouterAdvertisementDaemon {
} }
if (filteredDnses.isEmpty()) return; if (filteredDnses.isEmpty()) return;
final byte ND_OPTION_RDNSS = 25; final byte nd_option_rdnss = 25;
final byte RDNSS_NUM_8OCTETS = asByte(dnses.size() * 2 + 1); final byte rdnss_num_8octets = asByte(dnses.size() * 2 + 1);
ra.put(ND_OPTION_RDNSS) ra.put(nd_option_rdnss)
.put(RDNSS_NUM_8OCTETS) .put(rdnss_num_8octets)
.putShort(asShort(0)) .putShort(asShort(0))
.putInt(lifetime); .putInt(lifetime);
for (Inet6Address dns : filteredDnses) { for (Inet6Address dns : filteredDnses) {
// NOTE: If the full of list DNS servers doesn't fit in the packet, // NOTE: If the full of list DNS servers doesn't fit in the packet,
@@ -585,7 +602,7 @@ public class RouterAdvertisementDaemon {
} }
private boolean createSocket() { private boolean createSocket() {
final int SEND_TIMEOUT_MS = 300; final int send_timout_ms = 300;
final int oldTag = TrafficStats.getAndSetThreadStatsTag( final int oldTag = TrafficStats.getAndSetThreadStatsTag(
TrafficStatsConstants.TAG_SYSTEM_NEIGHBOR); TrafficStatsConstants.TAG_SYSTEM_NEIGHBOR);
@@ -593,7 +610,7 @@ public class RouterAdvertisementDaemon {
mSocket = Os.socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6); mSocket = Os.socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6);
// Setting SNDTIMEO is purely for defensive purposes. // Setting SNDTIMEO is purely for defensive purposes.
Os.setsockoptTimeval( Os.setsockoptTimeval(
mSocket, SOL_SOCKET, SO_SNDTIMEO, StructTimeval.fromMillis(SEND_TIMEOUT_MS)); mSocket, SOL_SOCKET, SO_SNDTIMEO, StructTimeval.fromMillis(send_timout_ms));
Os.setsockoptIfreq(mSocket, SOL_SOCKET, SO_BINDTODEVICE, mInterface.name); Os.setsockoptIfreq(mSocket, SOL_SOCKET, SO_BINDTODEVICE, mInterface.name);
NetworkUtils.protectFromVpn(mSocket); NetworkUtils.protectFromVpn(mSocket);
NetworkUtils.setupRaSocket(mSocket, mInterface.index); NetworkUtils.setupRaSocket(mSocket, mInterface.index);
@@ -611,7 +628,7 @@ public class RouterAdvertisementDaemon {
if (mSocket != null) { if (mSocket != null) {
try { try {
IoBridge.closeAndSignalBlockedThreads(mSocket); IoBridge.closeAndSignalBlockedThreads(mSocket);
} catch (IOException ignored) {} } catch (IOException ignored) { }
} }
mSocket = null; mSocket = null;
} }
@@ -627,9 +644,9 @@ public class RouterAdvertisementDaemon {
} }
final InetAddress destip = dest.getAddress(); final InetAddress destip = dest.getAddress();
return (destip instanceof Inet6Address) && return (destip instanceof Inet6Address)
destip.isLinkLocalAddress() && && destip.isLinkLocalAddress()
(((Inet6Address) destip).getScopeId() == mInterface.index); && (((Inet6Address) destip).getScopeId() == mInterface.index);
} }
private void maybeSendRA(InetSocketAddress dest) { private void maybeSendRA(InetSocketAddress dest) {
@@ -654,11 +671,11 @@ public class RouterAdvertisementDaemon {
} }
private final class UnicastResponder extends Thread { private final class UnicastResponder extends Thread {
private final InetSocketAddress solicitor = new InetSocketAddress(); private final InetSocketAddress mSolicitor = new InetSocketAddress();
// The recycled buffer for receiving Router Solicitations from clients. // The recycled buffer for receiving Router Solicitations from clients.
// If the RS is larger than IPV6_MIN_MTU the packets are truncated. // If the RS is larger than IPV6_MIN_MTU the packets are truncated.
// This is fine since currently only byte 0 is examined anyway. // This is fine since currently only byte 0 is examined anyway.
private final byte mSolication[] = new byte[IPV6_MIN_MTU]; private final byte[] mSolicitation = new byte[IPV6_MIN_MTU];
@Override @Override
public void run() { public void run() {
@@ -666,9 +683,9 @@ public class RouterAdvertisementDaemon {
try { try {
// Blocking receive. // Blocking receive.
final int rval = Os.recvfrom( final int rval = Os.recvfrom(
mSocket, mSolication, 0, mSolication.length, 0, solicitor); mSocket, mSolicitation, 0, mSolicitation.length, 0, mSolicitor);
// Do the least possible amount of validation. // Do the least possible amount of validation.
if (rval < 1 || mSolication[0] != ICMPV6_ND_ROUTER_SOLICIT) { if (rval < 1 || mSolicitation[0] != ICMPV6_ND_ROUTER_SOLICIT) {
continue; continue;
} }
} catch (ErrnoException | SocketException e) { } catch (ErrnoException | SocketException e) {
@@ -678,7 +695,7 @@ public class RouterAdvertisementDaemon {
continue; continue;
} }
maybeSendRA(solicitor); maybeSendRA(mSolicitor);
} }
} }
} }

View File

@@ -47,6 +47,6 @@ public class InterfaceSet {
public boolean equals(Object obj) { public boolean equals(Object obj) {
return obj != null return obj != null
&& obj instanceof InterfaceSet && obj instanceof InterfaceSet
&& ifnames.equals(((InterfaceSet)obj).ifnames); && ifnames.equals(((InterfaceSet) obj).ifnames);
} }
} }

View File

@@ -43,5 +43,8 @@ filegroup {
name: "tethering-tests-src", name: "tethering-tests-src",
srcs: [ srcs: [
"src/com/android/server/connectivity/tethering/TetheringConfigurationTest.java", "src/com/android/server/connectivity/tethering/TetheringConfigurationTest.java",
"src/android/net/dhcp/DhcpServingParamsParcelExtTest.java",
"src/android/net/ip/IpServerTest.java",
"src/android/net/util/InterfaceSetTest.java",
], ],
} }

View File

@@ -183,7 +183,7 @@ public class IpServerTest {
@Test @Test
public void shouldDoNothingUntilRequested() throws Exception { public void shouldDoNothingUntilRequested() throws Exception {
initStateMachine(TETHERING_BLUETOOTH); initStateMachine(TETHERING_BLUETOOTH);
final int [] NOOP_COMMANDS = { final int [] noOp_commands = {
IpServer.CMD_TETHER_UNREQUESTED, IpServer.CMD_TETHER_UNREQUESTED,
IpServer.CMD_IP_FORWARDING_ENABLE_ERROR, IpServer.CMD_IP_FORWARDING_ENABLE_ERROR,
IpServer.CMD_IP_FORWARDING_DISABLE_ERROR, IpServer.CMD_IP_FORWARDING_DISABLE_ERROR,
@@ -192,7 +192,7 @@ public class IpServerTest {
IpServer.CMD_SET_DNS_FORWARDERS_ERROR, IpServer.CMD_SET_DNS_FORWARDERS_ERROR,
IpServer.CMD_TETHER_CONNECTION_CHANGED IpServer.CMD_TETHER_CONNECTION_CHANGED
}; };
for (int command : NOOP_COMMANDS) { for (int command : noOp_commands) {
// None of these commands should trigger us to request action from // None of these commands should trigger us to request action from
// the rest of the system. // the rest of the system.
dispatchCommand(command); dispatchCommand(command);

View File

@@ -20,7 +20,6 @@ java_library_static {
":vold_aidl", ":vold_aidl",
":gsiservice_aidl", ":gsiservice_aidl",
":platform-compat-config", ":platform-compat-config",
":tethering-services-srcs",
"java/com/android/server/EventLogTags.logtags", "java/com/android/server/EventLogTags.logtags",
"java/com/android/server/am/EventLogTags.logtags", "java/com/android/server/am/EventLogTags.logtags",
"java/com/android/server/policy/EventLogTags.logtags", "java/com/android/server/policy/EventLogTags.logtags",

View File

@@ -1,6 +1,9 @@
java_library_static { java_library_static {
name: "services.net", name: "services.net",
srcs: ["java/**/*.java"], srcs: [
":tethering-services-srcs",
"java/**/*.java",
],
static_libs: [ static_libs: [
"dnsresolver_aidl_interface-V2-java", "dnsresolver_aidl_interface-V2-java",
"netd_aidl_interface-java", "netd_aidl_interface-java",
@@ -23,6 +26,12 @@ filegroup {
name: "services-tethering-shared-srcs", name: "services-tethering-shared-srcs",
srcs: [ srcs: [
":framework-annotations", ":framework-annotations",
"java/android/net/ConnectivityModuleConnector.java",
"java/android/net/NetworkStackClient.java",
"java/android/net/ip/InterfaceController.java",
"java/android/net/util/InterfaceParams.java",
"java/android/net/util/NetdService.java",
"java/android/net/util/NetworkConstants.java",
"java/android/net/util/SharedLog.java" "java/android/net/util/SharedLog.java"
], ],
} }