aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src
diff options
context:
space:
mode:
authorJacob Erlbeck <jerlbeck@sysmocom.de>2014-09-11 15:22:18 +0200
committerJacob Erlbeck <jerlbeck@sysmocom.de>2014-09-18 13:20:58 +0200
commit948c07f490f7be7be3d5b3a2efe3390af61bfafc (patch)
tree8c81024b8de8ad7335e235ba01c22362dbc8fcad /openbsc/src
parent991606b57a613e806e3db3be02864508f593cb27 (diff)
gbproxy: Fixed RAI patching in Attach Request messages
Currently the RAI in the LLC part of the message is not updated if the message has been taken from the list of stored messages. The reason is, that old_raid_matches is update in gbprox_process_bssgp_ul() but not in gbproxy_flush_stored_messages(). This patch moves the check to gprs_gb_parse_bssgp() which is called at both places and where other fields like parse_ctx->tlli are set, too. In addition, old_raid_matches is replaced by old_raid_is_foreign since this is clearer in the case when there is no old RAI at all. Several RAI patch counter assertions are also added to test_gbproxy_ra_patching(). Sponsored-by: On-Waves ehf
Diffstat (limited to 'openbsc/src')
-rw-r--r--openbsc/src/gprs/gb_proxy.c4
-rw-r--r--openbsc/src/gprs/gb_proxy_patch.c5
-rw-r--r--openbsc/src/gprs/gprs_gb_parse.c4
3 files changed, 7 insertions, 6 deletions
diff --git a/openbsc/src/gprs/gb_proxy.c b/openbsc/src/gprs/gb_proxy.c
index 2dfb4d82c..344e16448 100644
--- a/openbsc/src/gprs/gb_proxy.c
+++ b/openbsc/src/gprs/gb_proxy.c
@@ -494,10 +494,6 @@ static int gbprox_process_bssgp_ul(struct gbproxy_config *cfg,
now = time(NULL);
- if (parse_ctx.bssgp_raid_enc && parse_ctx.old_raid_enc &&
- memcmp(parse_ctx.bssgp_raid_enc, parse_ctx.old_raid_enc, 6) == 0)
- parse_ctx.old_raid_matches = 1;
-
gbprox_update_current_raid(parse_ctx.bssgp_raid_enc, peer,
parse_ctx.llc_msg_name);
diff --git a/openbsc/src/gprs/gb_proxy_patch.c b/openbsc/src/gprs/gb_proxy_patch.c
index be3ebd986..caedf8965 100644
--- a/openbsc/src/gprs/gb_proxy_patch.c
+++ b/openbsc/src/gprs/gb_proxy_patch.c
@@ -199,7 +199,8 @@ int gbproxy_patch_llc(struct msgb *msg, uint8_t *llc, size_t llc_len,
int have_patched = 0;
int fcs;
- if (parse_ctx->ptmsi_enc && tlli_info) {
+ if (parse_ctx->ptmsi_enc && tlli_info &&
+ !parse_ctx->old_raid_is_foreign) {
uint32_t ptmsi;
if (parse_ctx->to_bss)
ptmsi = tlli_info->tlli.ptmsi;
@@ -234,7 +235,7 @@ int gbproxy_patch_llc(struct msgb *msg, uint8_t *llc, size_t llc_len,
have_patched = 1;
}
- if (parse_ctx->old_raid_enc && parse_ctx->old_raid_matches) {
+ if (parse_ctx->old_raid_enc && !parse_ctx->old_raid_is_foreign) {
/* TODO: Patch to invalid if P-TMSI unknown. */
gbproxy_patch_raid(parse_ctx->old_raid_enc, peer, parse_ctx->to_bss,
parse_ctx->llc_msg_name);
diff --git a/openbsc/src/gprs/gprs_gb_parse.c b/openbsc/src/gprs/gprs_gb_parse.c
index fe0881783..f361951a1 100644
--- a/openbsc/src/gprs/gprs_gb_parse.c
+++ b/openbsc/src/gprs/gprs_gb_parse.c
@@ -557,6 +557,10 @@ int gprs_gb_parse_bssgp(uint8_t *bssgp, size_t bssgp_len,
parse_ctx->tlli = ntohl(tmp_tlli);
}
+ if (parse_ctx->bssgp_raid_enc && parse_ctx->old_raid_enc &&
+ memcmp(parse_ctx->bssgp_raid_enc, parse_ctx->old_raid_enc, 6) != 0)
+ parse_ctx->old_raid_is_foreign = 1;
+
return 1;
}