1- import time
21import logging
32import os
43import random
5- from unyte_generator .utils .unyte_message_gen import mock_message_generator
6- from unyte_generator .utils .unyte_logger import unyte_logger
7- from unyte_generator .models .unyte_global import UDPN_HEADER_LEN , UDPN_SEGMENTATION_OPT_LEN
8- from unyte_generator .models .udpn import UDPN
4+ import time
5+
6+ from scapy .all import send , wrpcap
7+ from scapy .layers .inet import IP , UDP
8+
99from unyte_generator .models .opt import SEGMENTATION_OPT
1010from unyte_generator .models .payload import PAYLOAD
11- from scapy .layers .inet import IP , UDP
12- from scapy .all import send , wrpcap
11+ from unyte_generator .models .udpn import UDPN
12+ from unyte_generator .models .unyte_global import (UDPN_HEADER_LEN ,
13+ UDPN_SEGMENTATION_OPT_LEN )
14+ from unyte_generator .utils .unyte_logger import unyte_logger
15+ from unyte_generator .utils .unyte_message_gen import mock_message_generator
1316
1417
1518class UDP_notif_generator :
@@ -28,7 +31,7 @@ def __init__(self, args):
2831 self .mtu = args .mtu
2932 self .waiting_time = args .waiting_time
3033 self .probability_of_loss = args .probability_of_loss
31- self .random_order = args .random_order
34+ self .random_order : bool = args .random_order == 1
3235 self .logging_level = args .logging_level
3336 self .capture = args .capture
3437 self .legacy = args .legacy == 1
@@ -46,95 +49,94 @@ def save_pcap(self, filename, packet):
4649 def generate_mock_message (self ):
4750 return self .mock_generator .generate_message (self .message_size )
4851
49- def generate_packet_list (self , packet_amount , maximum_length , current_message ):
50- packet_list = []
52+ def generate_udp_notif_packets (self , msg_payload ):
53+ payload_per_msg_len = self .mtu - UDPN_HEADER_LEN
54+ packet_amount = 1
55+
56+ if (len (msg_payload ) + UDPN_HEADER_LEN ) > self .mtu :
57+ payload_per_msg_len = self .mtu - UDPN_HEADER_LEN - UDPN_SEGMENTATION_OPT_LEN
58+ packet_amount = len (msg_payload ) // payload_per_msg_len
59+ if len (msg_payload ) % payload_per_msg_len != 0 :
60+ packet_amount += 1
61+
62+ udp_notif_packets = []
5163 for packet_increment in range (packet_amount ):
5264 if packet_amount == 1 :
5365 packet = IP (src = self .source_ip , dst = self .destination_ip )/ UDP ()/ UDPN ()/ PAYLOAD ()
5466 else :
5567 packet = IP (src = self .source_ip , dst = self .destination_ip )/ UDP ()/ UDPN ()/ SEGMENTATION_OPT ()/ PAYLOAD ()
5668 packet .sport = self .source_port
5769 packet .dport = self .destination_port
70+
5871 if packet_amount == 1 :
59- packet [PAYLOAD ]. message = current_message
72+ packet [UDPN ]. header_length = UDPN_HEADER_LEN
6073 packet [UDPN ].message_length = packet [UDPN ].header_length + len (packet [PAYLOAD ].message )
74+ packet [PAYLOAD ].message = msg_payload
6175 else :
6276 packet [UDPN ].header_length = UDPN_HEADER_LEN + UDPN_SEGMENTATION_OPT_LEN
6377 packet [SEGMENTATION_OPT ].segment_id = packet_increment
64- if (len (current_message [ maximum_length * packet_increment :]) > maximum_length ):
65- packet [PAYLOAD ].message = current_message [ maximum_length * packet_increment :maximum_length * (packet_increment + 1 )]
78+ if (len (msg_payload [ payload_per_msg_len * packet_increment :]) > payload_per_msg_len ):
79+ packet [PAYLOAD ].message = msg_payload [ payload_per_msg_len * packet_increment :payload_per_msg_len * (packet_increment + 1 )]
6680 packet [UDPN ].message_length = packet [UDPN ].header_length + len (packet [PAYLOAD ].message )
6781 else :
68- packet [PAYLOAD ].message = current_message [ maximum_length * packet_increment :]
82+ packet [PAYLOAD ].message = msg_payload [ payload_per_msg_len * packet_increment :]
6983 packet [UDPN ].message_length = packet [UDPN ].header_length + len (packet [PAYLOAD ].message )
7084 packet [SEGMENTATION_OPT ].last = 1
71- packet_list .append (packet )
72- return packet_list
85+ udp_notif_packets .append (packet )
86+ return udp_notif_packets
7387
74- def forward_current_message (self , packet_list , current_domain_id , current_message_id ) :
88+ def forward_current_message (self , udp_notif_msgs : list , current_domain_id : int ) -> int :
7589 current_message_lost_packets = 0
76- if (self .random_order == 1 ):
77- random .shuffle (packet_list )
78-
79- for packet in packet_list :
90+ if self .random_order :
91+ random .shuffle (udp_notif_msgs )
92+
93+ msg_id = 0
94+ for packet in udp_notif_msgs :
8095 packet [UDPN ].observation_domain_id = current_domain_id
81- packet [UDPN ].message_id = current_message_id
96+ packet [UDPN ].message_id = msg_id
8297 if (self .probability_of_loss == 0 ):
8398 send (packet , verbose = 0 )
8499 elif random .randint (1 , int (1000 * (1 / self .probability_of_loss ))) >= 1000 :
85100 send (packet , verbose = 0 )
86101 else :
87102 current_message_lost_packets += 1
88- if len (packet_list ) == 1 :
103+ if len (udp_notif_msgs ) == 1 :
89104 logging .info ("simulating packet number 0 from message_id " + str (packet [UDPN ].message_id ) + " lost" )
90105 else :
91106 logging .info ("simulating packet number " + str (packet [SEGMENTATION_OPT ].segment_id ) +
92107 " from message_id " + str (packet [UDPN ].message_id ) + " lost" )
93- if len (packet_list ) == 1 :
108+ if len (udp_notif_msgs ) == 1 :
94109 self .logger .log_packet (packet , self .legacy )
95110 else :
96111 self .logger .log_segment (packet , packet [SEGMENTATION_OPT ].segment_id )
97- self .save_pcap ('filtered.pcap' , packet )
112+ self .save_pcap ('captured_udp_notif.pcap' , packet )
113+ msg_id += 1
98114 return current_message_lost_packets
99115
100116 def send_udp_notif (self ):
101117 timer_start = time .time ()
102- observation_domains = []
103- message_ids = {}
104- for i in range (1 + self .additional_domains ):
105- observation_domains .append (self .initial_domain + i )
106- message_ids [observation_domains [i ]] = 0
107118
108119 self .logger .log_used_args (self )
109- current_message = self .generate_mock_message ()
110- maximum_length = self .mtu - UDPN_HEADER_LEN
120+ msg_payload = self .generate_mock_message ()
111121
112122 lost_packets = 0
113123 forwarded_packets = 0
114- message_increment = 0
115-
116- if len (current_message ) > maximum_length :
117- maximum_length = self .mtu - UDPN_HEADER_LEN - UDPN_SEGMENTATION_OPT_LEN
118- packet_amount = len (current_message ) // maximum_length
119- if len (current_message ) % maximum_length != 0 :
120- packet_amount += 1
121- else :
122- packet_amount = 1
123124
124125 # Generate packet only once
125- packets_list = self .generate_packet_list (packet_amount , maximum_length , current_message )
126+ udp_notif_msgs = self .generate_udp_notif_packets (msg_payload )
127+ observation_domain_id = self .initial_domain
126128
127- while message_increment < self .message_amount :
128- current_domain_id = observation_domains [message_increment % len (observation_domains )]
129- current_message_id = message_ids [current_domain_id ]
130- message_ids [current_domain_id ] += 1
129+ for _ in range (self .message_amount ):
131130
132- current_message_lost_packets = self .forward_current_message (packets_list , current_domain_id , current_message_id )
133-
134- forwarded_packets += len (packets_list ) - current_message_lost_packets
131+ current_message_lost_packets : int = self .forward_current_message (udp_notif_msgs , observation_domain_id )
132+ forwarded_packets += len (udp_notif_msgs ) - current_message_lost_packets
135133 lost_packets += current_message_lost_packets
134+
136135 time .sleep (self .waiting_time )
137- message_increment += 1
136+ observation_domain_id += 1
137+
138+ if observation_domain_id > (self .initial_domain + self .additional_domains ):
139+ observation_domain_id = self .initial_domain
138140
139141 timer_end = time .time ()
140142 generation_total_duration = timer_end - timer_start
0 commit comments