diff options
| author | Remi NGUYEN VAN <reminv@google.com> | 2019-01-22 05:02:22 -0800 |
|---|---|---|
| committer | android-build-merger <android-build-merger@google.com> | 2019-01-22 05:02:22 -0800 |
| commit | 4593e07944367664b12fa85e8d12820026b24c09 (patch) | |
| tree | bb3819bd686a233040173bbb46d4172a6539502c /core/java/android | |
| parent | d4a58e4a9a2a95675cbe38274b49ba5e755fedfc (diff) | |
| parent | 510d2f82ad0928f52535a34a8fc0705a1dd74903 (diff) | |
Merge "Add SystemApi utility for raw sockets." am: 91c81c13b6
am: 510d2f82ad
Change-Id: I2252fbfb4a793b33193037003823af68a56ae760
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/net/util/SocketUtils.java | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/core/java/android/net/util/SocketUtils.java b/core/java/android/net/util/SocketUtils.java new file mode 100644 index 000000000000..de67cf5952f4 --- /dev/null +++ b/core/java/android/net/util/SocketUtils.java @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.net.util; + +import static android.system.OsConstants.SOL_SOCKET; +import static android.system.OsConstants.SO_BINDTODEVICE; + +import android.annotation.SystemApi; +import android.net.NetworkUtils; +import android.system.ErrnoException; +import android.system.NetlinkSocketAddress; +import android.system.Os; +import android.system.PacketSocketAddress; + +import java.io.FileDescriptor; +import java.net.SocketAddress; + +/** + * Collection of utilities to interact with raw sockets. + * @hide + */ +@SystemApi +public class SocketUtils { + /** + * Create a raw datagram socket that is bound to an interface. + * + * <p>Data sent through the socket will go directly to the underlying network, ignoring VPNs. + */ + public static void bindSocketToInterface(FileDescriptor socket, String iface) + throws ErrnoException { + // SO_BINDTODEVICE actually takes a string. This works because the first member + // of struct ifreq is a NULL-terminated interface name. + // TODO: add a setsockoptString() + Os.setsockoptIfreq(socket, SOL_SOCKET, SO_BINDTODEVICE, iface); + NetworkUtils.protectFromVpn(socket); + } + + /** + * Make a socket address to communicate with netlink. + */ + public static SocketAddress makeNetlinkSocketAddress(int portId, int groupsMask) { + return new NetlinkSocketAddress(portId, groupsMask); + } + + /** + * Make a socket address to bind to packet sockets. + */ + public static SocketAddress makePacketSocketAddress(short protocol, int ifIndex) { + return new PacketSocketAddress(protocol, ifIndex); + } + + /** + * Make a socket address to send raw packets. + */ + public static SocketAddress makePacketSocketAddress(int ifIndex, byte[] hwAddr) { + return new PacketSocketAddress(ifIndex, hwAddr); + } + + private SocketUtils() {} +} |
