aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gtp/gtp.c6
-rw-r--r--gtp/pdp.h2
-rw-r--r--sgsnemu/cmdline.c17
-rw-r--r--sgsnemu/cmdline.h4
-rw-r--r--sgsnemu/sgsnemu.c83
5 files changed, 112 insertions, 0 deletions
diff --git a/gtp/gtp.c b/gtp/gtp.c
index 2516f50..111168b 100644
--- a/gtp/gtp.c
+++ b/gtp/gtp.c
@@ -1049,6 +1049,12 @@ extern int gtp_create_context_req(struct gsn_t *gsn, struct pdp_t *pdp,
sizeof(pdp->imsi), (uint8_t*) &pdp->imsi);
}
+ /* Section 7.7.3 Routing Area Information */
+ if (pdp->rai_given == 1)
+ gtpie_tv0(&packet, &length, GTP_MAX, GTPIE_RAI,
+ pdp->rai.l, (uint8_t*) &pdp->rai.v);
+
+
/* Section 7.7.11 */
gtpie_tv1(&packet, &length, GTP_MAX, GTPIE_RECOVERY,
gsn->restart_counter);
diff --git a/gtp/pdp.h b/gtp/pdp.h
index d826d77..aea5df7 100644
--- a/gtp/pdp.h
+++ b/gtp/pdp.h
@@ -192,6 +192,8 @@ struct pdp_t {
int rattype_given; /* Radio Access Technology Type given*/
struct ul255_t userloc; /* User Location Information */
int userloc_given; /* User Location Information given*/
+ struct ul255_t rai; /* Routing Area Information */
+ int rai_given; /* Routing Area Information given*/
struct ul255_t mstz; /* MS Time Zone */
int mstz_given; /* MS Time Zone given*/
struct ul255_t imeisv; /* IMEI Software Version */
diff --git a/sgsnemu/cmdline.c b/sgsnemu/cmdline.c
index 83897cf..7bd1849 100644
--- a/sgsnemu/cmdline.c
+++ b/sgsnemu/cmdline.c
@@ -42,6 +42,7 @@ const char *gengetopt_args_info_help[] = {
" --selmode=INT Selection mode (default=`0x01')",
" --rattype=INT Radio Access Technology Type (optional-1to5)",
" --userloc=STRING User Location Information (optional-type.MCC.MNC.LAC.CIorSACorRAC)",
+ " --rai=STRING Routing Area Information (optional-MCC.MNC.LAC.RAC)",
" --mstz=STRING MS Time Zone (optional- sign.NbQuartersOfAnHour.DSTAdjustment)",
" --imeisv=STRING IMEI(SV) International Mobile Equipment Identity (and Software Version) (optional,16 digits)",
" -i, --imsi=STRING IMSI (default=`240010123456789')",
@@ -123,6 +124,7 @@ void clear_given (struct gengetopt_args_info *args_info)
args_info->selmode_given = 0 ;
args_info->rattype_given = 0 ;
args_info->userloc_given = 0 ;
+ args_info->rai_given = 0 ;
args_info->mstz_given = 0 ;
args_info->imeisv_given = 0 ;
args_info->imsi_given = 0 ;
@@ -178,6 +180,8 @@ void clear_args (struct gengetopt_args_info *args_info)
args_info->rattype_orig = NULL;
args_info->userloc_arg = strdup("02509946241207");
args_info->userloc_orig = NULL;
+ args_info->rai_arg = strdup("02509946241207");
+ args_info->rai_orig = NULL;
args_info->mstz_arg = strdup("0");
args_info->mstz_orig = NULL;
args_info->imeisv_arg = strdup("2143658709214365");
@@ -802,6 +806,7 @@ cmdline_parser_internal (int argc, char * const *argv, struct gengetopt_args_inf
{ "selmode", 1, NULL, 0 },
{ "rattype", 1, NULL, 0},
{ "userloc", 1, NULL, 0},
+ { "rai", 1, NULL, 0},
{ "mstz", 1, NULL, 0},
{ "imeisv", 1, NULL, 0},
{ "imsi", 1, NULL, 'i' },
@@ -1284,6 +1289,18 @@ cmdline_parser_internal (int argc, char * const *argv, struct gengetopt_args_inf
args_info->userloc_arg = strdup (optarg);
break;
}
+ /* Routing Area Information. */
+ else if (strcmp (long_options[option_index].name, "rai") == 0)
+ {
+ if (args_info->rai_given)
+ {
+ fprintf (stderr, "%s: `--rai' option given more than once\n", PACKAGE);
+ exit (EXIT_FAILURE);
+ }
+ args_info->rai_given = 1;
+ args_info->rai_arg = strdup (optarg);
+ break;
+ }
/* MS Time Zone */
else if (strcmp (long_options[option_index].name, "mstz") == 0)
{
diff --git a/sgsnemu/cmdline.h b/sgsnemu/cmdline.h
index 869262f..5a4f8d9 100644
--- a/sgsnemu/cmdline.h
+++ b/sgsnemu/cmdline.h
@@ -67,6 +67,9 @@ struct gengetopt_args_info
char * userloc_arg; /* User Location Information (optional). */
char * userloc_orig;
char * userloc_help;
+ char * rai_arg; /* Routing Area Information (optional). */
+ char * rai_orig;
+ char * rai_help;
char * mstz_arg; /* MS Time Zone (optional). */
char * mstz_orig;
char * mstz_help;
@@ -146,6 +149,7 @@ struct gengetopt_args_info
int selmode_given ; /* Whether selmode was given. */
int rattype_given ; /* Whether rattype was given. */
int userloc_given ; /* Whether userloc was given. */
+ int rai_given ; /* Whether RAI was given. */
int mstz_given ; /* Whether mstz was given. */
int imeisv_given ; /* Whether imeisv was given. */
int imsi_given ; /* Whether imsi was given. */
diff --git a/sgsnemu/sgsnemu.c b/sgsnemu/sgsnemu.c
index edee09e..7d164b3 100644
--- a/sgsnemu/sgsnemu.c
+++ b/sgsnemu/sgsnemu.c
@@ -108,6 +108,8 @@ struct {
int rattype_given;
struct ul255_t userloc;
int userloc_given;
+ struct ul255_t rai;
+ int rai_given;
struct ul255_t mstz;
int mstz_given;
struct ul255_t imeisv;
@@ -231,6 +233,7 @@ int process_options(int argc, char **argv) {
int lac_d;
char * rest;
char *userloc_el[] = {"TYPE","MCC","MNC","LAC","REST"};
+ char *rai_el[] = {"MCC","MNC","LAC","RAC"};
char *mstz_el[] = {"SIGN","QUARTERS","DST"};
int sign ;
int nbquarters ;
@@ -610,6 +613,82 @@ int process_options(int argc, char **argv) {
options.userloc.v[6] = i; /* octet 10 - t0,CI / t1,SAC / t2,RAC */
options.userloc.v[7] = lac_d; /* octet 11 - t0,CI / t1,SAC / t2,RAC */
}
+
+ /* RAI */
+ if (args_info.rai_given == 1 ) {
+ printf("Using RAI: %s\n", args_info.rai_arg);
+ tmp = args_info.rai_arg ;
+ n=0;
+ pch = strtok (tmp,".");
+ while (pch != NULL) {
+ rai_el[n] = pch ;
+ pch = strtok (NULL, ".");
+ n++;
+ }
+
+ options.rai_given = 1 ;
+ options.rai.l = 6 ;
+
+
+ /* MCC */
+ mcc = rai_el[0] ;
+ printf("->mcc : %s\n", mcc);
+ if (strlen(mcc)!=3) {
+ printf("Invalid MCC lenght\n");
+ return -1;
+ }
+
+ /* MNC */
+ mnc = rai_el[1] ;
+ printf("->mnc : %s\n", mnc);
+
+ a = (uint8_t) (mcc[0] - 48);
+ b = (uint8_t) (mcc[1] - 48);
+ options.rai.v[0] = 16*b+a ;
+
+ /* octet 3 - MNC Digit 3 - MCC Digit 3 */
+ a = (uint8_t) (mcc[2] - 48);
+
+ if ( (strlen(mnc) > 3) || (strlen(mnc) < 2)) {
+ printf("Invalid MNC lenght\n");
+ return -1;
+ }
+ if (strlen(mnc)==2) {
+ b = 15 ;
+ }
+ if (strlen(mnc)==3) {
+ b = (uint8_t) (mnc[2] - 48);
+ }
+ options.rai.v[1] = 16*b+a ;
+
+ /* octet 4 - MNC Digit 2 - MNC Digit 1 */
+ a = (uint8_t) (mnc[0]- 48);
+ b = (uint8_t) (mnc[1]- 48);
+ options.rai.v[2] = 16*b+a ;
+
+ /* LAC */
+ lac = rai_el[2] ;
+ printf("->LAC: %s\n", lac);
+ lac_d = atoi(lac);
+ if (lac_d>65535 || lac_d<1) {
+ printf("Invalid LAC\n");
+ return -1;
+ }
+ i = lac_d >> 8 ;
+ options.rai.v[3] = i; /* octet 5 - LAC */
+ options.rai.v[4] = lac_d; /* octet 6 - LAC */
+
+ /* RAC */
+ rest = rai_el[3] ;
+ printf("->RAC : %s\n", rest);
+ lac_d = atoi(rest);
+ if (lac_d>255 || lac_d<1) {
+ printf("Invalid RAC\n");
+ return -1;
+ }
+ options.rai.v[5] = lac_d; /* octet 7 - RAC */
+ }
+
/* mstz */
if (args_info.mstz_given == 1 ) {
options.mstz_given = 1 ;
@@ -1374,6 +1453,10 @@ int main(int argc, char **argv)
memcpy(pdp->userloc.v, options.userloc.v, options.userloc.l);
pdp->userloc_given = options.userloc_given;
+ pdp->rai.l = options.rai.l;
+ memcpy(pdp->rai.v, options.rai.v, options.rai.l);
+ pdp->rai_given = options.rai_given;
+
pdp->mstz.l = options.mstz.l;
memcpy(pdp->mstz.v, options.mstz.v, options.mstz.l);
pdp->mstz_given = options.mstz_given;