- if not len(packet): continue
- (saddr, daddr) = packet_addrs(packet)
- if saddr.is_link_local or daddr.is_link_local:
- log_discard(packet, saddr, daddr, 'link-local')
- continue
- self._router(packet, saddr, daddr)
+ self._maybe_packet(packet)
+
+ def _maybe_packet(self, packet):
+ if len(packet):
+ self._on_packet(packet)
+
+ def flush(self):
+ self._maybe_packet(self._buffer)
+ self._buffer = b''
+
+class _IpifProcessProtocol(twisted.internet.protocol.ProcessProtocol):
+ def __init__(self, router):
+ self._router = router
+ self._decoder = SlipStreamDecoder(self.slip_on_packet)
+ def connectionMade(self): pass
+ def outReceived(self, data):
+ self._decoder.inputdata(data)
+ def slip_on_packet(self, packet):
+ (saddr, daddr) = packet_addrs(packet)
+ if saddr.is_link_local or daddr.is_link_local:
+ log_discard(packet, saddr, daddr, 'link-local')
+ return
+ self._router(packet, saddr, daddr)