Create a L3Handler, given a layer 2 endpoint, and the network part
of the L3Address. The host part comes from the L2 address in the
layer 2 endpoint. The code creates an L3Shim object (and storing it),
sets itself as a listener for that object, and creates and stores
the L3Address for this object, from the given netPart and layer 2's
unique Mac address.
Called when the layer below receives bits successfully. Like
the layer 2 implementation, it calls dropReceivedPacket to determine
if the received packet should be dropped, instead of passed on
through the listener packetReceived() callback to the higher layer.