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