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.
This commit is contained in:
Harald Welte 2011-04-24 16:55:42 +02:00
parent 8d36966e82
commit 4911ba91ef
4 changed files with 45 additions and 29 deletions

View File

@ -24,6 +24,8 @@
#include <unistd.h>
#include <osmocom/core/utils.h>
#include <osmocom/core/msgb.h>
#include <osmocom/core/talloc.h>
#include <tetra_common.h>
#include <tetra_tdma.h>
@ -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:

View File

@ -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

View File

@ -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 {

View File

@ -24,6 +24,8 @@
#include <unistd.h>
#include <osmocom/core/utils.h>
#include <osmocom/core/msgb.h>
#include <osmocom/core/talloc.h>
#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;
}