Example #1
0
def create_transport_xml(iface: CoreInterface, config: Dict[str, str]) -> None:
    """
    Build transport xml file for node and transport type.

    :param iface: interface to build transport xml for
    :param config: all current configuration values
    :return: nothing
    """
    transport_type = iface.transport_type
    transport_element = etree.Element(
        "transport",
        name=f"{transport_type.value.capitalize()} Transport",
        library=f"trans{transport_type.value.lower()}",
    )
    add_param(transport_element, "bitrate", "0")

    # get emane model cnfiguration
    flowcontrol = config.get("flowcontrolenable", "0") == "1"
    if iface.is_virtual():
        device_path = "/dev/net/tun_flowctl"
        if not os.path.exists(device_path):
            device_path = "/dev/net/tun"
        add_param(transport_element, "devicepath", device_path)
        if flowcontrol:
            add_param(transport_element, "flowcontrolenable", "on")
    doc_name = "transport"
    transport_name = transport_file_name(iface)
    create_iface_file(iface, transport_element, doc_name, transport_name)
Example #2
0
    def start_daemon(self, iface: CoreInterface) -> None:
        """
        Start one EMANE daemon per node having a radio.
        Add a control network even if the user has not configured one.
        """
        logging.info("starting emane daemons...")
        loglevel = str(EmaneManager.DEFAULT_LOG_LEVEL)
        cfgloglevel = self.session.options.get_config_int("emane_log_level")
        realtime = self.session.options.get_config_bool("emane_realtime",
                                                        default=True)
        if cfgloglevel:
            logging.info("setting user-defined emane log level: %d",
                         cfgloglevel)
            loglevel = str(cfgloglevel)
        emanecmd = f"emane -d -l {loglevel}"
        if realtime:
            emanecmd += " -r"
        node = iface.node
        if iface.is_virtual():
            otagroup, _otaport = self.get_config("otamanagergroup").split(":")
            otadev = self.get_config("otamanagerdevice")
            otanetidx = self.session.get_control_net_index(otadev)
            eventgroup, _eventport = self.get_config(
                "eventservicegroup").split(":")
            eventdev = self.get_config("eventservicedevice")
            eventservicenetidx = self.session.get_control_net_index(eventdev)

            # control network not yet started here
            self.session.add_remove_control_iface(node,
                                                  0,
                                                  remove=False,
                                                  conf_required=False)
            if otanetidx > 0:
                logging.info("adding ota device ctrl%d", otanetidx)
                self.session.add_remove_control_iface(node,
                                                      otanetidx,
                                                      remove=False,
                                                      conf_required=False)
            if eventservicenetidx >= 0:
                logging.info("adding event service device ctrl%d",
                             eventservicenetidx)
                self.session.add_remove_control_iface(node,
                                                      eventservicenetidx,
                                                      remove=False,
                                                      conf_required=False)
            # multicast route is needed for OTA data
            logging.info("OTA GROUP(%s) OTA DEV(%s)", otagroup, otadev)
            node.node_net_client.create_route(otagroup, otadev)
            # multicast route is also needed for event data if on control network
            if eventservicenetidx >= 0 and eventgroup != otagroup:
                node.node_net_client.create_route(eventgroup, eventdev)
            # start emane
            log_file = os.path.join(node.nodedir, f"{iface.name}-emane.log")
            platform_xml = os.path.join(node.nodedir,
                                        f"{iface.name}-platform.xml")
            args = f"{emanecmd} -f {log_file} {platform_xml}"
            node.cmd(args)
            logging.info("node(%s) emane daemon running: %s", node.name, args)
        else:
            path = self.session.session_dir
            log_file = os.path.join(path, f"{iface.name}-emane.log")
            platform_xml = os.path.join(path, f"{iface.name}-platform.xml")
            emanecmd += f" -f {log_file} {platform_xml}"
            node.host_cmd(emanecmd, cwd=path)
            logging.info("node(%s) host emane daemon running: %s", node.name,
                         emanecmd)