- ipif.transport.write(slip_delimiter)
- ipif.transport.write(slip_encode(packet))
- ipif.transport.write(slip_delimiter)
-
-#---------- SLIP handling ----------
-
-slip_end = b'\300'
-slip_esc = b'\333'
-slip_esc_end = b'\334'
-slip_esc_esc = b'\335'
-slip_delimiter = slip_end
-
-def slip_encode(packet):
- return (packet
- .replace(slip_esc, slip_esc + slip_esc_esc)
- .replace(slip_end, slip_esc + slip_esc_end))
-
-def slip_decode(data):
- print('DECODE ', repr(data))
- out = []
- for packet in data.split(slip_end):
- pdata = b''
- while True:
- eix = packet.find(slip_esc)
- if eix == -1:
- pdata += packet
- break
- #print('ESC ', repr((pdata, packet, eix)))
- pdata += packet[0 : eix]
- ck = packet[eix+1]
- if ck == slip_esc_esc: pdata += slip_esc
- elif ck == slip_esc_end: pdata += slip_end
- else: raise ValueError('invalid SLIP escape')
- packet = packet[eix+2 : ]
- out.append(pdata)
- print('DECODED ', repr(out))
- return out
-
-#---------- packet parsing ----------
-
-def packet_addrs(packet):
- version = packet[0] >> 4
- if version == 4:
- addrlen = 4
- saddroff = 3*4
- factory = ipaddress.IPv4Address
- elif version == 6:
- addrlen = 16
- saddroff = 2*4
- factory = ipaddress.IPv6Address
- else:
- raise ValueError('unsupported IP version %d' % version)
- saddr = factory(packet[ saddroff : saddroff + addrlen ])
- daddr = factory(packet[ saddroff + addrlen : saddroff + addrlen*2 ])
- return (saddr, daddr)