Merge "[Tether03] Migrate IpServer into module" am: 634c6a512f
am: c8c297544c
Change-Id: I2f63d9f288cba8186e6114860265b5347abf3bdc
This commit is contained in:
@@ -24,6 +24,8 @@ java_defaults {
|
||||
],
|
||||
static_libs: [
|
||||
"androidx.annotation_annotation",
|
||||
"netd_aidl_interface-java",
|
||||
"networkstack-aidl-interfaces-java",
|
||||
"tethering-client",
|
||||
],
|
||||
manifest: "AndroidManifestBase.xml",
|
||||
@@ -68,5 +70,10 @@ filegroup {
|
||||
name: "tethering-services-srcs",
|
||||
srcs: [
|
||||
"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",
|
||||
],
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
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.util.NetworkConstants.FF;
|
||||
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_LOCAL_ONLY = 3;
|
||||
|
||||
/** Get string name of |state|.*/
|
||||
public static String getStateString(int state) {
|
||||
switch (state) {
|
||||
case STATE_UNAVAILABLE: return "UNAVAILABLE";
|
||||
@@ -103,15 +104,16 @@ public class IpServer extends StateMachine {
|
||||
// TODO: have this configurable
|
||||
private static final int DHCP_LEASE_TIME_SECS = 3600;
|
||||
|
||||
private final static String TAG = "IpServer";
|
||||
private final static boolean DBG = false;
|
||||
private final static boolean VDBG = false;
|
||||
private static final Class[] messageClasses = {
|
||||
private static final String TAG = "IpServer";
|
||||
private static final boolean DBG = false;
|
||||
private static final boolean VDBG = false;
|
||||
private static final Class[] sMessageClasses = {
|
||||
IpServer.class
|
||||
};
|
||||
private static final SparseArray<String> sMagicDecoderRing =
|
||||
MessageUtils.findMessageNames(messageClasses);
|
||||
MessageUtils.findMessageNames(sMessageClasses);
|
||||
|
||||
/** IpServer callback. */
|
||||
public static class Callback {
|
||||
/**
|
||||
* Notify that |who| has changed its tethering state.
|
||||
@@ -131,11 +133,14 @@ public class IpServer extends StateMachine {
|
||||
public void updateLinkProperties(IpServer who, LinkProperties newLp) {}
|
||||
}
|
||||
|
||||
/** Capture IpServer dependencies, for injection. */
|
||||
public static class Dependencies {
|
||||
/** Create a RouterAdvertisementDaemon instance to be used by IpServer.*/
|
||||
public RouterAdvertisementDaemon getRouterAdvertisementDaemon(InterfaceParams ifParams) {
|
||||
return new RouterAdvertisementDaemon(ifParams);
|
||||
}
|
||||
|
||||
/** Get |ifName|'s interface information.*/
|
||||
public InterfaceParams getInterfaceParams(String ifName) {
|
||||
return InterfaceParams.getByName(ifName);
|
||||
}
|
||||
@@ -244,25 +249,51 @@ public class IpServer extends StateMachine {
|
||||
setInitialState(mInitialState);
|
||||
}
|
||||
|
||||
public String interfaceName() { return mIfaceName; }
|
||||
|
||||
public int interfaceType() { return mInterfaceType; }
|
||||
|
||||
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); }
|
||||
/** Interface name which IpServer served.*/
|
||||
public String interfaceName() {
|
||||
return mIfaceName;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
@@ -410,7 +441,7 @@ public class IpServer extends StateMachine {
|
||||
prefixLen = WIFI_P2P_IFACE_PREFIX_LENGTH;
|
||||
} else {
|
||||
// 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);
|
||||
}
|
||||
|
||||
@@ -422,7 +453,7 @@ public class IpServer extends StateMachine {
|
||||
return false;
|
||||
}
|
||||
|
||||
InetAddress addr = numericToInetAddress(ipAsString);
|
||||
InetAddress addr = parseNumericAddress(ipAsString);
|
||||
linkAddr = new LinkAddress(addr, prefixLen);
|
||||
ifcg.setLinkAddress(linkAddr);
|
||||
if (mInterfaceType == ConnectivityManager.TETHERING_WIFI) {
|
||||
@@ -473,7 +504,7 @@ public class IpServer extends StateMachine {
|
||||
|
||||
private String getRandomWifiIPv4Address() {
|
||||
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);
|
||||
return InetAddress.getByAddress(bytes).getHostAddress();
|
||||
} catch (Exception e) {
|
||||
@@ -119,6 +119,7 @@ public class RouterAdvertisementDaemon {
|
||||
private volatile MulticastTransmitter mMulticastTransmitter;
|
||||
private volatile UnicastResponder mUnicastResponder;
|
||||
|
||||
/** Encapsulate the RA parameters for RouterAdvertisementDaemon.*/
|
||||
public static class RaParams {
|
||||
// Tethered traffic will have the hop limit properly decremented.
|
||||
// Consequently, set the hoplimit greater by one than the upstream
|
||||
@@ -150,10 +151,12 @@ public class RouterAdvertisementDaemon {
|
||||
dnses = (HashSet) other.dnses.clone();
|
||||
}
|
||||
|
||||
// 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|.
|
||||
/**
|
||||
* 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|.
|
||||
*/
|
||||
public static RaParams getDeprecatedRaParams(RaParams oldRa, RaParams newRa) {
|
||||
RaParams newlyDeprecated = new RaParams();
|
||||
|
||||
@@ -179,7 +182,9 @@ public class RouterAdvertisementDaemon {
|
||||
private final HashMap<IpPrefix, Integer> mPrefixes = 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) {
|
||||
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) {
|
||||
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() {
|
||||
boolean removed = decrementCounter(mPrefixes);
|
||||
@@ -219,7 +228,7 @@ public class RouterAdvertisementDaemon {
|
||||
boolean removed = false;
|
||||
|
||||
for (Iterator<Map.Entry<T, Integer>> it = map.entrySet().iterator();
|
||||
it.hasNext();) {
|
||||
it.hasNext();) {
|
||||
Map.Entry<T, Integer> kv = it.next();
|
||||
if (kv.getValue() == 0) {
|
||||
it.remove();
|
||||
@@ -240,6 +249,7 @@ public class RouterAdvertisementDaemon {
|
||||
mDeprecatedInfoTracker = new DeprecatedInfoTracker();
|
||||
}
|
||||
|
||||
/** Build new RA.*/
|
||||
public void buildNewRa(RaParams deprecatedParams, RaParams newParams) {
|
||||
synchronized (mLock) {
|
||||
if (deprecatedParams != null) {
|
||||
@@ -260,6 +270,7 @@ public class RouterAdvertisementDaemon {
|
||||
maybeNotifyMulticastTransmitter();
|
||||
}
|
||||
|
||||
/** Start router advertisement daemon. */
|
||||
public boolean start() {
|
||||
if (!createSocket()) {
|
||||
return false;
|
||||
@@ -274,6 +285,7 @@ public class RouterAdvertisementDaemon {
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Stop router advertisement daemon. */
|
||||
public void stop() {
|
||||
closeSocket();
|
||||
// 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 short asShort(int value) { return (short) value; }
|
||||
private static byte asByte(int value) {
|
||||
return (byte) value;
|
||||
}
|
||||
private static short asShort(int value) {
|
||||
return (short) value;
|
||||
}
|
||||
|
||||
private static void putHeader(ByteBuffer ra, boolean hasDefaultRoute, byte hopLimit) {
|
||||
/**
|
||||
@@ -384,14 +400,14 @@ public class RouterAdvertisementDaemon {
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-
|
||||
*/
|
||||
ra.put(ICMPV6_ND_ROUTER_ADVERT)
|
||||
.put(asByte(0))
|
||||
.putShort(asShort(0))
|
||||
.put(hopLimit)
|
||||
// RFC 4191 "high" preference, iff. advertising a default route.
|
||||
.put(hasDefaultRoute ? asByte(0x08) : asByte(0))
|
||||
.putShort(hasDefaultRoute ? asShort(DEFAULT_LIFETIME) : asShort(0))
|
||||
.putInt(0)
|
||||
.putInt(0);
|
||||
.put(asByte(0))
|
||||
.putShort(asShort(0))
|
||||
.put(hopLimit)
|
||||
// RFC 4191 "high" preference, iff. advertising a default route.
|
||||
.put(hasDefaultRoute ? asByte(0x08) : asByte(0))
|
||||
.putShort(hasDefaultRoute ? asShort(DEFAULT_LIFETIME) : asShort(0))
|
||||
.putInt(0)
|
||||
.putInt(0);
|
||||
}
|
||||
|
||||
private static void putSlla(ByteBuffer ra, byte[] slla) {
|
||||
@@ -408,11 +424,12 @@ public class RouterAdvertisementDaemon {
|
||||
// Only IEEE 802.3 6-byte addresses are supported.
|
||||
return;
|
||||
}
|
||||
final byte ND_OPTION_SLLA = 1;
|
||||
final byte SLLA_NUM_8OCTETS = 1;
|
||||
ra.put(ND_OPTION_SLLA)
|
||||
.put(SLLA_NUM_8OCTETS)
|
||||
.put(slla);
|
||||
|
||||
final byte nd_option_slla = 1;
|
||||
final byte slla_num_8octets = 1;
|
||||
ra.put(nd_option_slla)
|
||||
.put(slla_num_8octets)
|
||||
.put(slla);
|
||||
}
|
||||
|
||||
private static void putExpandedFlagsOption(ByteBuffer ra) {
|
||||
@@ -428,13 +445,13 @@ public class RouterAdvertisementDaemon {
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
*/
|
||||
|
||||
final byte ND_OPTION_EFO = 26;
|
||||
final byte EFO_NUM_8OCTETS = 1;
|
||||
final byte nd_option__efo = 26;
|
||||
final byte efo_num_8octets = 1;
|
||||
|
||||
ra.put(ND_OPTION_EFO)
|
||||
.put(EFO_NUM_8OCTETS)
|
||||
.putShort(asShort(0))
|
||||
.putInt(0);
|
||||
ra.put(nd_option__efo)
|
||||
.put(efo_num_8octets)
|
||||
.putShort(asShort(0))
|
||||
.putInt(0);
|
||||
}
|
||||
|
||||
private static void putMtu(ByteBuffer ra, int mtu) {
|
||||
@@ -449,12 +466,12 @@ public class RouterAdvertisementDaemon {
|
||||
| MTU |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
*/
|
||||
final byte ND_OPTION_MTU = 5;
|
||||
final byte MTU_NUM_8OCTETS = 1;
|
||||
ra.put(ND_OPTION_MTU)
|
||||
.put(MTU_NUM_8OCTETS)
|
||||
.putShort(asShort(0))
|
||||
.putInt((mtu < IPV6_MIN_MTU) ? IPV6_MIN_MTU : mtu);
|
||||
final byte nd_option_mtu = 5;
|
||||
final byte mtu_num_8octs = 1;
|
||||
ra.put(nd_option_mtu)
|
||||
.put(mtu_num_8octs)
|
||||
.putShort(asShort(0))
|
||||
.putInt((mtu < IPV6_MIN_MTU) ? IPV6_MIN_MTU : mtu);
|
||||
}
|
||||
|
||||
private static void putPio(ByteBuffer ra, IpPrefix ipp,
|
||||
@@ -486,22 +503,22 @@ public class RouterAdvertisementDaemon {
|
||||
if (prefixLength != 64) {
|
||||
return;
|
||||
}
|
||||
final byte ND_OPTION_PIO = 3;
|
||||
final byte PIO_NUM_8OCTETS = 4;
|
||||
final byte nd_option_pio = 3;
|
||||
final byte pio_num_8octets = 4;
|
||||
|
||||
if (validTime < 0) validTime = 0;
|
||||
if (preferredTime < 0) preferredTime = 0;
|
||||
if (preferredTime > validTime) preferredTime = validTime;
|
||||
|
||||
final byte[] addr = ipp.getAddress().getAddress();
|
||||
ra.put(ND_OPTION_PIO)
|
||||
.put(PIO_NUM_8OCTETS)
|
||||
.put(asByte(prefixLength))
|
||||
.put(asByte(0xc0)) /* L & A set */
|
||||
.putInt(validTime)
|
||||
.putInt(preferredTime)
|
||||
.putInt(0)
|
||||
.put(addr);
|
||||
ra.put(nd_option_pio)
|
||||
.put(pio_num_8octets)
|
||||
.put(asByte(prefixLength))
|
||||
.put(asByte(0xc0)) /* L & A set */
|
||||
.putInt(validTime)
|
||||
.putInt(preferredTime)
|
||||
.putInt(0)
|
||||
.put(addr);
|
||||
}
|
||||
|
||||
private static void putRio(ByteBuffer ra, IpPrefix ipp) {
|
||||
@@ -524,16 +541,16 @@ public class RouterAdvertisementDaemon {
|
||||
if (prefixLength > 64) {
|
||||
return;
|
||||
}
|
||||
final byte ND_OPTION_RIO = 24;
|
||||
final byte RIO_NUM_8OCTETS = asByte(
|
||||
final byte nd_option_rio = 24;
|
||||
final byte rio_num_8octets = asByte(
|
||||
(prefixLength == 0) ? 1 : (prefixLength <= 8) ? 2 : 3);
|
||||
|
||||
final byte[] addr = ipp.getAddress().getAddress();
|
||||
ra.put(ND_OPTION_RIO)
|
||||
.put(RIO_NUM_8OCTETS)
|
||||
.put(asByte(prefixLength))
|
||||
.put(asByte(0x18))
|
||||
.putInt(DEFAULT_LIFETIME);
|
||||
ra.put(nd_option_rio)
|
||||
.put(rio_num_8octets)
|
||||
.put(asByte(prefixLength))
|
||||
.put(asByte(0x18))
|
||||
.putInt(DEFAULT_LIFETIME);
|
||||
|
||||
// Rely upon an IpPrefix's address being properly zeroed.
|
||||
if (prefixLength > 0) {
|
||||
@@ -566,12 +583,12 @@ public class RouterAdvertisementDaemon {
|
||||
}
|
||||
if (filteredDnses.isEmpty()) return;
|
||||
|
||||
final byte ND_OPTION_RDNSS = 25;
|
||||
final byte RDNSS_NUM_8OCTETS = asByte(dnses.size() * 2 + 1);
|
||||
ra.put(ND_OPTION_RDNSS)
|
||||
.put(RDNSS_NUM_8OCTETS)
|
||||
.putShort(asShort(0))
|
||||
.putInt(lifetime);
|
||||
final byte nd_option_rdnss = 25;
|
||||
final byte rdnss_num_8octets = asByte(dnses.size() * 2 + 1);
|
||||
ra.put(nd_option_rdnss)
|
||||
.put(rdnss_num_8octets)
|
||||
.putShort(asShort(0))
|
||||
.putInt(lifetime);
|
||||
|
||||
for (Inet6Address dns : filteredDnses) {
|
||||
// NOTE: If the full of list DNS servers doesn't fit in the packet,
|
||||
@@ -585,7 +602,7 @@ public class RouterAdvertisementDaemon {
|
||||
}
|
||||
|
||||
private boolean createSocket() {
|
||||
final int SEND_TIMEOUT_MS = 300;
|
||||
final int send_timout_ms = 300;
|
||||
|
||||
final int oldTag = TrafficStats.getAndSetThreadStatsTag(
|
||||
TrafficStatsConstants.TAG_SYSTEM_NEIGHBOR);
|
||||
@@ -593,7 +610,7 @@ public class RouterAdvertisementDaemon {
|
||||
mSocket = Os.socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6);
|
||||
// Setting SNDTIMEO is purely for defensive purposes.
|
||||
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);
|
||||
NetworkUtils.protectFromVpn(mSocket);
|
||||
NetworkUtils.setupRaSocket(mSocket, mInterface.index);
|
||||
@@ -611,7 +628,7 @@ public class RouterAdvertisementDaemon {
|
||||
if (mSocket != null) {
|
||||
try {
|
||||
IoBridge.closeAndSignalBlockedThreads(mSocket);
|
||||
} catch (IOException ignored) {}
|
||||
} catch (IOException ignored) { }
|
||||
}
|
||||
mSocket = null;
|
||||
}
|
||||
@@ -627,9 +644,9 @@ public class RouterAdvertisementDaemon {
|
||||
}
|
||||
|
||||
final InetAddress destip = dest.getAddress();
|
||||
return (destip instanceof Inet6Address) &&
|
||||
destip.isLinkLocalAddress() &&
|
||||
(((Inet6Address) destip).getScopeId() == mInterface.index);
|
||||
return (destip instanceof Inet6Address)
|
||||
&& destip.isLinkLocalAddress()
|
||||
&& (((Inet6Address) destip).getScopeId() == mInterface.index);
|
||||
}
|
||||
|
||||
private void maybeSendRA(InetSocketAddress dest) {
|
||||
@@ -654,11 +671,11 @@ public class RouterAdvertisementDaemon {
|
||||
}
|
||||
|
||||
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.
|
||||
// If the RS is larger than IPV6_MIN_MTU the packets are truncated.
|
||||
// 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
|
||||
public void run() {
|
||||
@@ -666,9 +683,9 @@ public class RouterAdvertisementDaemon {
|
||||
try {
|
||||
// Blocking receive.
|
||||
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.
|
||||
if (rval < 1 || mSolication[0] != ICMPV6_ND_ROUTER_SOLICIT) {
|
||||
if (rval < 1 || mSolicitation[0] != ICMPV6_ND_ROUTER_SOLICIT) {
|
||||
continue;
|
||||
}
|
||||
} catch (ErrnoException | SocketException e) {
|
||||
@@ -678,7 +695,7 @@ public class RouterAdvertisementDaemon {
|
||||
continue;
|
||||
}
|
||||
|
||||
maybeSendRA(solicitor);
|
||||
maybeSendRA(mSolicitor);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -47,6 +47,6 @@ public class InterfaceSet {
|
||||
public boolean equals(Object obj) {
|
||||
return obj != null
|
||||
&& obj instanceof InterfaceSet
|
||||
&& ifnames.equals(((InterfaceSet)obj).ifnames);
|
||||
&& ifnames.equals(((InterfaceSet) obj).ifnames);
|
||||
}
|
||||
}
|
||||
@@ -43,5 +43,8 @@ filegroup {
|
||||
name: "tethering-tests-src",
|
||||
srcs: [
|
||||
"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",
|
||||
],
|
||||
}
|
||||
|
||||
@@ -183,7 +183,7 @@ public class IpServerTest {
|
||||
@Test
|
||||
public void shouldDoNothingUntilRequested() throws Exception {
|
||||
initStateMachine(TETHERING_BLUETOOTH);
|
||||
final int [] NOOP_COMMANDS = {
|
||||
final int [] noOp_commands = {
|
||||
IpServer.CMD_TETHER_UNREQUESTED,
|
||||
IpServer.CMD_IP_FORWARDING_ENABLE_ERROR,
|
||||
IpServer.CMD_IP_FORWARDING_DISABLE_ERROR,
|
||||
@@ -192,7 +192,7 @@ public class IpServerTest {
|
||||
IpServer.CMD_SET_DNS_FORWARDERS_ERROR,
|
||||
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
|
||||
// the rest of the system.
|
||||
dispatchCommand(command);
|
||||
@@ -20,7 +20,6 @@ java_library_static {
|
||||
":vold_aidl",
|
||||
":gsiservice_aidl",
|
||||
":platform-compat-config",
|
||||
":tethering-services-srcs",
|
||||
"java/com/android/server/EventLogTags.logtags",
|
||||
"java/com/android/server/am/EventLogTags.logtags",
|
||||
"java/com/android/server/policy/EventLogTags.logtags",
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
java_library_static {
|
||||
name: "services.net",
|
||||
srcs: ["java/**/*.java"],
|
||||
srcs: [
|
||||
":tethering-services-srcs",
|
||||
"java/**/*.java",
|
||||
],
|
||||
static_libs: [
|
||||
"dnsresolver_aidl_interface-V2-java",
|
||||
"netd_aidl_interface-java",
|
||||
@@ -23,6 +26,12 @@ filegroup {
|
||||
name: "services-tethering-shared-srcs",
|
||||
srcs: [
|
||||
":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"
|
||||
],
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user