• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1% Regression tests for the CANSocket
2~ vcan_socket linux needs_root not_pypy
3
4# More information at http://www.secdev.org/projects/UTscapy/
5
6
7############
8############
9+ Configuration of CAN virtual sockets
10
11= Load module
12~ conf
13
14conf.contribs['CAN'] = {'swap-bytes': False, 'remove-padding': True}
15load_layer("can", globals_dict=globals())
16conf.contribs['CANSocket'] = {'use-python-can': True}
17from scapy.contrib.cansocket_python_can import *
18
19= Setup string for vcan
20~ conf command
21bashCommand = "/bin/bash -c 'sudo modprobe vcan; sudo ip link add name vcan0 type vcan; sudo ip link set dev vcan0 up'"
22
23= Load os
24~ conf command
25
26import os
27import threading
28from subprocess import call
29
30= Setup vcan0
31~ conf command
32
330 == os.system(bashCommand)
34
35= Define common used functions
36
37send_done = threading.Event()
38
39def sender(sock, msg):
40    if not hasattr(msg, "__iter__"):
41        msg = [msg]
42    for m in msg:
43        sock.send(m)
44    send_done.set()
45
46+ Basic Packet Tests()
47= CAN Packet init
48
49canframe = CAN(identifier=0x7ff,length=8,data=b'\x01\x02\x03\x04\x05\x06\x07\x08')
50bytes(canframe) == b'\x00\x00\x07\xff\x08\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08'
51
52+ Basic Socket Tests()
53= CAN Socket Init
54
55sock1 = CANSocket(bustype='socketcan', channel='vcan0')
56sock1.close()
57del sock1
58sock1 = None
59
60= CAN Socket send recv small packet
61
62sock1 = CANSocket(bustype='socketcan', channel='vcan0')
63sock2 = CANSocket(bustype='socketcan', channel='vcan0')
64
65sock2.send(CAN(identifier=0x7ff,length=1,data=b'\x01'))
66rx = sock1.recv()
67sock1.close()
68sock2.close()
69
70assert rx == CAN(identifier=0x7ff,length=1,data=b'\x01')
71
72= CAN Socket send recv small packet test with
73
74with CANSocket(bustype='socketcan', channel='vcan0') as sock1, \
75    CANSocket(bustype='socketcan', channel='vcan0') as sock2:
76    sock2.send(CAN(identifier=0x7ff,length=1,data=b'\x01'))
77    rx = sock1.recv()
78
79assert rx == CAN(identifier=0x7ff,length=1,data=b'\x01')
80
81
82= CAN Socket send recv ISOTP_Packet
83
84from scapy.contrib.isotp import ISOTPHeader, ISOTP_FF
85
86with CANSocket(bustype='socketcan', channel='vcan0') as sock1, \
87    CANSocket(bustype='socketcan', channel='vcan0') as sock2:
88    sock2.send(ISOTPHeader(identifier=0x7ff)/ISOTP_FF(message_size=100, data=b'abcdef'))
89    rx = sock1.recv()
90    assert rx == CAN(identifier=0x7ff,length=8,data=b'\x10\x64abcdef')
91
92
93= CAN Socket basecls test
94
95with CANSocket(bustype='socketcan', channel='vcan0') as sock1, \
96    CANSocket(bustype='socketcan', channel='vcan0') as sock2:
97    sock1.basecls = Raw
98    sock2.send(CAN(identifier=0x7ff,length=8,data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
99    rx = sock1.recv()
100    assert rx == Raw(bytes(CAN(identifier=0x7ff,length=8,data=b'\x01\x02\x03\x04\x05\x06\x07\x08')))
101
102= CAN Socket send recv
103
104with CANSocket(bustype='socketcan', channel='vcan0') as sock1, \
105    CANSocket(bustype='socketcan', channel='vcan0') as sock2:
106    sock2.send(CAN(identifier=0x7ff,length=8,data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
107    sock1.basecls = CAN
108    rx = sock1.recv()
109    assert rx == CAN(identifier=0x7ff,length=8,data=b'\x01\x02\x03\x04\x05\x06\x07\x08')
110
111= CAN Socket send recv swapped
112
113conf.contribs['CAN']['swap-bytes'] = True
114
115with CANSocket(bustype='socketcan', channel='vcan0') as sock1, \
116    CANSocket(bustype='socketcan', channel='vcan0') as sock2:
117    sock2.send(CAN(identifier=0x7ff,length=8,data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
118    sock1.basecls = CAN
119    rx = sock1.recv()
120    assert rx == CAN(identifier=0x7ff,length=8,data=b'\x01\x02\x03\x04\x05\x06\x07\x08')
121
122conf.contribs['CAN']['swap-bytes'] = False
123
124= sniff with filtermask 0x7ff
125
126msgs = [CAN(identifier=0x200, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'),
127    CAN(identifier=0x300, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'),
128    CAN(identifier=0x300, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'),
129    CAN(identifier=0x200, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'),
130    CAN(identifier=0x100, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'),
131    CAN(identifier=0x200, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')]
132
133with CANSocket(bustype='socketcan', channel='vcan0', can_filters=[{'can_id': 0x200, 'can_mask': 0x7ff}]) as sock1, \
134        CANSocket(bustype='socketcan', channel='vcan0') as sock2:
135    for m in msgs:
136        sock2.send(m)
137    packets = sock1.sniff(timeout=0.1, count=3)
138    assert len(packets) == 3
139
140
141= sniff with filtermask 0x700
142
143msgs = [CAN(identifier=0x212, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'),
144    CAN(identifier=0x300, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'),
145    CAN(identifier=0x2ff, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'),
146    CAN(identifier=0x1ff, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'),
147    CAN(identifier=0x200, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'),
148    CAN(identifier=0x2aa, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')]
149
150with CANSocket(bustype='socketcan', channel='vcan0', can_filters=[{'can_id': 0x200, 'can_mask': 0x700}]) as sock1, \
151        CANSocket(bustype='socketcan', channel='vcan0') as sock2:
152    for m in msgs:
153        sock2.send(m)
154    packets = sock1.sniff(timeout=0.1, count=4)
155    assert len(packets) == 4
156
157= sniff with filtermask 0x0ff
158
159msgs = [CAN(identifier=0x200, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'),
160    CAN(identifier=0x301, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'),
161    CAN(identifier=0x300, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'),
162    CAN(identifier=0x1ff, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'),
163    CAN(identifier=0x700, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'),
164    CAN(identifier=0x100, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')]
165
166with CANSocket(bustype='socketcan', channel='vcan0', can_filters=[{'can_id': 0x200, 'can_mask': 0xff}]) as sock1, \
167        CANSocket(bustype='socketcan', channel='vcan0') as sock2:
168    for m in msgs:
169        sock2.send(m)
170    packets = sock1.sniff(timeout=0.1, count=4)
171    assert len(packets) == 4
172
173= sniff with multiple filters
174
175msgs = [CAN(identifier=0x200, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'),
176    CAN(identifier=0x300, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'),
177    CAN(identifier=0x400, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'),
178    CAN(identifier=0x500, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'),
179    CAN(identifier=0x600, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'),
180    CAN(identifier=0x700, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'),
181    CAN(identifier=0x7ff, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')]
182
183with CANSocket(bustype='socketcan', channel='vcan0', can_filters=[{'can_id': 0x200, 'can_mask': 0x7ff}, {'can_id': 0x400, 'can_mask': 0x7ff}, {'can_id': 0x600, 'can_mask': 0x7ff}, {'can_id': 0x7ff, 'can_mask': 0x7ff}]) as sock1, \
184        CANSocket(bustype='socketcan', channel='vcan0') as sock2:
185    for m in msgs:
186        sock2.send(m)
187    packets = sock1.sniff(timeout=0.1, count=4)
188    assert len(packets) == 4
189
190= sniff with filtermask 0x7ff
191
192msgs = [CAN(identifier=0x200, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'),
193    CAN(identifier=0x200, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'),
194    CAN(identifier=0x300, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'),
195    CAN(identifier=0x200, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'),
196    CAN(identifier=0x100, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'),
197    CAN(identifier=0x200, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')]
198
199
200with CANSocket(bustype='socketcan', channel='vcan0', can_filters=[{'can_id': 0x200, 'can_mask': 0x7ff}]) as sock1, \
201        CANSocket(bustype='socketcan', channel='vcan0') as sock2:
202    for m in msgs:
203        sock2.send(m)
204    packets = sock1.sniff(timeout=0.1, count=4)
205    assert len(packets) == 4
206
207= sniff with filtermask 0x1FFFFFFF
208
209msgs = [CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'),
210    CAN(flags='extended', identifier=0x10020000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'),
211    CAN(flags='extended', identifier=0x10000000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'),
212    CAN(flags='extended', identifier=0x10030000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'),
213    CAN(flags='extended', identifier=0x10040000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'),
214    CAN(flags='extended', identifier=0x10000000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')]
215
216with CANSocket(bustype='socketcan', channel='vcan0', can_filters=[{'can_id': 0x10000000, 'can_mask': 0x1fffffff}]) as sock1, \
217        CANSocket(bustype='socketcan', channel='vcan0') as sock2:
218    for m in msgs:
219        sock2.send(m)
220    packets = sock1.sniff(timeout=0.1, count=2)
221    assert len(packets) == 2
222
223
224+ bridge and sniff tests
225= bridge and sniff setup vcan1 package forwarding
226
227bashCommand = "/bin/bash -c 'sudo ip link add name vcan1 type vcan; sudo ip link set dev vcan1 up'"
228assert 0 == os.system(bashCommand)
229
230sock0 = CANSocket(bustype='socketcan', channel='vcan0')
231sock1 = CANSocket(bustype='socketcan', channel='vcan1')
232
233bridgeStarted = threading.Event()
234def bridge():
235    global bridgeStarted
236    bSock0 = CANSocket(
237        bustype='socketcan', channel='vcan0',
238                                bitrate=250000)
239    bSock1 = CANSocket(
240        bustype='socketcan', channel='vcan1',
241                                bitrate=250000)
242    def pnr(pkt):
243        return pkt
244    bSock0.timeout = 0.01
245    bSock1.timeout = 0.01
246    bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnr, xfrm21=pnr, timeout=0.5, started_callback=bridgeStarted.set, count=6)
247    bSock0.close()
248    bSock1.close()
249
250threadBridge = threading.Thread(target=bridge)
251threadBridge.start()
252bridgeStarted.wait(timeout=1)
253
254sock0.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
255sock0.send(CAN(flags='extended', identifier=0x10020000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
256sock0.send(CAN(flags='extended', identifier=0x10000000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
257sock0.send(CAN(flags='extended', identifier=0x10030000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
258sock0.send(CAN(flags='extended', identifier=0x10040000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
259sock0.send(CAN(flags='extended', identifier=0x10000000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
260
261packetsVCan1 = sock1.sniff(timeout=0.5, count=6)
262assert len(packetsVCan1) == 6
263
264sock1.close()
265sock0.close()
266
267threadBridge.join(timeout=3)
268assert not threadBridge.is_alive()
269
270= bridge and sniff setup vcan0 package forwarding
271
272sock0 = CANSocket(bustype='socketcan', channel='vcan0')
273sock1 = CANSocket(bustype='socketcan', channel='vcan1')
274
275bridgeStarted = threading.Event()
276def bridge():
277    global bridgeStarted
278    bSock0 = CANSocket(bustype='socketcan', channel='vcan0')
279    bSock1 = CANSocket(bustype='socketcan', channel='vcan1')
280    def pnr(pkt):
281        return pkt
282    bSock0.timeout = 0.01
283    bSock1.timeout = 0.01
284    bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnr, xfrm21=pnr, timeout=0.5, started_callback=bridgeStarted.set, count=4)
285    bSock0.close()
286    bSock1.close()
287
288threadBridge = threading.Thread(target=bridge)
289threadBridge.start()
290bridgeStarted.wait(timeout=1)
291
292sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06'))
293sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06'))
294sock1.send(CAN(flags='extended', identifier=0x80, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06'))
295sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06'))
296
297packetsVCan0 = sock0.sniff(timeout=0.5, count=4)
298assert len(packetsVCan0) == 4
299
300sock0.close()
301sock1.close()
302
303threadBridge.join(timeout=3)
304assert not threadBridge.is_alive()
305
306=bridge and sniff setup vcan0 vcan1 package forwarding both directions
307
308sock0 = CANSocket(bustype='socketcan', channel='vcan0')
309sock1 = CANSocket(bustype='socketcan', channel='vcan1')
310
311bridgeStarted = threading.Event()
312def bridge():
313    global bridgeStarted
314    bSock0 = CANSocket(bustype='socketcan', channel='vcan0')
315    bSock1 = CANSocket(bustype='socketcan', channel='vcan1')
316    def pnr(pkt):
317        return pkt
318    bSock0.timeout = 0.01
319    bSock1.timeout = 0.01
320    bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnr, xfrm21=pnr, timeout=0.5, started_callback=bridgeStarted.set, count=10)
321    bSock0.close()
322    bSock1.close()
323
324threadBridge = threading.Thread(target=bridge)
325threadBridge.start()
326bridgeStarted.wait(timeout=1)
327
328sock0.send(CAN(flags='extended', identifier=0x25, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
329sock0.send(CAN(flags='extended', identifier=0x20, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
330sock0.send(CAN(flags='extended', identifier=0x25, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
331sock0.send(CAN(flags='extended', identifier=0x25, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
332sock0.send(CAN(flags='extended', identifier=0x20, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
333sock0.send(CAN(flags='extended', identifier=0x30, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
334sock1.send(CAN(flags='extended', identifier=0x40, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06'))
335sock1.send(CAN(flags='extended', identifier=0x40, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06'))
336sock1.send(CAN(flags='extended', identifier=0x80, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06'))
337sock1.send(CAN(flags='extended', identifier=0x40, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06'))
338
339packetsVCan0 = sock0.sniff(timeout=0.5, count=4)
340packetsVCan1 = sock1.sniff(timeout=0.5, count=6)
341assert len(packetsVCan0) == 4
342assert len(packetsVCan1) == 6
343
344sock0.close()
345sock1.close()
346
347threadBridge.join(timeout=3)
348assert not threadBridge.is_alive()
349
350=bridge and sniff setup vcan1 package change
351
352sock0 = CANSocket(bustype='socketcan', channel='vcan0')
353sock1 = CANSocket(bustype='socketcan', channel='vcan1', can_filters=[{'can_id': 0x10010000, 'can_mask': 0x1fffffff}])
354
355bridgeStarted = threading.Event()
356def bridgeWithPackageChangeVCan0ToVCan1():
357    global bridgeStarted
358    bSock0 = CANSocket(bustype='socketcan', channel='vcan0')
359    bSock1 = CANSocket(bustype='socketcan', channel='vcan1')
360    def pnr(pkt):
361        pkt.data = b'\x08\x07\x06\x05\x04\x03\x02\x01'
362        pkt.identifier = 0x10010000
363        return pkt
364    bSock0.timeout = 0.01
365    bSock1.timeout = 0.01
366    bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnr, timeout=0.5, started_callback=bridgeStarted.set, count=6)
367    bSock0.close()
368    bSock1.close()
369
370threadBridge = threading.Thread(target=bridgeWithPackageChangeVCan0ToVCan1)
371threadBridge.start()
372bridgeStarted.wait(timeout=1)
373sock0.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
374sock0.send(CAN(flags='extended', identifier=0x10020000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
375sock0.send(CAN(flags='extended', identifier=0x10000000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
376sock0.send(CAN(flags='extended', identifier=0x10030000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
377sock0.send(CAN(flags='extended', identifier=0x10040000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
378sock0.send(CAN(flags='extended', identifier=0x10000000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
379
380packetsVCan1 = sock1.sniff(timeout=0.5, count=6)
381assert len(packetsVCan1) == 6
382
383sock0.close()
384sock1.close()
385
386threadBridge.join(timeout=3)
387assert not threadBridge.is_alive()
388
389=bridge and sniff setup vcan0 package change
390
391sock1 = CANSocket(bustype='socketcan', channel='vcan1')
392sock0 = CANSocket(bustype='socketcan', channel='vcan0', can_filters=[{'can_id': 0x10010000, 'can_mask': 0x1fffffff}])
393
394bridgeStarted = threading.Event()
395def bridgeWithPackageChangeVCan1ToVCan0():
396    global bridgeStarted
397    bSock0 = CANSocket(bustype='socketcan', channel='vcan0')
398    bSock1 = CANSocket(bustype='socketcan', channel='vcan1')
399    def pnr(pkt):
400        pkt.data = b'\x08\x07\x06\x05\x04\x03\x02\x01'
401        pkt.identifier = 0x10010000
402        return pkt
403    bSock0.timeout = 0.01
404    bSock1.timeout = 0.01
405    bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm21=pnr, timeout=0.5, started_callback=bridgeStarted.set, count=4)
406    bSock0.close()
407    bSock1.close()
408
409threadBridge = threading.Thread(target=bridgeWithPackageChangeVCan1ToVCan0)
410threadBridge.start()
411bridgeStarted.wait(timeout=1)
412
413sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06'))
414sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06'))
415sock1.send(CAN(flags='extended', identifier=0x10050000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06'))
416sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06'))
417
418packetsVCan0 = sock0.sniff(timeout=0.5, count=4)
419assert len(packetsVCan0) == 4
420
421sock0.close()
422sock1.close()
423
424threadBridge.join(timeout=3)
425assert not threadBridge.is_alive()
426
427=bridge and sniff setup vcan0 and vcan1 package change in both directions
428
429sock0 = CANSocket(bustype='socketcan', channel='vcan0', can_filters=[{'can_id': 0x10010000, 'can_mask': 0x1fffffff}])
430sock1 = CANSocket(bustype='socketcan', channel='vcan1', can_filters=[{'can_id': 0x10010000, 'can_mask': 0x1fffffff}])
431
432bridgeStarted = threading.Event()
433def bridgeWithPackageChangeBothDirections():
434    global bridgeStarted
435    bSock0 = CANSocket(bustype='socketcan', channel='vcan0')
436    bSock1 = CANSocket(bustype='socketcan', channel='vcan1')
437    def pnr(pkt):
438        pkt.data = b'\x08\x07\x06\x05\x04\x03\x02\x01'
439        pkt.identifier = 0x10010000
440        return pkt
441    bSock0.timeout = 0.01
442    bSock1.timeout = 0.01
443    bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnr, xfrm21=pnr, timeout=0.5, started_callback=bridgeStarted.set, count=10)
444    bSock0.close()
445    bSock1.close()
446
447threadBridge = threading.Thread(target=bridgeWithPackageChangeBothDirections)
448threadBridge.start()
449bridgeStarted.wait(timeout=1)
450
451sock0.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
452sock0.send(CAN(flags='extended', identifier=0x10020000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
453sock0.send(CAN(flags='extended', identifier=0x10000000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
454sock0.send(CAN(flags='extended', identifier=0x10030000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
455sock0.send(CAN(flags='extended', identifier=0x10040000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
456sock0.send(CAN(flags='extended', identifier=0x10000000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
457sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06'))
458sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06'))
459sock1.send(CAN(flags='extended', identifier=0x10050000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06'))
460sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06'))
461
462packetsVCan0 = sock0.sniff(timeout=0.5, count=4)
463packetsVCan1 = sock1.sniff(timeout=0.5, count=6)
464assert len(packetsVCan0) == 4
465assert len(packetsVCan1) == 6
466
467sock0.close()
468sock1.close()
469
470threadBridge.join(timeout=3)
471assert not threadBridge.is_alive()
472
473=bridge and sniff setup vcan0 package remove
474
475sock0 = CANSocket(bustype='socketcan', channel='vcan0')
476sock1 = CANSocket(bustype='socketcan', channel='vcan1')
477
478bridgeStarted = threading.Event()
479def bridgeWithRemovePackageFromVCan0ToVCan1():
480    global bridgeStarted
481    bSock0 = CANSocket(bustype='socketcan', channel='vcan0')
482    bSock1 = CANSocket(bustype='socketcan', channel='vcan1')
483    def pnr(pkt):
484        if(pkt.identifier == 0x10020000):
485            pkt = False
486        else:
487            pkt = pkt
488        return pkt
489    bSock0.timeout = 0.01
490    bSock1.timeout = 0.01
491    bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnr, timeout=0.5, started_callback=bridgeStarted.set, count=6)
492    bSock0.close()
493    bSock1.close()
494
495threadBridge = threading.Thread(target=bridgeWithRemovePackageFromVCan0ToVCan1)
496threadBridge.start()
497bridgeStarted.wait(timeout=1)
498
499sock0.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
500sock0.send(CAN(flags='extended', identifier=0x10020000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
501sock0.send(CAN(flags='extended', identifier=0x10000000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
502sock0.send(CAN(flags='extended', identifier=0x10030000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
503sock0.send(CAN(flags='extended', identifier=0x10040000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
504sock0.send(CAN(flags='extended', identifier=0x10000000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
505
506packetsVCan1 = sock1.sniff(timeout=0.5, count=5)
507
508assert len(packetsVCan1) == 5
509
510sock0.close()
511sock1.close()
512
513threadBridge.join(timeout=3)
514assert not threadBridge.is_alive()
515
516=bridge and sniff setup vcan1 package remove
517
518sock0 = CANSocket(bustype='socketcan', channel='vcan0')
519sock1 = CANSocket(bustype='socketcan', channel='vcan1')
520
521bridgeStarted = threading.Event()
522def bridgeWithRemovePackageFromVCan1ToVCan0():
523    global bridgeStarted
524    bSock0 = CANSocket(bustype='socketcan', channel='vcan0')
525    bSock1 = CANSocket(bustype='socketcan', channel='vcan1')
526    def pnr(pkt):
527        if(pkt.identifier == 0x10050000):
528            pkt = False
529        else:
530            pkt = pkt
531        return pkt
532    bSock0.timeout = 0.01
533    bSock1.timeout = 0.01
534    bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm21=pnr, timeout=0.5, started_callback=bridgeStarted.set, count=4)
535    bSock0.close()
536    bSock1.close()
537
538threadBridge = threading.Thread(target=bridgeWithRemovePackageFromVCan1ToVCan0)
539threadBridge.start()
540bridgeStarted.wait(timeout=1)
541
542sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06'))
543sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06'))
544sock1.send(CAN(flags='extended', identifier=0x10050000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06'))
545sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06'))
546
547packetsVCan0 = sock0.sniff(timeout=0.5, count=3)
548
549assert len(packetsVCan0) == 3
550
551sock0.close()
552sock1.close()
553
554threadBridge.join(timeout=3)
555assert not threadBridge.is_alive()
556
557
558=bridge and sniff setup vcan0 and vcan1 package remove both directions
559
560sock0 = CANSocket(bustype='socketcan', channel='vcan0')
561sock1 = CANSocket(bustype='socketcan', channel='vcan1')
562
563bridgeStarted = threading.Event()
564def bridgeWithRemovePackageInBothDirections():
565    global bridgeStarted
566    bSock0 = CANSocket(bustype='socketcan', channel='vcan0')
567    bSock1 = CANSocket(bustype='socketcan', channel='vcan1')
568    def pnrA(pkt):
569        if(pkt.identifier == 0x10020000):
570            pkt = False
571        else:
572            pkt = pkt
573        return pkt
574    def pnrB(pkt):
575        if (pkt.identifier == 0x10050000):
576            pkt = False
577        else:
578            pkt = pkt
579        return pkt
580    bSock0.timeout = 0.01
581    bSock1.timeout = 0.01
582    bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnrA, xfrm21=pnrB, timeout=0.5, started_callback=bridgeStarted.set, count=10)
583    bSock0.close()
584    bSock1.close()
585
586threadBridge = threading.Thread(target=bridgeWithRemovePackageInBothDirections)
587threadBridge.start()
588bridgeStarted.wait(timeout=1)
589
590sock0.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
591sock0.send(CAN(flags='extended', identifier=0x10020000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
592sock0.send(CAN(flags='extended', identifier=0x10000000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
593sock0.send(CAN(flags='extended', identifier=0x10030000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
594sock0.send(CAN(flags='extended', identifier=0x10040000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
595sock0.send(CAN(flags='extended', identifier=0x10000000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))
596sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06'))
597sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06'))
598sock1.send(CAN(flags='extended', identifier=0x10050000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06'))
599sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06'))
600
601packetsVCan0 = sock0.sniff(timeout=0.5, count=3)
602packetsVCan1 = sock1.sniff(timeout=0.5, count=5)
603
604assert len(packetsVCan0) == 3
605assert len(packetsVCan1) == 5
606
607threadBridge.join(timeout=3)
608assert not threadBridge.is_alive()
609
610sock0.close()
611sock1.close()
612
613= Delete vcan interfaces
614~ needs_root linux vcan_socket
615
616if 0 != call(["sudo", "ip" ,"link", "delete", "vcan0"]):
617        raise Exception("vcan0 could not be deleted")
618
619if 0 != call(["sudo", "ip" ,"link", "delete", "vcan1"]):
620        raise Exception("vcan1 could not be deleted")
621