blob: 53c5b42f719fb90afd8b6b34af1a633bf0bb6e37 [file] [log] [blame]
Taoyu Liaa6238b2019-09-06 17:38:52 +09001// Copyright 2019 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "arc/network/ndproxy.h"
6
7#include <stdlib.h>
8
9#include <net/ethernet.h>
10
11#include <gtest/gtest.h>
12
13namespace arc_networkd {
14
15const uint8_t physical_if_mac[] = "\xa0\xce\xc8\xc6\x91\x0a";
16const uint8_t guest_if_mac[] = "\xd2\x47\xf7\xc5\x9e\x53";
17
18const uint8_t ping_frame[] =
19 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\xdd\x60\x0b"
20 "\x8d\xb4\x00\x40\x3a\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
21 "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
22 "\x00\x00\x00\x00\x00\x01\x80\x00\xb9\x3c\x13\x8f\x00\x09\xde\x6a"
23 "\x78\x5d\x00\x00\x00\x00\x8e\x13\x0f\x00\x00\x00\x00\x00\x10\x11"
24 "\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21"
25 "\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31"
26 "\x32\x33\x34\x35\x36\x37";
27
28const uint8_t rs_frame[] =
29 "\x33\x33\x00\x00\x00\x02\x1a\x9b\x82\xbd\xc0\xa0\x86\xdd\x60\x00"
30 "\x00\x00\x00\x10\x3a\xff\xfe\x80\x00\x00\x00\x00\x00\x00\x2d\x75"
31 "\xb2\x80\x97\x83\x76\xbf\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00"
32 "\x00\x00\x00\x00\x00\x02\x85\x00\x2f\xfc\x00\x00\x00\x00\x01\x01"
33 "\x1a\x9b\x82\xbd\xc0\xa0";
34
35const uint8_t rs_frame_translated[] =
36 "\x33\x33\x00\x00\x00\x02\xa0\xce\xc8\xc6\x91\x0a\x86\xdd\x60\x00"
37 "\x00\x00\x00\x10\x3a\xff\xfe\x80\x00\x00\x00\x00\x00\x00\x2d\x75"
38 "\xb2\x80\x97\x83\x76\xbf\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00"
39 "\x00\x00\x00\x00\x00\x02\x85\x00\x93\x55\x00\x00\x00\x00\x01\x01"
40 "\xa0\xce\xc8\xc6\x91\x0a";
41
42const uint8_t ra_frame[] =
43 "\x33\x33\x00\x00\x00\x01\xc4\x71\xfe\xf1\xf6\x7f\x86\xdd\x6e\x00"
44 "\x00\x00\x00\x40\x3a\xff\xfe\x80\x00\x00\x00\x00\x00\x00\xc6\x71"
45 "\xfe\xff\xfe\xf1\xf6\x7f\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00"
46 "\x00\x00\x00\x00\x00\x01\x86\x00\x8a\xd5\x40\x00\x07\x08\x00\x00"
47 "\x00\x00\x00\x00\x00\x00\x01\x01\xc4\x71\xfe\xf1\xf6\x7f\x05\x01"
48 "\x00\x00\x00\x00\x05\xdc\x03\x04\x40\xc0\x00\x27\x8d\x00\x00\x09"
49 "\x3a\x80\x00\x00\x00\x00\x24\x01\xfa\x00\x00\x04\x00\x02\x00\x00"
50 "\x00\x00\x00\x00\x00\x00";
51
52const uint8_t ra_frame_translated[] =
53 "\x33\x33\x00\x00\x00\x01\xd2\x47\xf7\xc5\x9e\x53\x86\xdd\x6e\x00"
54 "\x00\x00\x00\x40\x3a\xff\xfe\x80\x00\x00\x00\x00\x00\x00\xc6\x71"
55 "\xfe\xff\xfe\xf1\xf6\x7f\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00"
56 "\x00\x00\x00\x00\x00\x01\x86\x00\xdc\x53\x40\x04\x07\x08\x00\x00"
57 "\x00\x00\x00\x00\x00\x00\x01\x01\xd2\x47\xf7\xc5\x9e\x53\x05\x01"
58 "\x00\x00\x00\x00\x05\xdc\x03\x04\x40\xc0\x00\x27\x8d\x00\x00\x09"
59 "\x3a\x80\x00\x00\x00\x00\x24\x01\xfa\x00\x00\x04\x00\x02\x00\x00"
60 "\x00\x00\x00\x00\x00\x00";
61
62const uint8_t ra_frame_option_reordered[] =
63 "\x33\x33\x00\x00\x00\x01\xc4\x71\xfe\xf1\xf6\x7f\x86\xdd\x6e\x00"
64 "\x00\x00\x00\x40\x3a\xff\xfe\x80\x00\x00\x00\x00\x00\x00\xc6\x71"
65 "\xfe\xff\xfe\xf1\xf6\x7f\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00"
66 "\x00\x00\x00\x00\x00\x01\x86\x00\x8a\xd5\x40\x00\x07\x08\x00\x00"
67 "\x00\x00\x00\x00\x00\x00\x05\x01\x00\x00\x00\x00\x05\xdc\x01\x01"
68 "\xc4\x71\xfe\xf1\xf6\x7f\x03\x04\x40\xc0\x00\x27\x8d\x00\x00\x09"
69 "\x3a\x80\x00\x00\x00\x00\x24\x01\xfa\x00\x00\x04\x00\x02\x00\x00"
70 "\x00\x00\x00\x00\x00\x00";
71
72const uint8_t ra_frame_option_reordered_translated[] =
73 "\x33\x33\x00\x00\x00\x01\xd2\x47\xf7\xc5\x9e\x53\x86\xdd\x6e\x00"
74 "\x00\x00\x00\x40\x3a\xff\xfe\x80\x00\x00\x00\x00\x00\x00\xc6\x71"
75 "\xfe\xff\xfe\xf1\xf6\x7f\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00"
76 "\x00\x00\x00\x00\x00\x01\x86\x00\xdc\x53\x40\x04\x07\x08\x00\x00"
77 "\x00\x00\x00\x00\x00\x00\x05\x01\x00\x00\x00\x00\x05\xdc\x01\x01"
78 "\xd2\x47\xf7\xc5\x9e\x53\x03\x04\x40\xc0\x00\x27\x8d\x00\x00\x09"
79 "\x3a\x80\x00\x00\x00\x00\x24\x01\xfa\x00\x00\x04\x00\x02\x00\x00"
80 "\x00\x00\x00\x00\x00\x00";
81
82const uint8_t ns_frame[] =
83 "\xd2\x47\xf7\xc5\x9e\x53\x1a\x9b\x82\xbd\xc0\xa0\x86\xdd\x60\x00"
84 "\x00\x00\x00\x20\x3a\xff\xfe\x80\x00\x00\x00\x00\x00\x00\x2d\x75"
85 "\xb2\x80\x97\x83\x76\xbf\xfe\x80\x00\x00\x00\x00\x00\x00\xc6\x71"
86 "\xfe\xff\xfe\xf1\xf6\x7f\x87\x00\xba\x27\x00\x00\x00\x00\xfe\x80"
87 "\x00\x00\x00\x00\x00\x00\xc6\x71\xfe\xff\xfe\xf1\xf6\x7f\x01\x01"
88 "\x1a\x9b\x82\xbd\xc0\xa0";
89
90const uint8_t ns_frame_translated[] =
91 "\xff\xff\xff\xff\xff\xff\xa0\xce\xc8\xc6\x91\x0a\x86\xdd\x60\x00"
92 "\x00\x00\x00\x20\x3a\xff\xfe\x80\x00\x00\x00\x00\x00\x00\x2d\x75"
93 "\xb2\x80\x97\x83\x76\xbf\xfe\x80\x00\x00\x00\x00\x00\x00\xc6\x71"
94 "\xfe\xff\xfe\xf1\xf6\x7f\x87\x00\x1d\x81\x00\x00\x00\x00\xfe\x80"
95 "\x00\x00\x00\x00\x00\x00\xc6\x71\xfe\xff\xfe\xf1\xf6\x7f\x01\x01"
96 "\xa0\xce\xc8\xc6\x91\x0a";
97
98const uint8_t na_frame[] =
99 "\xa0\xce\xc8\xc6\x91\x0a\xc4\x71\xfe\xf1\xf6\x7f\x86\xdd\x6e\x00"
100 "\x00\x00\x00\x18\x3a\xff\xfe\x80\x00\x00\x00\x00\x00\x00\xc6\x71"
101 "\xfe\xff\xfe\xf1\xf6\x7f\xfe\x80\x00\x00\x00\x00\x00\x00\x2d\x75"
102 "\xb2\x80\x97\x83\x76\xbf\x88\x00\x58\x29\xc0\x00\x00\x00\xfe\x80"
103 "\x00\x00\x00\x00\x00\x00\xc6\x71\xfe\xff\xfe\xf1\xf6\x7f";
104
105const uint8_t na_frame_translated[] =
106 "\xff\xff\xff\xff\xff\xff\xd2\x47\xf7\xc5\x9e\x53\x86\xdd\x6e\x00"
107 "\x00\x00\x00\x18\x3a\xff\xfe\x80\x00\x00\x00\x00\x00\x00\xc6\x71"
108 "\xfe\xff\xfe\xf1\xf6\x7f\xfe\x80\x00\x00\x00\x00\x00\x00\x2d\x75"
109 "\xb2\x80\x97\x83\x76\xbf\x88\x00\x58\x29\xc0\x00\x00\x00\xfe\x80"
110 "\x00\x00\x00\x00\x00\x00\xc6\x71\xfe\xff\xfe\xf1\xf6\x7f";
111
112const uint8_t tcp_frame[] =
113 "\xc4\x71\xfe\xf1\xf6\x7f\xa0\xce\xc8\xc6\x91\x0a\x86\xdd\x60\x03"
114 "\xa3\x57\x00\x20\x06\x40\x24\x01\xfa\x00\x00\x04\x00\x02\xf0\x94"
115 "\x0d\xa1\x12\x6f\xfd\x6b\x24\x04\x68\x00\x40\x08\x0c\x07\x00\x00"
116 "\x00\x00\x00\x00\x00\x66\x85\xc0\x01\xbb\xb2\x7e\xd0\xa6\x0c\x57"
117 "\xa5\x6c\x80\x10\x01\x54\x04\xb9\x00\x00\x01\x01\x08\x0a\x00\x5a"
118 "\x59\xc0\x32\x53\x14\x3a";
119
120TEST(NDProxy, Icmpv6Checksum) {
121 uint8_t buffer[IP_MAXPACKET];
122 ip6_hdr* ip6 = reinterpret_cast<ip6_hdr*>(buffer + ETHER_HDR_LEN);
123 icmp6_hdr* icmp6 =
124 reinterpret_cast<icmp6_hdr*>(buffer + ETHER_HDR_LEN + sizeof(ip6_hdr));
125
126 memcpy(buffer, ping_frame, sizeof(ping_frame));
127 uint16_t ori_cksum = icmp6->icmp6_cksum;
128 icmp6->icmp6_cksum = 0;
129 EXPECT_EQ(ori_cksum, NDProxy::Icmpv6Checksum(ip6, icmp6));
130
131 memcpy(buffer, rs_frame, sizeof(rs_frame));
132 ori_cksum = icmp6->icmp6_cksum;
133 icmp6->icmp6_cksum = 0;
134 EXPECT_EQ(ori_cksum, NDProxy::Icmpv6Checksum(ip6, icmp6));
135}
136
137TEST(NDProxy, TranslateFrame) {
138 uint8_t in_buffer[IP_MAXPACKET];
139 uint8_t out_buffer[IP_MAXPACKET];
140 int result;
141
142 memcpy(in_buffer, tcp_frame, sizeof(tcp_frame));
143 result = NDProxy::TranslateNDFrame(in_buffer, sizeof(tcp_frame),
144 physical_if_mac, out_buffer);
145 EXPECT_EQ(NDProxy::kTranslateErrorNotICMPv6Frame, result);
146
147 memcpy(in_buffer, ping_frame, sizeof(ping_frame));
148 result = NDProxy::TranslateNDFrame(in_buffer, sizeof(ping_frame),
149 physical_if_mac, out_buffer);
150 EXPECT_EQ(NDProxy::kTranslateErrorNotNDFrame, result);
151
152 memcpy(in_buffer, rs_frame, sizeof(rs_frame));
153 result = NDProxy::TranslateNDFrame(in_buffer, sizeof(rs_frame),
154 physical_if_mac, out_buffer);
155 EXPECT_EQ(sizeof(rs_frame_translated), result);
156 EXPECT_EQ(0, memcmp(rs_frame_translated, out_buffer, sizeof(rs_frame)));
157
158 memcpy(in_buffer, ra_frame, sizeof(ra_frame));
159 result = NDProxy::TranslateNDFrame(in_buffer, sizeof(ra_frame), guest_if_mac,
160 out_buffer);
161 EXPECT_EQ(sizeof(ra_frame_translated), result);
162 EXPECT_EQ(0, memcmp(ra_frame_translated, out_buffer, sizeof(ra_frame)));
163
164 memcpy(in_buffer, ra_frame_option_reordered,
165 sizeof(ra_frame_option_reordered));
166 result = NDProxy::TranslateNDFrame(
167 in_buffer, sizeof(ra_frame_option_reordered), guest_if_mac, out_buffer);
168 EXPECT_EQ(sizeof(ra_frame_option_reordered_translated), result);
169 EXPECT_EQ(0, memcmp(ra_frame_option_reordered_translated, out_buffer,
170 sizeof(ra_frame_option_reordered)));
171
172 memcpy(in_buffer, ns_frame, sizeof(ns_frame));
173 result = NDProxy::TranslateNDFrame(in_buffer, sizeof(ns_frame),
174 physical_if_mac, out_buffer);
175 EXPECT_EQ(sizeof(ns_frame_translated), result);
176 EXPECT_EQ(0, memcmp(ns_frame_translated, out_buffer, sizeof(ns_frame)));
177
178 memcpy(in_buffer, na_frame, sizeof(na_frame));
179 result = NDProxy::TranslateNDFrame(in_buffer, sizeof(na_frame), guest_if_mac,
180 out_buffer);
181 EXPECT_EQ(sizeof(na_frame_translated), result);
182 EXPECT_EQ(0, memcmp(na_frame_translated, out_buffer, sizeof(na_frame)));
183}
184
185} // namespace arc_networkd