Source code for csle_common.dao.emulation_config.node_network_config

"""
Network configuration of a container in the emulation
"""
from typing import Dict, Any
from csle_common.dao.emulation_config.packet_loss_type import PacketLossType
from csle_common.dao.emulation_config.packet_delay_distribution_type import PacketDelayDistributionType
import csle_common.constants.constants as constants
from csle_base.json_serializable import JSONSerializable


[docs]class NodeNetworkConfig(JSONSerializable): """ A DTO object representing the network configuration of a specific container in an emulation environment """ def __init__(self, interface: str = constants.NETWORKING.ETH0, limit_packets_queue: int = 30000, packet_delay_ms: float = 0.1, packet_delay_jitter_ms: float = 0.025, packet_delay_correlation_percentage: float = 25, packet_delay_distribution: PacketDelayDistributionType = PacketDelayDistributionType.PARETO, packet_loss_type: PacketLossType = PacketLossType.GEMODEL, packet_loss_rate_random_percentage: float = 2, packet_loss_random_correlation_percentage: float = 25, loss_state_markov_chain_p13: float = 0.1, loss_state_markov_chain_p31: float = 0.1, loss_state_markov_chain_p32: float = 0.1, loss_state_markov_chain_p23: float = 0.1, loss_state_markov_chain_p14: float = 0.1, loss_gemodel_p: float = 0.0001, loss_gemodel_r: float = 0.999, loss_gemodel_h: float = 0.0001, loss_gemodel_k: float = 0.9999, packet_corrupt_percentage: float = 0.00001, packet_corrupt_correlation_percentage: float = 25, packet_duplicate_percentage: float = 0.00001, packet_duplicate_correlation_percentage: float = 25, packet_reorder_percentage: float = 0.0025, packet_reorder_correlation_percentage: float = 25, packet_reorder_gap: int = 5, rate_limit_mbit: float = 100, packet_overhead_bytes: int = 0, cell_overhead_bytes: int = 0): """ Initializes the DTO :param interface: the name of the network interface :param limit_packets_queue: Maximum number of packets that the output queue (queueing discpline) stores Note that to be able to rate limit at relatively high speeds, this queue must be quite large (FIFO by default) :param packet_delay_ms: a delay that is added to outgoing packets (specified in ms) :param packet_delay_jitter_ms: the jitter of the dealy added to outgoing packets (specified in ms) :param packet_delay_correlation_percentage: the amount of correlation in delay of outgoing packets (specified in %) for example delay 100ms jitter=10ms correlation=25% causes delay to be 100ms +- 10ms with successive packets depending 25% on each other :param packet_delay_distribution: the delay distribution, defaults to Gaussian, but can also be uniform, normal, pareto, or paretonormal :param packet_loss_type: the type of packet loss (random, state, or gemodel) :param packet_loss_rate_random_percentage: The packet loss percent when using the random packet loss type :param packet_loss_random_correlation_percentage: The packet loss correlation when using the random packet loss type :param loss_state_markov_chain_p13: The 1->3 transition probability when using the 2-state Markov chain state loss type :param loss_state_markov_chain_p31: The 3->1 transition probability when using the 2,3,or 4-state Markov chain state loss type :param loss_state_markov_chain_p32: The 3->2 transition probability when using the 3,or 4-state Markov chain state loss type :param loss_state_markov_chain_p23: The 2->3 transition probability when using the 3,or 4-state Markov chain state loss type :param loss_state_markov_chain_p14: The 1->4 transition probability when using the 4-state Markov chain state loss type :param loss_gemodel_p: The p parameter when using the Bernoulli,Simple Gilbert or Gilbert model in the gemodel loss type :param loss_gemodel_r: The p parameter when using the Simple Gilbert or Gilbert-Elliot model in the gemodel loss type :param loss_gemodel_h: The h parameter when using the Simple Gilbert or Gilbert-Elliot model in the gemodel loss type :param loss_gemodel_k: The k parameter when using the Gilbert-Elliot model in the gemodel loss type :param packet_corrupt_percentage: The percentage of corrupt outgoing packets :param packet_corrupt_correlation_percentage: The correlation of corrupt outgoing packets :param packet_duplicate_percentage: The percentage of duplicated outgoing packets :param packet_duplicate_correlation_percentage: The correlation of duplicated outgoing packets :param packet_reorder_percentage: The percentage of reordered packets :param packet_reorder_correlation_percentage: The correlation of reordered packets :param packet_reorder_gap: The packet reordering gap :param rate_limit_mbit: The bandwidth limit :param packet_overhead_bytes: The emulated packet overhead :param cell_overhead_bytes: The emulated cell overhead """ self.interface = interface self.limit_packets_queue = limit_packets_queue self.packet_delay_ms = packet_delay_ms self.packet_delay_jitter_ms = packet_delay_jitter_ms self.packet_delay_correlation_percentage = packet_delay_correlation_percentage self.packet_delay_distribution = packet_delay_distribution self.packet_loss_type = packet_loss_type self.packet_loss_rate_random_percentage = packet_loss_rate_random_percentage self.packet_loss_random_correlation_percentage = packet_loss_random_correlation_percentage self.loss_state_markov_chain_p13 = loss_state_markov_chain_p13 self.loss_state_markov_chain_p31 = loss_state_markov_chain_p31 self.loss_state_markov_chain_p32 = loss_state_markov_chain_p32 self.loss_state_markov_chain_p23 = loss_state_markov_chain_p23 self.loss_state_markov_chain_p14 = loss_state_markov_chain_p14 self.loss_gemodel_p = loss_gemodel_p self.loss_gemodel_r = loss_gemodel_r self.loss_gemodel_h = loss_gemodel_h self.loss_gemodel_k = loss_gemodel_k self.packet_corrupt_percentage = packet_corrupt_percentage self.packet_corrupt_correlation_percentage = packet_corrupt_correlation_percentage self.packet_duplicate_percentage = packet_duplicate_percentage self.packet_duplicate_correlation_percentage = packet_duplicate_correlation_percentage self.packet_reorder_percentage = packet_reorder_percentage self.packet_reorder_correlation_percentage = packet_reorder_correlation_percentage self.packet_reorder_gap = packet_reorder_gap self.rate_limit_mbit = rate_limit_mbit self.packet_overhead_bytes = packet_overhead_bytes self.cell_overhead_bytes = cell_overhead_bytes
[docs] @staticmethod def from_dict(d: Dict[str, Any]) -> "NodeNetworkConfig": """ Converts a dict representation to an instance :param d: the dict to convert :return: the converted instance """ obj = NodeNetworkConfig( interface=d["interface"], limit_packets_queue=d["limit_packets_queue"], packet_delay_ms=d["packet_delay_ms"], packet_delay_jitter_ms=d["packet_delay_jitter_ms"], packet_delay_correlation_percentage=d["packet_delay_correlation_percentage"], packet_delay_distribution=d["packet_delay_distribution"], packet_loss_type=d["packet_loss_type"], packet_loss_rate_random_percentage=d["packet_loss_rate_random_percentage"], packet_loss_random_correlation_percentage=d["packet_loss_random_correlation_percentage"], loss_state_markov_chain_p13=d["loss_state_markov_chain_p13"], loss_state_markov_chain_p31=d["loss_state_markov_chain_p31"], loss_state_markov_chain_p32=d["loss_state_markov_chain_p32"], loss_state_markov_chain_p23=d["loss_state_markov_chain_p23"], loss_state_markov_chain_p14=d["loss_state_markov_chain_p14"], loss_gemodel_p=d["loss_gemodel_p"], loss_gemodel_r=d["loss_gemodel_r"], loss_gemodel_h=d["loss_gemodel_h"], loss_gemodel_k=d["loss_gemodel_k"], packet_corrupt_percentage=d["packet_corrupt_percentage"], packet_corrupt_correlation_percentage=d["packet_corrupt_correlation_percentage"], packet_duplicate_percentage=d["packet_duplicate_percentage"], packet_duplicate_correlation_percentage=d["packet_duplicate_correlation_percentage"], packet_reorder_percentage=d["packet_reorder_percentage"], packet_reorder_correlation_percentage=d["packet_reorder_correlation_percentage"], packet_reorder_gap=d["packet_reorder_gap"], rate_limit_mbit=d["rate_limit_mbit"], packet_overhead_bytes=d["packet_overhead_bytes"], cell_overhead_bytes=d["cell_overhead_bytes"] ) return obj
[docs] def to_dict(self) -> Dict[str, Any]: """ Converts the object to a dict representation :return: a dict representation of the object """ d: Dict[str, Any] = {} d["interface"] = self.interface d["limit_packets_queue"] = self.limit_packets_queue d["packet_delay_ms"] = self.packet_delay_ms d["packet_delay_jitter_ms"] = self.packet_delay_jitter_ms d["packet_delay_correlation_percentage"] = self.packet_delay_correlation_percentage d["packet_delay_distribution"] = self.packet_delay_distribution d["packet_loss_type"] = self.packet_loss_type d["packet_loss_rate_random_percentage"] = self.packet_loss_rate_random_percentage d["packet_loss_random_correlation_percentage"] = self.packet_loss_random_correlation_percentage d["loss_state_markov_chain_p13"] = self.loss_state_markov_chain_p13 d["loss_state_markov_chain_p31"] = self.loss_state_markov_chain_p31 d["loss_state_markov_chain_p32"] = self.loss_state_markov_chain_p32 d["loss_state_markov_chain_p23"] = self.loss_state_markov_chain_p23 d["loss_state_markov_chain_p14"] = self.loss_state_markov_chain_p14 d["loss_gemodel_p"] = self.loss_gemodel_p d["loss_gemodel_r"] = self.loss_gemodel_r d["loss_gemodel_h"] = self.loss_gemodel_h d["loss_gemodel_k"] = self.loss_gemodel_k d["packet_corrupt_percentage"] = self.packet_corrupt_percentage d["packet_corrupt_correlation_percentage"] = self.packet_corrupt_correlation_percentage d["packet_duplicate_percentage"] = self.packet_duplicate_percentage d["packet_duplicate_correlation_percentage"] = self.packet_duplicate_correlation_percentage d["packet_reorder_percentage"] = self.packet_reorder_percentage d["packet_reorder_correlation_percentage"] = self.packet_reorder_correlation_percentage d["packet_reorder_gap"] = self.packet_reorder_gap d["rate_limit_mbit"] = self.rate_limit_mbit d["packet_overhead_bytes"] = self.packet_overhead_bytes d["cell_overhead_bytes"] = self.cell_overhead_bytes return d
def __str__(self) -> str: """ :return: a string representation of the DTO """ return f"limits_packets_queue:{self.limit_packets_queue}, packet_delay_ms:{self.packet_delay_ms}, " \ f"packet_delay_jitter_ms:{self.packet_delay_jitter_ms}, " \ f"packet_delay_correlation_percentage: {self.packet_delay_correlation_percentage}, " \ f"packet_delay_distribution: {self.packet_delay_distribution}, " \ f"packet_loss_type:{self.packet_loss_type}, " \ f"packet_loss_rate_random_percentage: {self.packet_loss_rate_random_percentage}, " \ f"packet_loss_correlation_percentage: {self.packet_loss_random_correlation_percentage}, " \ f"loss_state_markov_chain_p13: {self.loss_state_markov_chain_p13}, " \ f"loss_state_markov_chain_p31: {self.loss_state_markov_chain_p31}, " \ f"loss_state_markov_chain_p32: {self.loss_state_markov_chain_p32}, " \ f"loss_state_markov_chain_p23: {self.loss_state_markov_chain_p23}, " \ f"loss_state_markov_chain_p14: {self.loss_state_markov_chain_p14}, " \ f"loss_gemodel_p:{self.loss_gemodel_p}, loss_gemodel_r: {self.loss_gemodel_r}, " \ f"loss_gemodel_h:{self.loss_gemodel_h}, loss_gemodel_k:{self.loss_gemodel_k}, " \ f"packet_corrupt_percentage:{self.packet_corrupt_percentage}, " \ f"packet_corrupt_correlation_percentage:{self.packet_corrupt_correlation_percentage}, " \ f"packet_duplicate_percentage:{self.packet_duplicate_percentage}, " \ f"packet_duplicate_correlation_percentage:{self.packet_duplicate_correlation_percentage}, " \ f"packet_reorder_percentage:{self.packet_reorder_percentage}, " \ f"packet_reorder_correlation_percentage:{self.packet_reorder_correlation_percentage}, " \ f"packet_reorder_gap: {self.packet_reorder_gap}" \ f"rate_limit_mbit:{self.rate_limit_mbit}, packet_overhead_bytes:{self.packet_overhead_bytes}," \ f"cell_overhead_bytes:{self.cell_overhead_bytes}"
[docs] @staticmethod def from_json_file(json_file_path: str) -> "NodeNetworkConfig": """ Reads a json file and converts it to a DTO :param json_file_path: the json file path :return: the converted DTO """ import io import json with io.open(json_file_path, 'r') as f: json_str = f.read() return NodeNetworkConfig.from_dict(json.loads(json_str))
[docs] def copy(self) -> "NodeNetworkConfig": """ :return: a copy of the DTO """ return NodeNetworkConfig.from_dict(self.to_dict())
[docs] @staticmethod def schema() -> "NodeNetworkConfig": """ :return: get the schema of the DTO """ return NodeNetworkConfig()