From c3ba1f39df161cd11c50b993148d3e5e804b6133 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sat, 23 Apr 2011 17:00:01 +0200 Subject: [PATCH] add decode of CMCE PDU type --- src/Makefile | 2 +- src/tetra_cmce_pdu.c | 69 +++++++++++++++++++++++++++++++++++++++++++ src/tetra_cmce_pdu.h | 48 ++++++++++++++++++++++++++++++ src/tetra_upper_mac.c | 4 +++ 4 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 src/tetra_cmce_pdu.c create mode 100644 src/tetra_cmce_pdu.h diff --git a/src/Makefile b/src/Makefile index 2d56461..a24d6df 100644 --- a/src/Makefile +++ b/src/Makefile @@ -9,7 +9,7 @@ all: conv_enc_test crc_test tetra-rx float_to_bits libosmo-tetra-phy.a: phy/tetra_burst_sync.o phy/tetra_burst.o $(AR) r $@ $^ -libosmo-tetra-mac.a: lower_mac/tetra_conv_enc.o tetra_tdma.o lower_mac/tetra_scramb.o lower_mac/tetra_rm3014.o lower_mac/tetra_interleave.o lower_mac/crc_simple.o tetra_common.o lower_mac/viterbi.o lower_mac/viterbi_cch.o lower_mac/viterbi_tch.o lower_mac/tetra_lower_mac.o tetra_upper_mac.o tetra_mac_pdu.o tetra_mle_pdu.o tetra_mm_pdu.o tetra_gsmtap.o +libosmo-tetra-mac.a: lower_mac/tetra_conv_enc.o tetra_tdma.o lower_mac/tetra_scramb.o lower_mac/tetra_rm3014.o lower_mac/tetra_interleave.o lower_mac/crc_simple.o tetra_common.o lower_mac/viterbi.o lower_mac/viterbi_cch.o lower_mac/viterbi_tch.o lower_mac/tetra_lower_mac.o tetra_upper_mac.o tetra_mac_pdu.o tetra_mle_pdu.o tetra_mm_pdu.o tetra_cmce_pdu.o tetra_gsmtap.o $(AR) r $@ $^ float_to_bits: float_to_bits.o diff --git a/src/tetra_cmce_pdu.c b/src/tetra_cmce_pdu.c new file mode 100644 index 0000000..b7cf618 --- /dev/null +++ b/src/tetra_cmce_pdu.c @@ -0,0 +1,69 @@ +/* Implementation of TETRA CMCE PDU parsing */ + +/* (C) 2011 by Harald Welte + * All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +#include +#include + +#include "tetra_cmce_pdu.h" + +static const struct value_string cmce_pdut_d_names[] = { + { TCMCE_PDU_T_D_ALERT, "D-ALERT" }, + { TCMCE_PDU_T_D_CALL_PROCEEDING,"D-CALL PROCEEDING" }, + { TCMCE_PDU_T_D_CONNECT, "D-CONNECT" }, + { TCMCE_PDU_T_D_CONNECT_ACK, "D-CONNECT ACK" }, + { TCMCE_PDU_T_D_DISCONNECT, "D-DISCONNECT" }, + { TCMCE_PDU_T_D_INFO, "D-INFO" }, + { TCMCE_PDU_T_D_RELEASE, "D-RELEASE" }, + { TCMCE_PDU_T_D_SETUP, "D-SETUP" }, + { TCMCE_PDU_T_D_STATUS, "D-STATUS" }, + { TCMCE_PDU_T_D_TX_CEASED, "D-TX CEASED" }, + { TCMCE_PDU_T_D_TX_CONTINUE, "D-TX CONTINUE" }, + { TCMCE_PDU_T_D_TX_GRANTED, "D-TX GRANTED" }, + { TCMCE_PDU_T_D_TX_WAIT, "D-TX WAIT" }, + { TCMCE_PDU_T_D_TX_INTERRUPT, "D-TX INTERRUPT" }, + { TCMCE_PDU_T_D_CALL_RESTORE, "D-TX CALL RESTORE" }, + { TCMCE_PDU_T_D_SDS_DATA, "D-SDS DATA" }, + { TCMCE_PDU_T_D_FACILITY, "D-FACILITY" }, + { 0, NULL } +}; + +static const struct value_string cmce_pdut_u_names[] = { + { TCMCE_PDU_T_U_ALERT, "U-ALERT" }, + { TCMCE_PDU_T_U_CONNECT, "U-CONNECT" }, + { TCMCE_PDU_T_U_DISCONNECT, "U-DISCONNECT" }, + { TCMCE_PDU_T_U_INFO, "U-INFO" }, + { TCMCE_PDU_T_U_RELEASE, "U-RELEASE" }, + { TCMCE_PDU_T_U_SETUP, "U-SETUP" }, + { TCMCE_PDU_T_U_STATUS, "U-STATUS" }, + { TCMCE_PDU_T_U_TX_CEASED, "U-TX CEASED" }, + { TCMCE_PDU_T_U_TX_DEMAND, "U-TX DEMAND" }, + { TCMCE_PDU_T_U_CALL_RESTORE, "U-TX CALL RESTORE" }, + { TCMCE_PDU_T_U_SDS_DATA, "U-SDS DATA" }, + { TCMCE_PDU_T_U_FACILITY, "U-FACILITY" }, + { 0, NULL } +}; + +const char *tetra_get_cmce_pdut_name(uint16_t pdut, int uplink) +{ + if (uplink == 0) + return get_value_string(cmce_pdut_d_names, pdut); + else + return get_value_string(cmce_pdut_u_names, pdut); +} diff --git a/src/tetra_cmce_pdu.h b/src/tetra_cmce_pdu.h new file mode 100644 index 0000000..fed61ff --- /dev/null +++ b/src/tetra_cmce_pdu.h @@ -0,0 +1,48 @@ +#ifndef TETRA_CMCE_PDU_H +#define TETRA_CMCE_PDU_H + +#include + +/* 14.8.28 */ +enum tetra_cmce_pdu_type_d { + TCMCE_PDU_T_D_ALERT = 0x00, + TCMCE_PDU_T_D_CALL_PROCEEDING = 0x01, + TCMCE_PDU_T_D_CONNECT = 0x02, + TCMCE_PDU_T_D_CONNECT_ACK = 0x03, + TCMCE_PDU_T_D_DISCONNECT = 0x04, + TCMCE_PDU_T_D_INFO = 0x05, + TCMCE_PDU_T_D_RELEASE = 0x06, + TCMCE_PDU_T_D_SETUP = 0x07, + TCMCE_PDU_T_D_STATUS = 0x08, + TCMCE_PDU_T_D_TX_CEASED = 0x09, + TCMCE_PDU_T_D_TX_CONTINUE = 0x0a, + TCMCE_PDU_T_D_TX_GRANTED = 0x0b, + TCMCE_PDU_T_D_TX_WAIT = 0x0c, + TCMCE_PDU_T_D_TX_INTERRUPT = 0x0d, + TCMCE_PDU_T_D_CALL_RESTORE = 0x0e, + TCMCE_PDU_T_D_SDS_DATA = 0x0f, + TCMCE_PDU_T_D_FACILITY = 0x10, +}; + +enum tetra_cmce_pdu_type_u { + TCMCE_PDU_T_U_ALERT = 0x00, + /* reserved */ + TCMCE_PDU_T_U_CONNECT = 0x02, + /* reserved */ + TCMCE_PDU_T_U_DISCONNECT = 0x04, + TCMCE_PDU_T_U_INFO = 0x05, + TCMCE_PDU_T_U_RELEASE = 0x06, + TCMCE_PDU_T_U_SETUP = 0x07, + TCMCE_PDU_T_U_STATUS = 0x08, + TCMCE_PDU_T_U_TX_CEASED = 0x09, + TCMCE_PDU_T_U_TX_DEMAND = 0x0a, + /*reserved*/ + TCMCE_PDU_T_U_CALL_RESTORE = 0x0e, + TCMCE_PDU_T_U_SDS_DATA = 0x0f, + TCMCE_PDU_T_U_FACILITY = 0x10, + /*reserved*/ +}; + +const char *tetra_get_cmce_pdut_name(uint16_t pdut, int uplink); + +#endif /* TETRA_CMCE_PDU_H */ diff --git a/src/tetra_upper_mac.c b/src/tetra_upper_mac.c index fafbbe8..b4da781 100644 --- a/src/tetra_upper_mac.c +++ b/src/tetra_upper_mac.c @@ -31,6 +31,7 @@ #include "tetra_mac_pdu.h" #include "tetra_mle_pdu.h" #include "tetra_mm_pdu.h" +#include "tetra_cmce_pdu.h" #include "tetra_gsmtap.h" static void rx_bcast(struct tetra_tmvsap_prim *tmvp) @@ -90,6 +91,9 @@ static int rx_tm_sdu(uint8_t *bits, unsigned int len) case TMLE_PDISC_MM: printf(" %s", tetra_get_mm_pdut_name(bits_to_uint(bits+3, 4), 0)); break; + case TMLE_PDISC_CMCE: + printf(" %s", tetra_get_cmce_pdut_name(bits_to_uint(bits+3, 5), 0)); + break; default: break; }