Taoyu Li | aa6238b | 2019-09-06 17:38:52 +0900 | [diff] [blame] | 1 | // 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 | |
Garrick Evans | 3388a03 | 2020-03-24 11:25:55 +0900 | [diff] [blame^] | 5 | #include "patchpanel/ndproxy.h" |
Taoyu Li | aa6238b | 2019-09-06 17:38:52 +0900 | [diff] [blame] | 6 | |
| 7 | #include <stdlib.h> |
| 8 | |
| 9 | #include <net/ethernet.h> |
| 10 | |
| 11 | #include <gtest/gtest.h> |
| 12 | |
Garrick Evans | 3388a03 | 2020-03-24 11:25:55 +0900 | [diff] [blame^] | 13 | namespace patchpanel { |
Taoyu Li | aa6238b | 2019-09-06 17:38:52 +0900 | [diff] [blame] | 14 | |
Taoyu Li | e47df4a | 2019-11-08 12:48:57 +0900 | [diff] [blame] | 15 | const MacAddress physical_if_mac({0xa0, 0xce, 0xc8, 0xc6, 0x91, 0x0a}); |
| 16 | const MacAddress guest_if_mac({0xd2, 0x47, 0xf7, 0xc5, 0x9e, 0x53}); |
Taoyu Li | aa6238b | 2019-09-06 17:38:52 +0900 | [diff] [blame] | 17 | |
| 18 | const 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 | |
| 28 | const 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 | |
| 35 | const 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 | |
| 42 | const 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 | |
| 52 | const 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 | |
| 62 | const 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 | |
| 72 | const 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 | |
| 82 | const 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 | |
| 90 | const 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 | |
| 98 | const 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 | |
| 105 | const 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 | |
| 112 | const 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 | |
Taoyu Li | e47df4a | 2019-11-08 12:48:57 +0900 | [diff] [blame] | 120 | TEST(NDProxyTest, TranslateFrame) { |
Taoyu Li | 18041fe | 2019-11-13 15:49:31 +0900 | [diff] [blame] | 121 | uint8_t in_buffer_extended[IP_MAXPACKET + ETHER_HDR_LEN + 4]; |
| 122 | uint8_t out_buffer_extended[IP_MAXPACKET + ETHER_HDR_LEN + 4]; |
| 123 | uint8_t* in_buffer = NDProxy::AlignFrameBuffer(in_buffer_extended); |
| 124 | uint8_t* out_buffer = NDProxy::AlignFrameBuffer(out_buffer_extended); |
Taoyu Li | aa6238b | 2019-09-06 17:38:52 +0900 | [diff] [blame] | 125 | int result; |
| 126 | |
Taoyu Li | e47df4a | 2019-11-08 12:48:57 +0900 | [diff] [blame] | 127 | NDProxy ndproxy; |
| 128 | ndproxy.Init(); |
Taoyu Li | aa6238b | 2019-09-06 17:38:52 +0900 | [diff] [blame] | 129 | memcpy(in_buffer, tcp_frame, sizeof(tcp_frame)); |
Taoyu Li | e47df4a | 2019-11-08 12:48:57 +0900 | [diff] [blame] | 130 | result = ndproxy.TranslateNDFrame(in_buffer, sizeof(tcp_frame), |
| 131 | physical_if_mac, out_buffer); |
Taoyu Li | aa6238b | 2019-09-06 17:38:52 +0900 | [diff] [blame] | 132 | EXPECT_EQ(NDProxy::kTranslateErrorNotICMPv6Frame, result); |
| 133 | |
| 134 | memcpy(in_buffer, ping_frame, sizeof(ping_frame)); |
Taoyu Li | e47df4a | 2019-11-08 12:48:57 +0900 | [diff] [blame] | 135 | result = ndproxy.TranslateNDFrame(in_buffer, sizeof(ping_frame), |
| 136 | physical_if_mac, out_buffer); |
Taoyu Li | aa6238b | 2019-09-06 17:38:52 +0900 | [diff] [blame] | 137 | EXPECT_EQ(NDProxy::kTranslateErrorNotNDFrame, result); |
| 138 | |
| 139 | memcpy(in_buffer, rs_frame, sizeof(rs_frame)); |
Taoyu Li | e47df4a | 2019-11-08 12:48:57 +0900 | [diff] [blame] | 140 | result = ndproxy.TranslateNDFrame(in_buffer, sizeof(rs_frame), |
| 141 | physical_if_mac, out_buffer); |
Taoyu Li | aa6238b | 2019-09-06 17:38:52 +0900 | [diff] [blame] | 142 | EXPECT_EQ(sizeof(rs_frame_translated), result); |
| 143 | EXPECT_EQ(0, memcmp(rs_frame_translated, out_buffer, sizeof(rs_frame))); |
| 144 | |
| 145 | memcpy(in_buffer, ra_frame, sizeof(ra_frame)); |
Taoyu Li | e47df4a | 2019-11-08 12:48:57 +0900 | [diff] [blame] | 146 | result = ndproxy.TranslateNDFrame(in_buffer, sizeof(ra_frame), guest_if_mac, |
| 147 | out_buffer); |
Taoyu Li | aa6238b | 2019-09-06 17:38:52 +0900 | [diff] [blame] | 148 | EXPECT_EQ(sizeof(ra_frame_translated), result); |
| 149 | EXPECT_EQ(0, memcmp(ra_frame_translated, out_buffer, sizeof(ra_frame))); |
| 150 | |
| 151 | memcpy(in_buffer, ra_frame_option_reordered, |
| 152 | sizeof(ra_frame_option_reordered)); |
Taoyu Li | e47df4a | 2019-11-08 12:48:57 +0900 | [diff] [blame] | 153 | result = ndproxy.TranslateNDFrame( |
Taoyu Li | aa6238b | 2019-09-06 17:38:52 +0900 | [diff] [blame] | 154 | in_buffer, sizeof(ra_frame_option_reordered), guest_if_mac, out_buffer); |
| 155 | EXPECT_EQ(sizeof(ra_frame_option_reordered_translated), result); |
| 156 | EXPECT_EQ(0, memcmp(ra_frame_option_reordered_translated, out_buffer, |
| 157 | sizeof(ra_frame_option_reordered))); |
| 158 | |
| 159 | memcpy(in_buffer, ns_frame, sizeof(ns_frame)); |
Taoyu Li | e47df4a | 2019-11-08 12:48:57 +0900 | [diff] [blame] | 160 | result = ndproxy.TranslateNDFrame(in_buffer, sizeof(ns_frame), |
| 161 | physical_if_mac, out_buffer); |
Taoyu Li | aa6238b | 2019-09-06 17:38:52 +0900 | [diff] [blame] | 162 | EXPECT_EQ(sizeof(ns_frame_translated), result); |
| 163 | EXPECT_EQ(0, memcmp(ns_frame_translated, out_buffer, sizeof(ns_frame))); |
| 164 | |
| 165 | memcpy(in_buffer, na_frame, sizeof(na_frame)); |
Taoyu Li | e47df4a | 2019-11-08 12:48:57 +0900 | [diff] [blame] | 166 | result = ndproxy.TranslateNDFrame(in_buffer, sizeof(na_frame), guest_if_mac, |
| 167 | out_buffer); |
Taoyu Li | aa6238b | 2019-09-06 17:38:52 +0900 | [diff] [blame] | 168 | EXPECT_EQ(sizeof(na_frame_translated), result); |
| 169 | EXPECT_EQ(0, memcmp(na_frame_translated, out_buffer, sizeof(na_frame))); |
| 170 | } |
| 171 | |
Garrick Evans | 3388a03 | 2020-03-24 11:25:55 +0900 | [diff] [blame^] | 172 | } // namespace patchpanel |