2017-04-25 08:45:34 -07:00
|
|
|
"""
|
2016-09-14 17:15:43 -07:00
|
|
|
tdma.py: EMANE TDMA model bindings for CORE
|
2017-04-25 08:45:34 -07:00
|
|
|
"""
|
|
|
|
|
2019-02-16 09:50:19 -08:00
|
|
|
import logging
|
2021-03-19 16:54:24 -07:00
|
|
|
from pathlib import Path
|
2020-06-12 09:52:01 -07:00
|
|
|
from typing import Set
|
2018-03-26 10:27:39 -07:00
|
|
|
|
2019-04-29 23:31:47 -07:00
|
|
|
from core import constants, utils
|
2021-11-15 16:40:30 -08:00
|
|
|
from core.config import ConfigString
|
2018-03-29 14:38:32 -07:00
|
|
|
from core.emane import emanemodel
|
2021-05-25 12:14:28 -07:00
|
|
|
from core.emane.nodes import EmaneNet
|
|
|
|
from core.nodes.interface import CoreInterface
|
2016-09-14 17:15:43 -07:00
|
|
|
|
2021-04-21 21:09:35 -07:00
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
2016-09-14 17:15:43 -07:00
|
|
|
|
2018-03-29 14:38:32 -07:00
|
|
|
class EmaneTdmaModel(emanemodel.EmaneModel):
|
2016-09-14 17:15:43 -07:00
|
|
|
# model name
|
2020-06-12 09:52:01 -07:00
|
|
|
name: str = "emane_tdma"
|
2018-03-29 13:32:06 -07:00
|
|
|
|
|
|
|
# mac configuration
|
2020-06-12 09:52:01 -07:00
|
|
|
mac_library: str = "tdmaeventschedulerradiomodel"
|
|
|
|
mac_xml: str = "tdmaeventschedulerradiomodel.xml"
|
2018-03-30 12:08:33 -07:00
|
|
|
|
|
|
|
# add custom schedule options and ignore it when writing emane xml
|
2020-06-12 09:52:01 -07:00
|
|
|
schedule_name: str = "schedule"
|
2021-03-19 16:54:24 -07:00
|
|
|
default_schedule: Path = (
|
|
|
|
constants.CORE_DATA_DIR / "examples" / "tdma" / "schedule.xml"
|
2019-09-10 15:10:24 -07:00
|
|
|
)
|
2020-06-12 09:52:01 -07:00
|
|
|
config_ignore: Set[str] = {schedule_name}
|
2016-09-14 17:15:43 -07:00
|
|
|
|
2019-04-08 09:49:37 -07:00
|
|
|
@classmethod
|
2021-03-19 16:54:24 -07:00
|
|
|
def load(cls, emane_prefix: Path) -> None:
|
|
|
|
cls.mac_defaults["pcrcurveuri"] = str(
|
|
|
|
emane_prefix
|
|
|
|
/ "share/emane/xml/models/mac/tdmaeventscheduler/tdmabasemodelpcr.xml"
|
2019-04-08 09:49:37 -07:00
|
|
|
)
|
2019-10-23 09:51:52 -07:00
|
|
|
super().load(emane_prefix)
|
2021-11-15 16:40:30 -08:00
|
|
|
config_item = ConfigString(
|
2021-03-31 11:13:40 -07:00
|
|
|
id=cls.schedule_name,
|
2021-03-19 16:54:24 -07:00
|
|
|
default=str(cls.default_schedule),
|
|
|
|
label="TDMA schedule file (core)",
|
2019-04-08 09:49:37 -07:00
|
|
|
)
|
2021-03-19 16:54:24 -07:00
|
|
|
cls.mac_config.insert(0, config_item)
|
2019-04-08 09:49:37 -07:00
|
|
|
|
2021-05-25 12:14:28 -07:00
|
|
|
def post_startup(self, iface: CoreInterface) -> None:
|
2018-03-26 10:27:39 -07:00
|
|
|
# get configured schedule
|
2021-05-25 12:14:28 -07:00
|
|
|
emane_net = self.session.get_node(self.id, EmaneNet)
|
|
|
|
config = self.session.emane.get_iface_config(emane_net, iface)
|
2021-05-07 10:40:18 -07:00
|
|
|
schedule = Path(config[self.schedule_name])
|
|
|
|
if not schedule.is_file():
|
2021-05-25 12:14:28 -07:00
|
|
|
logger.error("ignoring invalid tdma schedule: %s", schedule)
|
2021-05-07 10:40:18 -07:00
|
|
|
return
|
2018-03-26 10:27:39 -07:00
|
|
|
# initiate tdma schedule
|
2021-05-25 12:14:28 -07:00
|
|
|
nem_id = self.session.emane.get_nem_id(iface)
|
|
|
|
if not nem_id:
|
|
|
|
logger.error("could not find nem for interface")
|
|
|
|
return
|
|
|
|
service = self.session.emane.nem_service.get(nem_id)
|
|
|
|
if service:
|
2021-05-24 21:41:05 -07:00
|
|
|
device = service.device
|
|
|
|
logger.info(
|
|
|
|
"setting up tdma schedule: schedule(%s) device(%s)", schedule, device
|
|
|
|
)
|
|
|
|
utils.cmd(f"emaneevent-tdmaschedule -i {device} {schedule}")
|