DCO
[hippotat] / hippotatlib / slip.py
CommitLineData
b0cfbfce
IJ
1# SLIP handling
2
3end = b'\300'
4esc = b'\333'
5esc_end = b'\334'
6esc_esc = b'\335'
7delimiter = end
8
9def encode(packet):
10 return (packet
11 .replace(esc, esc + esc_esc)
12 .replace(end, esc + esc_end))
13
7fa9c132 14def decode(data, keep_tail=False):
6f387df3 15 #print('DECODE ', repr(data))
b0cfbfce 16 out = []
7fa9c132
IJ
17 inp = data.split(end)
18 tail = []
19 if keep_tail:
20 tail.append(inp.pop())
21 for packet in inp:
b0cfbfce
IJ
22 pdata = b''
23 while True:
24 eix = packet.find(esc)
25 if eix == -1:
26 pdata += packet
27 break
28 #print('ESC ', repr((pdata, packet, eix)))
29 pdata += packet[0 : eix]
30 ck = packet[eix+1]
31 #print('ESC... %o' % ck)
32 if ck == esc_esc[0]: pdata += esc
33 elif ck == esc_end[0]: pdata += end
e8fcf3b7 34 else: raise ValueError('invalid SLIP escape 0%o %#x' % (ck, ck))
b0cfbfce
IJ
35 packet = packet[eix+2 : ]
36 out.append(pdata)
b68c0739 37 #print('DECODED ', repr(out))
7fa9c132 38 out += tail
b0cfbfce
IJ
39 return out
40# -*- python -*-
41