16193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline/* 26193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * Copyright (C) 2015 The Android Open Source Project 36193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * 46193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * Licensed under the Apache License, Version 2.0 (the "License"); 56193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * you may not use this file except in compliance with the License. 66193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * You may obtain a copy of the License at 76193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * 86193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * http://www.apache.org/licenses/LICENSE-2.0 96193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * 106193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * Unless required by applicable law or agreed to in writing, software 116193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * distributed under the License is distributed on an "AS IS" BASIS, 126193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * See the License for the specific language governing permissions and 146193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * limitations under the License. 156193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline */ 166193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline 176193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Klinepackage android.net.netlink; 186193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline 196193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Klineimport android.system.OsConstants; 206193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Klineimport com.android.internal.util.HexDump; 216193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline 226193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Klineimport java.nio.ByteBuffer; 236193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline 246193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline 256193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline/** 266193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * Various constants and static helper methods for netlink communications. 276193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * 286193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * Values taken from: 296193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * 306193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * <linux_src>/include/uapi/linux/netlink.h 316193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * <linux_src>/include/uapi/linux/rtnetlink.h 326193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * 336193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * @hide 346193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline */ 356193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Klinepublic class NetlinkConstants { 366193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline private NetlinkConstants() {} 376193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline 386193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public static final int NLA_ALIGNTO = 4; 396193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline 406193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public static final int alignedLengthOf(short length) { 416193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline final int intLength = (int) length & 0xffff; 426193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline return alignedLengthOf(intLength); 436193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline } 446193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline 456193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public static final int alignedLengthOf(int length) { 466193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline if (length <= 0) { return 0; } 476193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline return (((length + NLA_ALIGNTO - 1) / NLA_ALIGNTO) * NLA_ALIGNTO); 486193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline } 496193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline 506193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public static String stringForAddressFamily(int family) { 516193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline if (family == OsConstants.AF_INET) { return "AF_INET"; } 526193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline if (family == OsConstants.AF_INET6) { return "AF_INET6"; } 536193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline if (family == OsConstants.AF_NETLINK) { return "AF_NETLINK"; } 546193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline return String.valueOf(family); 556193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline } 566193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline 576193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public static String hexify(byte[] bytes) { 586193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline if (bytes == null) { return "(null)"; } 596193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline return HexDump.toHexString(bytes); 606193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline } 616193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline 626193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public static String hexify(ByteBuffer buffer) { 636193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline if (buffer == null) { return "(null)"; } 646193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline return HexDump.toHexString( 656193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline buffer.array(), buffer.position(), buffer.remaining()); 666193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline } 676193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline 686193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline // Known values for struct nlmsghdr nlm_type. 696193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public static final short NLMSG_NOOP = 1; // Nothing 706193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public static final short NLMSG_ERROR = 2; // Error 716193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public static final short NLMSG_DONE = 3; // End of a dump 726193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public static final short NLMSG_OVERRUN = 4; // Data lost 736193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public static final short NLMSG_MAX_RESERVED = 15; // Max reserved value 746193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline 756193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public static final short RTM_NEWLINK = 16; 766193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public static final short RTM_DELLINK = 17; 776193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public static final short RTM_GETLINK = 18; 786193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public static final short RTM_SETLINK = 19; 796193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public static final short RTM_NEWADDR = 20; 806193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public static final short RTM_DELADDR = 21; 816193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public static final short RTM_GETADDR = 22; 826193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public static final short RTM_NEWROUTE = 24; 836193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public static final short RTM_DELROUTE = 25; 846193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public static final short RTM_GETROUTE = 26; 856193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public static final short RTM_NEWNEIGH = 28; 866193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public static final short RTM_DELNEIGH = 29; 876193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public static final short RTM_GETNEIGH = 30; 886193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public static final short RTM_NEWRULE = 32; 896193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public static final short RTM_DELRULE = 33; 906193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public static final short RTM_GETRULE = 34; 916193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public static final short RTM_NEWNDUSEROPT = 68; 926193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline 936193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public static String stringForNlMsgType(short nlm_type) { 946193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline switch (nlm_type) { 956193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline case NLMSG_NOOP: return "NLMSG_NOOP"; 966193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline case NLMSG_ERROR: return "NLMSG_ERROR"; 976193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline case NLMSG_DONE: return "NLMSG_DONE"; 986193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline case NLMSG_OVERRUN: return "NLMSG_OVERRUN"; 996193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline case RTM_NEWLINK: return "RTM_NEWLINK"; 1006193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline case RTM_DELLINK: return "RTM_DELLINK"; 1016193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline case RTM_GETLINK: return "RTM_GETLINK"; 1026193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline case RTM_SETLINK: return "RTM_SETLINK"; 1036193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline case RTM_NEWADDR: return "RTM_NEWADDR"; 1046193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline case RTM_DELADDR: return "RTM_DELADDR"; 1056193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline case RTM_GETADDR: return "RTM_GETADDR"; 1066193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline case RTM_NEWROUTE: return "RTM_NEWROUTE"; 1076193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline case RTM_DELROUTE: return "RTM_DELROUTE"; 1086193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline case RTM_GETROUTE: return "RTM_GETROUTE"; 1096193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline case RTM_NEWNEIGH: return "RTM_NEWNEIGH"; 1106193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline case RTM_DELNEIGH: return "RTM_DELNEIGH"; 1116193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline case RTM_GETNEIGH: return "RTM_GETNEIGH"; 1126193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline case RTM_NEWRULE: return "RTM_NEWRULE"; 1136193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline case RTM_DELRULE: return "RTM_DELRULE"; 1146193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline case RTM_GETRULE: return "RTM_GETRULE"; 1156193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline case RTM_NEWNDUSEROPT: return "RTM_NEWNDUSEROPT"; 1166193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline default: 1176193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline return "unknown RTM type: " + String.valueOf(nlm_type); 1186193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline } 1196193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline } 1206193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline} 121