From 4911ba91ef3929f1e9d76c03ba404f2666edc84f Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sun, 24 Apr 2011 16:55:42 +0200 Subject: [PATCH] TETRA: start to use msgb as part of osmo_prim / tmvsap_prim This will allow us to pass the same msgb (with different l1h/l2h) up the stack. --- src/lower_mac/tetra_lower_mac.c | 23 ++++++++++------ src/osmo_prim.h | 1 + src/tetra_prim.h | 3 ++- src/tetra_upper_mac.c | 47 +++++++++++++++++++-------------- 4 files changed, 45 insertions(+), 29 deletions(-) diff --git a/src/lower_mac/tetra_lower_mac.c b/src/lower_mac/tetra_lower_mac.c index 362a2fd..3887058 100644 --- a/src/lower_mac/tetra_lower_mac.c +++ b/src/lower_mac/tetra_lower_mac.c @@ -24,6 +24,8 @@ #include #include +#include +#include #include #include @@ -126,8 +128,8 @@ struct tetra_tmvsap_prim *tmvsap_prim_alloc(uint16_t prim, uint8_t op) { struct tetra_tmvsap_prim *ttp; - //ttp = talloc_zero(NULL, struct tetra_tmvsap_prim); - ttp = calloc(1, sizeof(struct tetra_tmvsap_prim)); + ttp = talloc_zero(NULL, struct tetra_tmvsap_prim); + ttp->oph.msg = msgb_alloc(412, "tmvsap_prim"); ttp->oph.sap = TETRA_SAP_TMV; ttp->oph.primitive = prim; ttp->oph.operation = op; @@ -151,8 +153,11 @@ void tp_sap_udata_ind(enum tp_sap_data_type type, const uint8_t *bits, unsigned struct tetra_tmvsap_prim *ttp; struct tmv_unitdata_param *tup; + struct msgb *msg; + ttp = tmvsap_prim_alloc(PRIM_TMV_UNITDATA, PRIM_OP_INDICATION); tup = &ttp->u.unitdata; + msg = ttp->oph.msg; /* update the cell time */ memcpy(&tcd->time, &t_phy_state.time, sizeof(tcd->time)); @@ -204,10 +209,16 @@ void tp_sap_udata_ind(enum tp_sap_data_type type, const uint8_t *bits, unsigned ubit_dump(type2, tbp->type1_bits)); } else printf("WRONG\n"); + } else if (type == TPSAP_T_BBK) { + /* FIXME: RM3014-decode */ + tup->crc_ok = 1; + memcpy(type2, type4, tbp->type2_bits); + DEBUGP("%s %s type1: %s\n", tbp->name, time_str, + ubit_dump(type2, tbp->type1_bits)); } - memcpy(tup->mac_block, type2, tbp->type1_bits); - tup->mac_block_len = tbp->type1_bits; + msg->l1h = msgb_put(msg, tbp->type1_bits); + memcpy(msg->l1h, type2, tbp->type1_bits); switch (type) { case TPSAP_T_SB1: @@ -235,10 +246,6 @@ void tp_sap_udata_ind(enum tp_sap_data_type type, const uint8_t *bits, unsigned /* FIXME: do something */ break; case TPSAP_T_BBK: - /* FIXME: RM3014-decode */ - tup->crc_ok = 1; - memcpy(tup->mac_block, type4, tbp->type1_bits); - DEBUGP("%s %s type1: %s\n", tbp->name, time_str, ubit_dump(tup->mac_block, tbp->type1_bits)); tup->lchan = TETRA_LC_AACH; break; case TPSAP_T_SCH_F: diff --git a/src/osmo_prim.h b/src/osmo_prim.h index fc22714..3d10af2 100644 --- a/src/osmo_prim.h +++ b/src/osmo_prim.h @@ -14,6 +14,7 @@ struct osmo_prim_hdr { uint16_t sap; uint16_t primitive; enum osmo_prim_operation operation; + struct msgb *msg; /* message containing associated data */ }; #endif diff --git a/src/tetra_prim.h b/src/tetra_prim.h index bc4b515..180a480 100644 --- a/src/tetra_prim.h +++ b/src/tetra_prim.h @@ -28,7 +28,8 @@ struct tmv_unitdata_param { int crc_ok; /* was the CRC verified OK? */ uint32_t scrambling_code; /* which scrambling code was used */ struct tetra_tdma_time tdma_time;/* TDMA timestamp */ - uint8_t mac_block[412]; /* maximum num of bits in a non-QAM chan */ }; + //uint8_t mac_block[412]; /* maximum num of bits in a non-QAM chan */ +}; /* Table 23.3 */ struct tmv_configure_param { diff --git a/src/tetra_upper_mac.c b/src/tetra_upper_mac.c index 25ab3f4..3262a4f 100644 --- a/src/tetra_upper_mac.c +++ b/src/tetra_upper_mac.c @@ -24,6 +24,8 @@ #include #include +#include +#include #include "tetra_common.h" #include "tetra_prim.h" @@ -41,13 +43,13 @@ static struct tetra_si_decoded g_last_sid; static void rx_bcast(struct tetra_tmvsap_prim *tmvp) { - struct tmv_unitdata_param *tup = &tmvp->u.unitdata; + struct msgb *msg = tmvp->oph.msg; struct tetra_si_decoded sid; uint32_t dl_freq, ul_freq; int i; memset(&sid, 0, sizeof(sid)); - macpdu_decode_sysinfo(&sid, tup->mac_block); + macpdu_decode_sysinfo(&sid, msg->l1h); dl_freq = tetra_dl_carrier_hz(sid.freq_band, sid.main_carrier, @@ -137,12 +139,13 @@ static int rx_tm_sdu(uint8_t *bits, unsigned int len) static void rx_resrc(struct tetra_tmvsap_prim *tmvp) { - struct tmv_unitdata_param *tup = &tmvp->u.unitdata; + struct msgb *msg = tmvp->oph.msg; struct tetra_resrc_decoded rsd; int tmpdu_offset; memset(&rsd, 0, sizeof(rsd)); - tmpdu_offset = macpdu_decode_resource(&rsd, tup->mac_block); + tmpdu_offset = macpdu_decode_resource(&rsd, msg->l1h); + msg->l2h = msg->l1h + tmpdu_offset; printf("RESOURCE Encr=%u, Length=%d Addr=%s ", rsd.encryption_mode, rsd.macpdu_length, @@ -160,10 +163,9 @@ static void rx_resrc(struct tetra_tmvsap_prim *tmvp) if (rsd.macpdu_length > 0 && rsd.encryption_mode == 0) { int len_bits = rsd.macpdu_length*8; - if (tup->mac_block + tmpdu_offset + len_bits > - tup->mac_block + tup->mac_block_len) - len_bits = tup->mac_block_len - tmpdu_offset; - rx_tm_sdu(tup->mac_block + tmpdu_offset, len_bits); + if (msg->l2h + len_bits > msg->l1h + msgb_l1len(msg)) + len_bits = msgb_l1len(msg) - tmpdu_offset; + rx_tm_sdu(msg->l2h, len_bits); } out: @@ -172,16 +174,17 @@ out: static void rx_suppl(struct tetra_tmvsap_prim *tmvp) { - struct tmv_unitdata_param *tup = &tmvp->u.unitdata; + //struct tmv_unitdata_param *tup = &tmvp->u.unitdata; + struct msgb *msg = tmvp->oph.msg; //struct tetra_suppl_decoded sud; int tmpdu_offset; #if 0 memset(&sud, 0, sizeof(sud)); - tmpdu_offset = macpdu_decode_suppl(&sud, tup->mac_block, tup->lchan); + tmpdu_offset = macpdu_decode_suppl(&sud, msg->l1h, tup->lchan); #else { - uint8_t slot_granting = *(tup->mac_block + 17); + uint8_t slot_granting = *(msg->l1h + 17); if (slot_granting) tmpdu_offset = 17+1+8; else @@ -192,7 +195,7 @@ static void rx_suppl(struct tetra_tmvsap_prim *tmvp) printf("SUPPLEMENTARY MAC-D-BLOCK "); //if (sud.encryption_mode == 0) - rx_tm_sdu(tup->mac_block + tmpdu_offset, 100); + rx_tm_sdu(msg->l1h + tmpdu_offset, 100); printf("\n"); } @@ -210,7 +213,7 @@ static void rx_aach(struct tetra_tmvsap_prim *tmvp) printf("ACCESS-ASSIGN PDU: "); memset(&aad, 0, sizeof(aad)); - macpdu_decode_access_assign(&aad, tup->mac_block, + macpdu_decode_access_assign(&aad, tmvp->oph.msg->l1h, tup->tdma_time.fn == 18 ? 1 : 0); if (aad.pres & TETRA_ACC_ASS_PRES_ACCESS1) @@ -228,7 +231,8 @@ static void rx_aach(struct tetra_tmvsap_prim *tmvp) static int rx_tmv_unitdata_ind(struct tetra_tmvsap_prim *tmvp) { struct tmv_unitdata_param *tup = &tmvp->u.unitdata; - uint8_t pdu_type = bits_to_uint(tup->mac_block, 2); + struct msgb *msg = tmvp->oph.msg; + uint8_t pdu_type = bits_to_uint(msg->l1h, 2); const char *pdu_name; struct msgb *gsmtap_msg; @@ -237,7 +241,7 @@ static int rx_tmv_unitdata_ind(struct tetra_tmvsap_prim *tmvp) else if (tup->lchan == TETRA_LC_AACH) pdu_name = "ACCESS-ASSIGN"; else { - pdu_type = bits_to_uint(tup->mac_block, 2); + pdu_type = bits_to_uint(msg->l1h, 2); pdu_name = tetra_get_macpdu_name(pdu_type); } @@ -249,8 +253,10 @@ static int rx_tmv_unitdata_ind(struct tetra_tmvsap_prim *tmvp) if (!tup->crc_ok) return 0; - gsmtap_msg = tetra_gsmtap_makemsg(&tup->tdma_time, tup->lchan, tup->tdma_time.tn, - /* FIXME: */ 0, 0, 0, tup->mac_block, tup->mac_block_len); + gsmtap_msg = tetra_gsmtap_makemsg(&tup->tdma_time, tup->lchan, + tup->tdma_time.tn, + /* FIXME: */ 0, 0, 0, + msg->l1h, msgb_l1len(msg)); if (gsmtap_msg) tetra_gsmtap_sendmsg(gsmtap_msg); @@ -272,9 +278,9 @@ static int rx_tmv_unitdata_ind(struct tetra_tmvsap_prim *tmvp) rx_suppl(tmvp); break; case TETRA_PDU_T_MAC_FRAG_END: - if (tup->mac_block[3] == TETRA_MAC_FRAGE_FRAG) { + if (msg->l1h[3] == TETRA_MAC_FRAGE_FRAG) { printf("FRAG/END FRAG: "); - rx_tm_sdu(tup->mac_block+4, 100 /*FIXME*/); + rx_tm_sdu(msg->l1h+4, 100 /*FIXME*/); printf("\n"); } else printf("FRAG/END END\n"); @@ -309,7 +315,8 @@ int upper_mac_prim_recv(struct osmo_prim_hdr *op, void *priv) break; } - free(op); + talloc_free(op->msg); + talloc_free(op); return rc; }