This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
Harald Welte gerrit-no-reply at lists.osmocom.orgReview at https://gerrit.osmocom.org/3039 TRX: trx_if: Improve code description / comments Change-Id: I4e19d68782a12e52ba1d3ba2665060275d04866c --- M src/osmo-bts-trx/trx_if.c 1 file changed, 54 insertions(+), 13 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/39/3039/1 diff --git a/src/osmo-bts-trx/trx_if.c b/src/osmo-bts-trx/trx_if.c index c676d11..b15d24d 100644 --- a/src/osmo-bts-trx/trx_if.c +++ b/src/osmo-bts-trx/trx_if.c @@ -1,5 +1,9 @@ /* - * OpenBTS TRX interface handling + * OpenBTS-style TRX interface/protocol handling + * + * This file contains the BTS-side implementation of the OpenBTS-style + * UDP TRX protocol. It manages the clock, control + burst-data UDP + * sockets and their respective protocol encoding/parsing. * * Copyright (C) 2013 Andreas Eversberg <jolly at eversberg.eu> * Copyright (C) 2016 Harald Welte <laforge at gnumonks.org> @@ -53,10 +57,10 @@ #define TRX_MAX_BURST_LEN 512 /* - * socket + * socket helper functions */ -/* open socket */ +/*! convenience wrapper to open socket + fill in osmo_fd */ static int trx_udp_open(void *priv, struct osmo_fd *ofd, const char *host_local, uint16_t port_local, const char *host_remote, uint16_t port_remote, int (*cb)(struct osmo_fd *fd, unsigned int what)) @@ -77,7 +81,7 @@ return 0; } -/* close socket */ +/* close socket + unregister osmo_fd */ static void trx_udp_close(struct osmo_fd *ofd) { if (ofd->fd > 0) { @@ -89,7 +93,7 @@ /* - * clock + * TRX clock socket */ /* get clock from clock socket */ @@ -121,6 +125,7 @@ "correctly, correcting to fn=%u\n", fn); } + /* inform core TRX clock handling code that a FN has been received */ trx_sched_clock(pinst->trx->bts, fn); return 0; @@ -128,7 +133,7 @@ /* - * ctrl + * TRX ctrl socket */ static void trx_ctrl_timer_cb(void *data); @@ -165,7 +170,16 @@ trx_ctrl_send(l1h); } -/* add a new ctrl command */ +/*! Send a new TRX control command. + * \param[inout] l1h TRX Layer1 handle to which to send command + * \param[in] criticial + * \param[in] cmd zero-terminated string containing command + * \param[in] fmt Format string (+ variable list of arguments) + * \returns 0 on success; negative on error + * + * The new ocommand will be added to the end of the control command + * queue. + */ static int trx_ctrl_cmd(struct trx_l1h *l1h, int critical, const char *cmd, const char *fmt, ...) { @@ -197,15 +211,16 @@ tcm->cmd_len = strlen(cmd); tcm->critical = critical; llist_add_tail(&tcm->list, &l1h->trx_ctrl_list); - LOGP(DTRX, LOGL_INFO, "Adding new control '%s'\n", tcm->cmd); + LOGP(DTRX, LOGL_INFO, "Enqueuing TRX control command '%s'\n", tcm->cmd); - /* send message, if no pending message */ + /* send message, if we didn't already have pending messages */ if (!pending) trx_ctrl_send(l1h); return 0; } +/*! Send "POWEROFF" command to TRX */ int trx_if_cmd_poweroff(struct trx_l1h *l1h) { struct phy_instance *pinst = l1h->phy_inst; @@ -215,6 +230,7 @@ return 0; } +/*! Send "POWERON" command to TRX */ int trx_if_cmd_poweron(struct trx_l1h *l1h) { struct phy_instance *pinst = l1h->phy_inst; @@ -224,6 +240,7 @@ return 0; } +/*! Send "SETTSC" command to TRX */ int trx_if_cmd_settsc(struct trx_l1h *l1h, uint8_t tsc) { if (!settsc_enabled) @@ -233,6 +250,7 @@ tsc); } +/*! Send "SETBSIC" command to TRX */ int trx_if_cmd_setbsic(struct trx_l1h *l1h, uint8_t bsic) { if (!setbsic_enabled) @@ -242,31 +260,37 @@ bsic); } +/*! Send "SETRXGAIN" command to TRX */ int trx_if_cmd_setrxgain(struct trx_l1h *l1h, int db) { return trx_ctrl_cmd(l1h, 0, "SETRXGAIN", "%d", db); } +/*! Send "SETPOWER" command to TRX */ int trx_if_cmd_setpower(struct trx_l1h *l1h, int db) { return trx_ctrl_cmd(l1h, 0, "SETPOWER", "%d", db); } +/*! Send "SETMAXDLY" command to TRX, i.e. maximum delay for RACH bursts */ int trx_if_cmd_setmaxdly(struct trx_l1h *l1h, int dly) { return trx_ctrl_cmd(l1h, 0, "SETMAXDLY", "%d", dly); } +/*! Send "SETMAXDLYNB" command to TRX, i.e. maximum delay for normal bursts */ int trx_if_cmd_setmaxdlynb(struct trx_l1h *l1h, int dly) { return trx_ctrl_cmd(l1h, 0, "SETMAXDLYNB", "%d", dly); } +/*! Send "SETSLOT" command to TRX: Configure Channel Combination for TS */ int trx_if_cmd_setslot(struct trx_l1h *l1h, uint8_t tn, uint8_t type) { return trx_ctrl_cmd(l1h, 1, "SETSLOT", "%d %d", tn, type); } +/*! Send "RXTUNE" command to TRX: Tune Receiver to given ARFCN */ int trx_if_cmd_rxtune(struct trx_l1h *l1h, uint16_t arfcn) { struct phy_instance *pinst = l1h->phy_inst; @@ -285,6 +309,7 @@ return trx_ctrl_cmd(l1h, 1, "RXTUNE", "%d", freq10 * 100); } +/*! Send "TXTUNE" command to TRX: Tune Transmitter to given ARFCN */ int trx_if_cmd_txtune(struct trx_l1h *l1h, uint16_t arfcn) { struct phy_instance *pinst = l1h->phy_inst; @@ -303,17 +328,19 @@ return trx_ctrl_cmd(l1h, 1, "TXTUNE", "%d", freq10 * 100); } +/*! Send "HANDOVER" command to TRX: Enable handover RACH Detection on timeslot/sub-slot */ int trx_if_cmd_handover(struct trx_l1h *l1h, uint8_t tn, uint8_t ss) { return trx_ctrl_cmd(l1h, 1, "HANDOVER", "%d %d", tn, ss); } +/*! Send "NOHANDOVER" command to TRX: Disable handover RACH Detection on timeslot/sub-slot */ int trx_if_cmd_nohandover(struct trx_l1h *l1h, uint8_t tn, uint8_t ss) { return trx_ctrl_cmd(l1h, 1, "NOHANDOVER", "%d %d", tn, ss); } -/* get response from ctrl socket */ +/*! Get + parse response from TRX ctrl socket */ static int trx_ctrl_read_cb(struct osmo_fd *ofd, unsigned int what) { struct trx_l1h *l1h = ofd->data; @@ -353,7 +380,7 @@ tcm = llist_entry(l1h->trx_ctrl_list.next, struct trx_ctrl_msg, list); - /* check if respose matches command */ + /* check if response matches command */ if (rsp_len != tcm->cmd_len) { notmatch: LOGP(DTRX, (tcm->critical) ? LOGL_FATAL : LOGL_NOTICE, @@ -393,7 +420,7 @@ /* - * data + * TRX burst data socket */ static int trx_data_read_cb(struct osmo_fd *ofd, unsigned int what) @@ -452,11 +479,20 @@ fprintf(stderr, "%s\n", deb); #endif + /* feed received burst into scheduler code */ trx_sched_ul_burst(&l1h->l1s, tn, fn, bits, burst_len, rssi, toa); return 0; } +/*! Send burst data for given FN/timeslot to TRX + * \param[inout] l1h TRX Layer1 handle referring to TX + * \param[in] tn Timeslot Number (0..7) + * \param[in] fn GSM Frame Number + * \param[in] pwr Transmit Power to use + * \param[in] bits Unpacked bits to be transmitted + * \param[in] nbits Number of \a bits + * \returns 0 on success; negative on error */ int trx_if_data(struct trx_l1h *l1h, uint8_t tn, uint32_t fn, uint8_t pwr, const ubit_t *bits, uint16_t nbits) { @@ -495,6 +531,7 @@ * open/close */ +/*! open the PHY link using TRX protocol */ int bts_model_phy_link_open(struct phy_link *plink) { struct phy_instance *pinst; @@ -537,6 +574,7 @@ return -1; } +/*! compute UDP port number used for TRX protocol */ static uint16_t compute_port(struct phy_instance *pinst, int remote, int is_data) { struct phy_link *plink = pinst->phy_link; @@ -551,6 +589,7 @@ return plink->u.osmotrx.base_port_local + (pinst->num << 1) + inc; } +/*! open a TRX interface. creates contro + data sockets */ int trx_if_open(struct trx_l1h *l1h) { struct phy_instance *pinst = l1h->phy_inst; @@ -593,7 +632,7 @@ return rc; } -/* flush pending control messages */ +/*! flush (delete) all pending control messages */ void trx_if_flush(struct trx_l1h *l1h) { struct trx_ctrl_msg *tcm; @@ -607,6 +646,7 @@ } } +/*! close the TRX for given handle (data + control socket) */ void trx_if_close(struct trx_l1h *l1h) { struct phy_instance *pinst = l1h->phy_inst; @@ -620,6 +660,7 @@ trx_udp_close(&l1h->trx_ofd_data); } +/*! determine if the TRX for given handle is powered up */ int trx_if_powered(struct trx_l1h *l1h) { return l1h->config.poweron; -- To view, visit https://gerrit.osmocom.org/3039 To unsubscribe, visit https://gerrit.osmocom.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I4e19d68782a12e52ba1d3ba2665060275d04866c Gerrit-PatchSet: 1 Gerrit-Project: osmo-bts Gerrit-Branch: master Gerrit-Owner: Harald Welte <laforge at gnumonks.org>