From 10abfba9495e7bac1e96463f8a55ce7d4da76a26 Mon Sep 17 00:00:00 2001 From: Andreas Schultz Date: Fri, 13 Nov 2015 15:57:37 +0100 Subject: 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 --- sgsnemu/sgsnemu.c | 18 ++++++++++++++---- 1 file 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 */ -- cgit v1.2.3