Skip to content

Commit 47bf69d

Browse files
committed
refactor: observation domain id management simplified
1 parent 175b502 commit 47bf69d

File tree

5 files changed

+114
-118
lines changed

5 files changed

+114
-118
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,5 +138,6 @@ dmypy.json
138138
cython_debug/
139139

140140
# own custom files
141-
filtered.pcap
141+
captured_udp_notif.pcap
142142
pids
143+
.DS_Store

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ $ sudo python3 src/main.py <src_ipv4> <dst_ipv4> <port_src> <port_dst>
4242

4343
- `--capture x` or `-c x` : (INT) Set to 1 if you need a wireshark capture of the forwarded packets, x = 1 or x = 0, Default: `0`
4444

45-
- `--legacy x` or `-e x` : (INT) Set to 1 if you generate legacy headers: [draft-ietf-netconf-udp-pub-channel-05](https://datatracker.ietf.org/doc/draft-ietf-netconf-udp-pub-channel/), x = 1 or x = 0, Default: `0`
45+
- `--legacy x` or `-e x` : (INT) Set to 1 if you generate legacy headers: [draft-ietf-netconf-udp-pub-channel-05](https://datatracker.ietf.org/doc/draft-ietf-netconf-udp-pub-channel/), /!\ No segmentation is possible. x = 1 or x = 0, Default: `0`
4646

4747
## Examples
4848

src/resources/small.json

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,39 @@
11
{
2-
"random": 17,
3-
"random float": 26.838,
4-
"bool": true,
5-
"date": "1989-10-28",
6-
"regEx": "hellooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo world",
7-
"enum": "json",
8-
"firstname": "Ellette",
9-
"lastname": "Arne",
10-
"city": "Hagåtña",
11-
"country": "Uzbekistan",
12-
"countryCode": "OM",
13-
"email uses current data": "Ellette.Arne@gmail.com",
14-
"email from expression": "Ellette.Arne@yopmail.com",
15-
"array": [
16-
"Cristine",
17-
"Allis",
18-
"Feliza",
19-
"Tomasina",
20-
"Annice"
21-
],
22-
"array of objects": [
23-
{
24-
"index": 0,
25-
"index start at 5": 5
26-
},
27-
{
28-
"index": 1,
29-
"index start at 5": 6
30-
},
31-
{
32-
"index": 2,
33-
"index start at 5": 7
34-
}
35-
],
36-
"Courtnay": {
37-
"age": 57
38-
}
2+
"random": 17,
3+
"random float": 26.838,
4+
"bool": true,
5+
"date": "1989-10-28",
6+
"regEx": "hellooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo world",
7+
"enum": "json",
8+
"firstname": "Ellette",
9+
"lastname": "Arne",
10+
"city": "Tokyo",
11+
"country": "Japan",
12+
"countryCode": "OM",
13+
"email uses current data": "Ellette.Arne@gmail.com",
14+
"email from expression": "Ellette.Arne@yopmail.com",
15+
"array": [
16+
"Cristine",
17+
"Allis",
18+
"Feliza",
19+
"Tomasina",
20+
"Annice"
21+
],
22+
"array of objects": [
23+
{
24+
"index": 0,
25+
"index start at 5": 5
26+
},
27+
{
28+
"index": 1,
29+
"index start at 5": 6
30+
},
31+
{
32+
"index": 2,
33+
"index start at 5": 7
34+
}
35+
],
36+
"Courtnay": {
37+
"age": 57
38+
}
3939
}

src/unyte_generator/unyte_generator.py

Lines changed: 52 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
1-
import time
21
import logging
32
import os
43
import 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+
99
from unyte_generator.models.opt import SEGMENTATION_OPT
1010
from 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

1518
class 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

src/unyte_generator/unyte_generator_legacy_proto.py

Lines changed: 22 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
1-
import time
21
import logging
32
import os
43
import 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_LEGACY_HEADER_LEN
8-
from unyte_generator.models.udpn_legacy import UDPN_legacy
9-
from unyte_generator.models.payload import PAYLOAD
10-
from scapy.layers.inet import IP, UDP
4+
import time
5+
116
from scapy.all import send, wrpcap
7+
from scapy.layers.inet import IP, UDP
8+
9+
from unyte_generator.models.payload import PAYLOAD
10+
from unyte_generator.models.udpn_legacy import UDPN_legacy
11+
from unyte_generator.models.unyte_global import UDPN_LEGACY_HEADER_LEN
12+
from unyte_generator.utils.unyte_logger import unyte_logger
13+
from unyte_generator.utils.unyte_message_gen import mock_message_generator
1214

1315

1416
class UDP_notif_generator_legacy:
@@ -55,14 +57,15 @@ def generate_packet_list(self, current_message):
5557
packet_list.append(packet)
5658
return packet_list
5759

58-
def forward_current_message(self, packet_list, current_domain_id, current_message_id):
60+
def forward_current_message(self, packet_list, current_domain_id):
5961
current_message_lost_packets = 0
6062
if (self.random_order == 1):
6163
random.shuffle(packet_list)
62-
64+
65+
msg_id = 0
6366
for packet in packet_list:
6467
packet[UDPN_legacy].observation_domain_id = current_domain_id
65-
packet[UDPN_legacy].message_id = current_message_id
68+
packet[UDPN_legacy].message_id = msg_id
6669
if (self.probability_of_loss == 0):
6770
send(packet, verbose=0)
6871
elif random.randint(1, int(1000 * (1 / self.probability_of_loss))) >= 1000:
@@ -71,42 +74,32 @@ def forward_current_message(self, packet_list, current_domain_id, current_messag
7174
current_message_lost_packets += 1
7275
logging.info("simulating packet number 0 from message_id " + str(packet[UDPN_legacy].message_id) + " lost")
7376
self.logger.log_packet(packet, self.legacy)
74-
77+
msg_id += 1
7578
self.save_pcap('filtered.pcap', packet)
79+
7680
return current_message_lost_packets
7781

7882
def send_udp_notif(self):
7983
timer_start = time.time()
80-
observation_domains = []
81-
message_ids = {}
82-
for i in range(1 + self.additional_domains):
83-
observation_domains.append(self.initial_domain + i)
84-
message_ids[observation_domains[i]] = 0
8584

8685
self.logger.log_used_args(self)
8786
current_message = self.generate_mock_message()
88-
maximum_length = self.mtu - UDPN_LEGACY_HEADER_LEN
8987

9088
lost_packets = 0
9189
forwarded_packets = 0
92-
message_increment = 0
93-
94-
packet_amount = 1
9590

9691
# Generate packet only once
9792
packets_list = self.generate_packet_list(current_message)
98-
99-
while message_increment < self.message_amount:
100-
current_domain_id = observation_domains[message_increment % len(observation_domains)]
101-
current_message_id = message_ids[current_domain_id]
102-
message_ids[current_domain_id] += 1
103-
104-
current_message_lost_packets = self.forward_current_message(packets_list, current_domain_id, current_message_id)
105-
93+
obs_domain_id = self.initial_domain
94+
for _ in range(self.message_amount):
95+
current_message_lost_packets = self.forward_current_message(packets_list, obs_domain_id)
10696
forwarded_packets += len(packets_list) - current_message_lost_packets
10797
lost_packets += current_message_lost_packets
10898
time.sleep(self.waiting_time)
109-
message_increment += 1
99+
100+
obs_domain_id += 1
101+
if obs_domain_id > (self.initial_domain + self.additional_domains):
102+
obs_domain_id = self.initial_domain
110103

111104
timer_end = time.time()
112105
generation_total_duration = timer_end - timer_start

0 commit comments

Comments
 (0)