diff --git a/src/Makefile b/src/Makefile index a24d6df..0806d5c 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_cmce_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_sndcp_pdu.o tetra_gsmtap.o $(AR) r $@ $^ float_to_bits: float_to_bits.o diff --git a/src/tetra_sndcp_pdu.c b/src/tetra_sndcp_pdu.c new file mode 100644 index 0000000..8c6c868 --- /dev/null +++ b/src/tetra_sndcp_pdu.c @@ -0,0 +1,48 @@ +/* Implementation of TETRA SNDCP 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_sndcp_pdu.h" + +static const struct value_string sndcp_pdut_names[] = { + { SNDCP_PDU_T_ACT_PDP_DEMAND, "SN-ACTIVATE PDP DEMAND" }, + { SNDCP_PDU_T_DEACT_PDP_ACC, "SN-DEACTIVATE PDP ACCEPT" }, + { SNDCP_PDU_T_DEACT_PDP_DEMAND, "SN-DEACTIVATE PDP DEMAND" }, + { SNDCP_PDU_T_ACT_PDP_REJECT, "SN-ACTIVATE PDP REJECT" }, + { SNDCP_PDU_T_UNITDATA, "SN-UNITDATA" }, + { SNDCP_PDU_T_DATA, "SN-DATA" }, + { SNDCP_PDU_T_DATA_TX_REQ, "SN-DATA TX REQUEST" }, + { SNDCP_PDU_T_DATA_TX_RESP, "SN-DATA TX RESPONSE" }, + { SNDCP_PDU_T_END_OF_DATA, "SN-END OF DATA" }, + { SNDCP_PDU_T_RECONNECT, "SN-RECONNECT" }, + { SNDCP_PDU_T_PAGE_REQUEST, "SN-PAGE REQUEST" }, + { SNDCP_PDU_T_NOT_SUPPORTED, "SN-NOT SUPPORTED" }, + { SNDCP_PDU_T_DATA_PRIORITY, "SN-DATA PRIORITY" }, + { SNDCP_PDU_T_MODIFY, "SN-MODIFY" }, + { 0, NULL } +}; + +const char *tetra_get_sndcp_pdut_name(uint8_t pdut, int uplink) +{ + /* FIXME: uplink */ + return get_value_string(sndcp_pdut_names, pdut); +} diff --git a/src/tetra_sndcp_pdu.h b/src/tetra_sndcp_pdu.h new file mode 100644 index 0000000..3a78da5 --- /dev/null +++ b/src/tetra_sndcp_pdu.h @@ -0,0 +1,29 @@ +#ifndef TETRA_SNDCP_PDU_H +#define TETRA_SNDCP_PDU_H + +#include + +/* 28.115 */ +enum sndcp_pdu_type { + SNDCP_PDU_T_ACT_PDP_DEMAND = 0x0, + SNDCP_PDU_T_DEACT_PDP_ACC = 0x1, + SNDCP_PDU_T_DEACT_PDP_DEMAND = 0x2, + SNDCP_PDU_T_ACT_PDP_REJECT = 0x3, + SNDCP_PDU_T_UNITDATA = 0x4, + SNDCP_PDU_T_DATA = 0x5, + SNDCP_PDU_T_DATA_TX_REQ = 0x6, + SNDCP_PDU_T_DATA_TX_RESP = 0x7, + SNDCP_PDU_T_END_OF_DATA = 0x8, + SNDCP_PDU_T_RECONNECT = 0x9, + SNDCP_PDU_T_PAGE_REQUEST = 0xa, + SNDCP_PDU_T_NOT_SUPPORTED = 0xb, + SNDCP_PDU_T_DATA_PRIORITY = 0xc, + SNDCP_PDU_T_MODIFY = 0xd, +}; + +#define SNDCP_PDU_T_ACT_PDP_ACCEPT SNDCP_PDU_T_ACT_PDP_DEMAND +#define SNDCP_PDU_T_PAGE_RESPONSE SNDCP_PDU_T_PAGE_REQUEST + +#endif /* TETRA_SNDCP_PDU_H */ + +const char *tetra_get_sndcp_pdut_name(uint8_t pdut, int uplink); diff --git a/src/tetra_upper_mac.c b/src/tetra_upper_mac.c index 1675b8e..9239b82 100644 --- a/src/tetra_upper_mac.c +++ b/src/tetra_upper_mac.c @@ -32,6 +32,7 @@ #include "tetra_mle_pdu.h" #include "tetra_mm_pdu.h" #include "tetra_cmce_pdu.h" +#include "tetra_sndcp_pdu.h" #include "tetra_gsmtap.h" static void rx_bcast(struct tetra_tmvsap_prim *tmvp) @@ -94,6 +95,9 @@ static int rx_tm_sdu(uint8_t *bits, unsigned int len) case TMLE_PDISC_CMCE: printf(" %s", tetra_get_cmce_pdut_name(bits_to_uint(bits+3, 5), 0)); break; + case TMLE_PDISC_SNDCP: + printf(" %s", tetra_get_sndcp_pdut_name(bits_to_uint(bits+3, 4), 0)); + break; default: break; }