Example #1
0
 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,
     )
Example #2
0
    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
Example #3
0
    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
Example #4
0
    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)
Example #5
0
 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)
Example #6
0
    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,
        )
Example #7
0
    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,
        )
Example #8
0
 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)
Example #9
0
 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,
     )
Example #10
0
    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
Example #11
0
    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
Example #12
0
    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
Example #13
0
    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
Example #14
0
    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
Example #15
0
    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