aboutsummaryrefslogtreecommitdiffstats
path: root/sgsnemu
diff options
context:
space:
mode:
authorAndreas Schultz <aschultz@tpip.net>2015-11-13 15:57:37 +0100
committerHarald Welte <laforge@gnumonks.org>2015-11-13 17:16:03 +0100
commit10abfba9495e7bac1e96463f8a55ce7d4da76a26 (patch)
treebc99de36eea2270f02f4e16eb8cf05b0e9e28151 /sgsnemu
parenta377b0874a7b69e5094f640b47a985804f02bd19 (diff)
convert literal APN name to protocol encoded version before use
The definition of the APN field format in GTPv1 is hidden in a chain of documents. 3GPP TS 29.060 (the GTPv1-C specification) Section 7.7.30: > The Access Point Name contains a logical name (see 3GPP TS 23.060 [4]). > It is coded as in the value part defined in 3GPP TS 24.008 3GPP TS 24.008 Section 10.5.6.1: > The value part is defined in 3GPP TS 23.003. 3GPP TS 23.003 Section 9.1: > The APN consists of one or more labels. Each label is coded as a one > octet length field followed by that number of octets coded as 8 bit > ASCII characters This converts a literal APN (e.g. Label1.Label2.Label3) to a structured field (e.g. \006Label1\006Label2\006Label3) Signed-off-by: Andreas Schultz <aschultz@tpip.net>
Diffstat (limited to 'sgsnemu')
-rw-r--r--sgsnemu/sgsnemu.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/sgsnemu/sgsnemu.c b/sgsnemu/sgsnemu.c
index 45341af..f3d9ba0 100644
--- a/sgsnemu/sgsnemu.c
+++ b/sgsnemu/sgsnemu.c
@@ -231,6 +231,7 @@ int process_options(int argc, char **argv)
char *type;
char *mcc;
char *mnc;
+ char *tok, *apn;
char *lac;
int lac_d;
char *rest;
@@ -534,10 +535,19 @@ int process_options(int argc, char **argv)
printf("Invalid APN\n");
return -1;
}
- options.apn.l = strlen(args_info.apn_arg);
- strncpy((char *)options.apn.v, args_info.apn_arg,
- sizeof(options.apn.v));
- options.apn.v[sizeof(options.apn.v) - 1] = 0;
+ options.apn.l = strlen(args_info.apn_arg) + 1;
+
+ apn = (char *)options.apn.v;
+ for (tok = strtok(args_info.apn_arg, ".");
+ tok != NULL;
+ tok = strtok(NULL, ".")) {
+ size_t len = strlen(tok);
+
+ *apn++ = (char)len;
+ strncpy(apn, tok, len);
+ apn += len;
+ }
+
printf("Using APN: %s\n", args_info.apn_arg);
/* selmode */