pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmo-gprs/+/31755 )
Change subject: rlcmac: Move create_pkt_ctrl_ack() to tbf base class ......................................................................
rlcmac: Move create_pkt_ctrl_ack() to tbf base class
The code to generate a PKT CTRL ACK is the same for a DL TBF and an UL TBF. Move it to the generic base class in order to be able to generate it for a DL TBF in a follow up patch.
Change-Id: I767696b445842ebc32b35c320273b13f63076ca4 --- M include/osmocom/gprs/rlcmac/tbf.h M include/osmocom/gprs/rlcmac/tbf_ul.h M src/rlcmac/sched.c M src/rlcmac/tbf.c M src/rlcmac/tbf_ul.c 5 files changed, 68 insertions(+), 38 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/libosmo-gprs refs/changes/55/31755/1
diff --git a/include/osmocom/gprs/rlcmac/tbf.h b/include/osmocom/gprs/rlcmac/tbf.h index 2886c83..83a887d 100644 --- a/include/osmocom/gprs/rlcmac/tbf.h +++ b/include/osmocom/gprs/rlcmac/tbf.h @@ -27,3 +27,14 @@ void gprs_rlcmac_tbf_destructor(struct gprs_rlcmac_tbf *tbf);
void gprs_rlcmac_tbf_free(struct gprs_rlcmac_tbf *tbf); + +struct msgb *gprs_rlcmac_tbf_create_pkt_ctrl_ack(const struct gprs_rlcmac_tbf *tbf); + +#define LOGPTBF(tbf, lvl, fmt, args...) \ + LOGP(g_rlcmac_log_cat[tbf->direction == GPRS_RLCMAC_TBF_DIR_DL ? \ + OSMO_GPRS_RLCMAC_LOGC_TBFDL : \ + OSMO_GPRS_RLCMAC_LOGC_TBFUL], \ + lvl, "TBF(%s:NR-%" PRIu8 ":TLLI-%08x) " fmt, \ + tbf->direction == GPRS_RLCMAC_TBF_DIR_DL ? "DL" : "UL", \ + tbf->nr, tbf->gre->tlli, \ + ## args) diff --git a/include/osmocom/gprs/rlcmac/tbf_ul.h b/include/osmocom/gprs/rlcmac/tbf_ul.h index ab85f50..e5cfa91 100644 --- a/include/osmocom/gprs/rlcmac/tbf_ul.h +++ b/include/osmocom/gprs/rlcmac/tbf_ul.h @@ -54,7 +54,6 @@
struct msgb *gprs_rlcmac_ul_tbf_data_create(struct gprs_rlcmac_ul_tbf *ul_tbf, const struct gprs_rlcmac_rts_block_ind *bi); struct msgb *gprs_rlcmac_ul_tbf_dummy_create(const struct gprs_rlcmac_ul_tbf *ul_tbf); -struct msgb *gprs_rlcmac_ul_tbf_create_pkt_ctrl_ack(const struct gprs_rlcmac_ul_tbf *ul_tbf);
int gprs_rlcmac_ul_tbf_handle_pkt_ul_ack_nack(struct gprs_rlcmac_ul_tbf *ul_tbf, const RlcMacDownlink_t *dl_block); diff --git a/src/rlcmac/sched.c b/src/rlcmac/sched.c index 0431631..2630940 100644 --- a/src/rlcmac/sched.c +++ b/src/rlcmac/sched.c @@ -198,13 +198,13 @@ if (tbfs->poll_ul_ack) { LOGRLCMAC(LOGL_DEBUG, "(ts=%u,fn=%u,usf=%u) Tx Pkt Control Ack (UL ACK/NACK poll)\n", bi->ts, bi->fn, bi->usf); - msg = gprs_rlcmac_ul_tbf_create_pkt_ctrl_ack(tbfs->poll_ul_ack); + msg = gprs_rlcmac_tbf_create_pkt_ctrl_ack(ul_tbf_as_tbf(tbfs->poll_ul_ack)); /* Last UL message, freeing */ gprs_rlcmac_ul_tbf_free(tbfs->poll_ul_ack); return msg; } if (tbfs->poll_ul_ass) { - msg = gprs_rlcmac_ul_tbf_create_pkt_ctrl_ack(tbfs->poll_ul_ass); + msg = gprs_rlcmac_tbf_create_pkt_ctrl_ack(ul_tbf_as_tbf(tbfs->poll_ul_ass)); if (msg) return msg; } diff --git a/src/rlcmac/tbf.c b/src/rlcmac/tbf.c index ea15d69..c18ad83 100644 --- a/src/rlcmac/tbf.c +++ b/src/rlcmac/tbf.c @@ -19,8 +19,14 @@ * */
+#include <osmocom/core/bitvec.h> +#include <osmocom/core/msgb.h> +#include <osmocom/gsm/protocol/gsm_04_08.h> + #include <osmocom/gprs/rlcmac/tbf.h> #include <osmocom/gprs/rlcmac/tbf_ul.h> +#include <osmocom/gprs/rlcmac/gre.h> +#include <osmocom/gprs/rlcmac/rlcmac_enc.h>
void gprs_rlcmac_tbf_constructor(struct gprs_rlcmac_tbf *tbf, enum gprs_rlcmac_tbf_direction direction, @@ -41,3 +47,38 @@ gprs_rlcmac_ul_tbf_free(tbf_as_ul_tbf(tbf)); /* else: TODO dl_tbf not yet implemented */ } + +struct msgb *gprs_rlcmac_tbf_create_pkt_ctrl_ack(const struct gprs_rlcmac_tbf *tbf) +{ + struct msgb *msg; + struct bitvec bv; + RlcMacUplink_t ul_block; + int rc; + + OSMO_ASSERT(tbf); + + msg = msgb_alloc(GSM_MACBLOCK_LEN, "pkt_ctrl_ack"); + if (!msg) + return NULL; + + /* Initialize a bit vector that uses allocated msgb as the data buffer. */ + bv = (struct bitvec){ + .data = msgb_put(msg, GSM_MACBLOCK_LEN), + .data_len = GSM_MACBLOCK_LEN, + }; + bitvec_unhex(&bv, GPRS_RLCMAC_DUMMY_VEC); + + gprs_rlcmac_enc_prepare_pkt_ctrl_ack(&ul_block, tbf->gre->tlli); + rc = osmo_gprs_rlcmac_encode_uplink(&bv, &ul_block); + if (rc < 0) { + LOGPTBF(tbf, LOGL_ERROR, "Encoding of Packet Control ACK failed (%d)\n", rc); + goto free_ret; + } + LOGPTBF(tbf, LOGL_DEBUG, "Tx Packet Control Ack\n"); + + return msg; + +free_ret: + msgb_free(msg); + return NULL; +} diff --git a/src/rlcmac/tbf_ul.c b/src/rlcmac/tbf_ul.c index fcd7f56..143c880 100644 --- a/src/rlcmac/tbf_ul.c +++ b/src/rlcmac/tbf_ul.c @@ -310,41 +310,6 @@ return NULL; }
-struct msgb *gprs_rlcmac_ul_tbf_create_pkt_ctrl_ack(const struct gprs_rlcmac_ul_tbf *ul_tbf) -{ - struct msgb *msg; - struct bitvec bv; - RlcMacUplink_t ul_block; - int rc; - - OSMO_ASSERT(ul_tbf); - - msg = msgb_alloc(GSM_MACBLOCK_LEN, "pkt_ctrl_ack"); - if (!msg) - return NULL; - - /* Initialize a bit vector that uses allocated msgb as the data buffer. */ - bv = (struct bitvec){ - .data = msgb_put(msg, GSM_MACBLOCK_LEN), - .data_len = GSM_MACBLOCK_LEN, - }; - bitvec_unhex(&bv, GPRS_RLCMAC_DUMMY_VEC); - - gprs_rlcmac_enc_prepare_pkt_ctrl_ack(&ul_block, ul_tbf->tbf.gre->tlli); - rc = osmo_gprs_rlcmac_encode_uplink(&bv, &ul_block); - if (rc < 0) { - LOGPTBFUL(ul_tbf, LOGL_ERROR, "Encoding of Packet Control ACK failed (%d)\n", rc); - goto free_ret; - } - LOGPTBFUL(ul_tbf, LOGL_DEBUG, "Tx Packet Control Ack\n"); - - return msg; - -free_ret: - msgb_free(msg); - return NULL; -} - bool gprs_rlcmac_ul_tbf_have_data(const struct gprs_rlcmac_ul_tbf *ul_tbf) { return (ul_tbf->llc_tx_msg && msgb_length(ul_tbf->llc_tx_msg) > 0) ||