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];