sgsn: Extract the hlr Number into the mm context
Include the hlr-Number of the subscriber in the CDR. This is useful for debugging and understanding which equipment was used during the test. In contrast to the MSISDN the '+' is emitted as the number must be in international format already.
This commit is contained in:
parent
fe4a9f66fc
commit
8b2b5fbda6
|
@ -136,6 +136,9 @@ struct sgsn_mm_ctx {
|
|||
enum sgsn_auth_state auth_state;
|
||||
int is_authenticated;
|
||||
|
||||
/* the string representation of the current hlr */
|
||||
char hlr[GSM_EXTENSION_LENGTH];
|
||||
|
||||
struct gsm_subscriber *subscr;
|
||||
};
|
||||
|
||||
|
|
|
@ -578,6 +578,43 @@ static void extract_subscr_msisdn(struct sgsn_mm_ctx *ctx)
|
|||
}
|
||||
}
|
||||
|
||||
static void extract_subscr_hlr(struct sgsn_mm_ctx *ctx)
|
||||
{
|
||||
struct gsm_mncc_number called;
|
||||
uint8_t hlr_number[sizeof(ctx->subscr->sgsn_data->hlr) + 1];
|
||||
|
||||
if (!ctx->subscr)
|
||||
return;
|
||||
|
||||
if (ctx->subscr->sgsn_data->hlr_len < 1)
|
||||
return;
|
||||
|
||||
/* prepare the data for the decoder */
|
||||
memset(&called, 0, sizeof(called));
|
||||
hlr_number[0] = ctx->subscr->sgsn_data->hlr_len;
|
||||
memcpy(&hlr_number[1], ctx->subscr->sgsn_data->hlr,
|
||||
ctx->subscr->sgsn_data->hlr_len);
|
||||
|
||||
/* decode the string now */
|
||||
gsm48_decode_called(&called, hlr_number);
|
||||
|
||||
if (called.plan != 1) {
|
||||
LOGMMCTXP(LOGL_ERROR, ctx,
|
||||
"Numbering plan(%d) not allowed\n",
|
||||
called.plan);
|
||||
return;
|
||||
}
|
||||
|
||||
if (called.type != 1) {
|
||||
LOGMMCTXP(LOGL_ERROR, ctx,
|
||||
"Numbering type(%d) not allowed\n",
|
||||
called.type);
|
||||
return;
|
||||
}
|
||||
|
||||
strncpy(&ctx->hlr[0], called.number, sizeof(ctx->hlr) - 1);
|
||||
}
|
||||
|
||||
/* Check if we can already authorize a subscriber */
|
||||
static int gsm48_gmm_authorize(struct sgsn_mm_ctx *ctx)
|
||||
{
|
||||
|
@ -643,6 +680,7 @@ static int gsm48_gmm_authorize(struct sgsn_mm_ctx *ctx)
|
|||
case GSM48_MT_GMM_ATTACH_REQ:
|
||||
|
||||
extract_subscr_msisdn(ctx);
|
||||
extract_subscr_hlr(ctx);
|
||||
#ifdef PTMSI_ALLOC
|
||||
/* Start T3350 and re-transmit up to 5 times until ATTACH COMPLETE */
|
||||
mmctx_timer_start(ctx, 3350, GSM0408_T3350_SECS);
|
||||
|
|
|
@ -64,7 +64,7 @@ static void maybe_print_header(FILE *cdr_file)
|
|||
if (ftell(cdr_file) != 0)
|
||||
return;
|
||||
|
||||
fprintf(cdr_file, "timestamp,imsi,imei,msisdn,cell_id,lac,event,pdp_duration,ggsn_addr,sgsn_addr,apni,eua_addr,vol_in,vol_out,charging_id\n");
|
||||
fprintf(cdr_file, "timestamp,imsi,imei,msisdn,cell_id,lac,hlr,event,pdp_duration,ggsn_addr,sgsn_addr,apni,eua_addr,vol_in,vol_out,charging_id\n");
|
||||
}
|
||||
|
||||
static void cdr_log_mm(struct sgsn_instance *inst, const char *ev,
|
||||
|
@ -87,7 +87,7 @@ static void cdr_log_mm(struct sgsn_instance *inst, const char *ev,
|
|||
maybe_print_header(cdr_file);
|
||||
gettimeofday(&tv, NULL);
|
||||
gmtime_r(&tv.tv_sec, &tm);
|
||||
fprintf(cdr_file, "%04d%02d%02d%02d%02d%02d%03d,%s,%s,%s,%d,%d,%s\n",
|
||||
fprintf(cdr_file, "%04d%02d%02d%02d%02d%02d%03d,%s,%s,%s,%d,%d,%s,%s\n",
|
||||
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
|
||||
tm.tm_hour, tm.tm_min, tm.tm_sec,
|
||||
(int)(tv.tv_usec / 1000),
|
||||
|
@ -96,6 +96,7 @@ static void cdr_log_mm(struct sgsn_instance *inst, const char *ev,
|
|||
mmctx->msisdn,
|
||||
mmctx->cell_id,
|
||||
mmctx->ra.lac,
|
||||
mmctx->hlr,
|
||||
ev);
|
||||
|
||||
fclose(cdr_file);
|
||||
|
@ -171,7 +172,7 @@ static void cdr_log_pdp(struct sgsn_instance *inst, const char *ev,
|
|||
duration = tp.tv_sec - pdp->cdr_start.tv_sec;
|
||||
|
||||
fprintf(cdr_file,
|
||||
"%04d%02d%02d%02d%02d%02d%03d,%s,%s,%s,%d,%d,%s,%ld,%s,%s,%s,%s,%" PRIu64 ",%" PRIu64 ",%u\n",
|
||||
"%04d%02d%02d%02d%02d%02d%03d,%s,%s,%s,%d,%d,%s,%s,%ld,%s,%s,%s,%s,%" PRIu64 ",%" PRIu64 ",%u\n",
|
||||
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
|
||||
tm.tm_hour, tm.tm_min, tm.tm_sec,
|
||||
(int)(tv.tv_usec / 1000),
|
||||
|
@ -180,6 +181,7 @@ static void cdr_log_pdp(struct sgsn_instance *inst, const char *ev,
|
|||
pdp->mm ? pdp->mm->msisdn : "N/A",
|
||||
pdp->mm ? pdp->mm->cell_id : -1,
|
||||
pdp->mm ? pdp->mm->ra.lac : -1,
|
||||
pdp->mm ? pdp->mm->hlr : "N/A",
|
||||
ev,
|
||||
(unsigned long ) duration,
|
||||
ggsn_addr,
|
||||
|
|
|
@ -315,8 +315,8 @@ static void vty_dump_mmctx(struct vty *vty, const char *pfx,
|
|||
{
|
||||
vty_out(vty, "%sMM Context for IMSI %s, IMEI %s, P-TMSI %08x%s",
|
||||
pfx, mm->imsi, mm->imei, mm->p_tmsi, VTY_NEWLINE);
|
||||
vty_out(vty, "%s MSISDN: %s, TLLI: %08x%s", pfx, mm->msisdn,
|
||||
mm->tlli, VTY_NEWLINE);
|
||||
vty_out(vty, "%s MSISDN: %s, TLLI: %08x%s HLR: %s",
|
||||
pfx, mm->msisdn, mm->tlli, mm->hlr, VTY_NEWLINE);
|
||||
vty_out(vty, "%s MM State: %s, Routeing Area: %u-%u-%u-%u, "
|
||||
"Cell ID: %u%s", pfx,
|
||||
get_value_string(gprs_mm_st_strs, mm->mm_state),
|
||||
|
|
Loading…
Reference in New Issue