diff options
-rw-r--r-- | openbsc/src/gprs/gb_proxy_patch.c | 16 | ||||
-rw-r--r-- | openbsc/src/gprs/gb_proxy_tlli.c | 81 | ||||
-rw-r--r-- | openbsc/tests/gbproxy/gbproxy_test.ok | 20 |
3 files changed, 73 insertions, 44 deletions
diff --git a/openbsc/src/gprs/gb_proxy_patch.c b/openbsc/src/gprs/gb_proxy_patch.c index c1b88d99e..970f2f62c 100644 --- a/openbsc/src/gprs/gb_proxy_patch.c +++ b/openbsc/src/gprs/gb_proxy_patch.c @@ -335,6 +335,15 @@ void gbproxy_patch_bssgp(struct msgb *msg, uint8_t *bssgp, size_t bssgp_len, goto patch_error; } + if (!tlli_info && parse_ctx->tlli_enc && parse_ctx->to_bss) { + /* Happens with unknown (not cached) TLLI coming from + * the SGSN */ + /* TODO: What shall be done with the message in this case? */ + err_ctr = GBPROX_PEER_CTR_TLLI_UNKNOWN; + err_info = "TLLI sent by the SGSN is unknown"; + goto patch_error; + } + if (!tlli_info) return; @@ -346,13 +355,6 @@ void gbproxy_patch_bssgp(struct msgb *msg, uint8_t *bssgp, size_t bssgp_len, gbproxy_patch_tlli(parse_ctx->tlli_enc, peer, tlli, parse_ctx->to_bss, "TLLI"); parse_ctx->tlli = tlli; - } else if (parse_ctx->to_bss) { - /* Happens with unknown (not cached) TLLI coming from - * the SGSN */ - /* TODO: What shall be done with the message in this case? */ - err_ctr = GBPROX_PEER_CTR_TLLI_UNKNOWN; - err_info = "TLLI sent by the SGSN is unknown"; - goto patch_error; } else { /* Internal error */ err_ctr = GBPROX_PEER_CTR_PATCH_ERR; diff --git a/openbsc/src/gprs/gb_proxy_tlli.c b/openbsc/src/gprs/gb_proxy_tlli.c index 2074308cf..4c97f8abe 100644 --- a/openbsc/src/gprs/gb_proxy_tlli.c +++ b/openbsc/src/gprs/gb_proxy_tlli.c @@ -440,8 +440,8 @@ struct gbproxy_tlli_info *gbproxy_update_tlli_state_dl( if (parse_ctx->tlli_enc) tlli_info = gbproxy_find_tlli_by_sgsn_tlli(peer, parse_ctx->tlli); - if (parse_ctx->tlli_enc && parse_ctx->new_ptmsi_enc) { - /* A new PTMSI has been signaled in the message, + if (parse_ctx->tlli_enc && parse_ctx->new_ptmsi_enc && tlli_info) { + /* A new P-TMSI has been signalled in the message, * register new TLLI */ uint32_t new_sgsn_ptmsi; uint32_t new_sgsn_tlli; @@ -461,46 +461,67 @@ struct gbproxy_tlli_info *gbproxy_update_tlli_state_dl( LOGP(DGPRS, LOGL_INFO, "Got new TLLI(PTMSI) %08x(%08x) from SGSN, using %08x(%08x)\n", new_sgsn_tlli, new_sgsn_ptmsi, new_bss_tlli, new_bss_ptmsi); - if (tlli_info) { - gbproxy_reassign_tlli(&tlli_info->sgsn_tlli, - peer, new_sgsn_tlli); - gbproxy_reassign_tlli(&tlli_info->tlli, - peer, new_bss_tlli); - gbproxy_touch_tlli(peer, tlli_info, now); - } else { - tlli_info = gbproxy_tlli_info_alloc(peer); - LOGP(DGPRS, LOGL_INFO, - "Adding TLLI %08x to list (SGSN, new P-TMSI)\n", - new_sgsn_tlli); - gbproxy_attach_tlli_info(peer, now, tlli_info); - /* Setup TLLIs */ - tlli_info->sgsn_tlli.current = new_sgsn_tlli; - } + gbproxy_reassign_tlli(&tlli_info->sgsn_tlli, + peer, new_sgsn_tlli); + gbproxy_reassign_tlli(&tlli_info->tlli, + peer, new_bss_tlli); + gbproxy_touch_tlli(peer, tlli_info, now); /* Setup PTMSIs */ tlli_info->sgsn_tlli.ptmsi = new_sgsn_ptmsi; tlli_info->tlli.ptmsi = new_bss_ptmsi; - } else if (parse_ctx->tlli_enc && parse_ctx->llc && !tlli_info) { - /* Unknown SGSN TLLI */ + } else if (parse_ctx->tlli_enc && parse_ctx->new_ptmsi_enc && !tlli_info && + !peer->cfg->patch_ptmsi) { + /* A new P-TMSI has been signalled in the message with an unknown + * TLLI, create a new tlli_info */ + uint32_t new_ptmsi; + if (!gprs_parse_mi_tmsi(parse_ctx->new_ptmsi_enc, GSM48_TMSI_LEN, + &new_ptmsi)) { + LOGP(DGPRS, LOGL_ERROR, + "Failed to parse new PTMSI (TLLI is %08x)\n", + parse_ctx->tlli); + return tlli_info; + } + + LOGP(DGPRS, LOGL_INFO, + "Adding TLLI %08x to list (SGSN, new P-TMSI is %08x)\n", + parse_ctx->tlli, new_ptmsi); + + tlli_info = gbproxy_tlli_info_alloc(peer); + tlli_info->sgsn_tlli.current = parse_ctx->tlli;; + tlli_info->tlli.current = parse_ctx->tlli;; + tlli_info->sgsn_tlli.ptmsi = new_ptmsi; + tlli_info->tlli.ptmsi = new_ptmsi; + } else if (parse_ctx->tlli_enc && parse_ctx->llc && !tlli_info && + !peer->cfg->patch_ptmsi) { + /* Unknown SGSN TLLI, create a new tlli_info */ + uint32_t new_ptmsi; tlli_info = gbproxy_tlli_info_alloc(peer); LOGP(DGPRS, LOGL_INFO, "Adding TLLI %08x to list (SGSN)\n", parse_ctx->tlli); gbproxy_attach_tlli_info(peer, now, tlli_info); + /* Setup TLLIs */ tlli_info->sgsn_tlli.current = parse_ctx->tlli; - if (peer->cfg->patch_ptmsi) { - /* TODO: We don't know the local TLLI here, perhaps add - * a workaround that derives a PTMSI from the SGSN TLLI - * and use that to get the missing values. This may - * only happen when the gbproxy has been restarted or a - * tlli_info has been discarded due to age or queue - * length. - */ - tlli_info->tlli.current = 0; - } else { - tlli_info->tlli.current = tlli_info->sgsn_tlli.current; + tlli_info->tlli.current = parse_ctx->tlli; + + if (!parse_ctx->new_ptmsi_enc) + return tlli_info; + /* A new P-TMSI has been signalled in the message */ + + if (!gprs_parse_mi_tmsi(parse_ctx->new_ptmsi_enc, + GSM48_TMSI_LEN, &new_ptmsi)) { + LOGP(DGPRS, LOGL_ERROR, + "Failed to parse new PTMSI (TLLI is %08x)\n", + parse_ctx->tlli); + return tlli_info; } + LOGP(DGPRS, LOGL_INFO, + "Assigning new P-TMSI %08x\n", new_ptmsi); + /* Setup P-TMSIs */ + tlli_info->sgsn_tlli.ptmsi = new_ptmsi; + tlli_info->tlli.ptmsi = new_ptmsi; } else if (parse_ctx->tlli_enc && parse_ctx->llc && tlli_info) { uint32_t bss_tlli = gbproxy_map_tlli(parse_ctx->tlli, tlli_info, 1); diff --git a/openbsc/tests/gbproxy/gbproxy_test.ok b/openbsc/tests/gbproxy/gbproxy_test.ok index e00c20cf5..8e6770a98 100644 --- a/openbsc/tests/gbproxy/gbproxy_test.ok +++ b/openbsc/tests/gbproxy/gbproxy_test.ok @@ -1626,6 +1626,7 @@ Peers: NSEI 4096, BVCI 4098, not blocked, RAI 112-332-16464-96 RAID patched (BSS ): 2 RAID patched (SGSN): 1 + TLLI from SGSN unknown : 1 TLLI-Cache: 0 --- Send message from BSS 1 to SGSN, BVCI 0x1002 --- @@ -1743,6 +1744,7 @@ Peers: RAID patched (SGSN): 2 APN patched : 3 Attach Request count : 1 + TLLI from SGSN unknown : 1 TLLI cache size : 1 TLLI-Cache: 1 TLLI efe2b700 -> efe2b700, IMSI 12131415161718, AGE 0, IMSI matches @@ -1776,6 +1778,7 @@ Peers: RAID patched (SGSN): 2 APN patched : 3 Attach Request count : 1 + TLLI from SGSN unknown : 1 TLLI-Cache: 0 --- RA update --- @@ -1821,6 +1824,7 @@ Peers: RAID patched (SGSN): 3 APN patched : 4 Attach Request count : 1 + TLLI from SGSN unknown : 1 TLLI cache size : 1 TLLI-Cache: 1 TLLI bbc54679/efe2b700 -> bbc54679/efe2b700, IMSI 12131415161718, AGE 0, IMSI matches @@ -1843,6 +1847,7 @@ Peers: RAID patched (SGSN): 3 APN patched : 4 Attach Request count : 1 + TLLI from SGSN unknown : 1 TLLI-Cache: 0 --- Bad cases --- @@ -1881,6 +1886,7 @@ Peers: RAID patched (SGSN): 3 APN patched : 4 Attach Request count : 1 + TLLI from SGSN unknown : 1 TLLI cache size : 1 TLLI-Cache: 1 TLLI efe2b700 -> efe2b700, IMSI (none), AGE 0 @@ -2282,8 +2288,8 @@ Peers: TLLI patched (BSS ): 8 TLLI patched (SGSN): 6 P-TMSI patched (SGSN): 2 + Patch error: other : 1 Attach Request count : 1 - TLLI from SGSN unknown : 1 TLLI cache size : 1 TLLI-Cache: 1 TLLI c00f7304/ead4775a -> efe2b700/e0543210, IMSI 12131415161718, AGE 0, IMSI matches @@ -2319,8 +2325,8 @@ Peers: TLLI patched (BSS ): 9 TLLI patched (SGSN): 7 P-TMSI patched (SGSN): 2 + Patch error: other : 1 Attach Request count : 1 - TLLI from SGSN unknown : 1 TLLI cache size : 1 TLLI-Cache: 1 TLLI ead4775a -> e0543210, IMSI 12131415161718, AGE 0, IMSI matches @@ -2344,8 +2350,8 @@ Peers: TLLI patched (BSS ): 10 TLLI patched (SGSN): 7 P-TMSI patched (SGSN): 2 + Patch error: other : 1 Attach Request count : 1 - TLLI from SGSN unknown : 1 TLLI cache size : 1 TLLI-Cache: 1 TLLI ead4775a -> e0543210, IMSI 12131415161718, AGE 0, IMSI matches @@ -2369,8 +2375,8 @@ Peers: TLLI patched (BSS ): 11 TLLI patched (SGSN): 7 P-TMSI patched (SGSN): 2 + Patch error: other : 1 Attach Request count : 1 - TLLI from SGSN unknown : 1 TLLI cache size : 1 TLLI-Cache: 1 TLLI ead4775a -> e0543210, IMSI 12131415161718, AGE 0, IMSI matches @@ -2394,8 +2400,8 @@ Peers: TLLI patched (BSS ): 11 TLLI patched (SGSN): 8 P-TMSI patched (SGSN): 2 + Patch error: other : 1 Attach Request count : 1 - TLLI from SGSN unknown : 1 TLLI cache size : 1 TLLI-Cache: 1 TLLI ead4775a -> e0543210, IMSI 12131415161718, AGE 0, IMSI matches @@ -2463,8 +2469,8 @@ Peers: TLLI patched (SGSN): 9 P-TMSI patched (BSS ): 1 P-TMSI patched (SGSN): 2 + Patch error: other : 1 Attach Request count : 1 - TLLI from SGSN unknown : 1 TLLI cache size : 1 TLLI-Cache: 1 TLLI ead4775a -> e0543210, IMSI 12131415161718, AGE 0, IMSI matches @@ -2489,8 +2495,8 @@ Peers: TLLI patched (SGSN): 10 P-TMSI patched (BSS ): 1 P-TMSI patched (SGSN): 2 + Patch error: other : 1 Attach Request count : 1 - TLLI from SGSN unknown : 1 TLLI-Cache: 0 Gbproxy global: Invalid Routing Area Identifier : 1 |