aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src/nat/bsc_nat.c
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2010-03-30 05:57:42 +0200
committerHolger Hans Peter Freyther <zecke@selfish.org>2010-06-15 20:24:09 +0800
commitbae9da49b9e9bf05d8f105b00ea2008b657dacce (patch)
treedcdebfdd4297268500dfc8ad39604a5f16e5390d /openbsc/src/nat/bsc_nat.c
parent38f7c7573984c51a33f756b775537b65841cb650 (diff)
nat: Move paging by lac handling code into the utils file
Moving it here means we can more easily test this code, there is one behaviour change with the code that we only support paging messages with one LAC and will silently ignore the others.
Diffstat (limited to 'openbsc/src/nat/bsc_nat.c')
-rw-r--r--openbsc/src/nat/bsc_nat.c33
1 files changed, 5 insertions, 28 deletions
diff --git a/openbsc/src/nat/bsc_nat.c b/openbsc/src/nat/bsc_nat.c
index cafca8352..52b3f012c 100644
--- a/openbsc/src/nat/bsc_nat.c
+++ b/openbsc/src/nat/bsc_nat.c
@@ -227,34 +227,11 @@ send_to_all:
* message and then send it to the authenticated messages...
*/
if (parsed->ipa_proto == IPAC_PROTO_SCCP && parsed->gsm_type == BSS_MAP_MSG_PAGING) {
- int data_length;
- const u_int8_t *data;
- struct tlv_parsed tp;
- int i = 0;
-
- tlv_parse(&tp, gsm0808_att_tlvdef(), msg->l3h + 3, msgb_l3len(msg) - 3, 0, 0);
- if (!TLVP_PRESENT(&tp, GSM0808_IE_CELL_IDENTIFIER_LIST)) {
- LOGP(DNAT, LOGL_ERROR, "No CellIdentifier List inside paging msg.\n");
- goto exit;
- }
-
- data_length = TLVP_LEN(&tp, GSM0808_IE_CELL_IDENTIFIER_LIST);
- data = TLVP_VAL(&tp, GSM0808_IE_CELL_IDENTIFIER_LIST);
- if (data[0] != CELL_IDENT_LAC) {
- LOGP(DNAT, LOGL_ERROR, "Unhandled cell ident discrminator: %c\n", data[0]);
- goto exit;
- }
-
- /* go through each LAC and forward the message */
- for (i = 1; i < data_length - 1; i += 2) {
- unsigned int _lac = ntohs(*(unsigned int *) &data[i]);
- llist_for_each_entry(bsc, &nat->bsc_connections, list_entry) {
- if (!bsc->authenticated || _lac != bsc->lac)
- continue;
-
- bsc_write(bsc, msg->data, msg->len);
- }
- }
+ bsc = bsc_nat_find_bsc(nat, msg);
+ if (bsc)
+ bsc_write(bsc, msg->data, msg->len);
+ else
+ LOGP(DNAT, LOGL_ERROR, "Could not determine BSC for paging.\n");
goto exit;
}