1cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline/* 2cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline * Copyright (C) 2015 The Android Open Source Project 3cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline * 4cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline * Licensed under the Apache License, Version 2.0 (the "License"); 5cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline * you may not use this file except in compliance with the License. 6cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline * You may obtain a copy of the License at 7cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline * 8cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline * http://www.apache.org/licenses/LICENSE-2.0 9cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline * 10cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline * Unless required by applicable law or agreed to in writing, software 11cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline * distributed under the License is distributed on an "AS IS" BASIS, 12cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline * See the License for the specific language governing permissions and 14cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline * limitations under the License. 15cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline */ 16cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline 17cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Klinepackage android.net.netlink; 18cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline 19cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Klineimport static android.net.netlink.StructNlMsgHdr.NLM_F_REQUEST; 20cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Klineimport static android.net.netlink.StructNlMsgHdr.NLM_F_ACK; 21cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Klineimport static android.net.netlink.StructNlMsgHdr.NLM_F_REPLACE; 22cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline 23cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Klineimport android.net.netlink.NetlinkConstants; 24cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Klineimport android.net.netlink.NetlinkErrorMessage; 25cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Klineimport android.net.netlink.NetlinkMessage; 26cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Klineimport android.net.netlink.StructNlMsgErr; 27fa8a6f6220d1a0027ba7969c2d3f72690ddc6495Hugo Benichiimport android.test.suitebuilder.annotation.SmallTest; 28cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Klineimport android.util.Log; 29cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Klineimport java.nio.ByteBuffer; 30cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Klineimport java.nio.ByteOrder; 31cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Klineimport junit.framework.TestCase; 32cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Klineimport libcore.util.HexEncoding; 33cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline 34cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline 35cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Klinepublic class NetlinkErrorMessageTest extends TestCase { 36cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline private final String TAG = "NetlinkErrorMessageTest"; 37cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline 38cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline // Hexadecimal representation of packet capture. 39cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline public static final String NLM_ERROR_OK_HEX = 40cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline // struct nlmsghdr 41cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline "24000000" + // length = 36 42cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline "0200" + // type = 2 (NLMSG_ERROR) 43cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline "0000" + // flags 44cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline "26350000" + // seqno 45cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline "64100000" + // pid = userspace process 46cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline // error integer 47cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline "00000000" + // "errno" (0 == OK) 48cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline // struct nlmsghdr 49cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline "30000000" + // length (48) of original request 50cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline "1C00" + // type = 28 (RTM_NEWNEIGH) 51cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline "0501" + // flags (NLM_F_REQUEST | NLM_F_ACK | NLM_F_REPLACE) 52cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline "26350000" + // seqno 53cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline "00000000"; // pid = kernel 54cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline public static final byte[] NLM_ERROR_OK = 55cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline HexEncoding.decode(NLM_ERROR_OK_HEX.toCharArray(), false); 56cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline 57fa8a6f6220d1a0027ba7969c2d3f72690ddc6495Hugo Benichi @SmallTest 58cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline public void testParseNlmErrorOk() { 59cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline final ByteBuffer byteBuffer = ByteBuffer.wrap(NLM_ERROR_OK); 60cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline byteBuffer.order(ByteOrder.LITTLE_ENDIAN); // For testing. 61cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline final NetlinkMessage msg = NetlinkMessage.parse(byteBuffer); 62cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline assertNotNull(msg); 63cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline assertTrue(msg instanceof NetlinkErrorMessage); 64cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline final NetlinkErrorMessage errorMsg = (NetlinkErrorMessage) msg; 65cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline 66cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline final StructNlMsgHdr hdr = errorMsg.getHeader(); 67cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline assertNotNull(hdr); 68cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline assertEquals(36, hdr.nlmsg_len); 69cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline assertEquals(NetlinkConstants.NLMSG_ERROR, hdr.nlmsg_type); 70cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline assertEquals(0, hdr.nlmsg_flags); 71cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline assertEquals(13606, hdr.nlmsg_seq); 72cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline assertEquals(4196, hdr.nlmsg_pid); 73cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline 74cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline final StructNlMsgErr err = errorMsg.getNlMsgError(); 75cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline assertNotNull(err); 76cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline assertEquals(0, err.error); 77cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline assertNotNull(err.msg); 78cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline assertEquals(48, err.msg.nlmsg_len); 79cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline assertEquals(NetlinkConstants.RTM_NEWNEIGH, err.msg.nlmsg_type); 80cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline assertEquals((NLM_F_REQUEST | NLM_F_ACK | NLM_F_REPLACE), err.msg.nlmsg_flags); 81cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline assertEquals(13606, err.msg.nlmsg_seq); 82cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline assertEquals(0, err.msg.nlmsg_pid); 83cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline } 84cef7bc939fbc3baae5ccf78dcef63fc60e07ae21Erik Kline} 85