Esempio n. 1
0
 def generate_packet_list(self, packet_amount, maximum_length,
                          current_message):
     packet_list = []
     for packet_increment in range(packet_amount):
         if packet_amount == 1:
             packet = IP(
                 src=self.source_ip,
                 dst=self.destination_ip) / UDP() / UDPN() / PAYLOAD()
         else:
             packet = IP(src=self.source_ip, dst=self.destination_ip) / UDP(
             ) / UDPN() / OPT() / PAYLOAD()
         packet.sport = self.source_port
         packet.dport = self.destination_port
         if packet_amount == 1:
             packet[PAYLOAD].message = current_message
             packet[UDPN].message_length = packet[UDPN].header_length + len(
                 packet[PAYLOAD].message)
         else:
             packet[
                 UDPN].header_length = UDPN_header_length + OPT_header_length
             packet[OPT].segment_id = packet_increment
             if (len(current_message[maximum_length * packet_increment:]) >
                     maximum_length):
                 packet[PAYLOAD].message = current_message[
                     maximum_length * packet_increment:maximum_length *
                     (packet_increment + 1)]
                 packet[UDPN].message_length = packet[
                     UDPN].header_length + len(packet[PAYLOAD].message)
             else:
                 packet[PAYLOAD].message = current_message[
                     maximum_length * packet_increment:]
                 packet[UDPN].message_length = packet[
                     UDPN].header_length + len(packet[PAYLOAD].message)
                 packet[OPT].last = 1
         packet_list.append(packet)
     return packet_list
Esempio n. 2
0
    def send_udp_notif(self):

        start = time.time()
        npackets = 0
        observation_domains = []
        message_ids = {}
        for i in range(1 + self.additional_domains):
            observation_domains.append(self.initial_domain + i)
            message_ids[observation_domains[i]] = 0

        self.log_used_args()

        message = self.generate_mock_message()

        maximum_length = self.mtu - UDPN_header_length

        message_increment = 0
        messages_lost = 0

        while message_increment < self.message_amount:

            message_increment += 1

            segment_list = []

            if message_increment != 0:
                # TODO: may be a better way to do that ?
                if self.message_type == "rand":
                    message = self.generate_mock_message()
                time.sleep(self.sleep_time)

            domain = observation_domains[message_increment %
                                         len(observation_domains)]

            # SEGMENTATION
            if len(message) > maximum_length:

                maximum_length = self.mtu - UDPN_header_length - OPT_header_length
                segment_amount = len(message) // maximum_length
                if len(message) % maximum_length != 0:
                    segment_amount += 1

                for segment_increment in range(segment_amount):
                    segment = IP(src=self.source_ip, dst=self.destination_ip
                                 ) / UDP() / UDPN() / OPT() / PAYLOAD()
                    segment.sport = self.source_port
                    segment.dport = self.destination_port
                    segment[UDPN].observation_domain_id = domain
                    segment[UDPN].message_id = message_ids[domain]
                    segment[
                        UDPN].header_length = UDPN_header_length + OPT_header_length
                    segment[OPT].segment_id = segment_increment
                    if (len(message[maximum_length * segment_increment:]) >
                            maximum_length):
                        segment[PAYLOAD].message = message[
                            maximum_length * segment_increment:maximum_length *
                            (segment_increment + 1)]
                        segment[UDPN].message_length = segment[
                            UDPN].header_length + len(segment[PAYLOAD].message)
                    else:
                        segment[PAYLOAD].message = message[maximum_length *
                                                           segment_increment:]
                        segment[UDPN].message_length = segment[
                            UDPN].header_length + len(segment[PAYLOAD].message)
                        segment[OPT].last = 1
                        message_ids[domain] += 1

                    self.log_segment(segment_increment, segment)

                    segment_list.append(segment)
                    self.save_pcap('filtered.pcap', segment)

            # NO SEGMENTATION
            else:
                packet = IP(
                    src=self.source_ip,
                    dst=self.destination_ip) / UDP() / UDPN() / PAYLOAD()
                packet.sport = self.source_port
                packet.dport = self.destination_port
                packet[PAYLOAD].message = message
                packet[UDPN].message_length = packet[UDPN].header_length + len(
                    packet[PAYLOAD].message)
                packet[UDPN].observation_domain_id = domain
                packet[UDPN].message_id = message_ids[domain]
                message_ids[domain] += 1

                self.log_packet(packet)

                if self.loss_probability == 0:
                    send(packet, verbose=0)
                    npackets += 1

                    self.save_pcap('filtered.pcap', packet)
                elif random.randint(1, int(1 / self.loss_probability)) != 1:
                    send(packet, verbose=0)
                    npackets += 1
                    self.save_pcap('filtered.pcap', packet)
                else:
                    messages_lost += 1
                    logging.info("simulating packet " +
                                 str(packet[UDPN].message_id) + " lost")

            if (self.random_order == 1):
                random.shuffle(segment_list)

            for i in range(len(segment_list)):
                if (self.loss_probability == 0):
                    send(segment_list[i], verbose=0)
                    npackets += 1
                elif random.randint(1, int(
                        1000 * (1 / self.loss_probability))) >= 1000:
                    send(segment_list[i], verbose=0)
                    npackets += 1
                else:
                    messages_lost += 1
                    logging.info("simulating segment " +
                                 str(segment_list[i][OPT].segment_id) +
                                 " from message " +
                                 str(segment_list[i][UDPN].message_id) +
                                 " lost")
        end = time.time()
        duration = end - start
        logging.info('Sent ' + str(npackets) + ' in ' + str(duration))
        logging.info('Simulated %d lost messages from %d total messages',
                     messages_lost, (npackets + messages_lost))
        return