diff --git a/daemon/core/emane/tdma.py b/daemon/core/emane/tdma.py new file mode 100644 index 00000000..cc705f56 --- /dev/null +++ b/daemon/core/emane/tdma.py @@ -0,0 +1,114 @@ + +# +# CORE +# Copyright (c)2013 Company. +# See the LICENSE file included in this distribution. +# +# author: Name +# +''' +tdma.py: EMANE TDMA model bindings for CORE +''' + +import sys +import string +try: + from emanesh.events import EventService +except: + pass +from core.api import coreapi +from core.constants import * +from emane import Emane, EmaneModel +from universal import EmaneUniversalModel + +class EmaneTdmaModel(EmaneModel): + def __init__(self, session, objid = None, verbose = False): + EmaneModel.__init__(self, session, objid, verbose) + + # model name + _name = "emane_tdma" + if Emane.version >= Emane.EMANE101: + xml_path = '/usr/share/emane/xml/models/mac/tdmaeventscheduler' + else: + raise Exception("EMANE TDMA requires EMANE 1.0.1 or greater") + + + # MAC parameters + _confmatrix_mac = [ + ("enablepromiscuousmode", coreapi.CONF_DATA_TYPE_BOOL, '0', + 'True,False', 'enable promiscuous mode'), + ("flowcontrolenable", coreapi.CONF_DATA_TYPE_BOOL, '0', + 'On,Off', 'enable traffic flow control'), + ("flowcontroltokens", coreapi.CONF_DATA_TYPE_UINT16, '10', + '', 'number of flow control tokens'), + ("fragmentcheckthreshold", coreapi.CONF_DATA_TYPE_UINT16, '2', + '', 'rate in seconds for check if fragment reassembly efforts should be abandoned'), + ("fragmenttimeoutthreshold", coreapi.CONF_DATA_TYPE_UINT16, '5', + '', 'threshold in seconds to wait for another packet fragment for reassembly'), + ('neighbormetricdeletetime', coreapi.CONF_DATA_TYPE_FLOAT, '60.0', + '', 'neighbor RF reception timeout for removal from neighbor table (sec)'), + ('neighbormetricupdateinterval', coreapi.CONF_DATA_TYPE_FLOAT, '1.0', + '', 'neighbor table update interval (sec)'), + ("pcrcurveuri", coreapi.CONF_DATA_TYPE_STRING, '%s/tdmabasemodelpcr.xml' % xml_path, + '', 'SINR/PCR curve file'), + ("queue.aggregationenable", coreapi.CONF_DATA_TYPE_BOOL, '1', + 'On,Off', 'enable transmit packet aggregation'), + ('queue.aggregationslotthreshold', coreapi.CONF_DATA_TYPE_FLOAT, '90.0', + '', 'percentage of a slot that must be filled in order to conclude aggregation'), + ("queue.depth", coreapi.CONF_DATA_TYPE_UINT16, '256', + '', 'size of the per service class downstream packet queues (packets)'), + ("queue.fragmentationenable", coreapi.CONF_DATA_TYPE_BOOL, '1', + 'On,Off', 'enable packet fragmentation (over multiple slots)'), + ("queue.strictdequeueenable", coreapi.CONF_DATA_TYPE_BOOL, '0', + 'On,Off', 'enable strict dequeueing to specified queues only'), + ] + + # PHY parameters from Universal PHY + _confmatrix_phy = EmaneUniversalModel._confmatrix + + _confmatrix = _confmatrix_mac + _confmatrix_phy + + # value groupings + _confgroups = "TDMA MAC Parameters:1-%d|Universal PHY Parameters:%d-%d" % \ + (len(_confmatrix_mac), len(_confmatrix_mac) + 1, len(_confmatrix)) + + def buildnemxmlfiles(self, e, ifc): + ''' Build the necessary nem, mac, and phy XMLs in the given path. + If an individual NEM has a nonstandard config, we need to build + that file also. Otherwise the WLAN-wide nXXemane_tdmanem.xml, + nXXemane_tdmamac.xml, nXXemane_tdmaphy.xml are used. + ''' + values = e.getifcconfig(self.objid, self._name, + self.getdefaultvalues(), ifc) + if values is None: + return + nemdoc = e.xmldoc("nem") + nem = nemdoc.getElementsByTagName("nem").pop() + nem.setAttribute("name", "TDMA NEM") + e.appendtransporttonem(nemdoc, nem, self.objid, ifc) + mactag = nemdoc.createElement("mac") + mactag.setAttribute("definition", self.macxmlname(ifc)) + nem.appendChild(mactag) + phytag = nemdoc.createElement("phy") + phytag.setAttribute("definition", self.phyxmlname(ifc)) + nem.appendChild(phytag) + e.xmlwrite(nemdoc, self.nemxmlname(ifc)) + + names = list(self.getnames()) + macnames = names[:len(self._confmatrix_mac)] + phynames = names[len(self._confmatrix_mac):] + # make any changes to the mac/phy names here to e.g. exclude them from + # the XML output + + macdoc = e.xmldoc("mac") + mac = macdoc.getElementsByTagName("mac").pop() + mac.setAttribute("name", "TDMA MAC") + mac.setAttribute("library", "tdmaeventschedulerradiomodel") + # append MAC options to macdoc + map(lambda n: mac.appendChild(e.xmlparam(macdoc, n, \ + self.valueof(n, values))), macnames) + e.xmlwrite(macdoc, self.macxmlname(ifc)) + + phydoc = EmaneUniversalModel.getphydoc(e, self, values, phynames) + e.xmlwrite(phydoc, self.phyxmlname(ifc)) +