diff --git a/nets-in-progress/ditella-8r-1c-srv6-pm/isis8d.py b/nets-in-progress/ditella-8r-1c-srv6-pm/isis8d.py index 4d2b25f..3a4ae1d 100644 --- a/nets-in-progress/ditella-8r-1c-srv6-pm/isis8d.py +++ b/nets-in-progress/ditella-8r-1c-srv6-pm/isis8d.py @@ -48,7 +48,6 @@ NODE_MANAGER_GRPC_PORT = os.getenv('NODE_MANAGER_GRPC_PORT', None) - class BaseNode(Host): def __init__(self, name, *args, **kwargs): @@ -343,7 +342,8 @@ def simple_test(): add_nodes_to_etc_hosts() # This waiting time is needed because after several tests we noticed that - # it is needed some time to let each node of the topology to be set up correctly + # it is needed some time to let each node of the topology to be set up + # correctly print("Waiting the components of the topology to set up correctly (40 seconds)") sleep(40) @@ -414,6 +414,5 @@ def __main(): simple_test() - if __name__ == '__main__': __main() diff --git a/nets-in-progress/ditella-8r-1c-srv6-pm/isis8d.py.backup b/nets-in-progress/ditella-8r-1c-srv6-pm/isis8d.py.backup index b30fe25..be4bf1e 100644 --- a/nets-in-progress/ditella-8r-1c-srv6-pm/isis8d.py.backup +++ b/nets-in-progress/ditella-8r-1c-srv6-pm/isis8d.py.backup @@ -350,7 +350,7 @@ def simple_test(): add_nodes_to_etc_hosts() # Castagnacci-Ditella Progetto - + # Step 1. Recuperare sender & Reflector scelti dell'utente sender = net.get(choosed_sender) reflector = net.get(choosed_reflector) @@ -358,12 +358,12 @@ def simple_test(): # waiting sender to setup (after several test, we noticed that removing the sleep # will cause this command to fail) print("Waiting the routers to set up... (40 sec)") - #sleep(20) + # sleep(20) # Step 2. Execute on reflector, twampy cmd print("REFLECTOR", reflector.name, "Is sniffing") #reflector.cmd("./reflector &") - #sleep(2) + # sleep(2) print("SENDER", sender.name, "Is sending (scapy crafted) TWAMP packets") # Step 4. Execute on sender twampy cmd @@ -372,8 +372,6 @@ def simple_test(): # ----------------------------- CLI(net) - - # Remove Mininet nodes from /etc/hosts if ADD_ETC_HOSTS: remove_nodes_from_etc_hosts(net) @@ -418,7 +416,8 @@ def __main(): while not sender_choosed or not reflector_chosed: print("Here are the routers in the current mininet topology:") print("r1\nr2\nr3\nr4\nr5\nr6\nr7\nr8") - print("Please choose a Sender and Receiver to be used for Delay Measurement (TWAMP)") + print( + "Please choose a Sender and Receiver to be used for Delay Measurement (TWAMP)") if not sender_choosed: choosed_sender = input("Choose the Router 'Sender': ") if choosed_sender in possible_routers: @@ -462,6 +461,5 @@ def __main(): simple_test() - if __name__ == '__main__': __main() diff --git a/nets-in-progress/ditella-8r-1c-srv6-pm/twamp.py b/nets-in-progress/ditella-8r-1c-srv6-pm/twamp.py index 8aca5a1..8aab51b 100644 --- a/nets-in-progress/ditella-8r-1c-srv6-pm/twamp.py +++ b/nets-in-progress/ditella-8r-1c-srv6-pm/twamp.py @@ -4,37 +4,37 @@ class TWAMPTPacketSender(Packet): - name ="TWAMPPacketSender" - fields_desc=[IntField("SequenceNumber",0), - BitField("FirstPartTimestamp",0,32), - BitField("SecondPartTimestamp",0,32), - BitEnumField("S", 0, 1, {0: " no external synchronization", - 1: "external synchronization"}), - BitField("Z",0,1), - BitField("Scale",0,6), - BitField("Multiplier",1,8)] #manca il padding + name = "TWAMPPacketSender" + fields_desc = [IntField("SequenceNumber", 0), + BitField("FirstPartTimestamp", 0, 32), + BitField("SecondPartTimestamp", 0, 32), + BitEnumField("S", 0, 1, {0: " no external synchronization", + 1: "external synchronization"}), + BitField("Z", 0, 1), + BitField("Scale", 0, 6), + BitField("Multiplier", 1, 8)] # manca il padding class TWAMPTPacketReflector(Packet): - name ="TWAMPPacketReflector" - fields_desc=[IntField("SequenceNumber",0), - BitField("FirstPartTimestamp",0,32), - BitField("SecondPartTimestamp",0,32), - BitEnumField("S", 0, 1, {0: " no external synchronization", - 1: "external synchronization"}), - BitField("Z",0,1), - BitField("Scale",0,6), - BitField("Multiplier",1,8), - BitField("MBZ",0,16), - BitField("FirstPartTimestampReceiver",0,32), - BitField("SecondPartTimestampReceiver",0,32), - IntField("SequenceNumberSender",0), - BitField("FirstPartTimestampSender",0,32), - BitField("SecondPartTimestampSender",0,32), - BitEnumField("SSender", 0, 1, {0: " no external synchronization", - 1: "external synchronization"}), - BitField("ZSender ",0,1), - BitField("ScaleSender",0,6), - BitField("MultiplierSender",1,8), - BitField("MBZ",0,16), - ByteField("SenderTTL",255)] #manca il padding \ No newline at end of file + name = "TWAMPPacketReflector" + fields_desc = [IntField("SequenceNumber", 0), + BitField("FirstPartTimestamp", 0, 32), + BitField("SecondPartTimestamp", 0, 32), + BitEnumField("S", 0, 1, {0: " no external synchronization", + 1: "external synchronization"}), + BitField("Z", 0, 1), + BitField("Scale", 0, 6), + BitField("Multiplier", 1, 8), + BitField("MBZ", 0, 16), + BitField("FirstPartTimestampReceiver", 0, 32), + BitField("SecondPartTimestampReceiver", 0, 32), + IntField("SequenceNumberSender", 0), + BitField("FirstPartTimestampSender", 0, 32), + BitField("SecondPartTimestampSender", 0, 32), + BitEnumField("SSender", 0, 1, {0: " no external synchronization", + 1: "external synchronization"}), + BitField("ZSender ", 0, 1), + BitField("ScaleSender", 0, 6), + BitField("MultiplierSender", 1, 8), + BitField("MBZ", 0, 16), + ByteField("SenderTTL", 255)] # manca il padding diff --git a/nets-in-progress/ditella-8r-1c-srv6-pm/twamp_dM.py b/nets-in-progress/ditella-8r-1c-srv6-pm/twamp_dM.py index 7336096..94d329c 100644 --- a/nets-in-progress/ditella-8r-1c-srv6-pm/twamp_dM.py +++ b/nets-in-progress/ditella-8r-1c-srv6-pm/twamp_dM.py @@ -1,5 +1,5 @@ from scapy.all import * -from scapy.layers.inet import IP,UDP +from scapy.layers.inet import IP, UDP from scapy.layers.inet6 import IPv6 import twamp from datetime import datetime @@ -9,7 +9,8 @@ import struct -# Constants to convert between python timestamps and NTP 8B binary format [RFC1305] +# Constants to convert between python timestamps and NTP 8B binary format +# [RFC1305] TIMEOFFSET = int(2208988800) # Time Difference: 1-JAN-1900 to 1-JAN-1970 ALLBITS = int(0xFFFFFFFF) # To calculate 32bit fraction of the second @@ -22,9 +23,9 @@ def __init__(self, interface=get_if_list(), sender=None, reflector=None): self.interface = interface self.SessionSender = sender self.SessionReflector = reflector - + # If a specific interface is used, extract its IPv6 addr - if(type(interface) == type('string')): + if(isinstance(interface, type('string'))): addrs = netifaces.ifaddresses(interface) ipv6_addr = addrs[netifaces.AF_INET6][0]['addr'] @@ -34,31 +35,28 @@ def __init__(self, interface=get_if_list(), sender=None, reflector=None): ipv6_addr = addrs[netifaces.AF_INET6][0]['addr'] # setting ipv6 address according to the choosen interface - if(self.SessionReflector == None): + if(self.SessionReflector is None): self.SessionSender.srcAddr = ipv6_addr else: self.SessionReflector.srcAddr = ipv6_addr - - def packetRecvCallback(self, packet): - if UDP in packet: - if packet[UDP].dport==20001: + if packet[UDP].dport == 20001: packet[UDP].decode_payload_as(twamp.TWAMPTPacketSender) # print(packet.show()) - if(self.SessionReflector != None): + if(self.SessionReflector is not None): self.SessionReflector.recvTWAMPfromSender(packet) - elif packet[UDP].dport==20000: + elif packet[UDP].dport == 20000: packet[UDP].decode_payload_as(twamp.TWAMPTPacketReflector) - + # print(packet.show()) - if(self.SessionSender != None): + if(self.SessionSender is not None): self.SessionSender.recvTWAMPfromReflector(packet) def run(self): @@ -68,7 +66,6 @@ def run(self): print("TestPacketReceiver Stop sniffing") - class TWAMPUtils(): def __init__(self): @@ -78,80 +75,88 @@ def getTimestamp(self): t = datetime.timestamp(datetime.now()) + TIMEOFFSET - floatTimestamp = int((t - int(t)) * ALLBITS) # 32bit fraction of the second + # 32bit fraction of the second + floatTimestamp = int((t - int(t)) * ALLBITS) intTimestamp = int(t) return (intTimestamp, floatTimestamp) - class Reflector(TWAMPUtils): - - def __init__(self): - - # set to its superclass constructor - self.srcAddr = '' - self.senderSequenceNumber = 0 - self.senderTSint = 0 - self.senderTSfloat = 0 + def __init__(self): + + # set to its superclass constructor + self.srcAddr = '' + self.senderSequenceNumber = 0 + self.senderTSint = 0 + self.senderTSfloat = 0 - """ + """ This method is used upon receiving a packet from a sender. The method send a reply to the sender according to TWAMP standard """ - def sendReflectorDelayPacket(self,dstAddr,sequence_number,scale=0,multiplier=1,mBZ=0,SSender=0,ZSender=0,scaleSender=0,multiplierSender=1): - - timestamp = self.getTimestamp() - - ipv6_packet = IPv6() - ipv6_packet.src = self.srcAddr - ipv6_packet.dst = dstAddr - - udp_packet = UDP() - udp_packet.dport = 20000 - udp_packet.sport = 20001 - - - twamp_reflector = twamp.TWAMPTPacketReflector(SequenceNumber = sequence_number, - FirstPartTimestamp = timestamp[0], - SecondPartTimestamp = timestamp[1], - Scale = scale, - Multiplier = multiplier, - MBZ = mBZ, - FirstPartTimestampReceiver = timestamp[0], - SecondPartTimestampReceiver = timestamp[1], - SequenceNumberSender = self.senderSequenceNumber, - FirstPartTimestampSender = self.senderTSint, - SecondPartTimestampSender = self.senderTSfloat, - ScaleSender = scaleSender, - MultiplierSender = multiplierSender - ) - pkt = (ipv6_packet / udp_packet / twamp_reflector) - - send(pkt, count=1, verbose=0) + def sendReflectorDelayPacket( + self, + dstAddr, + sequence_number, + scale=0, + multiplier=1, + mBZ=0, + SSender=0, + ZSender=0, + scaleSender=0, + multiplierSender=1): - """ + timestamp = self.getTimestamp() + + ipv6_packet = IPv6() + ipv6_packet.src = self.srcAddr + ipv6_packet.dst = dstAddr + + udp_packet = UDP() + udp_packet.dport = 20000 + udp_packet.sport = 20001 + + twamp_reflector = twamp.TWAMPTPacketReflector( + SequenceNumber=sequence_number, + FirstPartTimestamp=timestamp[0], + SecondPartTimestamp=timestamp[1], + Scale=scale, + Multiplier=multiplier, + MBZ=mBZ, + FirstPartTimestampReceiver=timestamp[0], + SecondPartTimestampReceiver=timestamp[1], + SequenceNumberSender=self.senderSequenceNumber, + FirstPartTimestampSender=self.senderTSint, + SecondPartTimestampSender=self.senderTSfloat, + ScaleSender=scaleSender, + MultiplierSender=multiplierSender) + pkt = (ipv6_packet / udp_packet / twamp_reflector) + + send(pkt, count=1, verbose=0) + + """ Methods triggered when received a packet from (TWAMP) sender. This method extract the needed field to be used to craft the corresponding reply. - """ - def recvTWAMPfromSender(self, packet): + """ - self.srcAddr = packet[IPv6].dst - dstAddr = packet[IPv6].src + def recvTWAMPfromSender(self, packet): - packet[UDP].decode_payload_as(twamp.TWAMPTPacketSender) + self.srcAddr = packet[IPv6].dst + dstAddr = packet[IPv6].src - sequence_number = packet[UDP].SequenceNumber - self.senderSequenceNumber = packet[UDP].SequenceNumber - self.senderTSint = packet[UDP].FirstPartTimestamp - self.senderTSfloat = packet[UDP].SecondPartTimestamp + packet[UDP].decode_payload_as(twamp.TWAMPTPacketSender) - self.sendReflectorDelayPacket(sequence_number=sequence_number,dstAddr=dstAddr) + sequence_number = packet[UDP].SequenceNumber + self.senderSequenceNumber = packet[UDP].SequenceNumber + self.senderTSint = packet[UDP].FirstPartTimestamp + self.senderTSfloat = packet[UDP].SecondPartTimestamp - + self.sendReflectorDelayPacket( + sequence_number=sequence_number, dstAddr=dstAddr) class Sender(TWAMPUtils): @@ -165,58 +170,62 @@ def __init__(self, dstAddr): self.avarageDelayMeasured = 0.0 self.maxPacketSent = 500 - - def sendSenderDelayPacket(self,scale=0,multiplier=1): + def sendSenderDelayPacket(self, scale=0, multiplier=1): timestamp = self.getTimestamp() ipv6_packet = IPv6() ipv6_packet.src = self.srcAddr ipv6_packet.dst = self.dstAddr - #TODO parte Srv6 qui + # TODO parte Srv6 qui udp_packet = UDP() - udp_packet.dport = 20001 - udp_packet.sport = 20000 + udp_packet.dport = 20001 + udp_packet.sport = 20000 - twampPaylod = twamp.TWAMPTPacketSender(SequenceNumber = self.SequenceNumber, - FirstPartTimestamp = timestamp[0], - SecondPartTimestamp = timestamp[1], - Scale = scale, - Multiplier = multiplier) + twampPaylod = twamp.TWAMPTPacketSender( + SequenceNumber=self.SequenceNumber, + FirstPartTimestamp=timestamp[0], + SecondPartTimestamp=timestamp[1], + Scale=scale, + Multiplier=multiplier) pkt = (ipv6_packet / udp_packet / twampPaylod) send(pkt, count=1, verbose=0) - """ - Method triggered on receiving a reply from the reflector. + Method triggered on receiving a reply from the reflector. This method extracts the fields of the packet received from the reflector in order to evaluate the avatage delay. """ + def recvTWAMPfromReflector(self, packet): packet[UDP].decode_payload_as(twamp.TWAMPTPacketReflector) - if ( packet[UDP].SequenceNumber == self.SequenceNumber): + if (packet[UDP].SequenceNumber == self.SequenceNumber): + + delay = (packet[UDP].FirstPartTimestampReceiver + float("0.%d" % + packet[UDP].SecondPartTimestampReceiver)) - (packet[UDP].FirstPartTimestampSender + float("0.%d" % + packet[UDP].SecondPartTimestampSender)) - delay = (packet[UDP].FirstPartTimestampReceiver + float("0.%d"%packet[UDP].SecondPartTimestampReceiver)) - (packet[UDP].FirstPartTimestampSender + float("0.%d"%packet[UDP].SecondPartTimestampSender)) - - # Welford Online Algorithm for avarage evaluation - self.avarageDelayMeasured = float(self.avarageDelayMeasured) + (delay-self.avarageDelayMeasured)/float(self.SequenceNumber+1) + # Welford Online Algorithm for avarage evaluation + self.avarageDelayMeasured = float(self.avarageDelayMeasured) + ( + delay - self.avarageDelayMeasured) / float(self.SequenceNumber + 1) - if ( self.maxPacketSent <= self.SequenceNumber): - self.showPacketDelay() - return - else: - self.SequenceNumber = packet[UDP].SequenceNumber +1 - self.sendSenderDelayPacket() + if (self.maxPacketSent <= self.SequenceNumber): + self.showPacketDelay() + return + else: + self.SequenceNumber = packet[UDP].SequenceNumber + 1 + self.sendSenderDelayPacket() else: - #pacchetto scartato + # pacchetto scartato return # Method called automatically when the time delay measurement has finished def showPacketDelay(self): - print("After sending {} packets, the measured delay is: {} seconds".format(self.maxPacketSent, self.avarageDelayMeasured)) + print("After sending {} packets, the measured delay is: {} seconds".format( + self.maxPacketSent, self.avarageDelayMeasured)) diff --git a/nets-in-progress/ditella-8r-1c-srv6-pm/twamp_test_reflector.py b/nets-in-progress/ditella-8r-1c-srv6-pm/twamp_test_reflector.py index af12872..2a7ec3a 100644 --- a/nets-in-progress/ditella-8r-1c-srv6-pm/twamp_test_reflector.py +++ b/nets-in-progress/ditella-8r-1c-srv6-pm/twamp_test_reflector.py @@ -1,7 +1,7 @@ #!/usr/bin/python from scapy.all import * -from scapy.layers.inet import IP,UDP +from scapy.layers.inet import IP, UDP from scapy.layers.inet6 import IPv6 import twamp @@ -12,4 +12,4 @@ t_dm = twamp_dM.TWAMPDelayMeasurement(reflector=reflector) -t_dm.start() \ No newline at end of file +t_dm.start() diff --git a/nets-in-progress/ditella-8r-1c-srv6-pm/twamp_test_sender.py b/nets-in-progress/ditella-8r-1c-srv6-pm/twamp_test_sender.py index eb4f543..4e6a72a 100644 --- a/nets-in-progress/ditella-8r-1c-srv6-pm/twamp_test_sender.py +++ b/nets-in-progress/ditella-8r-1c-srv6-pm/twamp_test_sender.py @@ -1,6 +1,6 @@ from scapy.all import * -from scapy.layers.inet import IP,UDP +from scapy.layers.inet import IP, UDP from scapy.layers.inet6 import IPv6 import twamp @@ -19,4 +19,3 @@ time.sleep(2) sender.sendSenderDelayPacket() - diff --git a/nets-in-progress/riolo-8r-1c-srv6-pm/isis8d.py b/nets-in-progress/riolo-8r-1c-srv6-pm/isis8d.py index 4d2b25f..3a4ae1d 100644 --- a/nets-in-progress/riolo-8r-1c-srv6-pm/isis8d.py +++ b/nets-in-progress/riolo-8r-1c-srv6-pm/isis8d.py @@ -48,7 +48,6 @@ NODE_MANAGER_GRPC_PORT = os.getenv('NODE_MANAGER_GRPC_PORT', None) - class BaseNode(Host): def __init__(self, name, *args, **kwargs): @@ -343,7 +342,8 @@ def simple_test(): add_nodes_to_etc_hosts() # This waiting time is needed because after several tests we noticed that - # it is needed some time to let each node of the topology to be set up correctly + # it is needed some time to let each node of the topology to be set up + # correctly print("Waiting the components of the topology to set up correctly (40 seconds)") sleep(40) @@ -414,6 +414,5 @@ def __main(): simple_test() - if __name__ == '__main__': __main() diff --git a/nets-in-progress/riolo-8r-1c-srv6-pm/twamp.py b/nets-in-progress/riolo-8r-1c-srv6-pm/twamp.py index 9adf529..2e4b767 100644 --- a/nets-in-progress/riolo-8r-1c-srv6-pm/twamp.py +++ b/nets-in-progress/riolo-8r-1c-srv6-pm/twamp.py @@ -3,37 +3,37 @@ class TWAMPTPacketSender(Packet): - name ="TWAMPPacketSender" - fields_desc=[IntField("SequenceNumber",0), - BitField("FirstPartTimestamp",0,32), - BitField("SecondPartTimestamp",0,32), - BitEnumField("S", 0, 1, {0: " no external synchronization", - 1: "external synchronization"}), - BitField("Z",0,1), - BitField("Scale",0,6), - BitField("Multiplier",1,8)] #manca il padding + name = "TWAMPPacketSender" + fields_desc = [IntField("SequenceNumber", 0), + BitField("FirstPartTimestamp", 0, 32), + BitField("SecondPartTimestamp", 0, 32), + BitEnumField("S", 0, 1, {0: " no external synchronization", + 1: "external synchronization"}), + BitField("Z", 0, 1), + BitField("Scale", 0, 6), + BitField("Multiplier", 1, 8)] # manca il padding class TWAMPTPacketReflector(Packet): - name ="TWAMPPacketReflector" - fields_desc=[IntField("SequenceNumber",0), - BitField("FirstPartTimestamp",0,32), - BitField("SecondPartTimestamp",0,32), - BitEnumField("S", 0, 1, {0: " no external synchronization", - 1: "external synchronization"}), - BitField("Z",0,1), - BitField("Scale",0,6), - BitField("Multiplier",1,8), - BitField("MBZ",0,16), - BitField("FirstPartTimestampReceiver",0,32), - BitField("SecondPartTimestampReceiver",0,32), - IntField("SequenceNumberSender",0), - BitField("FirstPartTimestampSender",0,32), - BitField("SecondPartTimestampSender",0,32), - BitEnumField("SSender", 0, 1, {0: " no external synchronization", - 1: "external synchronization"}), - BitField("ZSender ",0,1), - BitField("ScaleSender",0,6), - BitField("MultiplierSender",1,8), - BitField("MBZ",0,16), - ByteField("SenderTTL",255)] #manca il padding \ No newline at end of file + name = "TWAMPPacketReflector" + fields_desc = [IntField("SequenceNumber", 0), + BitField("FirstPartTimestamp", 0, 32), + BitField("SecondPartTimestamp", 0, 32), + BitEnumField("S", 0, 1, {0: " no external synchronization", + 1: "external synchronization"}), + BitField("Z", 0, 1), + BitField("Scale", 0, 6), + BitField("Multiplier", 1, 8), + BitField("MBZ", 0, 16), + BitField("FirstPartTimestampReceiver", 0, 32), + BitField("SecondPartTimestampReceiver", 0, 32), + IntField("SequenceNumberSender", 0), + BitField("FirstPartTimestampSender", 0, 32), + BitField("SecondPartTimestampSender", 0, 32), + BitEnumField("SSender", 0, 1, {0: " no external synchronization", + 1: "external synchronization"}), + BitField("ZSender ", 0, 1), + BitField("ScaleSender", 0, 6), + BitField("MultiplierSender", 1, 8), + BitField("MBZ", 0, 16), + ByteField("SenderTTL", 255)] # manca il padding diff --git a/nets-in-progress/riolo-8r-1c-srv6-pm/twamp_dM.py b/nets-in-progress/riolo-8r-1c-srv6-pm/twamp_dM.py index 36bc3e7..9f90b1d 100644 --- a/nets-in-progress/riolo-8r-1c-srv6-pm/twamp_dM.py +++ b/nets-in-progress/riolo-8r-1c-srv6-pm/twamp_dM.py @@ -1,5 +1,5 @@ from scapy.all import * -from scapy.layers.inet import IP,UDP +from scapy.layers.inet import IP, UDP from scapy.layers.inet6 import IPv6 import twamp from datetime import datetime @@ -9,11 +9,15 @@ import struct -# Constants to convert between python timestamps and NTP 8B binary format [RFC1305] +# Constants to convert between python timestamps and NTP 8B binary format +# [RFC1305] TIMEOFFSET = int(2208988800) # Time Difference: 1-JAN-1900 to 1-JAN-1970 ALLBITS = int(0xFFFFFFFF) # To calculate 32bit fraction of the second -MAXPACKETSENT = int(500) # Number of packet exchanged between sender and reflector, modify to your choice +# Number of packet exchanged between sender and reflector, modify to your +# choice +MAXPACKETSENT = int(500) + class TWAMPDelayMeasurement(Thread): @@ -24,64 +28,60 @@ def __init__(self, interface=get_if_list(), sender=None, reflector=None): self.SessionSender = sender self.SessionReflector = reflector self.maxPacketSent = MAXPACKETSENT - + # If a specific interface is used, extract its IPv6 addr - if(type(interface) == type('string')): + if(isinstance(interface, type('string'))): addrs = netifaces.ifaddresses(interface) ipv6_addr = addrs[netifaces.AF_INET6][0]['addr'] - # If no interface is used, use global IPv6 addr + # If no interface is used, use global IPv6 addr else: addrs = netifaces.ifaddresses('lo') ipv6_addr = addrs[netifaces.AF_INET6][0]['addr'] # setting ipv6 address according to the choosen interface - if(self.SessionReflector == None): + if(self.SessionReflector is None): self.SessionSender.srcAddr = ipv6_addr print('Sono il sender') else: self.SessionReflector.srcAddr = ipv6_addr print('Sono il reflector') - - - def packetRecvCallback(self, packet): - + if UDP in packet: - if packet[UDP].dport==20001: + if packet[UDP].dport == 20001: packet[UDP].decode_payload_as(twamp.TWAMPTPacketSender) - - - if(self.SessionReflector != None): + if(self.SessionReflector is not None): self.SessionReflector.recvTWAMPfromSender(packet) - elif packet[UDP].dport==20000: + elif packet[UDP].dport == 20000: packet[UDP].decode_payload_as(twamp.TWAMPTPacketReflector) - - - if(self.SessionSender != None): + if(self.SessionSender is not None): self.SessionSender.recvTWAMPfromReflector(packet) - # sniff stop filter + def stopfilter(self, packet): - if packet[UDP].SequenceNumber == self.maxPacketSent - 1: + if packet[UDP].SequenceNumber == self.maxPacketSent - 1: return True else: - return False + return False def run(self): - + print("TestPacketReceiver Start sniffing...") - sniff(iface = self.interface, filter = "udp", prn=self.packetRecvCallback, stop_filter = self.stopfilter) # changed filter to UDP + sniff( + iface=self.interface, + filter="udp", + prn=self.packetRecvCallback, + stop_filter=self.stopfilter) # changed filter to UDP print("TestPacketReceiver Stop sniffing") - class TWAMPUtils(): def __init__(self): @@ -91,95 +91,107 @@ def getTimestamp(self): t = datetime.timestamp(datetime.now()) + TIMEOFFSET - floatTimestamp = int((t - int(t)) * ALLBITS) # 32bit fraction of the second + # 32bit fraction of the second + floatTimestamp = int((t - int(t)) * ALLBITS) intTimestamp = int(t) return (intTimestamp, floatTimestamp) - class Reflector(TWAMPUtils): - - def __init__(self, segList): # added segList - - # set to its superclass constructor - self.srcAddr = '' - self.senderSequenceNumber = 0 - self.senderTSint = 0 - self.senderTSfloat = 0 - self.segList = segList # added segment list - self.maxPacketSent = MAXPACKETSENT - - """ + def __init__(self, segList): # added segList + + # set to its superclass constructor + self.srcAddr = '' + self.senderSequenceNumber = 0 + self.senderTSint = 0 + self.senderTSfloat = 0 + self.segList = segList # added segment list + self.maxPacketSent = MAXPACKETSENT + + """ This method is used upon receiving a packet from a sender. The method send a reply to the sender according to TWAMP standard """ - def sendReflectorDelayPacket(self,dstAddr,sequence_number,scale=0,multiplier=1,mBZ=0,SSender=0,ZSender=0,scaleSender=0,multiplierSender=1): - - timestamp = self.getTimestamp() + def sendReflectorDelayPacket( + self, + dstAddr, + sequence_number, + scale=0, + multiplier=1, + mBZ=0, + SSender=0, + ZSender=0, + scaleSender=0, + multiplierSender=1): - ipv6_packet = IPv6() - ipv6_packet.src = self.srcAddr - ipv6_packet.dst = self.segList[-1] # last list's segment - - # srv6 header added - srv6_header = IPv6ExtHdrSegmentRouting() - srv6_header.addresses = self.segList # no necessary to reverse for reflector - srv6_header.segleft = len(self.segList) - 1 # -1 because start from 0 - srv6_header.lastentry = len(self.segList) - 1 + timestamp = self.getTimestamp() - ipv6_packet_inside = IPv6() - ipv6_packet_inside.src = self.srcAddr # src ipv6 inner (reflector's addr) - ipv6_packet_inside.dst = dstAddr # dst ipv6 inner (sender's addr) + ipv6_packet = IPv6() + ipv6_packet.src = self.srcAddr + ipv6_packet.dst = self.segList[-1] # last list's segment - udp_packet = UDP() - udp_packet.dport = 20000 - udp_packet.sport = 20001 - + # srv6 header added + srv6_header = IPv6ExtHdrSegmentRouting() + srv6_header.addresses = self.segList # no necessary to reverse for reflector + srv6_header.segleft = len(self.segList) - 1 # -1 because start from 0 + srv6_header.lastentry = len(self.segList) - 1 - twamp_reflector = twamp.TWAMPTPacketReflector(SequenceNumber = sequence_number, - FirstPartTimestamp = timestamp[0], - SecondPartTimestamp = timestamp[1], - Scale = scale, - Multiplier = multiplier, - MBZ = mBZ, - FirstPartTimestampReceiver = timestamp[0], - SecondPartTimestampReceiver = timestamp[1], - SequenceNumberSender = self.senderSequenceNumber, - FirstPartTimestampSender = self.senderTSint, - SecondPartTimestampSender = self.senderTSfloat, - ScaleSender = scaleSender, - MultiplierSender = multiplierSender - ) - pkt = (ipv6_packet / srv6_header / ipv6_packet_inside / udp_packet / twamp_reflector) + ipv6_packet_inside = IPv6() + # src ipv6 inner (reflector's addr) + ipv6_packet_inside.src = self.srcAddr + ipv6_packet_inside.dst = dstAddr # dst ipv6 inner (sender's addr) - send(pkt, verbose=1) + udp_packet = UDP() + udp_packet.dport = 20000 + udp_packet.sport = 20001 + + twamp_reflector = twamp.TWAMPTPacketReflector( + SequenceNumber=sequence_number, + FirstPartTimestamp=timestamp[0], + SecondPartTimestamp=timestamp[1], + Scale=scale, + Multiplier=multiplier, + MBZ=mBZ, + FirstPartTimestampReceiver=timestamp[0], + SecondPartTimestampReceiver=timestamp[1], + SequenceNumberSender=self.senderSequenceNumber, + FirstPartTimestampSender=self.senderTSint, + SecondPartTimestampSender=self.senderTSfloat, + ScaleSender=scaleSender, + MultiplierSender=multiplierSender) + pkt = ( + ipv6_packet / + srv6_header / + ipv6_packet_inside / + udp_packet / + twamp_reflector) + send(pkt, verbose=1) - """ + """ Methods triggered when received a packet from (TWAMP) sender. This method extract the needed field to be used to craft the corresponding reply. - """ - def recvTWAMPfromSender(self, packet): - - self.srcAddr = packet[IPv6].dst - dstAddr = packet[IPv6].src + """ + + def recvTWAMPfromSender(self, packet): + + self.srcAddr = packet[IPv6].dst + dstAddr = packet[IPv6].src - packet[UDP].decode_payload_as(twamp.TWAMPTPacketSender) + packet[UDP].decode_payload_as(twamp.TWAMPTPacketSender) - sequence_number = packet[UDP].SequenceNumber - - self.senderSequenceNumber = packet[UDP].SequenceNumber - self.senderTSint = packet[UDP].FirstPartTimestamp - self.senderTSfloat = packet[UDP].SecondPartTimestamp + sequence_number = packet[UDP].SequenceNumber - self.sendReflectorDelayPacket(sequence_number=sequence_number,dstAddr=dstAddr) - + self.senderSequenceNumber = packet[UDP].SequenceNumber + self.senderTSint = packet[UDP].FirstPartTimestamp + self.senderTSfloat = packet[UDP].SecondPartTimestamp - + self.sendReflectorDelayPacket( + sequence_number=sequence_number, dstAddr=dstAddr) class Sender(TWAMPUtils): @@ -189,79 +201,85 @@ def __init__(self, dstAddr, segList): # set to its superclass constructor self.srcAddr = '' self.dstAddr = dstAddr - self.segList = segList # add segment List + self.segList = segList # add segment List self.SequenceNumber = 0 self.avarageDelayMeasured = 0.0 self.maxPacketSent = MAXPACKETSENT # modificato per provare (era 500) - self.revSegList = segList[::-1] # segList reversed + self.revSegList = segList[::-1] # segList reversed - - def sendSenderDelayPacket(self,scale=0,multiplier=1): + def sendSenderDelayPacket(self, scale=0, multiplier=1): timestamp = self.getTimestamp() - + ipv6_packet = IPv6() ipv6_packet.src = self.srcAddr - ipv6_packet.dst = self.segList[0] # primo segmento dst ipv6 outer + ipv6_packet.dst = self.segList[0] # primo segmento dst ipv6 outer - #TODO parte Srv6 qui + # TODO parte Srv6 qui srv6_header = IPv6ExtHdrSegmentRouting() - srv6_header.addresses = self.revSegList # reversed order of segList in srv6 header - srv6_header.segleft = len(self.revSegList) - 1 # -1 beacuse start from 0 + # reversed order of segList in srv6 header + srv6_header.addresses = self.revSegList + srv6_header.segleft = len(self.revSegList) - \ + 1 # -1 beacuse start from 0 srv6_header.lastentry = len(self.revSegList) - 1 ipv6_packet_inside = IPv6() - ipv6_packet_inside.src = self.srcAddr # src ipv6 inner (sender's addr) - ipv6_packet_inside.dst = self.dstAddr # dst ipv6 inner (reflector's addr) - + ipv6_packet_inside.src = self.srcAddr # src ipv6 inner (sender's addr) + # dst ipv6 inner (reflector's addr) + ipv6_packet_inside.dst = self.dstAddr ######### udp_packet = UDP() - udp_packet.dport = 20001 - udp_packet.sport = 20000 + udp_packet.dport = 20001 + udp_packet.sport = 20000 - twampPaylod = twamp.TWAMPTPacketSender(SequenceNumber = self.SequenceNumber, - FirstPartTimestamp = timestamp[0], - SecondPartTimestamp = timestamp[1], - Scale = scale, - Multiplier = multiplier) + twampPaylod = twamp.TWAMPTPacketSender( + SequenceNumber=self.SequenceNumber, + FirstPartTimestamp=timestamp[0], + SecondPartTimestamp=timestamp[1], + Scale=scale, + Multiplier=multiplier) - pkt = (ipv6_packet / srv6_header / ipv6_packet_inside / udp_packet / twampPaylod) # new pkt with srv6 header - + pkt = (ipv6_packet / srv6_header / ipv6_packet_inside / + udp_packet / twampPaylod) # new pkt with srv6 header send(pkt, verbose=1) """ - Method triggered on receiving a reply from the reflector. + Method triggered on receiving a reply from the reflector. This method extracts the fields of the packet received from the reflector in order to evaluate the avatage delay. """ + def recvTWAMPfromReflector(self, packet): packet[UDP].decode_payload_as(twamp.TWAMPTPacketReflector) - if ( packet[UDP].SequenceNumber == self.SequenceNumber): + if (packet[UDP].SequenceNumber == self.SequenceNumber): + + delay = (packet[UDP].FirstPartTimestampReceiver + float("0.%d" % + packet[UDP].SecondPartTimestampReceiver)) - (packet[UDP].FirstPartTimestampSender + float("0.%d" % + packet[UDP].SecondPartTimestampSender)) - delay = (packet[UDP].FirstPartTimestampReceiver + float("0.%d"%packet[UDP].SecondPartTimestampReceiver)) - (packet[UDP].FirstPartTimestampSender + float("0.%d"%packet[UDP].SecondPartTimestampSender)) - - # Welford Online Algorithm for avarage evaluation - self.avarageDelayMeasured = float(self.avarageDelayMeasured) + (delay-self.avarageDelayMeasured)/float(self.SequenceNumber+1) + # Welford Online Algorithm for avarage evaluation + self.avarageDelayMeasured = float(self.avarageDelayMeasured) + ( + delay - self.avarageDelayMeasured) / float(self.SequenceNumber + 1) - if (self.maxPacketSent == self.SequenceNumber + 1): - self.showPacketDelay() - return - else: - self.SequenceNumber = packet[UDP].SequenceNumber + 1 - self.sendSenderDelayPacket() + if (self.maxPacketSent == self.SequenceNumber + 1): + self.showPacketDelay() + return + else: + self.SequenceNumber = packet[UDP].SequenceNumber + 1 + self.sendSenderDelayPacket() else: - #pacchetto scartato + # pacchetto scartato return # Method called automatically when the time delay measurement has finished def showPacketDelay(self): - print("After sending {} packets, the measured delay is: {} seconds".format(self.maxPacketSent, self.avarageDelayMeasured)) - + print("After sending {} packets, the measured delay is: {} seconds".format( + self.maxPacketSent, self.avarageDelayMeasured)) diff --git a/nets-in-progress/riolo-8r-1c-srv6-pm/twamp_test_reflector.py b/nets-in-progress/riolo-8r-1c-srv6-pm/twamp_test_reflector.py index 975d6b9..2dff1a7 100644 --- a/nets-in-progress/riolo-8r-1c-srv6-pm/twamp_test_reflector.py +++ b/nets-in-progress/riolo-8r-1c-srv6-pm/twamp_test_reflector.py @@ -1,7 +1,7 @@ #!/usr/bin/python3 from scapy.all import * -from scapy.layers.inet import IP,UDP +from scapy.layers.inet import IP, UDP from scapy.layers.inet6 import IPv6 import twamp @@ -9,7 +9,8 @@ # segment list file (file esempio con 2 segmenti) seg_file = open("SRv6-List", "r") -seg_list = seg_file.read().splitlines() # suppose symmetric path for sender and reflector +# suppose symmetric path for sender and reflector +seg_list = seg_file.read().splitlines() seg_file.close # ho la lista dei segmenti per il momento # immagino di avere un db con SSID|SegList in cui tramite il SSID diff --git a/nets-in-progress/riolo-8r-1c-srv6-pm/twamp_test_sender.py b/nets-in-progress/riolo-8r-1c-srv6-pm/twamp_test_sender.py index e240483..699a524 100644 --- a/nets-in-progress/riolo-8r-1c-srv6-pm/twamp_test_sender.py +++ b/nets-in-progress/riolo-8r-1c-srv6-pm/twamp_test_sender.py @@ -1,6 +1,6 @@ #!/usr/bin/python3 from scapy.all import * -from scapy.layers.inet import IP,UDP +from scapy.layers.inet import IP, UDP from scapy.layers.inet6 import IPv6 import twamp @@ -14,14 +14,15 @@ # segment list file (file esempio con 2 segmenti) seg_file = open("SRv6-List", "r") -seg_list = seg_file.read().splitlines() +seg_list = seg_file.read().splitlines() seg_file.close -# ho la lista dei segmenti per il momento, +# ho la lista dei segmenti per il momento, # immagino di avere un db con SSID|SegList in cui tramite il SSID # seleziono la seglist relativa # (src e dst IP + src e dst UDP --> SSID) -sender = twamp_dM.Sender(dst_addr, seg_list) # segment list added to Sender class +# segment list added to Sender class +sender = twamp_dM.Sender(dst_addr, seg_list) t_dm = twamp_dM.TWAMPDelayMeasurement(sender=sender) @@ -29,5 +30,4 @@ t_dm.start() time.sleep(2) -sender.sendSenderDelayPacket() - +sender.sendSenderDelayPacket()