1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.net.netlink;
18 
19 import android.system.OsConstants;
20 import com.android.internal.util.HexDump;
21 
22 import java.nio.ByteBuffer;
23 
24 
25 /**
26  * Various constants and static helper methods for netlink communications.
27  *
28  * Values taken from:
29  *
30  *     <linux_src>/include/uapi/linux/netlink.h
31  *     <linux_src>/include/uapi/linux/rtnetlink.h
32  *
33  * @hide
34  */
35 public class NetlinkConstants {
NetlinkConstants()36     private NetlinkConstants() {}
37 
38     public static final int NLA_ALIGNTO = 4;
39 
alignedLengthOf(short length)40     public static final int alignedLengthOf(short length) {
41         final int intLength = (int) length & 0xffff;
42         return alignedLengthOf(intLength);
43     }
44 
alignedLengthOf(int length)45     public static final int alignedLengthOf(int length) {
46         if (length <= 0) { return 0; }
47         return (((length + NLA_ALIGNTO - 1) / NLA_ALIGNTO) * NLA_ALIGNTO);
48     }
49 
stringForAddressFamily(int family)50     public static String stringForAddressFamily(int family) {
51         if (family == OsConstants.AF_INET) { return "AF_INET"; }
52         if (family == OsConstants.AF_INET6) { return "AF_INET6"; }
53         if (family == OsConstants.AF_NETLINK) { return "AF_NETLINK"; }
54         return String.valueOf(family);
55     }
56 
hexify(byte[] bytes)57     public static String hexify(byte[] bytes) {
58         if (bytes == null) { return "(null)"; }
59         return HexDump.toHexString(bytes);
60     }
61 
hexify(ByteBuffer buffer)62     public static String hexify(ByteBuffer buffer) {
63         if (buffer == null) { return "(null)"; }
64         return HexDump.toHexString(
65                 buffer.array(), buffer.position(), buffer.remaining());
66     }
67 
68     // Known values for struct nlmsghdr nlm_type.
69     public static final short NLMSG_NOOP         = 1;   // Nothing
70     public static final short NLMSG_ERROR        = 2;   // Error
71     public static final short NLMSG_DONE         = 3;   // End of a dump
72     public static final short NLMSG_OVERRUN      = 4;   // Data lost
73     public static final short NLMSG_MAX_RESERVED = 15;  // Max reserved value
74 
75     public static final short RTM_NEWLINK        = 16;
76     public static final short RTM_DELLINK        = 17;
77     public static final short RTM_GETLINK        = 18;
78     public static final short RTM_SETLINK        = 19;
79     public static final short RTM_NEWADDR        = 20;
80     public static final short RTM_DELADDR        = 21;
81     public static final short RTM_GETADDR        = 22;
82     public static final short RTM_NEWROUTE       = 24;
83     public static final short RTM_DELROUTE       = 25;
84     public static final short RTM_GETROUTE       = 26;
85     public static final short RTM_NEWNEIGH       = 28;
86     public static final short RTM_DELNEIGH       = 29;
87     public static final short RTM_GETNEIGH       = 30;
88     public static final short RTM_NEWRULE        = 32;
89     public static final short RTM_DELRULE        = 33;
90     public static final short RTM_GETRULE        = 34;
91     public static final short RTM_NEWNDUSEROPT   = 68;
92 
stringForNlMsgType(short nlm_type)93     public static String stringForNlMsgType(short nlm_type) {
94         switch (nlm_type) {
95             case NLMSG_NOOP: return "NLMSG_NOOP";
96             case NLMSG_ERROR: return "NLMSG_ERROR";
97             case NLMSG_DONE: return "NLMSG_DONE";
98             case NLMSG_OVERRUN: return "NLMSG_OVERRUN";
99             case RTM_NEWLINK: return "RTM_NEWLINK";
100             case RTM_DELLINK: return "RTM_DELLINK";
101             case RTM_GETLINK: return "RTM_GETLINK";
102             case RTM_SETLINK: return "RTM_SETLINK";
103             case RTM_NEWADDR: return "RTM_NEWADDR";
104             case RTM_DELADDR: return "RTM_DELADDR";
105             case RTM_GETADDR: return "RTM_GETADDR";
106             case RTM_NEWROUTE: return "RTM_NEWROUTE";
107             case RTM_DELROUTE: return "RTM_DELROUTE";
108             case RTM_GETROUTE: return "RTM_GETROUTE";
109             case RTM_NEWNEIGH: return "RTM_NEWNEIGH";
110             case RTM_DELNEIGH: return "RTM_DELNEIGH";
111             case RTM_GETNEIGH: return "RTM_GETNEIGH";
112             case RTM_NEWRULE: return "RTM_NEWRULE";
113             case RTM_DELRULE: return "RTM_DELRULE";
114             case RTM_GETRULE: return "RTM_GETRULE";
115             case RTM_NEWNDUSEROPT: return "RTM_NEWNDUSEROPT";
116             default:
117                 return "unknown RTM type: " + String.valueOf(nlm_type);
118         }
119     }
120 }
121