layer23: Send SIM APDUs via GSMTAP, if enabled

This commit is contained in:
Andreas Eversberg 2013-01-12 08:59:05 +01:00
parent fed1774b65
commit fdf7d2f8a5
1 changed files with 18 additions and 1 deletions

View File

@ -37,6 +37,7 @@
#include <osmocom/gsm/tlv.h>
#include <osmocom/gsm/gsm_utils.h>
#include <osmocom/core/gsmtap_util.h>
#include <osmocom/core/gsmtap.h>
#include <osmocom/gsm/protocol/gsm_04_08.h>
#include <osmocom/gsm/protocol/gsm_08_58.h>
#include <osmocom/gsm/rsl.h>
@ -50,6 +51,9 @@
extern struct gsmtap_inst *gsmtap_inst;
static int apdu_len = -1;
static uint8_t apdu_data[256 + 7];
static struct msgb *osmo_l1_alloc(uint8_t msg_type)
{
struct l1ctl_hdr *l1h;
@ -630,6 +634,12 @@ int l1ctl_tx_sim_req(struct osmocom_ms *ms, uint8_t *data, uint16_t length)
struct msgb *msg;
uint8_t *dat;
if (length <= sizeof(apdu_data)) {
memcpy(apdu_data, data, length);
apdu_len = length;
} else
apdu_len = -1;
msg = osmo_l1_alloc(L1CTL_SIM_REQ);
if (!msg)
return -1;
@ -645,7 +655,14 @@ static int rx_l1_sim_conf(struct osmocom_ms *ms, struct msgb *msg)
{
uint16_t len = msg->len - sizeof(struct l1ctl_hdr);
uint8_t *data = msg->data + sizeof(struct l1ctl_hdr);
if (apdu_len > -1 && apdu_len + len <= sizeof(apdu_data)) {
memcpy(apdu_data + apdu_len, data, len);
apdu_len += len;
gsmtap_send_ex(gsmtap_inst, GSMTAP_TYPE_SIM, 0, 0, 0, 0, 0, 0,
0, apdu_data, apdu_len);
}
LOGP(DL1C, LOGL_INFO, "SIM %s\n", osmo_hexdump(data, len));
/* pull the L1 header from the msgb */