def get_nem_link( self, nem1: int, nem2: int, flags: MessageFlags = MessageFlags.NONE) -> Optional[LinkData]: iface1 = self.get_iface(nem1) if not iface1: logging.error("invalid nem: %s", nem1) return None node1 = iface1.node iface2 = self.get_iface(nem2) if not iface2: logging.error("invalid nem: %s", nem2) return None node2 = iface2.node if iface1.net != iface2.net: return None emane_net = iface1.net color = self.session.get_link_color(emane_net.id) return LinkData( message_type=flags, type=LinkTypes.WIRELESS, node1_id=node1.id, node2_id=node2.id, network_id=emane_net.id, color=color, )
def links(self, flags: MessageFlags = MessageFlags.NONE) -> List[LinkData]: """ Build link data objects for this network. Each link object describes a link between this network and a node. :param flags: message type :return: list of link data """ all_links = [] # build a link message from this network node to each node having a # connected interface for iface in self.get_ifaces(): unidirectional = 0 linked_node = iface.node if linked_node is None: # two layer-2 switches/hubs linked together if not iface.othernet: continue linked_node = iface.othernet if linked_node.id == self.id: continue if iface.local_options != iface.options: unidirectional = 1 iface_data = iface.get_data() link_data = LinkData( message_type=flags, type=self.linktype, node1_id=self.id, node2_id=linked_node.id, iface2=iface_data, options=iface.local_options, ) link_data.options.unidirectional = unidirectional all_links.append(link_data) if unidirectional: link_data = LinkData( message_type=MessageFlags.NONE, type=self.linktype, node1_id=linked_node.id, node2_id=self.id, options=iface.options, ) link_data.options.unidirectional = unidirectional all_links.append(link_data) return all_links
def links(self, flags: MessageFlags = MessageFlags.NONE) -> List[LinkData]: """ Build CORE API TLVs for a point-to-point link. One Link message describes this network. :param flags: message flags :return: list of link data """ all_links = [] if len(self.ifaces) != 2: return all_links ifaces = self.get_ifaces() iface1 = ifaces[0] iface2 = ifaces[1] unidirectional = 0 if iface1.local_options == iface2.local_options else 1 iface1_data = iface1.get_data() iface2_data = iface2.get_data() link_data = LinkData( message_type=flags, type=self.linktype, node1_id=iface1.node.id, node2_id=iface2.node.id, iface1=iface1_data, iface2=iface2_data, options=iface1.local_options, ) link_data.options.unidirectional = unidirectional all_links.append(link_data) # build a 2nd link message for the upstream link parameters # (swap if1 and if2) if unidirectional: link_data = LinkData( message_type=MessageFlags.NONE, type=self.linktype, node1_id=iface2.node.id, node2_id=iface1.node.id, iface1=InterfaceData(id=iface2_data.id), iface2=InterfaceData(id=iface1_data.id), options=iface2.local_options, ) link_data.options.unidirectional = unidirectional all_links.append(link_data) return all_links
def create_link_data(self, interface1, interface2, message_type): """ Create a wireless link/unlink data message. :param core.coreobj.PyCoreNetIf interface1: interface one :param core.coreobj.PyCoreNetIf interface2: interface two :param message_type: link message type :return: link data :rtype: LinkData """ return LinkData(message_type=message_type, node1_id=interface1.node.id, node2_id=interface2.node.id, network_id=self.wlan.id, link_type=LinkTypes.WIRELESS.value)
def send_message( self, message_type: MessageFlags, label: str, node_one: int, node_two: int, emane_id: int, ) -> None: link_data = LinkData( message_type=message_type, label=label, node1_id=node_one, node2_id=node_two, network_id=emane_id, link_type=LinkTypes.WIRELESS, ) self.emane_manager.session.broadcast_link(link_data)
def create_link_data(self, interface1: CoreInterface, interface2: CoreInterface, message_type: int) -> LinkData: """ Create a wireless link/unlink data message. :param interface1: interface one :param interface2: interface two :param message_type: link message type :return: link data """ return LinkData( message_type=message_type, node1_id=interface1.node.id, node2_id=interface2.node.id, network_id=self.wlan.id, link_type=LinkTypes.WIRELESS.value, )
def create_link_data(self, iface1: CoreInterface, iface2: CoreInterface, message_type: MessageFlags) -> LinkData: """ Create a wireless link/unlink data message. :param iface1: interface one :param iface2: interface two :param message_type: link message type :return: link data """ color = self.session.get_link_color(self.wlan.id) return LinkData( message_type=message_type, type=LinkTypes.WIRELESS, node1_id=iface1.node.id, node2_id=iface2.node.id, network_id=self.wlan.id, color=color, )
def send_message( self, message_type: MessageFlags, label: str, node1: int, node2: int, emane_id: int, ) -> None: color = self.emane_manager.session.get_link_color(emane_id) link_data = LinkData( message_type=message_type, type=LinkTypes.WIRELESS, label=label, node1_id=node1, node2_id=node2, network_id=emane_id, color=color, ) self.emane_manager.session.broadcast_link(link_data)
def get_nem_link( self, nem1: int, nem2: int, flags: MessageFlags = MessageFlags.NONE) -> Optional[LinkData]: emane1, netif = self.nemlookup(nem1) if not emane1 or not netif: logging.error("invalid nem: %s", nem1) return None node1 = netif.node emane2, netif = self.nemlookup(nem2) if not emane2 or not netif: logging.error("invalid nem: %s", nem2) return None node2 = netif.node color = self.session.get_link_color(emane1.id) return LinkData( message_type=flags, node1_id=node1.id, node2_id=node2.id, network_id=emane1.id, link_type=LinkTypes.WIRELESS, color=color, )
def all_link_data(self, flags): """ Build link data objects for this network. Each link object describes a link between this network and a node. """ all_links = [] # build a link message from this network node to each node having a # connected interface for netif in self.netifs(sort=True): if not hasattr(netif, "node"): continue linked_node = netif.node uni = False if linked_node is None: # two layer-2 switches/hubs linked together via linknet() if not hasattr(netif, "othernet"): continue linked_node = netif.othernet if linked_node.id == self.id: continue netif.swapparams('_params_up') upstream_params = netif.getparams() netif.swapparams('_params_up') if netif.getparams() != upstream_params: uni = True unidirectional = 0 if uni: unidirectional = 1 interface2_ip4 = None interface2_ip4_mask = None interface2_ip6 = None interface2_ip6_mask = None for address in netif.addrlist: ip, _sep, mask = address.partition("/") mask = int(mask) if ipaddress.is_ipv4_address(ip): family = AF_INET ipl = socket.inet_pton(family, ip) interface2_ip4 = ipaddress.IpAddress(af=family, address=ipl) interface2_ip4_mask = mask else: family = AF_INET6 ipl = socket.inet_pton(family, ip) interface2_ip6 = ipaddress.IpAddress(af=family, address=ipl) interface2_ip6_mask = mask link_data = LinkData(message_type=flags, node1_id=self.id, node2_id=linked_node.id, link_type=self.linktype, unidirectional=unidirectional, interface2_id=linked_node.getifindex(netif), interface2_mac=netif.hwaddr, interface2_ip4=interface2_ip4, interface2_ip4_mask=interface2_ip4_mask, interface2_ip6=interface2_ip6, interface2_ip6_mask=interface2_ip6_mask, delay=netif.getparam("delay"), bandwidth=netif.getparam("bw"), dup=netif.getparam("duplicate"), jitter=netif.getparam("jitter"), per=netif.getparam("loss")) all_links.append(link_data) if not uni: continue netif.swapparams('_params_up') link_data = LinkData(message_type=0, node1_id=linked_node.id, node2_id=self.id, unidirectional=1, delay=netif.getparam("delay"), bandwidth=netif.getparam("bw"), dup=netif.getparam("duplicate"), jitter=netif.getparam("jitter"), per=netif.getparam("loss")) netif.swapparams('_params_up') all_links.append(link_data) return all_links
def links(self, flags: MessageFlags = MessageFlags.NONE) -> List[LinkData]: """ Build link data objects for this network. Each link object describes a link between this network and a node. :param flags: message type :return: list of link data """ all_links = [] # build a link message from this network node to each node having a # connected interface for iface in self.get_ifaces(): uni = False linked_node = iface.node if linked_node is None: # two layer-2 switches/hubs linked together via linknet() if not iface.othernet: continue linked_node = iface.othernet if linked_node.id == self.id: continue iface.swapparams("_params_up") upstream_params = iface.getparams() iface.swapparams("_params_up") if iface.getparams() != upstream_params: uni = True unidirectional = 0 if uni: unidirectional = 1 mac = str(iface.mac) if iface.mac else None iface2_data = InterfaceData(id=linked_node.get_iface_id(iface), name=iface.name, mac=mac) ip4 = iface.get_ip4() if ip4: iface2_data.ip4 = str(ip4.ip) iface2_data.ip4_mask = ip4.prefixlen ip6 = iface.get_ip6() if ip6: iface2_data.ip6 = str(ip6.ip) iface2_data.ip6_mask = ip6.prefixlen options_data = iface.get_link_options(unidirectional) link_data = LinkData( message_type=flags, type=self.linktype, node1_id=self.id, node2_id=linked_node.id, iface2=iface2_data, options=options_data, ) all_links.append(link_data) if not uni: continue iface.swapparams("_params_up") options_data = iface.get_link_options(unidirectional) link_data = LinkData( message_type=MessageFlags.NONE, type=self.linktype, node1_id=linked_node.id, node2_id=self.id, options=options_data, ) iface.swapparams("_params_up") all_links.append(link_data) return all_links
def links(self, flags: MessageFlags = MessageFlags.NONE) -> List[LinkData]: """ Build CORE API TLVs for a point-to-point link. One Link message describes this network. :param flags: message flags :return: list of link data """ all_links = [] if len(self.ifaces) != 2: return all_links ifaces = self.get_ifaces() iface1 = ifaces[0] iface2 = ifaces[1] unidirectional = 0 if iface1.getparams() != iface2.getparams(): unidirectional = 1 mac = str(iface1.mac) if iface1.mac else None iface1_data = InterfaceData(id=iface1.node.get_iface_id(iface1), name=iface1.name, mac=mac) ip4 = iface1.get_ip4() if ip4: iface1_data.ip4 = str(ip4.ip) iface1_data.ip4_mask = ip4.prefixlen ip6 = iface1.get_ip6() if ip6: iface1_data.ip6 = str(ip6.ip) iface1_data.ip6_mask = ip6.prefixlen mac = str(iface2.mac) if iface2.mac else None iface2_data = InterfaceData(id=iface2.node.get_iface_id(iface2), name=iface2.name, mac=mac) ip4 = iface2.get_ip4() if ip4: iface2_data.ip4 = str(ip4.ip) iface2_data.ip4_mask = ip4.prefixlen ip6 = iface2.get_ip6() if ip6: iface2_data.ip6 = str(ip6.ip) iface2_data.ip6_mask = ip6.prefixlen options_data = iface1.get_link_options(unidirectional) link_data = LinkData( message_type=flags, type=self.linktype, node1_id=iface1.node.id, node2_id=iface2.node.id, iface1=iface1_data, iface2=iface2_data, options=options_data, ) all_links.append(link_data) # build a 2nd link message for the upstream link parameters # (swap if1 and if2) if unidirectional: iface1_data = InterfaceData(id=iface2.node.get_iface_id(iface2)) iface2_data = InterfaceData(id=iface1.node.get_iface_id(iface1)) options_data = iface2.get_link_options(unidirectional) link_data = LinkData( message_type=MessageFlags.NONE, type=self.linktype, node1_id=iface2.node.id, node2_id=iface1.node.id, iface1=iface1_data, iface2=iface2_data, options=options_data, ) all_links.append(link_data) return all_links
def all_link_data(self, flags: int) -> List[LinkData]: """ Build CORE API TLVs for a point-to-point link. One Link message describes this network. :param flags: message flags :return: list of link data """ all_links = [] if len(self._netif) != 2: return all_links if1, if2 = self._netif.values() unidirectional = 0 if if1.getparams() != if2.getparams(): unidirectional = 1 interface1_ip4 = None interface1_ip4_mask = None interface1_ip6 = None interface1_ip6_mask = None for address in if1.addrlist: ip, _sep, mask = address.partition("/") mask = int(mask) if netaddr.valid_ipv4(ip): interface1_ip4 = ip interface1_ip4_mask = mask else: interface1_ip6 = ip interface1_ip6_mask = mask interface2_ip4 = None interface2_ip4_mask = None interface2_ip6 = None interface2_ip6_mask = None for address in if2.addrlist: ip, _sep, mask = address.partition("/") mask = int(mask) if netaddr.valid_ipv4(ip): interface2_ip4 = ip interface2_ip4_mask = mask else: interface2_ip6 = ip interface2_ip6_mask = mask link_data = LinkData( message_type=flags, node1_id=if1.node.id, node2_id=if2.node.id, link_type=self.linktype, unidirectional=unidirectional, delay=if1.getparam("delay"), bandwidth=if1.getparam("bw"), per=if1.getparam("loss"), dup=if1.getparam("duplicate"), jitter=if1.getparam("jitter"), interface1_id=if1.node.getifindex(if1), interface1_mac=if1.hwaddr, interface1_ip4=interface1_ip4, interface1_ip4_mask=interface1_ip4_mask, interface1_ip6=interface1_ip6, interface1_ip6_mask=interface1_ip6_mask, interface2_id=if2.node.getifindex(if2), interface2_mac=if2.hwaddr, interface2_ip4=interface2_ip4, interface2_ip4_mask=interface2_ip4_mask, interface2_ip6=interface2_ip6, interface2_ip6_mask=interface2_ip6_mask, ) all_links.append(link_data) # build a 2nd link message for the upstream link parameters # (swap if1 and if2) if unidirectional: link_data = LinkData( message_type=0, link_type=self.linktype, node1_id=if2.node.id, node2_id=if1.node.id, delay=if2.getparam("delay"), bandwidth=if2.getparam("bw"), per=if2.getparam("loss"), dup=if2.getparam("duplicate"), jitter=if2.getparam("jitter"), unidirectional=1, interface1_id=if2.node.getifindex(if2), interface2_id=if1.node.getifindex(if1), ) all_links.append(link_data) return all_links
def all_link_data(self, flags): """ Build CORE API TLVs for a point-to-point link. One Link message describes this network. :param flags: message flags :return: list of link data :rtype: list[core.emulator.data.LinkData] """ all_links = [] if len(self._netif) != 2: return all_links if1, if2 = self._netif.values() unidirectional = 0 if if1.getparams() != if2.getparams(): unidirectional = 1 interface1_ip4 = None interface1_ip4_mask = None interface1_ip6 = None interface1_ip6_mask = None for address in if1.addrlist: ip, _sep, mask = address.partition("/") mask = int(mask) if ipaddress.is_ipv4_address(ip): family = AF_INET ipl = socket.inet_pton(family, ip) interface1_ip4 = ipaddress.IpAddress(af=family, address=ipl) interface1_ip4_mask = mask else: family = AF_INET6 ipl = socket.inet_pton(family, ip) interface1_ip6 = ipaddress.IpAddress(af=family, address=ipl) interface1_ip6_mask = mask interface2_ip4 = None interface2_ip4_mask = None interface2_ip6 = None interface2_ip6_mask = None for address in if2.addrlist: ip, _sep, mask = address.partition("/") mask = int(mask) if ipaddress.is_ipv4_address(ip): family = AF_INET ipl = socket.inet_pton(family, ip) interface2_ip4 = ipaddress.IpAddress(af=family, address=ipl) interface2_ip4_mask = mask else: family = AF_INET6 ipl = socket.inet_pton(family, ip) interface2_ip6 = ipaddress.IpAddress(af=family, address=ipl) interface2_ip6_mask = mask link_data = LinkData( message_type=flags, node1_id=if1.node.id, node2_id=if2.node.id, link_type=self.linktype, unidirectional=unidirectional, delay=if1.getparam("delay"), bandwidth=if1.getparam("bw"), per=if1.getparam("loss"), dup=if1.getparam("duplicate"), jitter=if1.getparam("jitter"), interface1_id=if1.node.getifindex(if1), interface1_mac=if1.hwaddr, interface1_ip4=interface1_ip4, interface1_ip4_mask=interface1_ip4_mask, interface1_ip6=interface1_ip6, interface1_ip6_mask=interface1_ip6_mask, interface2_id=if2.node.getifindex(if2), interface2_mac=if2.hwaddr, interface2_ip4=interface2_ip4, interface2_ip4_mask=interface2_ip4_mask, interface2_ip6=interface2_ip6, interface2_ip6_mask=interface2_ip6_mask, ) all_links.append(link_data) # build a 2nd link message for the upstream link parameters # (swap if1 and if2) if unidirectional: link_data = LinkData( message_type=0, node1_id=if2.node.id, node2_id=if1.node.id, delay=if2.getparam("delay"), bandwidth=if2.getparam("bw"), per=if2.getparam("loss"), dup=if2.getparam("duplicate"), jitter=if2.getparam("jitter"), unidirectional=1, interface1_id=if2.node.getifindex(if2), interface2_id=if1.node.getifindex(if1), ) all_links.append(link_data) return all_links
def all_link_data(self, flags: MessageFlags = MessageFlags.NONE ) -> List[LinkData]: """ Build link data objects for this network. Each link object describes a link between this network and a node. :param flags: message type :return: list of link data """ all_links = [] # build a link message from this network node to each node having a # connected interface for netif in self.netifs(sort=True): if not hasattr(netif, "node"): continue uni = False linked_node = netif.node if linked_node is None: # two layer-2 switches/hubs linked together via linknet() if not netif.othernet: continue linked_node = netif.othernet if linked_node.id == self.id: continue netif.swapparams("_params_up") upstream_params = netif.getparams() netif.swapparams("_params_up") if netif.getparams() != upstream_params: uni = True unidirectional = 0 if uni: unidirectional = 1 interface2_ip4 = None interface2_ip4_mask = None interface2_ip6 = None interface2_ip6_mask = None for address in netif.addrlist: ip, _sep, mask = address.partition("/") mask = int(mask) if netaddr.valid_ipv4(ip): interface2_ip4 = ip interface2_ip4_mask = mask else: interface2_ip6 = ip interface2_ip6_mask = mask link_data = LinkData( message_type=flags, node1_id=self.id, node2_id=linked_node.id, link_type=self.linktype, unidirectional=unidirectional, interface2_id=linked_node.getifindex(netif), interface2_name=netif.name, interface2_mac=netif.hwaddr, interface2_ip4=interface2_ip4, interface2_ip4_mask=interface2_ip4_mask, interface2_ip6=interface2_ip6, interface2_ip6_mask=interface2_ip6_mask, delay=netif.getparam("delay"), bandwidth=netif.getparam("bw"), dup=netif.getparam("duplicate"), jitter=netif.getparam("jitter"), per=netif.getparam("loss"), ) all_links.append(link_data) if not uni: continue netif.swapparams("_params_up") link_data = LinkData( message_type=MessageFlags.NONE, node1_id=linked_node.id, node2_id=self.id, link_type=self.linktype, unidirectional=1, delay=netif.getparam("delay"), bandwidth=netif.getparam("bw"), dup=netif.getparam("duplicate"), jitter=netif.getparam("jitter"), per=netif.getparam("loss"), ) netif.swapparams("_params_up") all_links.append(link_data) return all_links