diff --git a/scapy/contrib/cansocket_native.uts b/scapy/contrib/cansocket_native.uts index 3c422a52392..482c27f4745 100644 --- a/scapy/contrib/cansocket_native.uts +++ b/scapy/contrib/cansocket_native.uts @@ -59,6 +59,7 @@ thread = threading.Thread(target=sender) thread.start() rx = sock1.recv() rx == CAN(identifier=0x7ff,length=1,data=b'\x01') +thread.join() = CAN Socket send recv ~ needs_root linux @@ -73,6 +74,7 @@ thread = threading.Thread(target=sender) thread.start() rx = sock1.recv() rx == CAN(identifier=0x7ff,length=8,data=b'\x01\x02\x03\x04\x05\x06\x07\x08') +thread.join() = CAN Socket basecls test ~ needs_root linux @@ -89,6 +91,7 @@ thread.start() rx = sock1.recv() rx == Raw(bytes(CAN(identifier=0x7ff,length=8,data=b'\x01\x02\x03\x04\x05\x06\x07\x08'))) sock1.basecls = CAN +thread.join() + Advanced Socket Tests() = CAN Socket sr1 @@ -114,6 +117,7 @@ rx = sock1.sr1(tx) rx == tx sock1.close() +thread.join() = CAN Socket sr1 time check ~ needs_root linux @@ -142,7 +146,7 @@ rx = None rx = srcan(tx, "vcan0", timeout=1) rx = rx[0][0][1] tx == rx - +thread.join() = srcan check init time basecls ~ needs_root linux @@ -159,6 +163,7 @@ rx = None rx = srcan(tx, "vcan0", timeout=1, basecls=Raw) rx = rx[0][0][1] Raw(bytes(tx)) == rx +thread.join() = srcan check rx and tx ~ needs_root linux @@ -171,7 +176,6 @@ tx.sent_time > 0 and rx.time > 0 and tx.sent_time < rx.time sock1 = CANSocket(iface='vcan0', can_filters=[{'can_id': 0x200, 'can_mask': 0x7ff}]) def sender(): - sleep(0.1) sock2 = CANSocket(iface="vcan0") sock2.send(CAN(identifier=0x200, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock2.send(CAN(identifier=0x300, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) @@ -182,11 +186,11 @@ def sender(): sock2.close() thread = threading.Thread(target=sender) -thread.start() -packets = sock1.sniff(timeout=0.3) +packets = sock1.sniff(timeout=0.2, started_callback=thread.start) len(packets) == 3 sock1.close() +thread.join() = sniff with filtermask 0x700 ~ needs_root linux @@ -194,7 +198,6 @@ sock1.close() sock1 = CANSocket(iface='vcan0', can_filters=[{'can_id': 0x200, 'can_mask': 0x700}]) def sender(): - sleep(0.1) sock2 = CANSocket(iface="vcan0") sock2.send(CAN(identifier=0x212, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock2.send(CAN(identifier=0x300, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) @@ -205,11 +208,11 @@ def sender(): sock2.close() thread = threading.Thread(target=sender) -thread.start() -packets = sock1.sniff(timeout=0.3) +packets = sock1.sniff(timeout=0.2, started_callback=thread.start) len(packets) == 4 sock1.close() +thread.join() = sniff with filtermask 0x0ff ~ needs_root linux @@ -217,7 +220,6 @@ sock1.close() sock1 = CANSocket(iface='vcan0', can_filters=[{'can_id': 0x200, 'can_mask': 0x0ff}]) def sender(): - sleep(0.1) sock2 = CANSocket(iface="vcan0") sock2.send(CAN(identifier=0x200, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock2.send(CAN(identifier=0x301, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) @@ -228,11 +230,11 @@ def sender(): sock2.close() thread = threading.Thread(target=sender) -thread.start() -packets = sock1.sniff(timeout=0.3) +packets = sock1.sniff(timeout=0.2, started_callback=thread.start) len(packets) == 4 sock1.close() +thread.join() = sniff with multiple filters ~ needs_root linux @@ -240,7 +242,6 @@ sock1.close() sock1 = CANSocket(iface='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}]) def sender(): - sleep(0.1) sock2 = CANSocket(iface="vcan0") sock2.send(CAN(identifier=0x200, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock2.send(CAN(identifier=0x300, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) @@ -252,11 +253,11 @@ def sender(): sock2.close() thread = threading.Thread(target=sender) -thread.start() -packets = sock1.sniff(timeout=0.3) +packets = sock1.sniff(timeout=0.2, started_callback=thread.start) len(packets) == 4 sock1.close() +thread.join() = sniff with filtermask 0x7ff and inverse filter ~ needs_root linux @@ -264,7 +265,6 @@ sock1.close() sock1 = CANSocket(iface='vcan0', can_filters=[{'can_id': 0x200 | CAN_INV_FILTER, 'can_mask': 0x7ff}]) def sender(): - sleep(0.1) sock2 = CANSocket(iface="vcan0") sock2.send(CAN(identifier=0x200, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock2.send(CAN(identifier=0x200, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) @@ -275,11 +275,11 @@ def sender(): sock2.close() thread = threading.Thread(target=sender) -thread.start() -packets = sock1.sniff(timeout=0.3) +packets = sock1.sniff(timeout=0.2, started_callback=thread.start) len(packets) == 2 sock1.close() +thread.join() = sniff with filtermask 0x1FFFFFFF ~ needs_root linux @@ -287,7 +287,6 @@ sock1.close() sock1 = CANSocket(iface='vcan0', can_filters=[{'can_id': 0x10000000, 'can_mask': 0x1fffffff}]) def sender(): - sleep(0.1) sock2 = CANSocket(iface="vcan0") sock2.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock2.send(CAN(flags='extended', identifier=0x10020000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) @@ -298,11 +297,11 @@ def sender(): sock2.close() thread = threading.Thread(target=sender) -thread.start() -packets = sock1.sniff(timeout=0.3) +packets = sock1.sniff(timeout=0.2, started_callback=thread.start) len(packets) == 2 sock1.close() +thread.join() = sniff with filtermask 0x1FFFFFFF and inverse filter ~ needs_root linux @@ -311,8 +310,7 @@ sock1 = CANSocket(iface='vcan0', can_filters=[{'can_id': 0x10000000 | CAN_INV_FI if six.PY3: thread = threading.Thread(target=sender) - thread.start() - packets = sock1.sniff(timeout=0.3) + packets = sock1.sniff(timeout=0.2, started_callback=thread.start) len(packets) == 4 sock1.close() @@ -349,7 +347,6 @@ sock0 = CANSocket(iface='vcan0') sock1 = CANSocket(iface='vcan1') def senderVCan0(): - sleep(0.1) sock0.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock0.send(CAN(flags='extended', identifier=0x10020000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock0.send(CAN(flags='extended', identifier=0x10000000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) @@ -357,25 +354,30 @@ def senderVCan0(): sock0.send(CAN(flags='extended', identifier=0x10040000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock0.send(CAN(flags='extended', identifier=0x10000000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) +bridgeStarted = threading.Event() + def bridge(): + global bridgeStarted bSock0 = CANSocket(iface="vcan0") bSock1 = CANSocket(iface='vcan1') def pnr(pkt): return pkt - bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnr, xfrm21=pnr, timeout=0.5) + bridgeStarted.set() + bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnr, xfrm21=pnr, timeout=0.2) bSock0.close() bSock1.close() threadBridge = threading.Thread(target=bridge) threadBridge.start() threadSender = threading.Thread(target=senderVCan0) -threadSender.start() +bridgeStarted.wait() -packetsVCan0 = sock0.sniff(timeout=0.3) -packetsVCan1 = sock1.sniff(timeout=0.3) -len(packetsVCan0) == 0 +packetsVCan1 = sock1.sniff(timeout=0.2, started_callback=threadSender.start) len(packetsVCan1) == 6 +threadSender.join() +threadBridge.join() + sock1.close() sock0.close() @@ -386,36 +388,38 @@ sock0 = CANSocket(iface='vcan0') sock1 = CANSocket(iface='vcan1') def senderVCan1(): - sleep(0.1) sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06')) sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06')) sock1.send(CAN(flags='extended', identifier=0x80, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06')) sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06')) +bridgeStarted = threading.Event() + def bridge(): + global bridgeStarted bSock0 = CANSocket(iface="vcan0") bSock1 = CANSocket(iface='vcan1') def pnr(pkt): return pkt - bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnr, xfrm21=pnr, timeout=0.5) + bridgeStarted.set() + bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnr, xfrm21=pnr, timeout=0.2) bSock0.close() bSock1.close() -threadBridge.join() threadBridge = threading.Thread(target=bridge) threadBridge.start() -threadSender.join() threadSender = threading.Thread(target=senderVCan1) -threadSender.start() +bridgeStarted.wait() -packetsVCan0 = sock0.sniff(timeout=0.3) -packetsVCan1 = sock1.sniff(timeout=0.3) +packetsVCan0 = sock0.sniff(timeout=0.2, started_callback=threadSender.start) len(packetsVCan0) == 4 -len(packetsVCan1) == 0 sock0.close() sock1.close() +threadSender.join() +threadBridge.join() + =bridge and sniff setup vcan0 vcan1 package forwarding both directions ~ needs_root linux @@ -423,7 +427,6 @@ sock0 = CANSocket(iface='vcan0') sock1 = CANSocket(iface='vcan1') def senderBothVCans(): - sleep(0.2) sock0.send(CAN(flags='extended', identifier=0x25, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock0.send(CAN(flags='extended', identifier=0x20, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock0.send(CAN(flags='extended', identifier=0x25, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) @@ -435,30 +438,37 @@ def senderBothVCans(): sock1.send(CAN(flags='extended', identifier=0x80, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06')) sock1.send(CAN(flags='extended', identifier=0x40, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06')) +bridgeStarted = threading.Event() + def bridge(): + global bridgeStarted bSock0 = CANSocket(iface="vcan0") bSock1 = CANSocket(iface='vcan1') def pnr(pkt): return pkt - bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnr, xfrm21=pnr, timeout=0.5) + bridgeStarted.set() + bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnr, xfrm21=pnr, timeout=0.2) bSock0.close() bSock1.close() -threadBridge.join() threadBridge = threading.Thread(target=bridge) threadBridge.start() -threadSender.join() threadSender = threading.Thread(target=senderBothVCans) -threadSender.start() -packetsVCan0 = sock0.sniff(timeout=0.3) -packetsVCan1 = sock1.sniff(timeout=0.3) +bridgeStarted.wait() + +packetsVCan0 = sock0.sniff(timeout=0.1, count=6, started_callback=threadSender.start) +packetsVCan1 = sock1.sniff(timeout=0.1) + len(packetsVCan0) == 4 len(packetsVCan1) == 6 sock0.close() sock1.close() +threadSender.join() +threadBridge.join() + =bridge and sniff setup vcan1 package change ~ needs_root linux @@ -474,32 +484,36 @@ def senderVCan0(): sock0.send(CAN(flags='extended', identifier=0x10040000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock0.send(CAN(flags='extended', identifier=0x10000000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) +bridgeStarted = threading.Event() + def bridgeWithPackageChangeVCan0ToVCan1(): + global bridgeStarted bSock0 = CANSocket(iface="vcan0") bSock1 = CANSocket(iface="vcan1") def pnr(pkt): pkt.data = b'\x08\x07\x06\x05\x04\x03\x02\x01' pkt.identifier = 0x10010000 return pkt - bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnr, timeout=0.5) + bridgeStarted.set() + bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnr, timeout=0.2) bSock0.close() bSock1.close() -threadBridge.join() threadBridge = threading.Thread(target=bridgeWithPackageChangeVCan0ToVCan1) threadBridge.start() -threadSender.join() threadSender = threading.Thread(target=senderVCan0) -threadSender.start() -packetsVCan0 = sock0.sniff(timeout=0.3) -packetsVCan1 = sock1.sniff(timeout=0.3) -len(packetsVCan0) == 0 +bridgeStarted.wait() + +packetsVCan1 = sock1.sniff(timeout=0.2, started_callback=threadSender.start) len(packetsVCan1) == 6 sock0.close() sock1.close() +threadSender.join() +threadBridge.join() + =bridge and sniff setup vcan0 package change ~ needs_root linux @@ -513,32 +527,36 @@ def senderVCan1(): sock1.send(CAN(flags='extended', identifier=0x10050000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06')) sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06')) +bridgeStarted = threading.Event() + def bridgeWithPackageChangeVCan1ToVCan0(): + global bridgeStarted bSock0 = CANSocket(iface="vcan0") bSock1 = CANSocket(iface="vcan1") def pnr(pkt): pkt.data = b'\x08\x07\x06\x05\x04\x03\x02\x01' pkt.identifier = 0x10010000 return pkt - bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm21=pnr, timeout=0.5) + bridgeStarted.set() + bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm21=pnr, timeout=0.2) bSock0.close() bSock1.close() -threadBridge.join() threadBridge = threading.Thread(target=bridgeWithPackageChangeVCan1ToVCan0) threadBridge.start() -threadSender.join() threadSender = threading.Thread(target=senderVCan1) -threadSender.start() -packetsVCan0 = sock0.sniff(timeout=0.3) -packetsVCan1 = sock1.sniff(timeout=0.3) +bridgeStarted.wait() + +packetsVCan0 = sock0.sniff(timeout=0.2, started_callback=threadSender.start) len(packetsVCan0) == 4 -len(packetsVCan1) == 0 sock0.close() sock1.close() +threadSender.join() +threadBridge.join() + =bridge and sniff setup vcan0 and vcan1 package change in both directions ~ needs_root linux @@ -546,7 +564,6 @@ sock0 = CANSocket(iface='vcan0', can_filters=[{'can_id': 0x10010000, 'can_mask' sock1 = CANSocket(iface='vcan1', can_filters=[{'can_id': 0x10010000, 'can_mask': 0x1fffffff}]) def senderBothVCans(): - sleep(0.2) sock0.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock0.send(CAN(flags='extended', identifier=0x10020000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock0.send(CAN(flags='extended', identifier=0x10000000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) @@ -558,32 +575,39 @@ def senderBothVCans(): sock1.send(CAN(flags='extended', identifier=0x10050000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06')) sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06')) +bridgeStarted = threading.Event() + def bridgeWithPackageChangeBothDirections(): + global bridgeStarted bSock0 = CANSocket(iface="vcan0") bSock1 = CANSocket(iface="vcan1") def pnr(pkt): pkt.data = b'\x08\x07\x06\x05\x04\x03\x02\x01' pkt.identifier = 0x10010000 return pkt - bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnr, xfrm21=pnr, timeout=0.5) + bridgeStarted.set() + bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnr, xfrm21=pnr, timeout=0.2) bSock0.close() bSock1.close() -threadBridge.join() threadBridge = threading.Thread(target=bridgeWithPackageChangeBothDirections) threadBridge.start() -threadSender.join() threadSender = threading.Thread(target=senderBothVCans) + +bridgeStarted.wait() threadSender.start() -packetsVCan0 = sock0.sniff(timeout=0.3) -packetsVCan1 = sock1.sniff(timeout=0.3) +packetsVCan0 = sock0.sniff(timeout=0.1) +packetsVCan1 = sock1.sniff(timeout=0.1) len(packetsVCan0) == 4 len(packetsVCan1) == 6 sock0.close() sock1.close() +threadSender.join() +threadBridge.join() + =bridge and sniff setup vcan0 package remove ~ needs_root linux @@ -591,7 +615,6 @@ sock0 = CANSocket(iface='vcan0') sock1 = CANSocket(iface='vcan1') def senderVCan0(): - sleep(0.1) sock0.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock0.send(CAN(flags='extended', identifier=0x10020000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock0.send(CAN(flags='extended', identifier=0x10000000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) @@ -599,7 +622,10 @@ def senderVCan0(): sock0.send(CAN(flags='extended', identifier=0x10040000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock0.send(CAN(flags='extended', identifier=0x10000000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) +bridgeStarted = threading.Event() + def bridgeWithRemovePackageFromVCan0ToVCan1(): + global bridgeStarted bSock0 = CANSocket(iface="vcan0") bSock1 = CANSocket(iface="vcan1") def pnr(pkt): @@ -608,26 +634,28 @@ def bridgeWithRemovePackageFromVCan0ToVCan1(): else: pkt = pkt return pkt - bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnr, timeout=0.5) + bridgeStarted.set() + bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnr, timeout=0.2) bSock0.close() bSock1.close() -threadBridge.join() threadBridge = threading.Thread(target=bridgeWithRemovePackageFromVCan0ToVCan1) threadBridge.start() -threadSender.join() threadSender = threading.Thread(target=senderVCan0) -threadSender.start() -packetsVCan0 = sock0.sniff(timeout=0.3) -packetsVCan1 = sock1.sniff(timeout=0.3) +bridgeStarted.wait() -len(packetsVCan0) == 0 +threadSender.start() + +packetsVCan1 = sock1.sniff(timeout=0.2) len(packetsVCan1) == 5 sock0.close() sock1.close() +threadSender.join() +threadBridge.join() + =bridge and sniff setup vcan1 package remove ~ needs_root linux @@ -635,13 +663,15 @@ sock0 = CANSocket(iface='vcan0') sock1 = CANSocket(iface='vcan1') def senderVCan1(): - sleep(0.1) sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06')) sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06')) sock1.send(CAN(flags='extended', identifier=0x10050000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06')) sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06')) +bridgeStarted = threading.Event() + def bridgeWithRemovePackageFromVCan1ToVCan0(): + global bridgeStarted bSock0 = CANSocket(iface="vcan0") bSock1 = CANSocket(iface="vcan1") def pnr(pkt): @@ -650,26 +680,27 @@ def bridgeWithRemovePackageFromVCan1ToVCan0(): else: pkt = pkt return pkt - bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm21=pnr, timeout=0.5) + bridgeStarted.set() + bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm21=pnr, timeout=0.2) bSock0.close() bSock1.close() -threadBridge.join() threadBridge = threading.Thread(target=bridgeWithRemovePackageFromVCan1ToVCan0) threadBridge.start() -threadSender.join() threadSender = threading.Thread(target=senderVCan1) -threadSender.start() +bridgeStarted.wait() -packetsVCan0 = sock0.sniff(timeout=0.3) -packetsVCan1 = sock1.sniff(timeout=0.3) +threadSender.start() +packetsVCan0 = sock0.sniff(timeout=0.2) len(packetsVCan0) == 3 -len(packetsVCan1) == 0 sock0.close() sock1.close() +threadSender.join() +threadBridge.join() + =bridge and sniff setup vcan0 and vcan1 package remove both directions ~ needs_root linux @@ -677,7 +708,6 @@ sock0 = CANSocket(iface="vcan0") sock1 = CANSocket(iface="vcan1") def senderBothVCans(): - sleep(0.2) sock0.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock0.send(CAN(flags='extended', identifier=0x10020000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock0.send(CAN(flags='extended', identifier=0x10000000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) @@ -689,7 +719,10 @@ def senderBothVCans(): sock1.send(CAN(flags='extended', identifier=0x10050000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06')) sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06')) +bridgeStarted = threading.Event() + def bridgeWithRemovePackageInBothDirections(): + global bridgeStarted bSock0 = CANSocket(iface="vcan0") bSock1 = CANSocket(iface="vcan1") def pnrA(pkt): @@ -704,22 +737,25 @@ def bridgeWithRemovePackageInBothDirections(): else: pkt = pkt return pkt - bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnrA, xfrm21=pnrB, timeout=0.5) + bridgeStarted.set() + bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnrA, xfrm21=pnrB, timeout=0.2) bSock0.close() bSock1.close() -threadBridge.join() threadBridge = threading.Thread(target=bridgeWithRemovePackageInBothDirections) threadBridge.start() -threadSender.join() threadSender = threading.Thread(target=senderBothVCans) -threadSender.start() -packetsVCan0 = sock0.sniff(timeout=0.3) -packetsVCan1 = sock1.sniff(timeout=0.3) +bridgeStarted.wait() + +packetsVCan0 = sock0.sniff(timeout=0.1, started_callback=threadSender.start) +packetsVCan1 = sock1.sniff(timeout=0.1) len(packetsVCan0) == 3 len(packetsVCan1) == 5 sock0.close() -sock1.close() \ No newline at end of file +sock1.close() + +threadSender.join() +threadBridge.join() \ No newline at end of file diff --git a/scapy/contrib/cansocket_python_can.uts b/scapy/contrib/cansocket_python_can.uts index 88f403e2995..8ff1a472816 100644 --- a/scapy/contrib/cansocket_python_can.uts +++ b/scapy/contrib/cansocket_python_can.uts @@ -59,7 +59,6 @@ sock1 = CANSocket(iface=can.interface.Bus(bustype='socketcan', channel='vcan0', ~ linux def sender(): - sleep(0.1) sock2 = CANSocket(iface=can.interface.Bus(bustype='socketcan', channel='vcan0', bitrate=250000)) sock2.send(CAN(identifier=0x7ff,length=1,data=b'\x01')) sock2.close() @@ -76,7 +75,6 @@ rx == CAN(identifier=0x7ff,length=1,data=b'\x01') ~ needs_root linux def sender(): - sleep(0.1) sock2 = CANSocket(iface=can.interface.Bus(bustype='socketcan', channel='vcan0', bitrate=250000)) sock2.send(CAN(identifier=0x7ff,length=8,data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock2.close() @@ -93,7 +91,6 @@ sock1.basecls = CAN ~ linux def sender(): - sleep(0.1) sock2 = CANSocket(iface=can.interface.Bus(bustype='socketcan', channel='vcan0', bitrate=250000)) sock2.send(CAN(identifier=0x7ff,length=8,data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock2.close() @@ -113,7 +110,6 @@ sock1.close() sock1 = CANSocket(iface=can.interface.Bus(bustype='socketcan', channel='vcan0', bitrate=250000, can_filters=[{'can_id': 0x200, 'can_mask': 0x7ff}])) def sender(): - sleep(0.1) sock2 = CANSocket(iface=can.interface.Bus(bustype='socketcan', channel='vcan0', bitrate=250000)) sock2.send(CAN(identifier=0x200, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock2.send(CAN(identifier=0x300, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) @@ -124,9 +120,8 @@ def sender(): sock2.close() thread = threading.Thread(target=sender) -thread.start() -packets = sock1.sniff(timeout=0.3) +packets = sock1.sniff(timeout=0.1, started_callback=thread.start) len(packets) == 3 sock1.close() @@ -138,7 +133,6 @@ sock1.close() sock1 = CANSocket(iface=can.interface.Bus(bustype='socketcan', channel='vcan0', bitrate=250000, can_filters=[{'can_id': 0x200, 'can_mask': 0x700}])) def sender(): - sleep(0.1) sock2 = CANSocket(iface=can.interface.Bus(bustype='socketcan', channel='vcan0', bitrate=250000)) sock2.send(CAN(identifier=0x212, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock2.send(CAN(identifier=0x300, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) @@ -149,9 +143,8 @@ def sender(): sock2.close() thread = threading.Thread(target=sender) -thread.start() -packets = sock1.sniff(timeout=0.3) +packets = sock1.sniff(timeout=0.1, started_callback=thread.start) len(packets) == 4 sock1.close() @@ -163,7 +156,6 @@ sock1.close() sock1 = CANSocket(iface=can.interface.Bus(bustype='socketcan', channel='vcan0', bitrate=250000, can_filters=[{'can_id': 0x200, 'can_mask': 0xff}])) def sender(): - sleep(0.1) sock2 = CANSocket(iface=can.interface.Bus(bustype='socketcan', channel='vcan0', bitrate=250000)) sock2.send(CAN(identifier=0x200, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock2.send(CAN(identifier=0x301, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) @@ -174,9 +166,8 @@ def sender(): sock2.close() thread = threading.Thread(target=sender) -thread.start() -packets = sock1.sniff(timeout=0.3) +packets = sock1.sniff(timeout=0.1, started_callback=thread.start) len(packets) == 4 sock1.close() @@ -192,7 +183,6 @@ sock1 = CANSocket(iface=can.interface.Bus(bustype='socketcan', channel='vcan0', {'can_id': 0x7ff, 'can_mask': 0x7ff}])) def sender(): - sleep(0.1) sock2 = CANSocket(iface=can.interface.Bus(bustype='socketcan', channel='vcan0', bitrate=250000)) sock2.send(CAN(identifier=0x200, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock2.send(CAN(identifier=0x300, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) @@ -204,9 +194,8 @@ def sender(): sock2.close() thread = threading.Thread(target=sender) -thread.start() -packets = sock1.sniff(timeout=0.3) +packets = sock1.sniff(timeout=0.1, started_callback=thread.start) len(packets) == 4 sock1.close() @@ -219,7 +208,6 @@ sock1 = CANSocket(iface=can.interface.Bus(bustype='socketcan', channel='vcan0', can_filters=[{'can_id': 0x200 | CAN_INV_FILTER, 'can_mask': 0x7ff}])) def sender(): - sleep(0.1) sock2 = CANSocket(iface=can.interface.Bus(bustype='socketcan', channel='vcan0', bitrate=250000)) sock2.send(CAN(identifier=0x200, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock2.send(CAN(identifier=0x200, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) @@ -230,9 +218,8 @@ def sender(): sock2.close() thread = threading.Thread(target=sender) -thread.start() -packets = sock1.sniff(timeout=0.3) +packets = sock1.sniff(timeout=0.1, started_callback=thread.start) len(packets) == 2 sock1.close() @@ -245,7 +232,6 @@ sock1 = CANSocket(iface=can.interface.Bus(bustype='socketcan', channel='vcan0', can_filters=[{'can_id': 0x10000000, 'can_mask': 0x1fffffff}])) def sender(): - sleep(0.1) sock2 = CANSocket(iface=can.interface.Bus(bustype='socketcan', channel='vcan0', bitrate=250000)) sock2.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock2.send(CAN(flags='extended', identifier=0x10020000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) @@ -256,9 +242,8 @@ def sender(): sock2.close() thread = threading.Thread(target=sender) -thread.start() -packets = sock1.sniff(timeout=0.3) +packets = sock1.sniff(timeout=0.1, started_callback=thread.start) len(packets) == 2 sock1.close() @@ -271,7 +256,6 @@ sock1 = CANSocket(iface=can.interface.Bus(bustype='socketcan', channel='vcan0', can_filters=[{'can_id': 0x10000000 | CAN_INV_FILTER, 'can_mask': 0x1fffffff}])) def sender(): - sleep(0.2) sock2 = CANSocket(iface=can.interface.Bus(bustype='socketcan', channel='vcan0', bitrate=250000)) sock2.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock2.send(CAN(flags='extended', identifier=0x10020000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) @@ -282,9 +266,8 @@ def sender(): sock2.close() thread = threading.Thread(target=sender) -thread.start() -packets = sock1.sniff(timeout=0.3) +packets = sock1.sniff(timeout=0.1, started_callback=thread.start) len(packets) == 4 sock1.close() @@ -334,7 +317,6 @@ sock0 = CANSocket(iface=can.interface.Bus(bustype='socketcan', channel='vcan0', sock1 = CANSocket(iface=can.interface.Bus(bustype='socketcan', channel='vcan1', bitrate=250000)) def senderVCan0(): - sleep(0.1) sock0.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock0.send(CAN(flags='extended', identifier=0x10020000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock0.send(CAN(flags='extended', identifier=0x10000000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) @@ -342,7 +324,9 @@ def senderVCan0(): sock0.send(CAN(flags='extended', identifier=0x10040000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock0.send(CAN(flags='extended', identifier=0x10000000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) +bridgeStarted = threading.Event() def bridge(): + global bridgeStarted bSock0 = CANSocket( iface=can.interface.Bus(bustype='socketcan', channel='vcan0', bitrate=250000)) @@ -351,23 +335,26 @@ def bridge(): bitrate=250000)) def pnr(pkt): return pkt - bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnr, xfrm21=pnr, timeout=0.5) + bSock0.timeout = 0.01 + bSock1.timeout = 0.01 + bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnr, xfrm21=pnr, timeout=0.5, started_callback=bridgeStarted.set) bSock0.close() bSock1.close() threadBridge = threading.Thread(target=bridge) threadBridge.start() threadSender = threading.Thread(target=senderVCan0) -threadSender.start() +bridgeStarted.wait() -packetsVCan0 = sock0.sniff(timeout=0.3) -packetsVCan1 = sock1.sniff(timeout=0.3) -len(packetsVCan0) == 0 +packetsVCan1 = sock1.sniff(timeout=0.3, started_callback=threadSender.start) len(packetsVCan1) == 6 sock1.close() sock0.close() +threadBridge.join() +threadSender.join() + = bridge and sniff setup vcan0 package forwarding ~ needs_root linux @@ -375,13 +362,14 @@ sock0 = CANSocket(iface=can.interface.Bus(bustype='socketcan', channel='vcan0', sock1 = CANSocket(iface=can.interface.Bus(bustype='socketcan', channel='vcan1', bitrate=250000)) def senderVCan1(): - sleep(0.1) sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06')) sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06')) sock1.send(CAN(flags='extended', identifier=0x80, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06')) sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06')) +bridgeStarted = threading.Event() def bridge(): + global bridgeStarted bSock0 = CANSocket( iface=can.interface.Bus(bustype='socketcan', channel='vcan0', bitrate=250000)) @@ -390,25 +378,26 @@ def bridge(): bitrate=250000)) def pnr(pkt): return pkt - bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnr, xfrm21=pnr, timeout=0.5) + bSock0.timeout = 0.01 + bSock1.timeout = 0.01 + bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnr, xfrm21=pnr, timeout=0.5, started_callback=bridgeStarted.set) bSock0.close() bSock1.close() -threadBridge.join() threadBridge = threading.Thread(target=bridge) threadBridge.start() -threadSender.join() threadSender = threading.Thread(target=senderVCan1) -threadSender.start() +bridgeStarted.wait() -packetsVCan0 = sock0.sniff(timeout=0.3) -packetsVCan1 = sock1.sniff(timeout=0.3) +packetsVCan0 = sock0.sniff(timeout=0.3, started_callback=threadSender.start) len(packetsVCan0) == 4 -len(packetsVCan1) == 0 sock0.close() sock1.close() +threadBridge.join() +threadSender.join() + =bridge and sniff setup vcan0 vcan1 package forwarding both directions ~ needs_root linux @@ -421,7 +410,6 @@ sock1 = CANSocket( def senderBothVCans(): - sleep(0.2) sock0.send(CAN(flags='extended', identifier=0x25, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock0.send(CAN(flags='extended', identifier=0x20, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock0.send(CAN(flags='extended', identifier=0x25, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) @@ -433,7 +421,9 @@ def senderBothVCans(): sock1.send(CAN(flags='extended', identifier=0x80, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06')) sock1.send(CAN(flags='extended', identifier=0x40, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06')) +bridgeStarted = threading.Event() def bridge(): + global bridgeStarted bSock0 = CANSocket( iface=can.interface.Bus(bustype='socketcan', channel='vcan0', bitrate=250000)) @@ -442,18 +432,18 @@ def bridge(): bitrate=250000)) def pnr(pkt): return pkt - bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnr, xfrm21=pnr, timeout=0.5) + bSock0.timeout = 0.01 + bSock1.timeout = 0.01 + bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnr, xfrm21=pnr, timeout=0.5, started_callback=bridgeStarted.set) bSock0.close() bSock1.close() -threadBridge.join() threadBridge = threading.Thread(target=bridge) threadBridge.start() -threadSender.join() threadSender = threading.Thread(target=senderBothVCans) -threadSender.start() +bridgeStarted.wait() -packetsVCan0 = sock0.sniff(timeout=0.3) +packetsVCan0 = sock0.sniff(timeout=0.3, started_callback=threadSender.start) packetsVCan1 = sock1.sniff(timeout=0.3) len(packetsVCan0) == 4 len(packetsVCan1) == 6 @@ -461,6 +451,9 @@ len(packetsVCan1) == 6 sock0.close() sock1.close() +threadBridge.join() +threadSender.join() + =bridge and sniff setup vcan1 package change ~ needs_root linux @@ -472,7 +465,6 @@ sock1 = CANSocket( bitrate=250000, can_filters=[{'can_id': 0x10010000, 'can_mask': 0x1fffffff}])) def senderVCan0(): - sleep(0.1) sock0.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock0.send(CAN(flags='extended', identifier=0x10020000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock0.send(CAN(flags='extended', identifier=0x10000000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) @@ -480,7 +472,9 @@ def senderVCan0(): sock0.send(CAN(flags='extended', identifier=0x10040000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock0.send(CAN(flags='extended', identifier=0x10000000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) +bridgeStarted = threading.Event() def bridgeWithPackageChangeVCan0ToVCan1(): + global bridgeStarted bSock0 = CANSocket( iface=can.interface.Bus(bustype='socketcan', channel='vcan0', bitrate=250000)) @@ -491,25 +485,26 @@ def bridgeWithPackageChangeVCan0ToVCan1(): pkt.data = b'\x08\x07\x06\x05\x04\x03\x02\x01' pkt.identifier = 0x10010000 return pkt - bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnr, timeout=0.5) + bSock0.timeout = 0.01 + bSock1.timeout = 0.01 + bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnr, timeout=0.5, started_callback=bridgeStarted.set) bSock0.close() bSock1.close() -threadBridge.join() threadBridge = threading.Thread(target=bridgeWithPackageChangeVCan0ToVCan1) threadBridge.start() -threadSender.join() threadSender = threading.Thread(target=senderVCan0) -threadSender.start() +bridgeStarted.wait() -packetsVCan0 = sock0.sniff(timeout=0.3) -packetsVCan1 = sock1.sniff(timeout=0.3) -len(packetsVCan0) == 0 +packetsVCan1 = sock1.sniff(timeout=0.3, started_callback=threadSender.start) len(packetsVCan1) == 6 sock0.close() sock1.close() +threadBridge.join() +threadSender.join() + =bridge and sniff setup vcan0 package change ~ needs_root linux @@ -521,13 +516,14 @@ sock0 = CANSocket( bitrate=250000, can_filters=[{'can_id': 0x10010000, 'can_mask': 0x1fffffff}])) def senderVCan1(): - sleep(0.1) sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06')) sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06')) sock1.send(CAN(flags='extended', identifier=0x10050000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06')) sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06')) +bridgeStarted = threading.Event() def bridgeWithPackageChangeVCan1ToVCan0(): + global bridgeStarted bSock0 = CANSocket( iface=can.interface.Bus(bustype='socketcan', channel='vcan0', bitrate=250000)) @@ -538,25 +534,26 @@ def bridgeWithPackageChangeVCan1ToVCan0(): pkt.data = b'\x08\x07\x06\x05\x04\x03\x02\x01' pkt.identifier = 0x10010000 return pkt - bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm21=pnr, timeout=0.5) + bSock0.timeout = 0.01 + bSock1.timeout = 0.01 + bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm21=pnr, timeout=0.5, started_callback=bridgeStarted.set) bSock0.close() bSock1.close() -threadBridge.join() threadBridge = threading.Thread(target=bridgeWithPackageChangeVCan1ToVCan0) threadBridge.start() -threadSender.join() threadSender = threading.Thread(target=senderVCan1) -threadSender.start() +bridgeStarted.wait() -packetsVCan0 = sock0.sniff(timeout=0.3) -packetsVCan1 = sock1.sniff(timeout=0.3) +packetsVCan0 = sock0.sniff(timeout=0.3, started_callback=threadSender.start) len(packetsVCan0) == 4 -len(packetsVCan1) == 0 sock0.close() sock1.close() +threadBridge.join() +threadSender.join() + =bridge and sniff setup vcan0 and vcan1 package change in both directions ~ needs_root linux @@ -568,7 +565,6 @@ sock1 = CANSocket( bitrate=250000, can_filters=[{'can_id': 0x10010000, 'can_mask': 0x1fffffff}])) def senderBothVCans(): - sleep(0.2) sock0.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock0.send(CAN(flags='extended', identifier=0x10020000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock0.send(CAN(flags='extended', identifier=0x10000000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) @@ -580,7 +576,9 @@ def senderBothVCans(): sock1.send(CAN(flags='extended', identifier=0x10050000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06')) sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06')) +bridgeStarted = threading.Event() def bridgeWithPackageChangeBothDirections(): + global bridgeStarted bSock0 = CANSocket( iface=can.interface.Bus(bustype='socketcan', channel='vcan0', bitrate=250000)) @@ -591,18 +589,18 @@ def bridgeWithPackageChangeBothDirections(): pkt.data = b'\x08\x07\x06\x05\x04\x03\x02\x01' pkt.identifier = 0x10010000 return pkt - bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnr, xfrm21=pnr, timeout=0.5) + bSock0.timeout = 0.01 + bSock1.timeout = 0.01 + bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnr, xfrm21=pnr, timeout=0.5, started_callback=bridgeStarted.set) bSock0.close() bSock1.close() -threadBridge.join() threadBridge = threading.Thread(target=bridgeWithPackageChangeBothDirections) threadBridge.start() -threadSender.join() threadSender = threading.Thread(target=senderBothVCans) -threadSender.start() +bridgeStarted.wait() -packetsVCan0 = sock0.sniff(timeout=0.3) +packetsVCan0 = sock0.sniff(timeout=0.3, started_callback=threadSender.start) packetsVCan1 = sock1.sniff(timeout=0.3) len(packetsVCan0) == 4 len(packetsVCan1) == 6 @@ -610,6 +608,9 @@ len(packetsVCan1) == 6 sock0.close() sock1.close() +threadBridge.join() +threadSender.join() + =bridge and sniff setup vcan0 package remove ~ needs_root linux @@ -621,7 +622,6 @@ sock1 = CANSocket( bitrate=250000)) def senderVCan0(): - sleep(0.1) sock0.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock0.send(CAN(flags='extended', identifier=0x10020000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock0.send(CAN(flags='extended', identifier=0x10000000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) @@ -629,7 +629,9 @@ def senderVCan0(): sock0.send(CAN(flags='extended', identifier=0x10040000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock0.send(CAN(flags='extended', identifier=0x10000000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) +bridgeStarted = threading.Event() def bridgeWithRemovePackageFromVCan0ToVCan1(): + global bridgeStarted bSock0 = CANSocket( iface=can.interface.Bus(bustype='socketcan', channel='vcan0', bitrate=250000)) @@ -642,26 +644,27 @@ def bridgeWithRemovePackageFromVCan0ToVCan1(): else: pkt = pkt return pkt - bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnr, timeout=0.5) + bSock0.timeout = 0.01 + bSock1.timeout = 0.01 + bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnr, timeout=0.5, started_callback=bridgeStarted.set) bSock0.close() bSock1.close() -threadBridge.join() threadBridge = threading.Thread(target=bridgeWithRemovePackageFromVCan0ToVCan1) threadBridge.start() -threadSender.join() threadSender = threading.Thread(target=senderVCan0) -threadSender.start() +bridgeStarted.wait() -packetsVCan0 = sock0.sniff(timeout=0.3) -packetsVCan1 = sock1.sniff(timeout=0.3) +packetsVCan1 = sock1.sniff(timeout=0.3, started_callback=threadSender.start) -len(packetsVCan0) == 0 len(packetsVCan1) == 5 sock0.close() sock1.close() +threadBridge.join() +threadSender.join() + =bridge and sniff setup vcan1 package remove ~ needs_root linux @@ -673,13 +676,14 @@ sock1 = CANSocket( bitrate=250000)) def senderVCan1(): - sleep(0.1) sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06')) sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06')) sock1.send(CAN(flags='extended', identifier=0x10050000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06')) sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06')) +bridgeStarted = threading.Event() def bridgeWithRemovePackageFromVCan1ToVCan0(): + global bridgeStarted bSock0 = CANSocket( iface=can.interface.Bus(bustype='socketcan', channel='vcan0', bitrate=250000)) @@ -692,26 +696,28 @@ def bridgeWithRemovePackageFromVCan1ToVCan0(): else: pkt = pkt return pkt - bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm21=pnr, timeout=0.5) + bSock0.timeout = 0.01 + bSock1.timeout = 0.01 + bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm21=pnr, timeout=0.5, started_callback=bridgeStarted.set) bSock0.close() bSock1.close() -threadBridge.join() threadBridge = threading.Thread(target=bridgeWithRemovePackageFromVCan1ToVCan0) threadBridge.start() -threadSender.join() threadSender = threading.Thread(target=senderVCan1) -threadSender.start() +bridgeStarted.wait() -packetsVCan0 = sock0.sniff(timeout=0.3) -packetsVCan1 = sock1.sniff(timeout=0.3) +packetsVCan0 = sock0.sniff(timeout=0.3, started_callback=threadSender.start) len(packetsVCan0) == 3 -len(packetsVCan1) == 0 sock0.close() sock1.close() +threadBridge.join() +threadSender.join() + + =bridge and sniff setup vcan0 and vcan1 package remove both directions ~ needs_root linux @@ -723,7 +729,6 @@ sock1 = CANSocket( bitrate=250000)) def senderBothVCans(): - sleep(0.2) sock0.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock0.send(CAN(flags='extended', identifier=0x10020000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) sock0.send(CAN(flags='extended', identifier=0x10000000, length=8, data=b'\x01\x02\x03\x04\x05\x06\x07\x08')) @@ -735,7 +740,9 @@ def senderBothVCans(): sock1.send(CAN(flags='extended', identifier=0x10050000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06')) sock1.send(CAN(flags='extended', identifier=0x10010000, length=8, data=b'\x01\x02\x03\x04\x05\x04\x05\x06')) +bridgeStarted = threading.Event() def bridgeWithRemovePackageInBothDirections(): + global bridgeStarted bSock0 = CANSocket( iface=can.interface.Bus(bustype='socketcan', channel='vcan0', bitrate=250000)) @@ -754,18 +761,18 @@ def bridgeWithRemovePackageInBothDirections(): else: pkt = pkt return pkt - bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnrA, xfrm21=pnrB, timeout=0.5) + bSock0.timeout = 0.01 + bSock1.timeout = 0.01 + bridge_and_sniff(if1=bSock0, if2=bSock1, xfrm12=pnrA, xfrm21=pnrB, timeout=0.5, started_callback=bridgeStarted.set) bSock0.close() bSock1.close() -threadBridge.join() threadBridge = threading.Thread(target=bridgeWithRemovePackageInBothDirections) threadBridge.start() -threadSender.join() threadSender = threading.Thread(target=senderBothVCans) -threadSender.start() +bridgeStarted.wait() -packetsVCan0 = sock0.sniff(timeout=0.3) +packetsVCan0 = sock0.sniff(timeout=0.3, started_callback=threadSender.start) packetsVCan1 = sock1.sniff(timeout=0.3) len(packetsVCan0) == 3 diff --git a/scapy/contrib/isotp.uts b/scapy/contrib/isotp.uts index 8696a2c7cd3..53d2502ce59 100644 --- a/scapy/contrib/isotp.uts +++ b/scapy/contrib/isotp.uts @@ -108,8 +108,8 @@ else: if "python_can" in CANSocket.__module__: import can as python_can new_can_socket = lambda iface: CANSocket(iface=python_can.interface.Bus(bustype='socketcan', channel=iface, bitrate=250000)) - new_can_socket0 = lambda: CANSocket(iface=python_can.interface.Bus(bustype='socketcan', channel=iface0, bitrate=250000)) - new_can_socket1 = lambda: CANSocket(iface=python_can.interface.Bus(bustype='socketcan', channel=iface1, bitrate=250000)) + new_can_socket0 = lambda: CANSocket(iface=python_can.interface.Bus(bustype='socketcan', channel=iface0, bitrate=250000), timeout=0.01) + new_can_socket1 = lambda: CANSocket(iface=python_can.interface.Bus(bustype='socketcan', channel=iface1, bitrate=250000), timeout=0.01) else: new_can_socket = lambda iface: CANSocket(iface) new_can_socket0 = lambda: CANSocket(iface0) @@ -128,7 +128,7 @@ print("CAN sockets should work now") # Verify that a CAN socket can be created and closed ~ conf linux needs_root -s = new_can_socket0() +s = new_can_socket(iface0) s.close() @@ -643,7 +643,7 @@ def sender(args=None): global succ succ = True -s = new_can_socket0() +s = new_can_socket(iface0) thread = threading.Thread(target=sender) sniffed = ISOTPSniffer.sniff(s, timeout=1, count=1, prn=lambda x: x.show2(), started_callback=thread.start) sniffed[0]['ISOTP'].data == bytearray(range(1, 0x29)) @@ -843,8 +843,8 @@ with ISOTPSocket(cans, sid=0x641, did=0x241) as s: = Verify that packets are not lost if they arrive before the sniff() is called ~ linux needs_root -ss = new_can_socket0() -sr = new_can_socket0() +ss = new_can_socket(iface0) +sr = new_can_socket(iface0) print("socket open") ss.send(CAN(identifier=0x111, data=b"\x01\x23\x45\x67")) time.sleep(0.02) @@ -860,8 +860,8 @@ del sr = Send single frame ISOTP message, using begin_send ~ linux needs_root -cans = new_can_socket0() -with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241) as s: +cans = new_can_socket(iface0) +with ISOTPSocket(new_can_socket(iface0), sid=0x641, did=0x241) as s: s.begin_send(ISOTP(data=dhex("01 02 03 04 05"))) can = cans.recv() assert(can.identifier == 0x641) @@ -870,8 +870,8 @@ with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241) as s: = Send many single frame ISOTP messages, using begin_send ~ linux needs_root -cans = new_can_socket0() -with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241) as s: +cans = new_can_socket(iface0) +with ISOTPSocket(new_can_socket(iface0), sid=0x641, did=0x241) as s: for i in range(100): data = dhex("01 02 03 04 05") + struct.pack("B", i) expected = struct.pack("B", len(data)) + data @@ -884,8 +884,8 @@ with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241) as s: = Send two-frame ISOTP message, using begin_send ~ linux needs_root -with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241) as s: - cans = new_can_socket0() +with ISOTPSocket(new_can_socket(iface0), sid=0x641, did=0x241) as s: + cans = new_can_socket(iface0) s.begin_send(ISOTP(data=dhex("01 02 03 04 05 06 07 08"))) can = cans.recv() assert can.identifier == 0x641 @@ -899,8 +899,8 @@ with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241) as s: = Send single frame ISOTP message ~ linux needs_root -cans = new_can_socket0() -with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241) as s: +cans = new_can_socket(iface0) +with ISOTPSocket(new_can_socket(iface0), sid=0x641, did=0x241) as s: s.send(ISOTP(data=dhex("01 02 03 04 05"))) can = cans.recv() assert(can.identifier == 0x641) @@ -910,17 +910,17 @@ with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241) as s: = Send two-frame ISOTP message ~ linux needs_root -cans = new_can_socket0() +cans = new_can_socket(iface0) acker_ready = threading.Event() def acker(): - acks = new_can_socket0() + acks = new_can_socket(iface0) acker_ready.set() can = acks.recv() acks.send(CAN(identifier = 0x241, data=dhex("30 00 00"))) Thread(target=acker).start() acker_ready.wait() -with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241) as s: +with ISOTPSocket(new_can_socket(iface0), sid=0x641, did=0x241) as s: s.send(ISOTP(data=dhex("01 02 03 04 05 06 07 08"))) can = cans.recv() assert(can.identifier == 0x641) @@ -936,8 +936,8 @@ with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241) as s: = Receive a single frame ISOTP message ~ linux needs_root -with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241) as s: - cans = new_can_socket0() +with ISOTPSocket(new_can_socket(iface0), sid=0x641, did=0x241) as s: + cans = new_can_socket(iface0) cans.send(CAN(identifier = 0x241, data = dhex("05 01 02 03 04 05"))) isotp = s.recv() assert(isotp.data == dhex("01 02 03 04 05")) @@ -950,8 +950,8 @@ with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241) as s: = Receive a single frame ISOTP message, with extended addressing ~ linux needs_root -with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241, extended_addr=0xc0, extended_rx_addr=0xea) as s: - cans = new_can_socket0() +with ISOTPSocket(new_can_socket(iface0), sid=0x641, did=0x241, extended_addr=0xc0, extended_rx_addr=0xea) as s: + cans = new_can_socket(iface0) cans.send(CAN(identifier = 0x241, data = dhex("EA 05 01 02 03 04 05"))) isotp = s.recv() assert(isotp.data == dhex("01 02 03 04 05")) @@ -964,8 +964,8 @@ with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241, extended_addr=0xc0, ex = Receive a two-frame ISOTP message ~ linux needs_root -with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241) as s: - cans = new_can_socket0() +with ISOTPSocket(new_can_socket(iface0), sid=0x641, did=0x241) as s: + cans = new_can_socket(iface0) cans.send(CAN(identifier = 0x241, data = dhex("10 0B 01 02 03 04 05 06"))) cans.send(CAN(identifier = 0x241, data = dhex("21 07 08 09 10 11"))) isotp = s.recv() @@ -975,8 +975,8 @@ with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241) as s: = Check what happens when a CAN frame with wrong identifier gets received ~ linux needs_root -with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241) as s: - cans = new_can_socket0() +with ISOTPSocket(new_can_socket(iface0), sid=0x641, did=0x241) as s: + cans = new_can_socket(iface0) cans.send(CAN(identifier = 0x141, data = dhex("05 01 02 03 04 05"))) assert(s.ins.rx_queue.empty()) @@ -987,8 +987,8 @@ with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241) as s: = Check if not sending the last CF will make the socket timeout ~ linux needs_root -with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241) as s: - cans = new_can_socket0() +with ISOTPSocket(new_can_socket(iface0), sid=0x641, did=0x241) as s: + cans = new_can_socket(iface0) cans.send(CAN(identifier = 0x241, data = dhex("10 11 01 02 03 04 05 06"))) cans.send(CAN(identifier = 0x241, data = dhex("21 07 08 09 0A 0B 0C 0D"))) isotp = s.sniff(timeout=1) @@ -1000,8 +1000,8 @@ assert(len(isotp) == 0) = Check if not sending the first CF will make the socket timeout ~ linux needs_root -with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241) as s: - cans = new_can_socket0() +with ISOTPSocket(new_can_socket(iface0), sid=0x641, did=0x241) as s: + cans = new_can_socket(iface0) cans.send(CAN(identifier = 0x241, data = dhex("10 11 01 02 03 04 05 06"))) isotp = s.sniff(timeout=1) @@ -1014,7 +1014,7 @@ assert(len(isotp) == 0) exception = None isotp = ISOTP(data=dhex("01 02 03 04 05 06 07 08 09 0A")) -with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241) as s: +with ISOTPSocket(new_can_socket(iface0), sid=0x641, did=0x241) as s: try: s.send(isotp) assert(False) @@ -1034,7 +1034,7 @@ test_sem = threading.Semaphore(0) evt = threading.Event() def acker(): - cans = new_can_socket0() + cans = new_can_socket(iface0) evt.set() can = cans.recv() cans.send(CAN(identifier = 0x241, data=dhex("30 04 00"))) @@ -1043,7 +1043,7 @@ thread = Thread(target=acker) thread.start() evt.wait() -with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241) as s: +with ISOTPSocket(new_can_socket(iface0), sid=0x641, did=0x241) as s: try: s.send(isotp) except Scapy_Exception as ex: @@ -1065,7 +1065,7 @@ test_sem = threading.Semaphore(0) evt = threading.Event() def acker(): - cans = new_can_socket0() + cans = new_can_socket(iface0) evt.set() can = cans.recv() cans.send(CAN(identifier = 0x241, data=dhex("32 00 00"))) @@ -1074,7 +1074,7 @@ thread = Thread(target=acker) thread.start() evt.wait() -with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241) as s: +with ISOTPSocket(new_can_socket(iface0), sid=0x641, did=0x241) as s: try: s.send(isotp) except Scapy_Exception as ex: @@ -1090,7 +1090,7 @@ assert(str(exception) == "Overflow happened at the receiver side") = Close the Socket ~ linux needs_root -with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241) as s: +with ISOTPSocket(new_can_socket(iface0), sid=0x641, did=0x241) as s: s.close() + More complex operations @@ -1104,14 +1104,14 @@ rx2 = None def sender(): global evt, rx2, msg - with ISOTPSoftSocket(new_can_socket0(), 0x123, 0x321) as sock: + with ISOTPSoftSocket(new_can_socket(iface0), 0x123, 0x321) as sock: evt.wait() rx2 = sock.sr1(msg, timeout=1, verbose=True) txThread = threading.Thread(target=sender) txThread.start() -with ISOTPSoftSocket(new_can_socket0(), 0x321, 0x123) as sock: +with ISOTPSoftSocket(new_can_socket(iface0), 0x321, 0x123) as sock: evt.set() rx = sock.recv() sock.send(msg) @@ -1351,7 +1351,7 @@ with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241) as s1, \ ~ linux needs_root with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241, padding=True) as s: - cans = new_can_socket0() + cans = new_can_socket(iface0) s.send(ISOTP(data=dhex("01"))) res = cans.recv() assert(res.length == 8) @@ -1360,10 +1360,10 @@ with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241, padding=True) as s: = Send a two-frame ISOTP message with padding ~ linux needs_root -cans = new_can_socket0() +cans = new_can_socket(iface0) acker_ready = threading.Event() def acker(): - acks = new_can_socket0() + acks = new_can_socket(iface0) acker_ready.set() can = acks.recv() acks.send(CAN(identifier = 0x241, data=dhex("30 00 00"))) @@ -1388,7 +1388,7 @@ assert(can.data == dhex("21 07 08 00 00 00 00 00")) ~ linux needs_root with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241, padding=False) as s: - cans = new_can_socket0() + cans = new_can_socket(iface0) cans.send(CAN(identifier=0x241, data=dhex("02 05 06 00 00 00 00 00"))) res = s.recv() assert(res.data == dhex("05 06")) @@ -1398,7 +1398,7 @@ with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241, padding=False) as s: ~ linux needs_root with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241, padding=True) as s: - cans = new_can_socket0() + cans = new_can_socket(iface0) cans.send(CAN(identifier=0x241, data=dhex("02 05 06 00 00 00 00 00"))) res = s.recv() assert(res.data == dhex("05 06")) @@ -1408,7 +1408,7 @@ with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241, padding=True) as s: ~ linux needs_root with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241, padding=True) as s: - cans = new_can_socket0() + cans = new_can_socket(iface0) cans.send(CAN(identifier=0x241, data=dhex("02 05 06"))) res = s.recv() assert(res.data == dhex("05 06")) @@ -1418,7 +1418,7 @@ with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241, padding=True) as s: ~ linux needs_root with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241, padding=True) as s: - cans = new_can_socket0() + cans = new_can_socket(iface0) cans.send(CAN(identifier=0x241, data=dhex("10 09 01 02 03 04 05 06"))) cans.send(CAN(identifier=0x241, data=dhex("21 07 08 09 00 00 00 00"))) res = s.recv() @@ -1429,7 +1429,7 @@ with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241, padding=True) as s: ~ linux needs_root with ISOTPSocket(new_can_socket0(), sid=0x641, did=0x241, padding=False) as s: - cans = new_can_socket0() + cans = new_can_socket(iface0) cans.send(CAN(identifier=0x241, data=dhex("10 09 01 02 03 04 05 06"))) cans.send(CAN(identifier=0x241, data=dhex("21 07 08 09 00 00 00 00"))) res = s.recv() @@ -1594,7 +1594,7 @@ exit_if_no_isotp_module() cans = CANSocket(iface0) acker_ready = threading.Event() def acker(): - acks = new_can_socket0() + acks = new_can_socket(iface0) acker_ready.set() can = acks.recv() acks.send(CAN(identifier = 0x241, data=dhex("30 00 00"))) @@ -1852,10 +1852,12 @@ isoTpSocket1 = ISOTPNativeSocket(iface1, sid=0x641, did=0x241) bSocket0 = ISOTPNativeSocket(iface0, sid=0x641, did=0x241) bSocket1 = ISOTPNativeSocket(iface1, sid=0x241, did=0x641) +bridgeStarted = threading.Event() def bridge(): + global bridgeStarted def forwarding(pkt): return pkt - bridge_and_sniff(if1=bSocket0, if2=bSocket1, xfrm12=forwarding, xfrm21=forwarding, timeout=2, count=1) + bridge_and_sniff(if1=bSocket0, if2=bSocket1, xfrm12=forwarding, xfrm21=forwarding, timeout=2, count=1, started_callback=bridgeStarted.set) bSocket0.close() bSocket1.close() global bSucc @@ -1874,15 +1876,18 @@ rSucc = False threadBridge = threading.Thread(target=bridge) threadBridge.start() threadSender = threading.Thread(target=RequestOnBus0) -threadSender.start() +bridgeStarted.wait() -packetsVCan1 = isoTpSocket1.sniff(timeout=0.5) +packetsVCan1 = isoTpSocket1.sniff(timeout=0.5, started_callback=threadSender.start) len(packetsVCan1) == 1 isoTpSocket0.close() isoTpSocket1.close() +threadSender.join() +threadBridge.join() + assert(bSucc) assert(rSucc) @@ -1898,12 +1903,14 @@ bSocket1 = ISOTPNativeSocket(iface1, sid=0x241, did=0x641) bSucc = False rSucc = False +bridgeStarted = threading.Event() def bridge(): + global bridgeStarted global bSucc def forwarding(pkt): pkt.data = 'changed' return pkt - bridge_and_sniff(if1=bSocket0, if2=bSocket1, xfrm12=forwarding, xfrm21=forwarding, timeout=0.5) + bridge_and_sniff(if1=bSocket0, if2=bSocket1, xfrm12=forwarding, xfrm21=forwarding, timeout=0.5, started_callback=bridgeStarted.set) bSocket0.close() bSocket1.close() bSucc = True @@ -1915,14 +1922,11 @@ def RequestOnBus0(): isoTpSocket0.send(packet) rSucc = True -threadBridge.join() threadBridge = threading.Thread(target=bridge) threadBridge.start() -threadSender.join() threadSender = threading.Thread(target=RequestOnBus0) -threadSender.start() - -packetsVCan1 = isoTpSocket1.sniff(timeout=0.5) +bridgeStarted.wait() +packetsVCan1 = isoTpSocket1.sniff(timeout=0.5, started_callback=threadSender.start) packetsVCan1[0].data = b'changed' len(packetsVCan1) == 1 @@ -1930,6 +1934,9 @@ len(packetsVCan1) == 1 isoTpSocket0.close() isoTpSocket1.close() +threadSender.join() +threadBridge.join() + assert(bSucc) assert(rSucc) @@ -1945,11 +1952,13 @@ isoTpSocket1 = ISOTPNativeSocket(iface1, sid=0x641, did=0x241) bSocket0 = ISOTPNativeSocket(iface0, sid=0x641, did=0x241) bSocket1 = ISOTPNativeSocket(iface1, sid=0x241, did=0x641) +bridgeStarted = threading.Event() def bridge(): + global bridgeStarted global bSucc def forwarding(pkt): return pkt - bridge_and_sniff(if1=bSocket0, if2=bSocket1, xfrm12=forwarding, xfrm21=forwarding, timeout=0.5) + bridge_and_sniff(if1=bSocket0, if2=bSocket1, xfrm12=forwarding, xfrm21=forwarding, timeout=0.5, started_callback=bridgeStarted.set) bSocket0.close() bSocket1.close() bSucc = True @@ -1963,14 +1972,12 @@ def RequestBothVCans(): isoTpSocket1.send(packetVcan1) rSucc = True -threadBridge.join() threadBridge = threading.Thread(target=bridge) threadBridge.start() -threadSender.join() threadSender = threading.Thread(target=RequestOnBus0) -threadSender.start() +bridgeStarted.wait() -packetsVCan0 = isoTpSocket0.sniff(timeout=0.5) +packetsVCan0 = isoTpSocket0.sniff(timeout=0.5, started_callback=threadSender.start) packetsVCan1 = isoTpSocket1.sniff(timeout=0.5) len(packetsVCan0) == 1 @@ -1979,6 +1986,9 @@ len(packetsVCan1) == 1 isoTpSocket0.close() isoTpSocket1.close() +threadSender.join() +threadBridge.join() + assert(bSucc) assert(rSucc) @@ -1994,12 +2004,14 @@ isoTpSocket1 = ISOTPNativeSocket(iface1, sid=0x641, did=0x241) bSocket0 = ISOTPNativeSocket(iface0, sid=0x641, did=0x241) bSocket1 = ISOTPNativeSocket(iface1, sid=0x241, did=0x641) +bridgeStarted = threading.Event() def bridge(): + global bridgeStarted global bSucc def forwarding(pkt): pkt.data = 'changed' return pkt - bridge_and_sniff(if1=bSocket0, if2=bSocket1, xfrm12=forwarding, xfrm21=forwarding, timeout=0.5) + bridge_and_sniff(if1=bSocket0, if2=bSocket1, xfrm12=forwarding, xfrm21=forwarding, timeout=0.5, started_callback=bridgeStarted.set) bSocket0.close() bSocket1.close() bSucc = True @@ -2013,14 +2025,12 @@ def RequestBothVCans(): isoTpSocket1.send(packetVcan1) rSucc = True -threadBridge.join() threadBridge = threading.Thread(target=bridge) threadBridge.start() -threadSender.join() threadSender = threading.Thread(target=RequestBothVCans) -threadSender.start() +bridgeStarted.wait() -packetsVCan0 = isoTpSocket0.sniff(timeout=0.5) +packetsVCan0 = isoTpSocket0.sniff(timeout=0.5, started_callback=threadSender.start) packetsVCan1 = isoTpSocket1.sniff(timeout=0.5) packetsVCan0[0].data = b'changed' @@ -2031,6 +2041,9 @@ len(packetsVCan1) == 1 isoTpSocket0.close() isoTpSocket1.close() +threadSender.join() +threadBridge.join() + assert(bSucc) assert(rSucc)