From 6d38669f055b0355a71683a4b10fe3fea852b868 Mon Sep 17 00:00:00 2001 From: sq5bpf Date: Wed, 16 Nov 2016 21:36:50 +0100 Subject: [PATCH] fix D-SETUP parser --- src/tetra_upper_mac.c | 55 +++++++++++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 20 deletions(-) diff --git a/src/tetra_upper_mac.c b/src/tetra_upper_mac.c index 383ab23..6280ef4 100644 --- a/src/tetra_upper_mac.c +++ b/src/tetra_upper_mac.c @@ -291,6 +291,10 @@ uint parse_d_setup(struct tetra_mac_state *tms, struct msgb *msg, unsigned int l char tmpstr2[1024]; struct tetra_resrc_decoded rsd; int tmpdu_offset; + uint16_t notifindic=0; + uint32_t tempaddr=0; + uint16_t cpti=0; + memset(&rsd, 0, sizeof(rsd)); tmpdu_offset = macpdu_decode_resource(&rsd, msg->l1h); @@ -307,33 +311,44 @@ uint parse_d_setup(struct tetra_mac_state *tms, struct msgb *msg, unsigned int l m=2; uint16_t txgrant=bits_to_uint(bits+n, m); n=n+m; m=1; uint16_t txperm=bits_to_uint(bits+n, m); n=n+m; m=4; uint16_t callprio=bits_to_uint(bits+n, m); n=n+m; - m=6; uint16_t notifindic=bits_to_uint(bits+n, m); n=n+m; - m=24; uint32_t tempaddr=bits_to_uint(bits+n, m); n=n+m; - m=2; uint16_t cpti=bits_to_uint(bits+n, m); n=n+m; - switch(cpti) + m=1; uint8_t obit=bits_to_uint(bits+n, m); n=n+m; + if (obit) { - case 0: /* SNA */ - m=8; callingssi=bits_to_uint(bits+n, m); n=n+m; - break; - case 1: /* SSI */ - m=24; callingssi=bits_to_uint(bits+n, m); n=n+m; - break; - case 2: /* TETRA Subscriber Identity (TSI) */ - m=24; callingssi=bits_to_uint(bits+n, m); n=n+m; - m=24; callingext=bits_to_uint(bits+n, m); n=n+m; - break; - case 3: /* reserved ? */ - break; + m=1; uint8_t pbit_notifindic=bits_to_uint(bits+n, m); n=n+m; + if (pbit_notifindic) { + m=6; notifindic=bits_to_uint(bits+n, m); n=n+m; + } + m=1; uint8_t pbit_tempaddr=bits_to_uint(bits+n, m); n=n+m; + if (pbit_tempaddr) { + m=24; tempaddr=bits_to_uint(bits+n, m); n=n+m; + } + m=1; uint8_t pbit_cpti=bits_to_uint(bits+n, m); n=n+m; + if (pbit_cpti) { + m=2; cpti=bits_to_uint(bits+n, m); n=n+m; + switch(cpti) + { + case 0: /* SNA */ + m=8; callingssi=bits_to_uint(bits+n, m); n=n+m; + break; + case 1: /* SSI */ + m=24; callingssi=bits_to_uint(bits+n, m); n=n+m; + break; + case 2: /* TETRA Subscriber Identity (TSI) */ + m=24; callingssi=bits_to_uint(bits+n, m); n=n+m; + m=24; callingext=bits_to_uint(bits+n, m); n=n+m; + break; + case 3: /* reserved ? */ + break; + } + } + } - - printf ("\nCall identifier:%i Call timeout:%i Hookmethod:%i Duplex:%i\n",callident,calltimeout,hookmethod,duplex); printf("Basicinfo:0x%2.2X Txgrant:%i TXperm:%i Callprio:%i\n",basicinfo,txgrant,txperm,callprio); printf("NotificationID:%i Tempaddr:%i CPTI:%i CallingSSI:%i CallingExt:%i\n",notifindic,tempaddr,cpti,callingssi,callingext); - sprintf(tmpstr2,"TETMON_begin FUNC:DSETUPDEC IDX:%i SSI:%i SSI2:%i CID:%i NID:%i RX:%i TETMON_end",rsd.addr.usage_marker,rsd.addr.ssi,tempaddr,callident,notifindic,tetra_hack_rxid); + sprintf(tmpstr2,"TETMON_begin FUNC:DSETUPDEC IDX:%i SSI:%i SSI2:%i CID:%i NID:%i RX:%i TETMON_end",rsd.addr.usage_marker,rsd.addr.ssi,callingssi,callident,notifindic,tetra_hack_rxid); sendto(tetra_hack_live_socket, (char *)&tmpstr2, strlen((char *)&tmpstr2)+1, 0, (struct sockaddr *)&tetra_hack_live_sockaddr, tetra_hack_socklen); - } /* decode 18.5.17 Neighbour cell information for CA */