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