From a95cfeb275bc35b1aed098fbdf866a631718feb8 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Wed, 22 Mar 2017 23:49:53 +0000 Subject: [PATCH] reorg SlipStreamDecoder again --- hippotat/__init__.py | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/hippotat/__init__.py b/hippotat/__init__.py index 3f62113..e48083a 100644 --- a/hippotat/__init__.py +++ b/hippotat/__init__.py @@ -123,29 +123,36 @@ def ipnetwork(input): #---------- ipif (SLIP) subprocess ---------- -class SlipProtocol(twisted.internet.protocol.ProcessProtocol): - # caller must define method receivedPacket(packet) - def __init__(self): +class SlipStreamDecoder(): + def __init__(self, on_packet): + # we will call packet() self._buffer = b'' - def connectionMade(self): pass - def outReceived(self, data): + self._on_packet = on_packet + + def inputdata(self, data): #print('SLIP-GOT ', repr(data)) self._buffer += data packets = slip.decode(self._buffer) self._buffer = packets.pop() for packet in packets: - if not len(packet): continue - self.receivedPacket(packet) + self._maybe_packet(packet) + + def _maybe_packet(self, packet): + if len(packet): + self._on_packet(packet) + def flush(self): - if len(self._buffer): - self.receivedPacket(self._buffer) - self._buffer = '' + self._maybe_packet(self._buffer) + self._buffer = b'' class _IpifProcessProtocol(SlipProtocol): def __init__(self, router): self._router = router - super.__init__() - def receivedPacket(self, packet): + 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') -- 2.30.2