@@ -23,15 +23,13 @@
#include <stdint.h>
#include <sys/types.h>
+#include <osmocom/core/defs.h>
struct msgb;
struct msgb *gprs_msgb_copy(const struct msgb *msg, const char *name);
int gprs_msgb_resize_area(struct msgb *msg, uint8_t *area,
size_t old_size, size_t new_size);
-char *gprs_apn_to_str(char *out_str, const uint8_t *apn_enc, size_t rest_chars);
-int gprs_str_to_apn(uint8_t *apn_enc, size_t max_len, const char *str);
-
/* GSM 04.08, 10.5.7.3 GPRS Timer */
int gprs_tmr_to_secs(uint8_t tmr);
uint8_t gprs_secs_to_tmr_floor(int secs);
@@ -28,6 +28,7 @@
#include <openbsc/debug.h>
#include <osmocom/gprs/protocol/gsm_08_18.h>
+#include <osmocom/gsm/apn.h>
#include <osmocom/core/rate_ctr.h>
/* patch RA identifier in place */
@@ -102,7 +103,7 @@ static void gbproxy_patch_apn_ie(struct msgb *msg,
LOGP(DGPRS, LOGL_DEBUG,
"Patching %s to SGSN: Removing APN '%s'\n",
log_text,
- gprs_apn_to_str(str1, apn, apn_len));
+ osmo_apn_to_str(str1, apn, apn_len));
*new_apn_ie_len = 0;
gprs_msgb_resize_area(msg, apn_ie, apn_ie_len, 0);
@@ -117,8 +118,8 @@ static void gbproxy_patch_apn_ie(struct msgb *msg,
"Patching %s to SGSN: "
"Replacing APN '%s' -> '%s'\n",
log_text,
- gprs_apn_to_str(str1, apn, apn_len),
- gprs_apn_to_str(str2, peer->cfg->core_apn,
+ osmo_apn_to_str(str1, apn, apn_len),
+ osmo_apn_to_str(str2, peer->cfg->core_apn,
peer->cfg->core_apn_size));
*new_apn_ie_len = peer->cfg->core_apn_size + 2;
@@ -29,10 +29,10 @@
#include <openbsc/gsm_04_08.h>
#include <osmocom/gprs/gprs_ns.h>
+#include <osmocom/gsm/apn.h>
#include <openbsc/debug.h>
#include <openbsc/gb_proxy.h>
-#include <openbsc/gprs_utils.h>
#include <openbsc/vty.h>
#include <osmocom/vty/command.h>
@@ -107,7 +107,7 @@ static int config_write_gbproxy(struct vty *vty)
if (g_cfg->core_apn_size > 0) {
char str[500] = {0};
vty_out(vty, " core-access-point-name %s%s",
- gprs_apn_to_str(str, g_cfg->core_apn,
+ osmo_apn_to_str(str, g_cfg->core_apn,
g_cfg->core_apn_size),
VTY_NEWLINE);
} else {
@@ -279,7 +279,7 @@ static int set_core_apn(struct vty *vty, const char *apn)
g_cfg->core_apn =
talloc_realloc_size(NULL, g_cfg->core_apn, apn_len + 1);
g_cfg->core_apn_size =
- gprs_str_to_apn(g_cfg->core_apn, apn_len + 1, apn);
+ osmo_apn_from_str(g_cfg->core_apn, apn_len + 1, apn);
}
return CMD_SUCCESS;
@@ -29,6 +29,7 @@
#include <osmocom/core/backtrace.h>
#include <osmocom/gprs/gprs_ns.h>
#include <osmocom/gprs/gprs_bssgp.h>
+#include <osmocom/gsm/apn.h>
#include <openbsc/gsm_subscriber.h>
#include <openbsc/debug.h>
@@ -36,7 +37,6 @@
#include <openbsc/sgsn.h>
#include <openbsc/gsm_04_08_gprs.h>
#include <openbsc/gprs_gmm.h>
-#include <openbsc/gprs_utils.h>
#include <openbsc/signal.h>
#include "openbsc/gprs_llc.h"
@@ -650,7 +650,7 @@ struct sgsn_ggsn_ctx *sgsn_mm_ctx_find_ggsn_ctx(struct sgsn_mm_ctx *mmctx,
return NULL;
}
- gprs_apn_to_str(req_apn_str,
+ osmo_apn_to_str(req_apn_str,
TLVP_VAL(tp, GSM48_IE_GSM_APN),
TLVP_LEN(tp, GSM48_IE_GSM_APN));
@@ -27,10 +27,11 @@
#include <openbsc/gprs_sgsn.h>
#include <openbsc/gprs_gmm.h>
#include <openbsc/gprs_gsup_messages.h>
-#include <openbsc/gprs_utils.h>
#include <openbsc/debug.h>
+#include <osmocom/gsm/apn.h>
+
#include <netinet/in.h>
#include <arpa/inet.h>
@@ -328,7 +329,7 @@ static void gprs_subscr_gsup_insert_data(struct gsm_subscriber *subscr,
OSMO_ASSERT(pdp_data != NULL);
pdp_data->pdp_type = pdp_info->pdp_type;
- gprs_apn_to_str(pdp_data->apn_str,
+ osmo_apn_to_str(pdp_data->apn_str,
pdp_info->apn_enc, pdp_info->apn_enc_len);
memcpy(pdp_data->qos_subscribed, pdp_info->qos_enc, pdp_info->qos_enc_len);
pdp_data->qos_subscribed_len = pdp_info->qos_enc_len;
@@ -113,68 +113,6 @@ int gprs_msgb_resize_area(struct msgb *msg, uint8_t *area,
return 0;
}
-/* TODO: Move these conversion functions to a utils file. */
-/* TODO: consolidate with gprs_apn2str(). */
-/** memmove apn_enc to out_str, replacing the length octets in apn_enc with '.'
- * (omitting the first one) and terminating with a '\0'.
- * out_str needs to have rest_chars amount of bytes or 1 whatever is bigger.
- */
-char * gprs_apn_to_str(char *out_str, const uint8_t *apn_enc, size_t rest_chars)
-{
- char *str = out_str;
-
- while (rest_chars > 0 && apn_enc[0]) {
- size_t label_size = apn_enc[0];
- if (label_size + 1 > rest_chars)
- return NULL;
-
- memmove(str, apn_enc + 1, label_size);
- str += label_size;
- rest_chars -= label_size + 1;
- apn_enc += label_size + 1;
-
- if (rest_chars)
- *(str++) = '.';
- }
- str[0] = '\0';
-
- return out_str;
-}
-
-int gprs_str_to_apn(uint8_t *apn_enc, size_t max_len, const char *str)
-{
- uint8_t *last_len_field;
- int len;
-
- /* Can we even write the length field to the output? */
- if (max_len == 0)
- return -1;
-
- /* Remember where we need to put the length once we know it */
- last_len_field = apn_enc;
- len = 1;
- apn_enc += 1;
-
- while (str[0]) {
- if (len >= max_len)
- return -1;
-
- if (str[0] == '.') {
- *last_len_field = (apn_enc - last_len_field) - 1;
- last_len_field = apn_enc;
- } else {
- *apn_enc = str[0];
- }
- apn_enc += 1;
- str += 1;
- len += 1;
- }
-
- *last_len_field = (apn_enc - last_len_field) - 1;
-
- return len;
-}
-
/* GSM 04.08, 10.5.7.3 GPRS Timer */
int gprs_tmr_to_secs(uint8_t tmr)
{
@@ -34,13 +34,13 @@
#include <openbsc/gtphub.h>
#include <openbsc/debug.h>
-#include <openbsc/gprs_utils.h>
#include <osmocom/core/utils.h>
#include <osmocom/core/logging.h>
#include <osmocom/core/socket.h>
#include <osmocom/core/rate_ctr.h>
#include <osmocom/core/stats.h>
+#include <osmocom/gsm/apn.h>
static const int GTPH_GC_TICK_SECONDS = 1;
@@ -498,7 +498,7 @@ static int get_ie_apn_str(union gtpie_member *ie[], const char **apn_str)
len = sizeof(apn_buf) - 1;
apn_buf[len] = '\0';
- *apn_str = gprs_apn_to_str(apn_buf, (uint8_t*)apn_buf, len);
+ *apn_str = osmo_apn_to_str(apn_buf, (uint8_t*)apn_buf, len);
if (!(*apn_str)) {
LOG(LOGL_ERROR, "APN IE: present but cannot be decoded: %s\n",
osmo_hexdump((uint8_t*)apn_buf, len));
@@ -20,11 +20,12 @@
#include <openbsc/sgsn.h>
#include <openbsc/signal.h>
-#include <openbsc/gprs_utils.h>
#include <openbsc/debug.h>
#include <openbsc/vty.h>
+#include <osmocom/gsm/apn.h>
+
#include <gtp.h>
#include <pdp.h>
@@ -145,7 +146,7 @@ static void cdr_log_pdp(struct sgsn_instance *inst, const char *ev,
if (pdp->lib) {
- gprs_apn_to_str(apni, pdp->lib->apn_use.v, pdp->lib->apn_use.l);
+ osmo_apn_to_str(apni, pdp->lib->apn_use.v, pdp->lib->apn_use.l);
inet_ntop(AF_INET, &pdp->lib->hisaddr0.s_addr, ggsn_addr, sizeof(ggsn_addr));
extract_eua(&pdp->lib->eua, eua_addr);
}
@@ -110,7 +110,7 @@ DECLARE_TIMER(3397, "Wait for DEACT AA PDP CTX ACK timer (s)")
#define GSM48_MAX_APN_LEN 102 /* 10.5.6.1 */
-/* TODO: consolidate with gprs_apn_to_str(). */
+/* TODO: consolidate with osmo_apn_to_str(). */
/** Copy apn to a static buffer, replacing the length octets in apn_enc with '.'
* and terminating with a '\0'. Return the static buffer.
* len: the length of the encoded APN (which has no terminating zero).
@@ -26,6 +26,7 @@
#include <osmocom/core/rate_ctr.h>
#include <osmocom/gsm/tlv.h>
#include <osmocom/gsm/gsm_utils.h>
+#include <osmocom/gsm/apn.h>
#include <osmocom/gprs/gprs_msgb.h>
#include <osmocom/gprs/gprs_ns.h>
#include <osmocom/gprs/gprs_bssgp.h>
@@ -1660,7 +1661,7 @@ static void test_gbproxy_ra_patching()
gbcfg.core_mcc = 123;
gbcfg.core_mnc = 456;
gbcfg.core_apn = talloc_zero_size(NULL, 100);
- gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
+ gbcfg.core_apn_size = osmo_apn_from_str(gbcfg.core_apn, 100, "foo.bar");
gbcfg.patch_ptmsi = 0;
configure_sgsn_peer(&sgsn_peer);
@@ -2001,7 +2002,7 @@ static void test_gbproxy_ptmsi_assignment()
gbcfg.core_mcc = 0;
gbcfg.core_mnc = 0;
gbcfg.core_apn = talloc_zero_size(NULL, 100);
- gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
+ gbcfg.core_apn_size = osmo_apn_from_str(gbcfg.core_apn, 100, "foo.bar");
gbcfg.patch_ptmsi = 0;
configure_sgsn_peer(&sgsn_peer);
@@ -2235,7 +2236,7 @@ static void test_gbproxy_ptmsi_patching()
gbcfg.core_mcc = 123;
gbcfg.core_mnc = 456;
gbcfg.core_apn = talloc_zero_size(NULL, 100);
- gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
+ gbcfg.core_apn_size = osmo_apn_from_str(gbcfg.core_apn, 100, "foo.bar");
gbcfg.patch_ptmsi = 1;
configure_sgsn_peer(&sgsn_peer);
@@ -2554,7 +2555,7 @@ static void test_gbproxy_ptmsi_patching_bad_cases()
gbcfg.core_mcc = 123;
gbcfg.core_mnc = 456;
gbcfg.core_apn = talloc_zero_size(NULL, 100);
- gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
+ gbcfg.core_apn_size = osmo_apn_from_str(gbcfg.core_apn, 100, "foo.bar");
gbcfg.patch_ptmsi = 1;
configure_sgsn_peer(&sgsn_peer);
@@ -2738,7 +2739,7 @@ static void test_gbproxy_imsi_acquisition()
gbcfg.core_mcc = 123;
gbcfg.core_mnc = 456;
gbcfg.core_apn = talloc_zero_size(NULL, 100);
- gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
+ gbcfg.core_apn_size = osmo_apn_from_str(gbcfg.core_apn, 100, "foo.bar");
gbcfg.patch_ptmsi = 1;
gbcfg.acquire_imsi = 1;
@@ -3064,7 +3065,7 @@ static void test_gbproxy_secondary_sgsn()
gbcfg.core_mcc = 123;
gbcfg.core_mnc = 456;
gbcfg.core_apn = talloc_zero_size(NULL, 100);
- gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
+ gbcfg.core_apn_size = osmo_apn_from_str(gbcfg.core_apn, 100, "foo.bar");
gbcfg.patch_ptmsi = 1;
gbcfg.acquire_imsi = 1;
@@ -10,6 +10,7 @@
#include <openbsc/debug.h>
#include <osmocom/core/application.h>
+#include <osmocom/gsm/apn.h>
#define ASSERT_FALSE(x) if (x) { printf("Should have returned false.\n"); abort(); }
#define ASSERT_TRUE(x) if (!x) { printf("Should have returned true.\n"); abort(); }
@@ -59,7 +60,7 @@ static void apn_round_trip(const uint8_t *input, size_t len, const char *wanted_
int enc_len;
/* decode and verify we have what we want */
- out_str = gprs_apn_to_str(output, input, len);
+ out_str = osmo_apn_to_str(output, input, len);
OSMO_ASSERT(out_str);
OSMO_ASSERT(out_str == &output[0]);
OSMO_ASSERT(strlen(out_str) == strlen(wanted_output));
@@ -67,11 +68,11 @@ static void apn_round_trip(const uint8_t *input, size_t len, const char *wanted_
/* encode and verify it */
if (len != 0) {
- enc_len = gprs_str_to_apn(encoded, ARRAY_SIZE(encoded), wanted_output);
+ enc_len = osmo_apn_from_str(encoded, ARRAY_SIZE(encoded), wanted_output);
OSMO_ASSERT(enc_len == len);
OSMO_ASSERT(memcmp(encoded, input, enc_len) == 0);
} else {
- enc_len = gprs_str_to_apn(encoded, 0, wanted_output);
+ enc_len = osmo_apn_from_str(encoded, 0, wanted_output);
OSMO_ASSERT(enc_len == -1);
}
}
@@ -86,27 +87,27 @@ static void test_gsm_03_03_apn(void)
int enc_len;
memcpy(output, ref, ARRAY_SIZE(output));
- enc_len = gprs_str_to_apn(output, 0, "");
+ enc_len = osmo_apn_from_str(output, 0, "");
OSMO_ASSERT(enc_len == -1);
OSMO_ASSERT(memcmp(ref, output, ARRAY_SIZE(ref)) == 0);
memcpy(output, ref, ARRAY_SIZE(output));
- enc_len = gprs_str_to_apn(output, 0, "foo");
+ enc_len = osmo_apn_from_str(output, 0, "foo");
OSMO_ASSERT(enc_len == -1);
OSMO_ASSERT(memcmp(ref, output, ARRAY_SIZE(ref)) == 0);
memcpy(output, ref, ARRAY_SIZE(output));
- enc_len = gprs_str_to_apn(output, 1, "foo");
+ enc_len = osmo_apn_from_str(output, 1, "foo");
OSMO_ASSERT(enc_len == -1);
OSMO_ASSERT(memcmp(ref + 1, output + 1, ARRAY_SIZE(ref) - 1) == 0);
memcpy(output, ref, ARRAY_SIZE(output));
- enc_len = gprs_str_to_apn(output, 2, "foo");
+ enc_len = osmo_apn_from_str(output, 2, "foo");
OSMO_ASSERT(enc_len == -1);
OSMO_ASSERT(memcmp(ref + 2, output + 2, ARRAY_SIZE(ref) - 2) == 0);
memcpy(output, ref, ARRAY_SIZE(output));
- enc_len = gprs_str_to_apn(output, 3, "foo");
+ enc_len = osmo_apn_from_str(output, 3, "foo");
OSMO_ASSERT(enc_len == -1);
OSMO_ASSERT(memcmp(ref + 3, output + 3, ARRAY_SIZE(ref) - 3) == 0);
}
@@ -130,7 +131,7 @@ static void test_gsm_03_03_apn(void)
uint8_t input[] = { 0x1, 65 };
const char *output = "A";
apn_round_trip(input, ARRAY_SIZE(input), output);
- OSMO_ASSERT(gprs_apn_to_str(NULL, input, ARRAY_SIZE(input) - 1) == NULL);
+ OSMO_ASSERT(osmo_apn_to_str(NULL, input, ARRAY_SIZE(input) - 1) == NULL);
}
{
@@ -138,11 +139,11 @@ static void test_gsm_03_03_apn(void)
const char *output = "ABC.Zz";
char tmp[strlen(output) + 1];
apn_round_trip(input, ARRAY_SIZE(input), output);
- OSMO_ASSERT(gprs_apn_to_str(tmp, input, ARRAY_SIZE(input) - 1) == NULL);
- OSMO_ASSERT(gprs_apn_to_str(tmp, input, ARRAY_SIZE(input) - 2) == NULL);
- OSMO_ASSERT(gprs_apn_to_str(tmp, input, ARRAY_SIZE(input) - 4) == NULL);
- OSMO_ASSERT(gprs_apn_to_str(tmp, input, ARRAY_SIZE(input) - 5) == NULL);
- OSMO_ASSERT(gprs_apn_to_str(tmp, input, ARRAY_SIZE(input) - 6) == NULL);
+ OSMO_ASSERT(osmo_apn_to_str(tmp, input, ARRAY_SIZE(input) - 1) == NULL);
+ OSMO_ASSERT(osmo_apn_to_str(tmp, input, ARRAY_SIZE(input) - 2) == NULL);
+ OSMO_ASSERT(osmo_apn_to_str(tmp, input, ARRAY_SIZE(input) - 4) == NULL);
+ OSMO_ASSERT(osmo_apn_to_str(tmp, input, ARRAY_SIZE(input) - 5) == NULL);
+ OSMO_ASSERT(osmo_apn_to_str(tmp, input, ARRAY_SIZE(input) - 6) == NULL);
}
}
@@ -20,5 +20,6 @@ gtphub_test_LDADD = \
$(top_builddir)/src/gprs/gtphub.o \
$(top_builddir)/src/gprs/gprs_utils.o \
$(LIBOSMOCORE_LIBS) \
+ $(LIBOSMOGSM_LIBS) \
-lgtp -lrt
@@ -31,7 +31,8 @@
#include <osmocom/gprs/gprs_bssgp.h>
-#include <osmocom/gsm/gsm_utils.h>
+#include <osmocom/gsm/apn.h>
+
#include <openbsc/gsm_04_08_gprs.h>
#include <osmocom/core/application.h>
@@ -1957,7 +1958,7 @@ static void test_ggsn_selection(void)
/* Resolve GGSNs */
tp.lv[GSM48_IE_GSM_APN].len =
- gprs_str_to_apn(apn_enc, sizeof(apn_enc), "Test.Apn");
+ osmo_apn_from_str(apn_enc, sizeof(apn_enc), "Test.Apn");
ggc = sgsn_mm_ctx_find_ggsn_ctx(ctx, &tp, &gsm_cause, apn_str);
OSMO_ASSERT(ggc != NULL);
@@ -1965,7 +1966,7 @@ static void test_ggsn_selection(void)
OSMO_ASSERT(strcmp(apn_str, "Test.Apn") == 0);
tp.lv[GSM48_IE_GSM_APN].len =
- gprs_str_to_apn(apn_enc, sizeof(apn_enc), "Other.Apn");
+ osmo_apn_from_str(apn_enc, sizeof(apn_enc), "Other.Apn");
ggc = sgsn_mm_ctx_find_ggsn_ctx(ctx, &tp, &gsm_cause, apn_str);
OSMO_ASSERT(ggc != NULL);
@@ -1991,7 +1992,7 @@ static void test_ggsn_selection(void)
tp.lv[GSM48_IE_GSM_APN].val = apn_enc;
tp.lv[GSM48_IE_GSM_APN].len =
- gprs_str_to_apn(apn_enc, sizeof(apn_enc), "Foo.Bar");
+ osmo_apn_from_str(apn_enc, sizeof(apn_enc), "Foo.Bar");
ggc = sgsn_mm_ctx_find_ggsn_ctx(ctx, &tp, &gsm_cause, apn_str);
OSMO_ASSERT(ggc == NULL);
@@ -2008,7 +2009,7 @@ static void test_ggsn_selection(void)
strncpy(pdp_data->apn_str, "Test.Apn", sizeof(pdp_data->apn_str)-1);
tp.lv[GSM48_IE_GSM_APN].len =
- gprs_str_to_apn(apn_enc, sizeof(apn_enc), "Test.Apn");
+ osmo_apn_from_str(apn_enc, sizeof(apn_enc), "Test.Apn");
ggc = sgsn_mm_ctx_find_ggsn_ctx(ctx, &tp, &gsm_cause, apn_str);
OSMO_ASSERT(ggc != NULL);
@@ -2016,7 +2017,7 @@ static void test_ggsn_selection(void)
OSMO_ASSERT(strcmp(apn_str, "Test.Apn") == 0);
tp.lv[GSM48_IE_GSM_APN].len =
- gprs_str_to_apn(apn_enc, sizeof(apn_enc), "Other.Apn");
+ osmo_apn_from_str(apn_enc, sizeof(apn_enc), "Other.Apn");
ggc = sgsn_mm_ctx_find_ggsn_ctx(ctx, &tp, &gsm_cause, apn_str);
OSMO_ASSERT(ggc == NULL);