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