Loading Android.bp +2 −1 Original line number Diff line number Diff line Loading @@ -25,7 +25,8 @@ java_library { ":services-networkstack-shared-srcs", ], static_libs: [ "services-netlink-lib", "netd_aidl_interface-java", "networkstack-aidl-interfaces-java", ] } Loading src/android/net/apf/ApfFilter.java +6 −9 Original line number Diff line number Diff line Loading @@ -38,7 +38,6 @@ import android.content.Intent; import android.content.IntentFilter; import android.net.LinkAddress; import android.net.LinkProperties; import android.net.NetworkUtils; import android.net.apf.ApfGenerator.IllegalInstructionException; import android.net.apf.ApfGenerator.Register; import android.net.ip.IpClient.IpClientCallbacksWrapper; Loading @@ -47,6 +46,8 @@ import android.net.metrics.ApfStats; import android.net.metrics.IpConnectivityLog; import android.net.metrics.RaEvent; import android.net.util.InterfaceParams; import android.net.util.NetworkStackUtils; import android.net.util.SocketUtils; import android.os.PowerManager; import android.os.SystemClock; import android.system.ErrnoException; Loading @@ -60,8 +61,6 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.HexDump; import com.android.internal.util.IndentingPrintWriter; import libcore.io.IoBridge; import java.io.FileDescriptor; import java.io.IOException; import java.net.Inet4Address; Loading Loading @@ -200,10 +199,8 @@ public class ApfFilter { public void halt() { mStopped = true; try { // Interrupts the read() call the thread is blocked in. IoBridge.closeAndSignalBlockedThreads(mSocket); } catch (IOException ignored) {} NetworkStackUtils.closeSocketQuietly(mSocket); } @Override Loading Loading @@ -470,8 +467,8 @@ public class ApfFilter { socket = Os.socket(AF_PACKET, SOCK_RAW, ETH_P_IPV6); SocketAddress addr = makePacketSocketAddress( (short) ETH_P_IPV6, mInterfaceParams.index); Os.bind(socket, addr); NetworkUtils.attachRaFilter(socket, mApfCapabilities.apfPacketFormat); SocketUtils.bindSocket(socket, addr); SocketUtils.attachRaFilter(socket, mApfCapabilities.apfPacketFormat); } catch(SocketException|ErrnoException e) { Log.e(TAG, "Error starting filter", e); return; Loading src/android/net/dhcp/DhcpClient.java +16 −17 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import static android.net.dhcp.DhcpPacket.DHCP_SUBNET_MASK; import static android.net.dhcp.DhcpPacket.DHCP_VENDOR_INFO; import static android.net.dhcp.DhcpPacket.INADDR_ANY; import static android.net.dhcp.DhcpPacket.INADDR_BROADCAST; import static android.net.util.NetworkStackUtils.closeSocketQuietly; import static android.net.util.SocketUtils.makePacketSocketAddress; import static android.system.OsConstants.AF_INET; import static android.system.OsConstants.AF_PACKET; Loading @@ -44,7 +45,6 @@ import static com.android.server.util.NetworkStackConstants.IPV4_ADDR_ANY; import android.content.Context; import android.net.DhcpResults; import android.net.NetworkUtils; import android.net.TrafficStats; import android.net.ip.IpClient; import android.net.metrics.DhcpClientEvent; Loading @@ -66,8 +66,6 @@ import com.android.internal.util.State; import com.android.internal.util.StateMachine; import com.android.internal.util.WakeupMessage; import libcore.io.IoBridge; import java.io.FileDescriptor; import java.io.IOException; import java.net.Inet4Address; Loading Loading @@ -108,6 +106,12 @@ public class DhcpClient extends StateMachine { private static final boolean MSG_DBG = false; private static final boolean PACKET_DBG = false; // Metrics events: must be kept in sync with server-side aggregation code. /** Represents transitions from DhcpInitState to DhcpBoundState */ private static final String EVENT_INITIAL_BOUND = "InitialBoundState"; /** Represents transitions from and to DhcpBoundState via DhcpRenewingState */ private static final String EVENT_RENEWING_BOUND = "RenewingBoundState"; // Timers and timeouts. private static final int SECONDS = 1000; private static final int FIRST_TIMEOUT_MS = 2 * SECONDS; Loading Loading @@ -313,8 +317,8 @@ public class DhcpClient extends StateMachine { try { mPacketSock = Os.socket(AF_PACKET, SOCK_RAW, ETH_P_IP); SocketAddress addr = makePacketSocketAddress((short) ETH_P_IP, mIface.index); Os.bind(mPacketSock, addr); NetworkUtils.attachDhcpFilter(mPacketSock); SocketUtils.bindSocket(mPacketSock, addr); SocketUtils.attachDhcpFilter(mPacketSock); } catch(SocketException|ErrnoException e) { Log.e(TAG, "Error creating packet socket", e); return false; Loading Loading @@ -350,15 +354,9 @@ public class DhcpClient extends StateMachine { } } private static void closeQuietly(FileDescriptor fd) { try { IoBridge.closeAndSignalBlockedThreads(fd); } catch (IOException ignored) {} } private void closeSockets() { closeQuietly(mUdpSock); closeQuietly(mPacketSock); closeSocketQuietly(mUdpSock); closeSocketQuietly(mPacketSock); } class ReceiveThread extends Thread { Loading Loading @@ -414,7 +412,8 @@ public class DhcpClient extends StateMachine { try { if (encap == DhcpPacket.ENCAP_L2) { if (DBG) Log.d(TAG, "Broadcasting " + description); Os.sendto(mPacketSock, buf.array(), 0, buf.limit(), 0, mInterfaceBroadcastAddr); SocketUtils.sendTo( mPacketSock, buf.array(), 0, buf.limit(), 0, mInterfaceBroadcastAddr); } else if (encap == DhcpPacket.ENCAP_BOOTP && to.equals(INADDR_BROADCAST)) { if (DBG) Log.d(TAG, "Broadcasting " + description); // We only send L3-encapped broadcasts in DhcpRebindingState, Loading Loading @@ -928,9 +927,9 @@ public class DhcpClient extends StateMachine { private void logTimeToBoundState() { long now = SystemClock.elapsedRealtime(); if (mLastBoundExitTime > mLastInitEnterTime) { logState(DhcpClientEvent.RENEWING_BOUND, (int)(now - mLastBoundExitTime)); logState(EVENT_RENEWING_BOUND, (int) (now - mLastBoundExitTime)); } else { logState(DhcpClientEvent.INITIAL_BOUND, (int)(now - mLastInitEnterTime)); logState(EVENT_INITIAL_BOUND, (int) (now - mLastInitEnterTime)); } } } Loading Loading @@ -1021,7 +1020,7 @@ public class DhcpClient extends StateMachine { // We need to broadcast and possibly reconnect the socket to a // completely different server. closeQuietly(mUdpSock); closeSocketQuietly(mUdpSock); if (!initUdpSocket()) { Log.e(TAG, "Failed to recreate UDP socket"); transitionTo(mDhcpInitState); Loading src/android/net/dhcp/DhcpPacketListener.java +1 −1 Original line number Diff line number Diff line Loading @@ -64,7 +64,7 @@ abstract class DhcpPacketListener extends FdEventsReader<DhcpPacketListener.Payl @Override protected int readPacket(@NonNull FileDescriptor fd, @NonNull Payload packetBuffer) throws Exception { final InetSocketAddress addr = new InetSocketAddress(); final InetSocketAddress addr = new InetSocketAddress(0); final int read = Os.recvfrom( fd, packetBuffer.mBytes, 0, packetBuffer.mBytes.length, 0 /* flags */, addr); Loading src/android/net/dhcp/DhcpServer.java +3 −3 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import static android.net.shared.Inet4AddressUtils.getPrefixMaskAsInet4Address; import static android.system.OsConstants.AF_INET; import static android.system.OsConstants.IPPROTO_UDP; import static android.system.OsConstants.SOCK_DGRAM; import static android.system.OsConstants.SOCK_NONBLOCK; import static android.system.OsConstants.SOL_SOCKET; import static android.system.OsConstants.SO_BROADCAST; import static android.system.OsConstants.SO_REUSEADDR; Loading @@ -43,7 +44,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.net.INetworkStackStatusCallback; import android.net.MacAddress; import android.net.NetworkUtils; import android.net.TrafficStats; import android.net.util.SharedLog; import android.net.util.SocketUtils; Loading Loading @@ -207,7 +207,7 @@ public class DhcpServer extends IDhcpServer.Stub { @Override public void addArpEntry(@NonNull Inet4Address ipv4Addr, @NonNull MacAddress ethAddr, @NonNull String ifname, @NonNull FileDescriptor fd) throws IOException { NetworkUtils.addArpEntry(ipv4Addr, ethAddr, ifname, fd); SocketUtils.addArpEntry(ipv4Addr, ethAddr, ifname, fd); } @Override Loading Loading @@ -630,7 +630,7 @@ public class DhcpServer extends IDhcpServer.Stub { // TODO: have and use an API to set a socket tag without going through the thread tag final int oldTag = TrafficStats.getAndSetThreadStatsTag(TAG_SYSTEM_DHCP_SERVER); try { mSocket = Os.socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); mSocket = Os.socket(AF_INET, SOCK_DGRAM | SOCK_NONBLOCK, IPPROTO_UDP); SocketUtils.bindSocketToInterface(mSocket, mIfName); Os.setsockoptInt(mSocket, SOL_SOCKET, SO_REUSEADDR, 1); Os.setsockoptInt(mSocket, SOL_SOCKET, SO_BROADCAST, 1); Loading Loading
Android.bp +2 −1 Original line number Diff line number Diff line Loading @@ -25,7 +25,8 @@ java_library { ":services-networkstack-shared-srcs", ], static_libs: [ "services-netlink-lib", "netd_aidl_interface-java", "networkstack-aidl-interfaces-java", ] } Loading
src/android/net/apf/ApfFilter.java +6 −9 Original line number Diff line number Diff line Loading @@ -38,7 +38,6 @@ import android.content.Intent; import android.content.IntentFilter; import android.net.LinkAddress; import android.net.LinkProperties; import android.net.NetworkUtils; import android.net.apf.ApfGenerator.IllegalInstructionException; import android.net.apf.ApfGenerator.Register; import android.net.ip.IpClient.IpClientCallbacksWrapper; Loading @@ -47,6 +46,8 @@ import android.net.metrics.ApfStats; import android.net.metrics.IpConnectivityLog; import android.net.metrics.RaEvent; import android.net.util.InterfaceParams; import android.net.util.NetworkStackUtils; import android.net.util.SocketUtils; import android.os.PowerManager; import android.os.SystemClock; import android.system.ErrnoException; Loading @@ -60,8 +61,6 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.HexDump; import com.android.internal.util.IndentingPrintWriter; import libcore.io.IoBridge; import java.io.FileDescriptor; import java.io.IOException; import java.net.Inet4Address; Loading Loading @@ -200,10 +199,8 @@ public class ApfFilter { public void halt() { mStopped = true; try { // Interrupts the read() call the thread is blocked in. IoBridge.closeAndSignalBlockedThreads(mSocket); } catch (IOException ignored) {} NetworkStackUtils.closeSocketQuietly(mSocket); } @Override Loading Loading @@ -470,8 +467,8 @@ public class ApfFilter { socket = Os.socket(AF_PACKET, SOCK_RAW, ETH_P_IPV6); SocketAddress addr = makePacketSocketAddress( (short) ETH_P_IPV6, mInterfaceParams.index); Os.bind(socket, addr); NetworkUtils.attachRaFilter(socket, mApfCapabilities.apfPacketFormat); SocketUtils.bindSocket(socket, addr); SocketUtils.attachRaFilter(socket, mApfCapabilities.apfPacketFormat); } catch(SocketException|ErrnoException e) { Log.e(TAG, "Error starting filter", e); return; Loading
src/android/net/dhcp/DhcpClient.java +16 −17 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import static android.net.dhcp.DhcpPacket.DHCP_SUBNET_MASK; import static android.net.dhcp.DhcpPacket.DHCP_VENDOR_INFO; import static android.net.dhcp.DhcpPacket.INADDR_ANY; import static android.net.dhcp.DhcpPacket.INADDR_BROADCAST; import static android.net.util.NetworkStackUtils.closeSocketQuietly; import static android.net.util.SocketUtils.makePacketSocketAddress; import static android.system.OsConstants.AF_INET; import static android.system.OsConstants.AF_PACKET; Loading @@ -44,7 +45,6 @@ import static com.android.server.util.NetworkStackConstants.IPV4_ADDR_ANY; import android.content.Context; import android.net.DhcpResults; import android.net.NetworkUtils; import android.net.TrafficStats; import android.net.ip.IpClient; import android.net.metrics.DhcpClientEvent; Loading @@ -66,8 +66,6 @@ import com.android.internal.util.State; import com.android.internal.util.StateMachine; import com.android.internal.util.WakeupMessage; import libcore.io.IoBridge; import java.io.FileDescriptor; import java.io.IOException; import java.net.Inet4Address; Loading Loading @@ -108,6 +106,12 @@ public class DhcpClient extends StateMachine { private static final boolean MSG_DBG = false; private static final boolean PACKET_DBG = false; // Metrics events: must be kept in sync with server-side aggregation code. /** Represents transitions from DhcpInitState to DhcpBoundState */ private static final String EVENT_INITIAL_BOUND = "InitialBoundState"; /** Represents transitions from and to DhcpBoundState via DhcpRenewingState */ private static final String EVENT_RENEWING_BOUND = "RenewingBoundState"; // Timers and timeouts. private static final int SECONDS = 1000; private static final int FIRST_TIMEOUT_MS = 2 * SECONDS; Loading Loading @@ -313,8 +317,8 @@ public class DhcpClient extends StateMachine { try { mPacketSock = Os.socket(AF_PACKET, SOCK_RAW, ETH_P_IP); SocketAddress addr = makePacketSocketAddress((short) ETH_P_IP, mIface.index); Os.bind(mPacketSock, addr); NetworkUtils.attachDhcpFilter(mPacketSock); SocketUtils.bindSocket(mPacketSock, addr); SocketUtils.attachDhcpFilter(mPacketSock); } catch(SocketException|ErrnoException e) { Log.e(TAG, "Error creating packet socket", e); return false; Loading Loading @@ -350,15 +354,9 @@ public class DhcpClient extends StateMachine { } } private static void closeQuietly(FileDescriptor fd) { try { IoBridge.closeAndSignalBlockedThreads(fd); } catch (IOException ignored) {} } private void closeSockets() { closeQuietly(mUdpSock); closeQuietly(mPacketSock); closeSocketQuietly(mUdpSock); closeSocketQuietly(mPacketSock); } class ReceiveThread extends Thread { Loading Loading @@ -414,7 +412,8 @@ public class DhcpClient extends StateMachine { try { if (encap == DhcpPacket.ENCAP_L2) { if (DBG) Log.d(TAG, "Broadcasting " + description); Os.sendto(mPacketSock, buf.array(), 0, buf.limit(), 0, mInterfaceBroadcastAddr); SocketUtils.sendTo( mPacketSock, buf.array(), 0, buf.limit(), 0, mInterfaceBroadcastAddr); } else if (encap == DhcpPacket.ENCAP_BOOTP && to.equals(INADDR_BROADCAST)) { if (DBG) Log.d(TAG, "Broadcasting " + description); // We only send L3-encapped broadcasts in DhcpRebindingState, Loading Loading @@ -928,9 +927,9 @@ public class DhcpClient extends StateMachine { private void logTimeToBoundState() { long now = SystemClock.elapsedRealtime(); if (mLastBoundExitTime > mLastInitEnterTime) { logState(DhcpClientEvent.RENEWING_BOUND, (int)(now - mLastBoundExitTime)); logState(EVENT_RENEWING_BOUND, (int) (now - mLastBoundExitTime)); } else { logState(DhcpClientEvent.INITIAL_BOUND, (int)(now - mLastInitEnterTime)); logState(EVENT_INITIAL_BOUND, (int) (now - mLastInitEnterTime)); } } } Loading Loading @@ -1021,7 +1020,7 @@ public class DhcpClient extends StateMachine { // We need to broadcast and possibly reconnect the socket to a // completely different server. closeQuietly(mUdpSock); closeSocketQuietly(mUdpSock); if (!initUdpSocket()) { Log.e(TAG, "Failed to recreate UDP socket"); transitionTo(mDhcpInitState); Loading
src/android/net/dhcp/DhcpPacketListener.java +1 −1 Original line number Diff line number Diff line Loading @@ -64,7 +64,7 @@ abstract class DhcpPacketListener extends FdEventsReader<DhcpPacketListener.Payl @Override protected int readPacket(@NonNull FileDescriptor fd, @NonNull Payload packetBuffer) throws Exception { final InetSocketAddress addr = new InetSocketAddress(); final InetSocketAddress addr = new InetSocketAddress(0); final int read = Os.recvfrom( fd, packetBuffer.mBytes, 0, packetBuffer.mBytes.length, 0 /* flags */, addr); Loading
src/android/net/dhcp/DhcpServer.java +3 −3 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import static android.net.shared.Inet4AddressUtils.getPrefixMaskAsInet4Address; import static android.system.OsConstants.AF_INET; import static android.system.OsConstants.IPPROTO_UDP; import static android.system.OsConstants.SOCK_DGRAM; import static android.system.OsConstants.SOCK_NONBLOCK; import static android.system.OsConstants.SOL_SOCKET; import static android.system.OsConstants.SO_BROADCAST; import static android.system.OsConstants.SO_REUSEADDR; Loading @@ -43,7 +44,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.net.INetworkStackStatusCallback; import android.net.MacAddress; import android.net.NetworkUtils; import android.net.TrafficStats; import android.net.util.SharedLog; import android.net.util.SocketUtils; Loading Loading @@ -207,7 +207,7 @@ public class DhcpServer extends IDhcpServer.Stub { @Override public void addArpEntry(@NonNull Inet4Address ipv4Addr, @NonNull MacAddress ethAddr, @NonNull String ifname, @NonNull FileDescriptor fd) throws IOException { NetworkUtils.addArpEntry(ipv4Addr, ethAddr, ifname, fd); SocketUtils.addArpEntry(ipv4Addr, ethAddr, ifname, fd); } @Override Loading Loading @@ -630,7 +630,7 @@ public class DhcpServer extends IDhcpServer.Stub { // TODO: have and use an API to set a socket tag without going through the thread tag final int oldTag = TrafficStats.getAndSetThreadStatsTag(TAG_SYSTEM_DHCP_SERVER); try { mSocket = Os.socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); mSocket = Os.socket(AF_INET, SOCK_DGRAM | SOCK_NONBLOCK, IPPROTO_UDP); SocketUtils.bindSocketToInterface(mSocket, mIfName); Os.setsockoptInt(mSocket, SOL_SOCKET, SO_REUSEADDR, 1); Os.setsockoptInt(mSocket, SOL_SOCKET, SO_BROADCAST, 1); Loading