aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src/libbsc
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <holger@moiji-mobile.com>2015-06-10 11:51:16 +0200
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2015-07-01 08:16:40 +0200
commit8a8df80772a4bac0f3cb4d384f45a5d4c463fe11 (patch)
tree2038fe325af8dae15577efbbdfdf36de4425c50c /openbsc/src/libbsc
parent0363d1bb97663e83aa0dc3a1e6b425b1870dd271 (diff)
bsc/nat: Fix the structure of the identity request message
Unfortunately the basic structure of the response is broken. There is a two byte length followed by data. The concept of a 'tag' happens to be the first byte of the data. This means we want to write strlen of the token, then we want to write the NUL and then we need to account for the tag in front. Introduce a flag if the new or old format should be used. This will allow to have new BSCs talk to old NATs without an additional change. In the long run we can clean that up.
Diffstat (limited to 'openbsc/src/libbsc')
-rw-r--r--openbsc/src/libbsc/bsc_msc.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/openbsc/src/libbsc/bsc_msc.c b/openbsc/src/libbsc/bsc_msc.c
index a24efabb0..fc4530ce7 100644
--- a/openbsc/src/libbsc/bsc_msc.c
+++ b/openbsc/src/libbsc/bsc_msc.c
@@ -276,7 +276,7 @@ void bsc_msc_schedule_connect(struct bsc_msc_connection *con)
osmo_timer_schedule(&con->reconnect_timer, 5, 0);
}
-struct msgb *bsc_msc_id_get_resp(const char *token)
+struct msgb *bsc_msc_id_get_resp(int fixed, const char *token)
{
struct msgb *msg;
@@ -291,8 +291,21 @@ struct msgb *bsc_msc_id_get_resp(const char *token)
return NULL;
}
+ /*
+ * The situation is bizarre. The encoding doesn't follow the
+ * TLV structure. It is more like a LV and old versions had
+ * it wrong but we want new versions to old servers so we
+ * introduce the quirk here.
+ */
msg->l2h = msgb_v_put(msg, IPAC_MSGT_ID_RESP);
- msgb_l16tv_put(msg, strlen(token) + 1,
+ if (fixed) {
+ msgb_put_u8(msg, 0);
+ msgb_put_u8(msg, strlen(token) + 2);
+ msgb_tv_fixed_put(msg, IPAC_IDTAG_UNITNAME, strlen(token) + 1, (uint8_t *) token);
+ } else {
+ msgb_l16tv_put(msg, strlen(token) + 1,
IPAC_IDTAG_UNITNAME, (uint8_t *) token);
+ }
+
return msg;
}