aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2010-04-23 14:13:27 +0800
committerHolger Hans Peter Freyther <zecke@selfish.org>2010-04-23 14:13:27 +0800
commite4045679a8bc746c5fb2a85872ca074f02add241 (patch)
tree953f2f7f1b615aa38447f4327ddfe0ed681cdfdc
parent52ae9a461b10abeb0e2041dc3fb900465ecb2da3 (diff)
nat: Only close connections that were fully connected
Remember that we have seen a CC and have a valid destination local reference now and only send a fake RLC to the MSC when we had connections in this state.
-rw-r--r--openbsc/include/openbsc/bsc_nat.h1
-rw-r--r--openbsc/src/nat/bsc_nat.c3
-rw-r--r--openbsc/src/nat/bsc_sccp.c1
3 files changed, 4 insertions, 1 deletions
diff --git a/openbsc/include/openbsc/bsc_nat.h b/openbsc/include/openbsc/bsc_nat.h
index 4d90ed74..90c263d2 100644
--- a/openbsc/include/openbsc/bsc_nat.h
+++ b/openbsc/include/openbsc/bsc_nat.h
@@ -110,6 +110,7 @@ struct sccp_connections {
struct sccp_source_reference real_ref;
struct sccp_source_reference patched_ref;
struct sccp_source_reference remote_ref;
+ int has_remote_ref;
/* GSM audio handling. That is 32 * multiplex + ts */
int crcx;
diff --git a/openbsc/src/nat/bsc_nat.c b/openbsc/src/nat/bsc_nat.c
index d5ed7515..52844276 100644
--- a/openbsc/src/nat/bsc_nat.c
+++ b/openbsc/src/nat/bsc_nat.c
@@ -444,7 +444,8 @@ static void remove_bsc_connection(struct bsc_connection *connection)
if (sccp_patch->bsc != connection)
continue;
- nat_send_rlsd(sccp_patch);
+ if (sccp_patch->has_remote_ref)
+ nat_send_rlsd(sccp_patch);
sccp_connection_destroy(sccp_patch);
}
diff --git a/openbsc/src/nat/bsc_sccp.c b/openbsc/src/nat/bsc_sccp.c
index 90c8499b..ebe10860 100644
--- a/openbsc/src/nat/bsc_sccp.c
+++ b/openbsc/src/nat/bsc_sccp.c
@@ -141,6 +141,7 @@ int update_sccp_src_ref(struct sccp_connections *sccp, struct bsc_nat_parsed *pa
}
sccp->remote_ref = *parsed->src_local_ref;
+ sccp->has_remote_ref = 1;
LOGP(DNAT, LOGL_DEBUG, "Updating 0x%x to remote 0x%x on %p\n",
sccp_src_ref_to_int(&sccp->patched_ref),
sccp_src_ref_to_int(&sccp->remote_ref), sccp->bsc);