diff options
-rw-r--r-- | src/target/trx_toolkit/ctrl_if_trx.py | 67 | ||||
-rw-r--r-- | src/target/trx_toolkit/data_if.py | 9 |
2 files changed, 75 insertions, 1 deletions
diff --git a/src/target/trx_toolkit/ctrl_if_trx.py b/src/target/trx_toolkit/ctrl_if_trx.py index 26a844ff..8cb5c1ae 100644 --- a/src/target/trx_toolkit/ctrl_if_trx.py +++ b/src/target/trx_toolkit/ctrl_if_trx.py @@ -4,7 +4,7 @@ # TRX Toolkit # CTRL interface implementation (common commands) # -# (C) 2016-2018 by Vadim Yanitskiy <axilirator@gmail.com> +# (C) 2016-2019 by Vadim Yanitskiy <axilirator@gmail.com> # # All Rights Reserved # @@ -25,6 +25,7 @@ import logging as log from ctrl_if import CTRLInterface +from data_msg import DATAMSG class CTRLInterfaceTRX(CTRLInterface): """ CTRL interface handler for common transceiver management commands. @@ -42,6 +43,45 @@ class CTRLInterfaceTRX(CTRLInterface): that is prioritized, i.e. it can overwrite any commands mentioned above. If None is returned, a command is considered as unhandled. + == TRXD header version negotiation + + Messages on DATA interface may have different header formats, + defined by a version number, which can be negotiated on the + control interface. By default, the Transceiver will use the + legacy header version (0). + + The header format negotiation can be initiated by the L1 + using 'SETFORMAT' command. If the requested version is not + supported by the transceiver, status code of the response + message should indicate a preferred (basically, the latest) + version. The format of this message is the following: + + L1 -> TRX: CMD SETFORMAT VER_REQ + L1 <- TRX: RSP SETFORMAT VER_RSP VER_REQ + + where: + + - VER_REQ is the requested version (suggested by the L1), + - VER_RSP is either the applied version if matches VER_REQ, + or a preferred version if VER_REQ is not supported. + + If the transceiver indicates VER_RSP different than VER_REQ, + the L1 is supposed to reinitiate the version negotiation + using the suggested VER_RSP. For example: + + L1 -> TRX: CMD SETFORMAT 2 + L1 <- TRX: RSP SETFORMAT 1 2 + + L1 -> TRX: CMD SETFORMAT 1 + L1 <- TRX: RSP SETFORMAT 1 1 + + If no suitable VER_RSP is found, or the VER_REQ is incorrect, + the status code in the response shall be -1. + + As soon as VER_RSP matches VER_REQ in the response, the process + of negotiation is complete. Changing the header version is + supposed to be done before POWERON, but can be also done after. + """ def __init__(self, trx, *udp_link_args): @@ -147,6 +187,31 @@ class CTRLInterfaceTRX(CTRLInterface): return (0, [str(meas_dbm)]) + # TRXD header version negotiation + if self.verify_cmd(request, "SETFORMAT", 1): + log.debug("(%s) Recv SETFORMAT cmd" % self.trx) + + # Parse the requested version + ver_req = int(request[1]) + # ... and store current for logging + ver_cur = self.trx.data_if._hdr_ver + + if ver_req < 0 or ver_req > DATAMSG.CHDR_VERSION_MAX: + log.error("(%s) Incorrect TRXD header version %u" + % (self.trx, ver_req)) + return -1 + + if not self.trx.data_if.set_hdr_ver(ver_req): + ver_rsp = self.trx.data_if.pick_hdr_ver(ver_req) + log.warn("(%s) Requested TRXD header version %u " + "is not supported, suggesting %u..." + % (self.trx, ver_req, ver_rsp)) + return ver_rsp + + log.info("(%s) TRXD header version %u -> %u" + % (self.trx, ver_cur, ver_req)) + return ver_req + # Wrong / unknown command else: # We don't care about other commands, diff --git a/src/target/trx_toolkit/data_if.py b/src/target/trx_toolkit/data_if.py index 10df4383..11df7561 100644 --- a/src/target/trx_toolkit/data_if.py +++ b/src/target/trx_toolkit/data_if.py @@ -42,6 +42,15 @@ class DATAInterface(UDPLink): self._hdr_ver = ver return True + def pick_hdr_ver(self, ver_req): + # Pick a version that is lower or equal to ver_req + for ver in DATAMSG.known_versions[::-1]: + if ver <= ver_req: + return ver + + # No suitable version found + return -1 + def match_hdr_ver(self, msg): if msg.ver == self._hdr_ver: return True |