/* * Copyright (C) 2017 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.netlink; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assume.assumeTrue; import android.system.OsConstants; import libcore.util.HexEncoding; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; import org.junit.runner.RunWith; import org.junit.Test; import java.net.Inet4Address; import java.net.InetAddress; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.Arrays; @RunWith(AndroidJUnit4.class) @SmallTest public class ConntrackMessageTest { private static final boolean USING_LE = (ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN); // Example 1: TCP (192.168.43.209, 44333) -> (23.211.13.26, 443) public static final String CT_V4UPDATE_TCP_HEX = // struct nlmsghdr "50000000" + // length = 80 "0001" + // type = (1 << 8) | 0 "0501" + // flags "01000000" + // seqno = 1 "00000000" + // pid = 0 // struct nfgenmsg "02" + // nfgen_family = AF_INET "00" + // version = NFNETLINK_V0 "0000" + // res_id // struct nlattr "3400" + // nla_len = 52 "0180" + // nla_type = nested CTA_TUPLE_ORIG // struct nlattr "1400" + // nla_len = 20 "0180" + // nla_type = nested CTA_TUPLE_IP "0800 0100 C0A82BD1" + // nla_type=CTA_IP_V4_SRC, ip=192.168.43.209 "0800 0200 17D30D1A" + // nla_type=CTA_IP_V4_DST, ip=23.211.13.26 // struct nlattr "1C00" + // nla_len = 28 "0280" + // nla_type = nested CTA_TUPLE_PROTO "0500 0100 06 000000" + // nla_type=CTA_PROTO_NUM, proto=6 "0600 0200 AD2D 0000" + // nla_type=CTA_PROTO_SRC_PORT, port=44333 (big endian) "0600 0300 01BB 0000" + // nla_type=CTA_PROTO_DST_PORT, port=443 (big endian) // struct nlattr "0800" + // nla_len = 8 "0700" + // nla_type = CTA_TIMEOUT "00069780"; // nla_value = 432000 (big endian) public static final byte[] CT_V4UPDATE_TCP_BYTES = HexEncoding.decode(CT_V4UPDATE_TCP_HEX.replaceAll(" ", "").toCharArray(), false); // Example 2: UDP (100.96.167.146, 37069) -> (216.58.197.10, 443) public static final String CT_V4UPDATE_UDP_HEX = // struct nlmsghdr "50000000" + // length = 80 "0001" + // type = (1 << 8) | 0 "0501" + // flags "01000000" + // seqno = 1 "00000000" + // pid = 0 // struct nfgenmsg "02" + // nfgen_family = AF_INET "00" + // version = NFNETLINK_V0 "0000" + // res_id // struct nlattr "3400" + // nla_len = 52 "0180" + // nla_type = nested CTA_TUPLE_ORIG // struct nlattr "1400" + // nla_len = 20 "0180" + // nla_type = nested CTA_TUPLE_IP "0800 0100 6460A792" + // nla_type=CTA_IP_V4_SRC, ip=100.96.167.146 "0800 0200 D83AC50A" + // nla_type=CTA_IP_V4_DST, ip=216.58.197.10 // struct nlattr "1C00" + // nla_len = 28 "0280" + // nla_type = nested CTA_TUPLE_PROTO "0500 0100 11 000000" + // nla_type=CTA_PROTO_NUM, proto=17 "0600 0200 90CD 0000" + // nla_type=CTA_PROTO_SRC_PORT, port=37069 (big endian) "0600 0300 01BB 0000" + // nla_type=CTA_PROTO_DST_PORT, port=443 (big endian) // struct nlattr "0800" + // nla_len = 8 "0700" + // nla_type = CTA_TIMEOUT "000000B4"; // nla_value = 180 (big endian) public static final byte[] CT_V4UPDATE_UDP_BYTES = HexEncoding.decode(CT_V4UPDATE_UDP_HEX.replaceAll(" ", "").toCharArray(), false); @Test public void testConntrackIPv4TcpTimeoutUpdate() throws Exception { assumeTrue(USING_LE); final byte[] tcp = ConntrackMessage.newIPv4TimeoutUpdateRequest( OsConstants.IPPROTO_TCP, (Inet4Address) InetAddress.getByName("192.168.43.209"), 44333, (Inet4Address) InetAddress.getByName("23.211.13.26"), 443, 432000); assertArrayEquals(CT_V4UPDATE_TCP_BYTES, tcp); } @Test public void testConntrackIPv4UdpTimeoutUpdate() throws Exception { assumeTrue(USING_LE); final byte[] udp = ConntrackMessage.newIPv4TimeoutUpdateRequest( OsConstants.IPPROTO_UDP, (Inet4Address) InetAddress.getByName("100.96.167.146"), 37069, (Inet4Address) InetAddress.getByName("216.58.197.10"), 443, 180); assertArrayEquals(CT_V4UPDATE_UDP_BYTES, udp); } }