patchpanel: ndproxy: assign public v6 addr to guest-facing ifs
Currently there is no public IPv6 address assigned on the
guest-facing interfaces (arc bridges and taps) when device is on
IPv6 network. This is causing Linux choosing a wrong src address
on packets directly originated from host to guest and drop the
returning traffic.
This patch generates an EUI-64 address based on virtual interface
MAC address upon receiving an RA, and add it to the interface.
BUG=chromium:1069985
TEST=unit;fuzz
TEST=manual(deploy on octopus and verify pinging penguin from host)
Change-Id: Id3ae953df6b3c84411461294bbc8dbd236cef901
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform2/+/2428652
Tested-by: Taoyu Li <taoyl@chromium.org>
Reviewed-by: Garrick Evans <garrick@chromium.org>
Reviewed-by: Hugo Benichi <hugobenichi@google.com>
Commit-Queue: Taoyu Li <taoyl@chromium.org>
diff --git a/patchpanel/ndproxy_test.cc b/patchpanel/ndproxy_test.cc
index b8aa16a..b303e5a 100644
--- a/patchpanel/ndproxy_test.cc
+++ b/patchpanel/ndproxy_test.cc
@@ -117,6 +117,21 @@
"\xa5\x6c\x80\x10\x01\x54\x04\xb9\x00\x00\x01\x01\x08\x0a\x00\x5a"
"\x59\xc0\x32\x53\x14\x3a";
+TEST(NDProxyTest, GetPrefixInfoOption) {
+ uint8_t in_buffer_extended[IP_MAXPACKET + ETHER_HDR_LEN + 4];
+ uint8_t* in_buffer = NDProxy::AlignFrameBuffer(in_buffer_extended);
+ const nd_opt_prefix_info* prefix_info;
+
+ memcpy(in_buffer, ra_frame, sizeof(ra_frame));
+ prefix_info = NDProxy::GetPrefixInfoOption(in_buffer, sizeof(ra_frame));
+ EXPECT_NE(nullptr, prefix_info);
+ EXPECT_EQ(64, prefix_info->nd_opt_pi_prefix_len);
+
+ memcpy(in_buffer, rs_frame, sizeof(rs_frame));
+ prefix_info = NDProxy::GetPrefixInfoOption(in_buffer, sizeof(rs_frame));
+ EXPECT_EQ(nullptr, prefix_info);
+}
+
TEST(NDProxyTest, TranslateFrame) {
uint8_t in_buffer_extended[IP_MAXPACKET + ETHER_HDR_LEN + 4];
uint8_t out_buffer_extended[IP_MAXPACKET + ETHER_HDR_LEN + 4];