From 0ad20fd762afd034f536ad43feb96d1ce61db9a1 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Fri, 27 May 2011 08:44:12 +0200 Subject: [PATCH] create 'struct tetra_mac_state' in main and pass through all layers/SAPs --- src/lower_mac/tetra_lower_mac.c | 4 ++-- src/tetra-rx.c | 9 +++++++++ src/tetra_common.c | 5 +++++ src/tetra_common.h | 8 ++++++++ src/tetra_upper_mac.c | 33 +++++++++++++++++---------------- 5 files changed, 41 insertions(+), 18 deletions(-) diff --git a/src/lower_mac/tetra_lower_mac.c b/src/lower_mac/tetra_lower_mac.c index 6c11cfd..7b62bb4 100644 --- a/src/lower_mac/tetra_lower_mac.c +++ b/src/lower_mac/tetra_lower_mac.c @@ -39,7 +39,6 @@ #include "tetra_upper_mac.h" #include - struct tetra_blk_param { const char *name; uint16_t type345_bits; @@ -147,6 +146,7 @@ void tp_sap_udata_ind(enum tp_sap_data_type type, const uint8_t *bits, unsigned uint8_t type2[512]; const struct tetra_blk_param *tbp = &tetra_blk_param[type]; + struct tetra_mac_state *tms = priv; const char *time_str; /* TMV-SAP.UNITDATA.ind primitive which we will send to the upper MAC */ @@ -258,7 +258,7 @@ void tp_sap_udata_ind(enum tp_sap_data_type type, const uint8_t *bits, unsigned /* send Rx time along with the TMV-UNITDATA.ind primitive */ memcpy(&tup->tdma_time, &tcd->time, sizeof(tup->tdma_time)); - upper_mac_prim_recv(&ttp->oph, NULL); + upper_mac_prim_recv(&ttp->oph, tms); } diff --git a/src/tetra-rx.c b/src/tetra-rx.c index a337bed..3a464bd 100644 --- a/src/tetra-rx.c +++ b/src/tetra-rx.c @@ -27,16 +27,20 @@ #include #include +#include #include "tetra_common.h" #include #include #include "tetra_gsmtap.h" +void *tetra_tall_ctx; + int main(int argc, char **argv) { int fd; struct tetra_rx_state *trs; + struct tetra_mac_state *tms; if (argc < 2) { fprintf(stderr, "Usage: %s \n", argv[0]); @@ -51,7 +55,11 @@ int main(int argc, char **argv) tetra_gsmtap_init("localhost", 0); + tms = talloc_zero(tetra_tall_ctx, struct tetra_mac_state); + tetra_mac_state_init(tms); + trs = calloc(1, sizeof(*trs)); + trs->burst_cb_priv = tms; while (1) { uint8_t buf[64]; @@ -69,6 +77,7 @@ int main(int argc, char **argv) } free(trs); + talloc_free(tms); exit(0); } diff --git a/src/tetra_common.c b/src/tetra_common.c index fc53bde..92b8a1e 100644 --- a/src/tetra_common.c +++ b/src/tetra_common.c @@ -124,3 +124,8 @@ const char *tetra_get_sap_name(uint8_t sap) { return get_value_string(tetra_sap_names, sap); } + +void tetra_mac_state_init(struct tetra_mac_state *tms) +{ + INIT_LLIST_HEAD(&tms->voice_channels); +} diff --git a/src/tetra_common.h b/src/tetra_common.h index dc13c92..6c32db4 100644 --- a/src/tetra_common.h +++ b/src/tetra_common.h @@ -3,6 +3,8 @@ #include +#include + #ifdef DEBUG #define DEBUGP(x, args...) printf(x, ## args) #else @@ -40,6 +42,12 @@ struct tetra_phy_state { }; extern struct tetra_phy_state t_phy_state; +struct tetra_mac_state { + struct llist_head voice_channels; +}; + +void tetra_mac_state_init(struct tetra_mac_state *tms); + #define TETRA_CRC_OK 0x1d0f uint32_t tetra_dl_carrier_hz(uint8_t band, uint16_t carrier, uint8_t offset); diff --git a/src/tetra_upper_mac.c b/src/tetra_upper_mac.c index f64a6b2..19f4693 100644 --- a/src/tetra_upper_mac.c +++ b/src/tetra_upper_mac.c @@ -41,7 +41,7 @@ /* FIXME: this is ugly */ static struct tetra_si_decoded g_last_sid; -static void rx_bcast(struct tetra_tmvsap_prim *tmvp) +static void rx_bcast(struct tetra_tmvsap_prim *tmvp, struct tetra_mac_state *tms) { struct msgb *msg = tmvp->oph.msg; struct tetra_si_decoded sid; @@ -97,7 +97,7 @@ const char *tetra_alloc_dump(const struct tetra_chan_alloc_decoded *cad) return buf; } -static int rx_tl_sdu(uint8_t *bits, unsigned int len) +static int rx_tl_sdu(struct tetra_mac_state *tms, uint8_t *bits, unsigned int len) { uint8_t mle_pdisc = bits_to_uint(bits, 3); @@ -122,7 +122,7 @@ static int rx_tl_sdu(uint8_t *bits, unsigned int len) return len; } -static int rx_tm_sdu(uint8_t *bits, unsigned int len) +static int rx_tm_sdu(struct tetra_mac_state *tms, uint8_t *bits, unsigned int len) { struct tetra_llc_pdu lpp; @@ -132,12 +132,12 @@ static int rx_tm_sdu(uint8_t *bits, unsigned int len) printf("TM-SDU(%s,%u,%u): ", tetra_get_llc_pdut_dec_name(lpp.pdu_type), lpp.ns, lpp.ss); if (lpp.tl_sdu && lpp.ss == 0) { - rx_tl_sdu(lpp.tl_sdu, lpp.tl_sdu_len); + rx_tl_sdu(tms, lpp.tl_sdu, lpp.tl_sdu_len); } return len; } -static void rx_resrc(struct tetra_tmvsap_prim *tmvp) +static void rx_resrc(struct tetra_tmvsap_prim *tmvp, struct tetra_mac_state *tms) { struct msgb *msg = tmvp->oph.msg; struct tetra_resrc_decoded rsd; @@ -165,14 +165,14 @@ static void rx_resrc(struct tetra_tmvsap_prim *tmvp) int len_bits = rsd.macpdu_length*8; if (msg->l2h + len_bits > msg->l1h + msgb_l1len(msg)) len_bits = msgb_l1len(msg) - tmpdu_offset; - rx_tm_sdu(msg->l2h, len_bits); + rx_tm_sdu(tms, msg->l2h, len_bits); } out: printf("\n"); } -static void rx_suppl(struct tetra_tmvsap_prim *tmvp) +static void rx_suppl(struct tetra_tmvsap_prim *tmvp, struct tetra_mac_state *tms) { //struct tmv_unitdata_param *tup = &tmvp->u.unitdata; struct msgb *msg = tmvp->oph.msg; @@ -195,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(msg->l1h + tmpdu_offset, 100); + rx_tm_sdu(tms, msg->l1h + tmpdu_offset, 100); printf("\n"); } @@ -205,7 +205,7 @@ static void dump_access(struct tetra_access_field *acc, unsigned int num) printf("ACCESS%u: %c/%u ", num, 'A'+acc->access_code, acc->base_frame_len); } -static void rx_aach(struct tetra_tmvsap_prim *tmvp) +static void rx_aach(struct tetra_tmvsap_prim *tmvp, struct tetra_mac_state *tms) { struct tmv_unitdata_param *tup = &tmvp->u.unitdata; struct tetra_acc_ass_decoded aad; @@ -228,7 +228,7 @@ static void rx_aach(struct tetra_tmvsap_prim *tmvp) printf("\n"); } -static int rx_tmv_unitdata_ind(struct tetra_tmvsap_prim *tmvp) +static int rx_tmv_unitdata_ind(struct tetra_tmvsap_prim *tmvp, struct tetra_mac_state *tms) { struct tmv_unitdata_param *tup = &tmvp->u.unitdata; struct msgb *msg = tmvp->oph.msg; @@ -262,25 +262,25 @@ static int rx_tmv_unitdata_ind(struct tetra_tmvsap_prim *tmvp) switch (tup->lchan) { case TETRA_LC_AACH: - rx_aach(tmvp); + rx_aach(tmvp, tms); break; case TETRA_LC_BNCH: case TETRA_LC_UNKNOWN: case TETRA_LC_SCH_F: switch (pdu_type) { case TETRA_PDU_T_BROADCAST: - rx_bcast(tmvp); + rx_bcast(tmvp, tms); break; case TETRA_PDU_T_MAC_RESOURCE: - rx_resrc(tmvp); + rx_resrc(tmvp, tms); break; case TETRA_PDU_T_MAC_SUPPL: - rx_suppl(tmvp); + rx_suppl(tmvp, tms); break; case TETRA_PDU_T_MAC_FRAG_END: if (msg->l1h[3] == TETRA_MAC_FRAGE_FRAG) { printf("FRAG/END FRAG: "); - rx_tm_sdu(msg->l1h+4, 100 /*FIXME*/); + rx_tm_sdu(tms, msg->l1h+4, 100 /*FIXME*/); printf("\n"); } else printf("FRAG/END END\n"); @@ -303,12 +303,13 @@ static int rx_tmv_unitdata_ind(struct tetra_tmvsap_prim *tmvp) int upper_mac_prim_recv(struct osmo_prim_hdr *op, void *priv) { struct tetra_tmvsap_prim *tmvp; + struct tetra_mac_state *tms = priv; int rc; switch (op->sap) { case TETRA_SAP_TMV: tmvp = (struct tetra_tmvsap_prim *) op; - rc = rx_tmv_unitdata_ind(tmvp); + rc = rx_tmv_unitdata_ind(tmvp, tms); break; default: printf("primitive on unknown sap\n");