shill: Increase Receiver buffer size for RTNL socket

Observed ENOBUF crashes in shill and various daemons. Increasing
the size of the RTNL socket receive buffer 1Mb to mitigate the issue.

BUG=b:140535848,b:139903503
TEST=cros_workon_make --board=${BOARD} --test  shill

Change-Id: I9001c464c841ab47e9823039530ef5b6e8249a8c
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform2/+/1815935
Reviewed-by: James Chen <chienhua@google.com>
Reviewed-by: Alex Khouderchah <akhouderchah@chromium.org>
Tested-by: James Chen <chienhua@google.com>
Auto-Submit: James Chen <chienhua@google.com>
Commit-Queue: Alex Khouderchah <akhouderchah@chromium.org>
diff --git a/shill/net/rtnl_handler.cc b/shill/net/rtnl_handler.cc
index 61591b7..2963de6 100644
--- a/shill/net/rtnl_handler.cc
+++ b/shill/net/rtnl_handler.cc
@@ -61,6 +61,9 @@
 namespace {
 base::LazyInstance<RTNLHandler>::DestructorAtExit g_rtnl_handler =
     LAZY_INSTANCE_INITIALIZER;
+
+// Increasing buffer size to avoid overflows on IPV6 routing events.
+constexpr int kReceiveBufferBytes = 1024 * 1024;
 }  // namespace
 
 RTNLHandler::RTNLHandler()
@@ -96,6 +99,8 @@
     return;
   }
 
+  SetReceiverBufferSize(kReceiveBufferBytes);
+
   rtnl_handler_.reset(io_handler_factory_->CreateIOInputHandler(
       rtnl_socket_,
       Bind(&RTNLHandler::ParseRTNL, Unretained(this)),
diff --git a/shill/net/rtnl_handler_test.cc b/shill/net/rtnl_handler_test.cc
index 168355e..9e351f5 100644
--- a/shill/net/rtnl_handler_test.cc
+++ b/shill/net/rtnl_handler_test.cc
@@ -35,6 +35,7 @@
 using testing::ReturnArg;
 using testing::StrictMock;
 using testing::Test;
+using testing::AtLeast;
 
 namespace shill {
 
@@ -158,7 +159,9 @@
         NETLINK_ROUTE)).WillOnce(Return(kTestSocket));
   EXPECT_CALL(*sockets_, Bind(kTestSocket, _, sizeof(sockaddr_nl)))
       .WillOnce(Return(0));
-  EXPECT_CALL(*sockets_, SetReceiveBuffer(kTestSocket, _)).WillOnce(Return(0));
+  EXPECT_CALL(*sockets_, SetReceiveBuffer(kTestSocket, _))
+      .Times(AtLeast(1))
+      .WillRepeatedly(Return(0));
   EXPECT_CALL(io_handler_factory_, CreateIOInputHandler(kTestSocket, _, _));
   RTNLHandler::GetInstance()->Start(0);
 }