diff options
author | Harald Welte <laforge@gnumonks.org> | 2017-08-12 19:29:16 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2017-08-12 22:53:54 +0200 |
commit | b10ee08c2ff4df8acc053d2ad9a2cba04e757061 (patch) | |
tree | 289b828c702e623f7dc71a462b5e0479d16374d7 | |
parent | 23eea1d132120198745dcca32728906d5f05dc5f (diff) |
Properly format IMSI before using it in trap
For some reason Max' commits introducing the CTRL/trap interface
about one year ago didn't convert the IMSI to its actual textual
representation before usign it in the CTRL interface.
Let's clean that up by properly interpreting the IMSI.
Change-Id: I8b20d2e47a29de266d93a7ddd5e6877f7e346a63
-rw-r--r-- | ggsn/ggsn.c | 2 | ||||
-rw-r--r-- | gtp/gtp.c | 28 | ||||
-rw-r--r-- | gtp/gtp.h | 1 |
3 files changed, 30 insertions, 1 deletions
diff --git a/ggsn/ggsn.c b/ggsn/ggsn.c index 05a56ae..c6a6dac 100644 --- a/ggsn/ggsn.c +++ b/ggsn/ggsn.c @@ -146,7 +146,7 @@ static bool send_trap(const struct gsn_t *gsn, const struct pdp_t *pdp, const st const char *addrstr = in46a_ntop(&member->addr, addrbuf, sizeof(addrbuf)); - snprintf(val, sizeof(val), "%" PRIu64 ",%s", pdp->imsi, addrstr); + snprintf(val, sizeof(val), "%s,%s", imsi_gtp2str(&pdp->imsi), addrstr); if (ctrl_cmd_send_trap(gsn->ctrl, var, val) < 0) { LOGP(DGGSN, LOGL_ERROR, "Failed to create and send TRAP for IMSI %" PRIu64 " [%s].\n", pdp->imsi, var); @@ -3244,3 +3244,31 @@ int in_addr2gsna(struct ul16_t *gsna, struct in_addr *src) memcpy(gsna->v, src, gsna->l); return 0; } + +/* TS 29.060 has yet again a different encoding for IMSIs than + * what we have in other places, so we cannot use the gsm48 + * decoding functions. Also, libgtp uses an uint64_t in + * _network byte order_ to contain BCD digits ?!? */ +const char *imsi_gtp2str(const uint64_t *imsi) +{ + static char buf[sizeof(*imsi)+1]; + const uint8_t *imsi8 = (const uint8_t *) imsi; + unsigned int i, j = 0; + + for (i = 0; i < sizeof(*imsi); i++) { + uint8_t nibble; + + nibble = imsi8[i] & 0xf; + if (nibble == 0xf) + break; + buf[j++] = osmo_bcd2char(nibble); + + nibble = imsi8[i] >> 4; + if (nibble == 0xf) + break; + buf[j++] = osmo_bcd2char(nibble); + } + + buf[j++] = '\0'; + return buf; +} @@ -402,5 +402,6 @@ extern int ipv42eua(struct ul66_t *eua, struct in_addr *src); extern int eua2ipv4(struct in_addr *dst, struct ul66_t *eua); extern int gsna2in_addr(struct in_addr *dst, struct ul16_t *gsna); extern int in_addr2gsna(struct ul16_t *gsna, struct in_addr *src); +extern const char *imsi_gtp2str(const uint64_t *imsi); #endif /* !_GTP_H */ |