[gprs] gb_proxy: Fix proxying of BSS messages to SGSN
We don't keep a superfluous gbprox_peer for the SGSN anymore.
diff --git a/openbsc/include/openbsc/gb_proxy.h b/openbsc/include/openbsc/gb_proxy.h
index 8194d2a..60dd5ca 100644
--- a/openbsc/include/openbsc/gb_proxy.h
+++ b/openbsc/include/openbsc/gb_proxy.h
@@ -22,6 +22,7 @@
struct gprs_ns_inst *nsi;
};
+extern struct gbproxy_config gbcfg;
/* gb_proxy_vty .c */
diff --git a/openbsc/src/gb_proxy.c b/openbsc/src/gb_proxy.c
index 4d8f27f..93b8f67 100644
--- a/openbsc/src/gb_proxy.c
+++ b/openbsc/src/gb_proxy.c
@@ -37,6 +37,7 @@
#include <openbsc/debug.h>
#include <openbsc/gprs_ns.h>
#include <openbsc/gprs_bssgp.h>
+#include <openbsc/gb_proxy.h>
struct gbprox_peer {
struct llist_head list;
@@ -54,10 +55,6 @@
/* Linked list of all Gb peers (except SGSN) */
static LLIST_HEAD(gbprox_bts_peers);
-/* Pointer to the SGSN peer */
-struct gbprox_peer *gbprox_peer_sgsn;
-
-/* The NS protocol stack instance we're using */
extern struct gprs_ns_inst *gbprox_nsi;
/* Find the gbprox_peer by its BVCI */
@@ -124,12 +121,28 @@
}
/* feed a message down the NS-VC associated with the specified peer */
+static int gbprox_tx2sgsn(struct msgb *msg, uint16_t ns_bvci)
+{
+ msgb_bvci(msg) = ns_bvci;
+ msgb_nsei(msg) = gbcfg.nsip_sgsn_nsei;
+
+ DEBUGP(DGPRS, "proxying message to SGSN (NS_BVCI=%u, NSEI=%u)\n",
+ ns_bvci, gbcfg.nsip_sgsn_nsei);
+
+ return gprs_ns_sendmsg(gbprox_nsi, msg);
+}
+
+
+/* feed a message down the NS-VC associated with the specified peer */
static int gbprox_tx2peer(struct msgb *msg, struct gbprox_peer *peer,
uint16_t ns_bvci)
{
msgb_bvci(msg) = ns_bvci;
msgb_nsei(msg) = peer->nsvc->nsei;
+ DEBUGP(DGPRS, "proxying message to BSS (NS_BVCI=%u, NSEI=%u)\n",
+ ns_bvci, peer->nsvc->nsei);
+
return gprs_ns_sendmsg(gbprox_nsi, msg);
}
@@ -197,7 +210,7 @@
}
/* Normally, we can simply pass on all signalling messages from BSS to SGSN */
- return gbprox_tx2peer(msg, gbprox_peer_sgsn, ns_bvci);
+ return gbprox_tx2sgsn(msg, ns_bvci);
err_no_peer:
err_mand_ie:
/* FIXME: do something */
@@ -303,33 +316,30 @@
/* Main input function for Gb proxy */
int gbprox_rcvmsg(struct msgb *msg, struct gprs_nsvc *nsvc, uint16_t ns_bvci)
{
- struct gbprox_peer *peer;
+ int rc;
/* Only BVCI=0 messages need special treatment */
if (ns_bvci == 0 || ns_bvci == 1) {
if (nsvc->remote_end_is_sgsn)
- return gbprox_rx_sig_from_sgsn(msg, nsvc, ns_bvci);
+ rc = gbprox_rx_sig_from_sgsn(msg, nsvc, ns_bvci);
else
- return gbprox_rx_sig_from_bss(msg, nsvc, ns_bvci);
- }
-
- /* All other BVCI are PTP and thus can be simply forwarded */
- peer = peer_by_bvci(ns_bvci);
- if (!peer) {
- if (!nsvc->remote_end_is_sgsn) {
- LOGP(DGPRS, LOGL_NOTICE, "Allocationg new peer for "
- "BVCI=%u via NSVC=%u/NSEI=%u\n", ns_bvci,
- nsvc->nsvci, nsvc->nsei);
- peer = peer_alloc(ns_bvci);
- peer->nsvc = nsvc;
+ rc = gbprox_rx_sig_from_bss(msg, nsvc, ns_bvci);
+ } else {
+ /* All other BVCI are PTP and thus can be simply forwarded */
+ if (nsvc->remote_end_is_sgsn) {
+ rc = gbprox_tx2sgsn(msg, ns_bvci);
} else {
- LOGP(DGPRS, LOGL_ERROR, "Couldn't find peer for "
- "BVCI %u\n", ns_bvci);
- /* FIXME: do we really have to free the message here? */
- msgb_free(msg);
- return -EIO;
+ struct gbprox_peer *peer = peer_by_bvci(ns_bvci);
+ if (!peer) {
+ LOGP(DGPRS, LOGL_NOTICE, "Allocationg new peer for "
+ "BVCI=%u via NSVC=%u/NSEI=%u\n", ns_bvci,
+ nsvc->nsvci, nsvc->nsei);
+ peer = peer_alloc(ns_bvci);
+ peer->nsvc = nsvc;
+ }
+ rc = gbprox_tx2peer(msg, peer, ns_bvci);
}
}
- return gbprox_tx2peer(msg, peer, ns_bvci);
+ return rc;
}
diff --git a/openbsc/src/gb_proxy_main.c b/openbsc/src/gb_proxy_main.c
index fe72e02..549b6ce 100644
--- a/openbsc/src/gb_proxy_main.c
+++ b/openbsc/src/gb_proxy_main.c
@@ -65,7 +65,7 @@
"There is NO WARRANTY, to the extent permitted by law.\n";
static char *config_file = "osmo_gbproxy.cfg";
-static struct gbproxy_config gbcfg;
+struct gbproxy_config gbcfg;
/* Pointer to the SGSN peer */
extern struct gbprox_peer *gbprox_peer_sgsn;
@@ -124,9 +124,8 @@
sin.sin_family = AF_INET;
sin.sin_port = htons(gbcfg.nsip_sgsn_port);
sin.sin_addr.s_addr = htonl(gbcfg.nsip_sgsn_ip);
- gbprox_peer_sgsn = nsip_connect(gbprox_nsi, &sin,
- gbcfg.nsip_sgsn_nsei,
- gbcfg.nsip_sgsn_nsvci);
+ nsip_connect(gbprox_nsi, &sin, gbcfg.nsip_sgsn_nsei,
+ gbcfg.nsip_sgsn_nsvci);
while (1) {
rc = bsc_select_main(0);