Loading services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java +9 −26 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.net.RouteInfo; import android.net.ip.InterfaceController; import android.net.ip.RouterAdvertisementDaemon; import android.net.ip.RouterAdvertisementDaemon.RaParams; import android.net.util.InterfaceParams; import android.net.util.NetdService; import android.net.util.SharedLog; import android.os.INetworkManagementService; Loading @@ -48,7 +49,6 @@ import com.android.internal.util.StateMachine; import java.net.Inet6Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.net.UnknownHostException; import java.util.ArrayList; Loading Loading @@ -120,8 +120,7 @@ public class TetherInterfaceStateMachine extends StateMachine { private int mLastError; private int mServingMode; private String mMyUpstreamIfaceName; // may change over time private NetworkInterface mNetworkInterface; private byte[] mHwAddr; private InterfaceParams mInterfaceParams; // TODO: De-duplicate this with mLinkProperties above. Currently, these link // properties are those selected by the IPv6TetheringCoordinator and relayed // to us. By comparison, mLinkProperties contains the addresses and directly Loading Loading @@ -247,31 +246,16 @@ public class TetherInterfaceStateMachine extends StateMachine { } private boolean startIPv6() { // TODO: Refactor for testability (perhaps passing an android.system.Os // instance and calling getifaddrs() directly). try { mNetworkInterface = NetworkInterface.getByName(mIfaceName); } catch (SocketException e) { mLog.e("Error looking up NetworkInterfaces: " + e); stopIPv6(); return false; } if (mNetworkInterface == null) { mLog.e("Failed to find NetworkInterface"); stopIPv6(); return false; } try { mHwAddr = mNetworkInterface.getHardwareAddress(); } catch (SocketException e) { mLog.e("Failed to find hardware address: " + e); // TODO: Refactor for better testability. This is one of the things // that prohibits unittesting IPv6 tethering setup. mInterfaceParams = InterfaceParams.getByName(mIfaceName); if (mInterfaceParams == null) { mLog.e("Failed to find InterfaceParams"); stopIPv6(); return false; } final int ifindex = mNetworkInterface.getIndex(); mRaDaemon = new RouterAdvertisementDaemon(mIfaceName, ifindex, mHwAddr); mRaDaemon = new RouterAdvertisementDaemon(mInterfaceParams); if (!mRaDaemon.start()) { stopIPv6(); return false; Loading @@ -281,8 +265,7 @@ public class TetherInterfaceStateMachine extends StateMachine { } private void stopIPv6() { mNetworkInterface = null; mHwAddr = null; mInterfaceParams = null; setRaParams(null); if (mRaDaemon != null) { Loading services/net/java/android/net/apf/ApfFilter.java +12 −12 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ import android.net.metrics.ApfProgramEvent; import android.net.metrics.ApfStats; import android.net.metrics.IpConnectivityLog; import android.net.metrics.RaEvent; import android.net.util.InterfaceParams; import android.system.ErrnoException; import android.system.Os; import android.system.PacketSocketAddress; Loading @@ -56,7 +57,6 @@ import java.lang.Thread; import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.net.UnknownHostException; import java.nio.ByteBuffer; Loading Loading @@ -247,7 +247,7 @@ public class ApfFilter { private final ApfCapabilities mApfCapabilities; private final IpClient.Callback mIpClientCallback; private final NetworkInterface mNetworkInterface; private final InterfaceParams mInterfaceParams; private final IpConnectivityLog mMetricsLog; @VisibleForTesting Loading @@ -269,11 +269,11 @@ public class ApfFilter { private int mIPv4PrefixLength; @VisibleForTesting ApfFilter(ApfConfiguration config, NetworkInterface networkInterface, ApfFilter(ApfConfiguration config, InterfaceParams ifParams, IpClient.Callback ipClientCallback, IpConnectivityLog log) { mApfCapabilities = config.apfCapabilities; mIpClientCallback = ipClientCallback; mNetworkInterface = networkInterface; mInterfaceParams = ifParams; mMulticastFilter = config.multicastFilter; mDrop802_3Frames = config.ieee802_3Filter; Loading @@ -287,7 +287,7 @@ public class ApfFilter { } private void log(String s) { Log.d(TAG, "(" + mNetworkInterface.getName() + "): " + s); Log.d(TAG, "(" + mInterfaceParams.name + "): " + s); } @GuardedBy("this") Loading Loading @@ -332,14 +332,14 @@ public class ApfFilter { void maybeStartFilter() { FileDescriptor socket; try { mHardwareAddress = mNetworkInterface.getHardwareAddress(); mHardwareAddress = mInterfaceParams.macAddr.toByteArray(); synchronized(this) { // Install basic filters installNewProgramLocked(); } socket = Os.socket(AF_PACKET, SOCK_RAW, ETH_P_IPV6); PacketSocketAddress addr = new PacketSocketAddress((short) ETH_P_IPV6, mNetworkInterface.getIndex()); PacketSocketAddress addr = new PacketSocketAddress( (short) ETH_P_IPV6, mInterfaceParams.index); Os.bind(socket, addr); NetworkUtils.attachRaFilter(socket, mApfCapabilities.apfPacketFormat); } catch(SocketException|ErrnoException e) { Loading Loading @@ -1168,10 +1168,10 @@ public class ApfFilter { * filtering using APF programs. */ public static ApfFilter maybeCreate(ApfConfiguration config, NetworkInterface networkInterface, IpClient.Callback ipClientCallback) { if (config == null) return null; InterfaceParams ifParams, IpClient.Callback ipClientCallback) { if (config == null || ifParams == null) return null; ApfCapabilities apfCapabilities = config.apfCapabilities; if (apfCapabilities == null || networkInterface == null) return null; if (apfCapabilities == null) return null; if (apfCapabilities.apfVersionSupported == 0) return null; if (apfCapabilities.maximumApfProgramSize < 512) { Log.e(TAG, "Unacceptably small APF limit: " + apfCapabilities.maximumApfProgramSize); Loading @@ -1186,7 +1186,7 @@ public class ApfFilter { Log.e(TAG, "Unsupported APF version: " + apfCapabilities.apfVersionSupported); return null; } return new ApfFilter(config, networkInterface, ipClientCallback, new IpConnectivityLog()); return new ApfFilter(config, ifParams, ipClientCallback, new IpConnectivityLog()); } public synchronized void shutdown() { Loading services/net/java/android/net/dhcp/DhcpClient.java +15 −13 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import android.net.TrafficStats; import android.net.metrics.IpConnectivityLog; import android.net.metrics.DhcpClientEvent; import android.net.metrics.DhcpErrorEvent; import android.net.util.InterfaceParams; import android.os.Message; import android.os.RemoteException; import android.os.ServiceManager; Loading @@ -50,7 +51,6 @@ import java.io.FileDescriptor; import java.io.IOException; import java.lang.Thread; import java.net.Inet4Address; import java.net.NetworkInterface; import java.net.SocketException; import java.nio.ByteBuffer; import java.util.Arrays; Loading Loading @@ -187,7 +187,8 @@ public class DhcpClient extends StateMachine { private final String mIfaceName; private boolean mRegisteredForPreDhcpNotification; private NetworkInterface mIface; private InterfaceParams mIface; // TODO: MacAddress-ify more of this class hierarchy. private byte[] mHwAddr; private PacketSocketAddress mInterfaceBroadcastAddr; private int mTransactionId; Loading Loading @@ -221,6 +222,7 @@ public class DhcpClient extends StateMachine { return new WakeupMessage(mContext, getHandler(), cmdName, cmd); } // TODO: Take an InterfaceParams instance instead of an interface name String. private DhcpClient(Context context, StateMachine controller, String iface) { super(TAG); Loading Loading @@ -262,23 +264,23 @@ public class DhcpClient extends StateMachine { } public static DhcpClient makeDhcpClient( Context context, StateMachine controller, String intf) { DhcpClient client = new DhcpClient(context, controller, intf); Context context, StateMachine controller, InterfaceParams ifParams) { DhcpClient client = new DhcpClient(context, controller, ifParams.name); client.mIface = ifParams; client.start(); return client; } private boolean initInterface() { try { mIface = NetworkInterface.getByName(mIfaceName); mHwAddr = mIface.getHardwareAddress(); mInterfaceBroadcastAddr = new PacketSocketAddress(mIface.getIndex(), DhcpPacket.ETHER_BROADCAST); return true; } catch(SocketException | NullPointerException e) { Log.e(TAG, "Can't determine ifindex or MAC address for " + mIfaceName, e); if (mIface == null) mIface = InterfaceParams.getByName(mIfaceName); if (mIface == null) { Log.e(TAG, "Can't determine InterfaceParams for " + mIfaceName); return false; } mHwAddr = mIface.macAddr.toByteArray(); mInterfaceBroadcastAddr = new PacketSocketAddress(mIface.index, DhcpPacket.ETHER_BROADCAST); return true; } private void startNewTransaction() { Loading @@ -293,7 +295,7 @@ public class DhcpClient extends StateMachine { private boolean initPacketSocket() { try { mPacketSock = Os.socket(AF_PACKET, SOCK_RAW, ETH_P_IP); PacketSocketAddress addr = new PacketSocketAddress((short) ETH_P_IP, mIface.getIndex()); PacketSocketAddress addr = new PacketSocketAddress((short) ETH_P_IP, mIface.index); Os.bind(mPacketSock, addr); NetworkUtils.attachDhcpFilter(mPacketSock); } catch(SocketException|ErrnoException e) { Loading services/net/java/android/net/ip/ConnectivityPacketTracker.java +11 −25 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import static android.system.OsConstants.*; import android.net.NetworkUtils; import android.net.util.PacketReader; import android.net.util.ConnectivityPacketSummary; import android.net.util.InterfaceParams; import android.os.Handler; import android.system.ErrnoException; import android.system.Os; Loading @@ -35,7 +36,6 @@ import libcore.util.HexEncoding; import java.io.FileDescriptor; import java.io.InterruptedIOException; import java.io.IOException; import java.net.NetworkInterface; import java.net.SocketException; Loading Loading @@ -69,24 +69,12 @@ public class ConnectivityPacketTracker { private boolean mRunning; private String mDisplayName; public ConnectivityPacketTracker(Handler h, NetworkInterface netif, LocalLog log) { final String ifname; final int ifindex; final byte[] hwaddr; final int mtu; public ConnectivityPacketTracker(Handler h, InterfaceParams ifParams, LocalLog log) { if (ifParams == null) throw new IllegalArgumentException("null InterfaceParams"); try { ifname = netif.getName(); ifindex = netif.getIndex(); hwaddr = netif.getHardwareAddress(); mtu = netif.getMTU(); } catch (NullPointerException|SocketException e) { throw new IllegalArgumentException("bad network interface", e); } mTag = TAG + "." + ifname; mTag = TAG + "." + ifParams.name; mLog = log; mPacketListener = new PacketListener(h, ifindex, hwaddr, mtu); mPacketListener = new PacketListener(h, ifParams); } public void start(String displayName) { Loading @@ -102,13 +90,11 @@ public class ConnectivityPacketTracker { } private final class PacketListener extends PacketReader { private final int mIfIndex; private final byte mHwAddr[]; private final InterfaceParams mInterface; PacketListener(Handler h, int ifindex, byte[] hwaddr, int mtu) { super(h, mtu); mIfIndex = ifindex; mHwAddr = hwaddr; PacketListener(Handler h, InterfaceParams ifParams) { super(h, ifParams.defaultMtu); mInterface = ifParams; } @Override Loading @@ -117,7 +103,7 @@ public class ConnectivityPacketTracker { try { s = Os.socket(AF_PACKET, SOCK_RAW, 0); NetworkUtils.attachControlPacketFilter(s, ARPHRD_ETHER); Os.bind(s, new PacketSocketAddress((short) ETH_P_ALL, mIfIndex)); Os.bind(s, new PacketSocketAddress((short) ETH_P_ALL, mInterface.index)); } catch (ErrnoException | IOException e) { logError("Failed to create packet tracking socket: ", e); closeFd(s); Loading @@ -129,7 +115,7 @@ public class ConnectivityPacketTracker { @Override protected void handlePacket(byte[] recvbuf, int length) { final String summary = ConnectivityPacketSummary.summarize( mHwAddr, recvbuf, length); mInterface.macAddr, recvbuf, length); if (summary == null) return; if (DBG) Log.d(mTag, summary); Loading services/net/java/android/net/ip/IpClient.java +13 −17 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import android.net.apf.ApfFilter; import android.net.dhcp.DhcpClient; import android.net.metrics.IpConnectivityLog; import android.net.metrics.IpManagerEvent; import android.net.util.InterfaceParams; import android.net.util.MultinetworkPolicyTracker; import android.net.util.NetdService; import android.net.util.NetworkConstants; Loading Loading @@ -63,7 +64,6 @@ import java.io.PrintWriter; import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.ArrayList; import java.util.Collection; Loading Loading @@ -556,7 +556,7 @@ public class IpClient extends StateMachine { private final IpConnectivityLog mMetricsLog = new IpConnectivityLog(); private final InterfaceController mInterfaceCtrl; private NetworkInterface mNetworkInterface; private InterfaceParams mInterfaceParams; /** * Non-final member variables accessed only from within our StateMachine. Loading Loading @@ -722,7 +722,12 @@ public class IpClient extends StateMachine { return; } getNetworkInterface(); mInterfaceParams = InterfaceParams.getByName(mInterfaceName); if (mInterfaceParams == null) { logError("Failed to find InterfaceParams for " + mInterfaceName); // TODO: call doImmediateProvisioningFailure() with an error code // indicating something like "interface not ready". } mCallback.setNeighborDiscoveryOffload(true); sendMessage(CMD_START, new ProvisioningConfiguration(req)); Loading Loading @@ -858,7 +863,7 @@ public class IpClient extends StateMachine { protected String getLogRecString(Message msg) { final String logLine = String.format( "%s/%d %d %d %s [%s]", mInterfaceName, mNetworkInterface == null ? -1 : mNetworkInterface.getIndex(), mInterfaceName, (mInterfaceParams == null) ? -1 : mInterfaceParams.index, msg.arg1, msg.arg2, Objects.toString(msg.obj), mMsgStateLogger); final String richerLogLine = getWhatToString(msg.what) + " " + logLine; Loading Loading @@ -889,15 +894,6 @@ public class IpClient extends StateMachine { mLog.log(msg); } private void getNetworkInterface() { try { mNetworkInterface = NetworkInterface.getByName(mInterfaceName); } catch (SocketException | NullPointerException e) { // TODO: throw new IllegalStateException. logError("Failed to get interface object: %s", e); } } // This needs to be called with care to ensure that our LinkProperties // are in sync with the actual LinkProperties of the interface. For example, // we should only call this if we know for sure that there are no IP addresses Loading Loading @@ -1218,7 +1214,7 @@ public class IpClient extends StateMachine { } } else { // Start DHCPv4. mDhcpClient = DhcpClient.makeDhcpClient(mContext, IpClient.this, mInterfaceName); mDhcpClient = DhcpClient.makeDhcpClient(mContext, IpClient.this, mInterfaceParams); mDhcpClient.registerForPreDhcpNotification(); mDhcpClient.sendMessage(DhcpClient.CMD_START_DHCP); } Loading @@ -1245,7 +1241,7 @@ public class IpClient extends StateMachine { try { mIpReachabilityMonitor = new IpReachabilityMonitor( mContext, mInterfaceName, mInterfaceParams, getHandler(), mLog, new IpReachabilityMonitor.Callback() { Loading Loading @@ -1447,7 +1443,7 @@ public class IpClient extends StateMachine { mContext.getResources().getBoolean(R.bool.config_apfDrop802_3Frames); apfConfig.ethTypeBlackList = mContext.getResources().getIntArray(R.array.config_apfEthTypeBlackList); mApfFilter = ApfFilter.maybeCreate(apfConfig, mNetworkInterface, mCallback); mApfFilter = ApfFilter.maybeCreate(apfConfig, mInterfaceParams, mCallback); // TODO: investigate the effects of any multicast filtering racing/interfering with the // rest of this IP configuration startup. if (mApfFilter == null) { Loading Loading @@ -1515,7 +1511,7 @@ public class IpClient extends StateMachine { private ConnectivityPacketTracker createPacketTracker() { try { return new ConnectivityPacketTracker( getHandler(), mNetworkInterface, mConnectivityPacketLog); getHandler(), mInterfaceParams, mConnectivityPacketLog); } catch (IllegalArgumentException e) { return null; } Loading Loading
services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java +9 −26 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.net.RouteInfo; import android.net.ip.InterfaceController; import android.net.ip.RouterAdvertisementDaemon; import android.net.ip.RouterAdvertisementDaemon.RaParams; import android.net.util.InterfaceParams; import android.net.util.NetdService; import android.net.util.SharedLog; import android.os.INetworkManagementService; Loading @@ -48,7 +49,6 @@ import com.android.internal.util.StateMachine; import java.net.Inet6Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.net.UnknownHostException; import java.util.ArrayList; Loading Loading @@ -120,8 +120,7 @@ public class TetherInterfaceStateMachine extends StateMachine { private int mLastError; private int mServingMode; private String mMyUpstreamIfaceName; // may change over time private NetworkInterface mNetworkInterface; private byte[] mHwAddr; private InterfaceParams mInterfaceParams; // TODO: De-duplicate this with mLinkProperties above. Currently, these link // properties are those selected by the IPv6TetheringCoordinator and relayed // to us. By comparison, mLinkProperties contains the addresses and directly Loading Loading @@ -247,31 +246,16 @@ public class TetherInterfaceStateMachine extends StateMachine { } private boolean startIPv6() { // TODO: Refactor for testability (perhaps passing an android.system.Os // instance and calling getifaddrs() directly). try { mNetworkInterface = NetworkInterface.getByName(mIfaceName); } catch (SocketException e) { mLog.e("Error looking up NetworkInterfaces: " + e); stopIPv6(); return false; } if (mNetworkInterface == null) { mLog.e("Failed to find NetworkInterface"); stopIPv6(); return false; } try { mHwAddr = mNetworkInterface.getHardwareAddress(); } catch (SocketException e) { mLog.e("Failed to find hardware address: " + e); // TODO: Refactor for better testability. This is one of the things // that prohibits unittesting IPv6 tethering setup. mInterfaceParams = InterfaceParams.getByName(mIfaceName); if (mInterfaceParams == null) { mLog.e("Failed to find InterfaceParams"); stopIPv6(); return false; } final int ifindex = mNetworkInterface.getIndex(); mRaDaemon = new RouterAdvertisementDaemon(mIfaceName, ifindex, mHwAddr); mRaDaemon = new RouterAdvertisementDaemon(mInterfaceParams); if (!mRaDaemon.start()) { stopIPv6(); return false; Loading @@ -281,8 +265,7 @@ public class TetherInterfaceStateMachine extends StateMachine { } private void stopIPv6() { mNetworkInterface = null; mHwAddr = null; mInterfaceParams = null; setRaParams(null); if (mRaDaemon != null) { Loading
services/net/java/android/net/apf/ApfFilter.java +12 −12 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ import android.net.metrics.ApfProgramEvent; import android.net.metrics.ApfStats; import android.net.metrics.IpConnectivityLog; import android.net.metrics.RaEvent; import android.net.util.InterfaceParams; import android.system.ErrnoException; import android.system.Os; import android.system.PacketSocketAddress; Loading @@ -56,7 +57,6 @@ import java.lang.Thread; import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.net.UnknownHostException; import java.nio.ByteBuffer; Loading Loading @@ -247,7 +247,7 @@ public class ApfFilter { private final ApfCapabilities mApfCapabilities; private final IpClient.Callback mIpClientCallback; private final NetworkInterface mNetworkInterface; private final InterfaceParams mInterfaceParams; private final IpConnectivityLog mMetricsLog; @VisibleForTesting Loading @@ -269,11 +269,11 @@ public class ApfFilter { private int mIPv4PrefixLength; @VisibleForTesting ApfFilter(ApfConfiguration config, NetworkInterface networkInterface, ApfFilter(ApfConfiguration config, InterfaceParams ifParams, IpClient.Callback ipClientCallback, IpConnectivityLog log) { mApfCapabilities = config.apfCapabilities; mIpClientCallback = ipClientCallback; mNetworkInterface = networkInterface; mInterfaceParams = ifParams; mMulticastFilter = config.multicastFilter; mDrop802_3Frames = config.ieee802_3Filter; Loading @@ -287,7 +287,7 @@ public class ApfFilter { } private void log(String s) { Log.d(TAG, "(" + mNetworkInterface.getName() + "): " + s); Log.d(TAG, "(" + mInterfaceParams.name + "): " + s); } @GuardedBy("this") Loading Loading @@ -332,14 +332,14 @@ public class ApfFilter { void maybeStartFilter() { FileDescriptor socket; try { mHardwareAddress = mNetworkInterface.getHardwareAddress(); mHardwareAddress = mInterfaceParams.macAddr.toByteArray(); synchronized(this) { // Install basic filters installNewProgramLocked(); } socket = Os.socket(AF_PACKET, SOCK_RAW, ETH_P_IPV6); PacketSocketAddress addr = new PacketSocketAddress((short) ETH_P_IPV6, mNetworkInterface.getIndex()); PacketSocketAddress addr = new PacketSocketAddress( (short) ETH_P_IPV6, mInterfaceParams.index); Os.bind(socket, addr); NetworkUtils.attachRaFilter(socket, mApfCapabilities.apfPacketFormat); } catch(SocketException|ErrnoException e) { Loading Loading @@ -1168,10 +1168,10 @@ public class ApfFilter { * filtering using APF programs. */ public static ApfFilter maybeCreate(ApfConfiguration config, NetworkInterface networkInterface, IpClient.Callback ipClientCallback) { if (config == null) return null; InterfaceParams ifParams, IpClient.Callback ipClientCallback) { if (config == null || ifParams == null) return null; ApfCapabilities apfCapabilities = config.apfCapabilities; if (apfCapabilities == null || networkInterface == null) return null; if (apfCapabilities == null) return null; if (apfCapabilities.apfVersionSupported == 0) return null; if (apfCapabilities.maximumApfProgramSize < 512) { Log.e(TAG, "Unacceptably small APF limit: " + apfCapabilities.maximumApfProgramSize); Loading @@ -1186,7 +1186,7 @@ public class ApfFilter { Log.e(TAG, "Unsupported APF version: " + apfCapabilities.apfVersionSupported); return null; } return new ApfFilter(config, networkInterface, ipClientCallback, new IpConnectivityLog()); return new ApfFilter(config, ifParams, ipClientCallback, new IpConnectivityLog()); } public synchronized void shutdown() { Loading
services/net/java/android/net/dhcp/DhcpClient.java +15 −13 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import android.net.TrafficStats; import android.net.metrics.IpConnectivityLog; import android.net.metrics.DhcpClientEvent; import android.net.metrics.DhcpErrorEvent; import android.net.util.InterfaceParams; import android.os.Message; import android.os.RemoteException; import android.os.ServiceManager; Loading @@ -50,7 +51,6 @@ import java.io.FileDescriptor; import java.io.IOException; import java.lang.Thread; import java.net.Inet4Address; import java.net.NetworkInterface; import java.net.SocketException; import java.nio.ByteBuffer; import java.util.Arrays; Loading Loading @@ -187,7 +187,8 @@ public class DhcpClient extends StateMachine { private final String mIfaceName; private boolean mRegisteredForPreDhcpNotification; private NetworkInterface mIface; private InterfaceParams mIface; // TODO: MacAddress-ify more of this class hierarchy. private byte[] mHwAddr; private PacketSocketAddress mInterfaceBroadcastAddr; private int mTransactionId; Loading Loading @@ -221,6 +222,7 @@ public class DhcpClient extends StateMachine { return new WakeupMessage(mContext, getHandler(), cmdName, cmd); } // TODO: Take an InterfaceParams instance instead of an interface name String. private DhcpClient(Context context, StateMachine controller, String iface) { super(TAG); Loading Loading @@ -262,23 +264,23 @@ public class DhcpClient extends StateMachine { } public static DhcpClient makeDhcpClient( Context context, StateMachine controller, String intf) { DhcpClient client = new DhcpClient(context, controller, intf); Context context, StateMachine controller, InterfaceParams ifParams) { DhcpClient client = new DhcpClient(context, controller, ifParams.name); client.mIface = ifParams; client.start(); return client; } private boolean initInterface() { try { mIface = NetworkInterface.getByName(mIfaceName); mHwAddr = mIface.getHardwareAddress(); mInterfaceBroadcastAddr = new PacketSocketAddress(mIface.getIndex(), DhcpPacket.ETHER_BROADCAST); return true; } catch(SocketException | NullPointerException e) { Log.e(TAG, "Can't determine ifindex or MAC address for " + mIfaceName, e); if (mIface == null) mIface = InterfaceParams.getByName(mIfaceName); if (mIface == null) { Log.e(TAG, "Can't determine InterfaceParams for " + mIfaceName); return false; } mHwAddr = mIface.macAddr.toByteArray(); mInterfaceBroadcastAddr = new PacketSocketAddress(mIface.index, DhcpPacket.ETHER_BROADCAST); return true; } private void startNewTransaction() { Loading @@ -293,7 +295,7 @@ public class DhcpClient extends StateMachine { private boolean initPacketSocket() { try { mPacketSock = Os.socket(AF_PACKET, SOCK_RAW, ETH_P_IP); PacketSocketAddress addr = new PacketSocketAddress((short) ETH_P_IP, mIface.getIndex()); PacketSocketAddress addr = new PacketSocketAddress((short) ETH_P_IP, mIface.index); Os.bind(mPacketSock, addr); NetworkUtils.attachDhcpFilter(mPacketSock); } catch(SocketException|ErrnoException e) { Loading
services/net/java/android/net/ip/ConnectivityPacketTracker.java +11 −25 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import static android.system.OsConstants.*; import android.net.NetworkUtils; import android.net.util.PacketReader; import android.net.util.ConnectivityPacketSummary; import android.net.util.InterfaceParams; import android.os.Handler; import android.system.ErrnoException; import android.system.Os; Loading @@ -35,7 +36,6 @@ import libcore.util.HexEncoding; import java.io.FileDescriptor; import java.io.InterruptedIOException; import java.io.IOException; import java.net.NetworkInterface; import java.net.SocketException; Loading Loading @@ -69,24 +69,12 @@ public class ConnectivityPacketTracker { private boolean mRunning; private String mDisplayName; public ConnectivityPacketTracker(Handler h, NetworkInterface netif, LocalLog log) { final String ifname; final int ifindex; final byte[] hwaddr; final int mtu; public ConnectivityPacketTracker(Handler h, InterfaceParams ifParams, LocalLog log) { if (ifParams == null) throw new IllegalArgumentException("null InterfaceParams"); try { ifname = netif.getName(); ifindex = netif.getIndex(); hwaddr = netif.getHardwareAddress(); mtu = netif.getMTU(); } catch (NullPointerException|SocketException e) { throw new IllegalArgumentException("bad network interface", e); } mTag = TAG + "." + ifname; mTag = TAG + "." + ifParams.name; mLog = log; mPacketListener = new PacketListener(h, ifindex, hwaddr, mtu); mPacketListener = new PacketListener(h, ifParams); } public void start(String displayName) { Loading @@ -102,13 +90,11 @@ public class ConnectivityPacketTracker { } private final class PacketListener extends PacketReader { private final int mIfIndex; private final byte mHwAddr[]; private final InterfaceParams mInterface; PacketListener(Handler h, int ifindex, byte[] hwaddr, int mtu) { super(h, mtu); mIfIndex = ifindex; mHwAddr = hwaddr; PacketListener(Handler h, InterfaceParams ifParams) { super(h, ifParams.defaultMtu); mInterface = ifParams; } @Override Loading @@ -117,7 +103,7 @@ public class ConnectivityPacketTracker { try { s = Os.socket(AF_PACKET, SOCK_RAW, 0); NetworkUtils.attachControlPacketFilter(s, ARPHRD_ETHER); Os.bind(s, new PacketSocketAddress((short) ETH_P_ALL, mIfIndex)); Os.bind(s, new PacketSocketAddress((short) ETH_P_ALL, mInterface.index)); } catch (ErrnoException | IOException e) { logError("Failed to create packet tracking socket: ", e); closeFd(s); Loading @@ -129,7 +115,7 @@ public class ConnectivityPacketTracker { @Override protected void handlePacket(byte[] recvbuf, int length) { final String summary = ConnectivityPacketSummary.summarize( mHwAddr, recvbuf, length); mInterface.macAddr, recvbuf, length); if (summary == null) return; if (DBG) Log.d(mTag, summary); Loading
services/net/java/android/net/ip/IpClient.java +13 −17 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import android.net.apf.ApfFilter; import android.net.dhcp.DhcpClient; import android.net.metrics.IpConnectivityLog; import android.net.metrics.IpManagerEvent; import android.net.util.InterfaceParams; import android.net.util.MultinetworkPolicyTracker; import android.net.util.NetdService; import android.net.util.NetworkConstants; Loading Loading @@ -63,7 +64,6 @@ import java.io.PrintWriter; import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.ArrayList; import java.util.Collection; Loading Loading @@ -556,7 +556,7 @@ public class IpClient extends StateMachine { private final IpConnectivityLog mMetricsLog = new IpConnectivityLog(); private final InterfaceController mInterfaceCtrl; private NetworkInterface mNetworkInterface; private InterfaceParams mInterfaceParams; /** * Non-final member variables accessed only from within our StateMachine. Loading Loading @@ -722,7 +722,12 @@ public class IpClient extends StateMachine { return; } getNetworkInterface(); mInterfaceParams = InterfaceParams.getByName(mInterfaceName); if (mInterfaceParams == null) { logError("Failed to find InterfaceParams for " + mInterfaceName); // TODO: call doImmediateProvisioningFailure() with an error code // indicating something like "interface not ready". } mCallback.setNeighborDiscoveryOffload(true); sendMessage(CMD_START, new ProvisioningConfiguration(req)); Loading Loading @@ -858,7 +863,7 @@ public class IpClient extends StateMachine { protected String getLogRecString(Message msg) { final String logLine = String.format( "%s/%d %d %d %s [%s]", mInterfaceName, mNetworkInterface == null ? -1 : mNetworkInterface.getIndex(), mInterfaceName, (mInterfaceParams == null) ? -1 : mInterfaceParams.index, msg.arg1, msg.arg2, Objects.toString(msg.obj), mMsgStateLogger); final String richerLogLine = getWhatToString(msg.what) + " " + logLine; Loading Loading @@ -889,15 +894,6 @@ public class IpClient extends StateMachine { mLog.log(msg); } private void getNetworkInterface() { try { mNetworkInterface = NetworkInterface.getByName(mInterfaceName); } catch (SocketException | NullPointerException e) { // TODO: throw new IllegalStateException. logError("Failed to get interface object: %s", e); } } // This needs to be called with care to ensure that our LinkProperties // are in sync with the actual LinkProperties of the interface. For example, // we should only call this if we know for sure that there are no IP addresses Loading Loading @@ -1218,7 +1214,7 @@ public class IpClient extends StateMachine { } } else { // Start DHCPv4. mDhcpClient = DhcpClient.makeDhcpClient(mContext, IpClient.this, mInterfaceName); mDhcpClient = DhcpClient.makeDhcpClient(mContext, IpClient.this, mInterfaceParams); mDhcpClient.registerForPreDhcpNotification(); mDhcpClient.sendMessage(DhcpClient.CMD_START_DHCP); } Loading @@ -1245,7 +1241,7 @@ public class IpClient extends StateMachine { try { mIpReachabilityMonitor = new IpReachabilityMonitor( mContext, mInterfaceName, mInterfaceParams, getHandler(), mLog, new IpReachabilityMonitor.Callback() { Loading Loading @@ -1447,7 +1443,7 @@ public class IpClient extends StateMachine { mContext.getResources().getBoolean(R.bool.config_apfDrop802_3Frames); apfConfig.ethTypeBlackList = mContext.getResources().getIntArray(R.array.config_apfEthTypeBlackList); mApfFilter = ApfFilter.maybeCreate(apfConfig, mNetworkInterface, mCallback); mApfFilter = ApfFilter.maybeCreate(apfConfig, mInterfaceParams, mCallback); // TODO: investigate the effects of any multicast filtering racing/interfering with the // rest of this IP configuration startup. if (mApfFilter == null) { Loading Loading @@ -1515,7 +1511,7 @@ public class IpClient extends StateMachine { private ConnectivityPacketTracker createPacketTracker() { try { return new ConnectivityPacketTracker( getHandler(), mNetworkInterface, mConnectivityPacketLog); getHandler(), mInterfaceParams, mConnectivityPacketLog); } catch (IllegalArgumentException e) { return null; } Loading