From bac24f5750e3e267e1ecc24663b9880bb8de2fe6 Mon Sep 17 00:00:00 2001 From: Nils Weiss Date: Thu, 21 Feb 2019 18:09:34 +0100 Subject: [PATCH 1/2] try to make tests more reliable --- scapy/contrib/cansocket_native.uts | 208 +++++++++++++++---------- scapy/contrib/cansocket_python_can.uts | 183 +++++++++++----------- 2 files changed, 217 insertions(+), 174 deletions(-) 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 From e92b632506b3c634e4b72a42e97e0e823ed2e095 Mon Sep 17 00:00:00 2001 From: Nils Weiss Date: Fri, 22 Feb 2019 08:22:50 +0100 Subject: [PATCH 2/2] cleanups and minor improvements to achieve more stability --- scapy/contrib/isotp.uts | 57 +++++++++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 22 deletions(-) diff --git a/scapy/contrib/isotp.uts b/scapy/contrib/isotp.uts index 8696a2c7cd3..e14f36c4478 100644 --- a/scapy/contrib/isotp.uts +++ b/scapy/contrib/isotp.uts @@ -107,9 +107,9 @@ 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_socket = lambda iface: CANSocket(iface=python_can.interface.Bus(bustype='socketcan', channel=iface, bitrate=250000), timeout=0.01) + 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) @@ -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)