shill: ArpClient: Support Request Reception

Refactor the code (specifically the part that sets up BPF filters)
to be able to receive and parse ARP requests.  In doing so, we
will now be able to start an ARP client to monitor the amount of
ambient broadcast ARP traffic on the network.  We can use this to
back down the rate of LinkMonitor requests to reduce loads on
networks with large numbers of Chromebooks.

BUG=chromium:422159
TEST=Unit tests + manual: ff_debug +link; ff_debug --level -4
Make sure ARP responses continue to be received correctly

Change-Id: I4c29919a09537b8be39f414647dd3a4fccc3800b
Reviewed-on: https://chromium-review.googlesource.com/222704
Reviewed-by: Peter Qiu <zqiu@chromium.org>
Tested-by: Paul Stewart <pstew@chromium.org>
Commit-Queue: Paul Stewart <pstew@chromium.org>
diff --git a/mock_arp_client.h b/mock_arp_client.h
index c2ff24b..2c9a356 100644
--- a/mock_arp_client.h
+++ b/mock_arp_client.h
@@ -19,9 +19,11 @@
   MockArpClient();
   ~MockArpClient() override;
 
-  MOCK_METHOD0(Start, bool());
+  MOCK_METHOD0(StartReplyListener, bool());
+  MOCK_METHOD0(StartRequestListener, bool());
   MOCK_METHOD0(Stop, void());
-  MOCK_CONST_METHOD2(ReceiveReply, bool(ArpPacket *packet, ByteString *sender));
+  MOCK_CONST_METHOD2(ReceivePacket, bool(ArpPacket *packet,
+                                         ByteString *sender));
   MOCK_CONST_METHOD1(TransmitRequest, bool(const ArpPacket &packet));
   MOCK_CONST_METHOD0(socket, int());