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
This commit is contained in:
Pau Espin 2023-03-08 17:59:59 +01:00
parent bab234c2ea
commit e0ec0a3fcc
5 changed files with 54 additions and 38 deletions

View File

@ -27,3 +27,14 @@ void gprs_rlcmac_tbf_constructor(struct gprs_rlcmac_tbf *tbf,
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)

View File

@ -54,7 +54,6 @@ bool gprs_rlcmac_ul_tbf_dummy_rts(const struct gprs_rlcmac_ul_tbf *ul_tbf, const
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);

View File

@ -198,13 +198,13 @@ static struct msgb *sched_select_ctrl_msg(const struct gprs_rlcmac_rts_block_ind
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;
}

View File

@ -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 @@ void gprs_rlcmac_tbf_free(struct gprs_rlcmac_tbf *tbf)
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;
}

View File

@ -310,41 +310,6 @@ free_ret:
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) ||