summaryrefslogtreecommitdiffstats
path: root/openbsc
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2010-05-14 11:53:08 +0000
committerHarald Welte <laforge@gnumonks.org>2010-05-14 11:53:08 +0000
commit731d1fc956f6fc5cd0c08e4536c00598e391bc75 (patch)
tree095fd550fb10ffb3392195338610f49a3b774756 /openbsc
parent58e65c90a8fc43624d45acd173b0454796fa971d (diff)
[GPRS] gb_proxy: Initiate RESET procedure on persistent NS-VC at startup
Some BSS that connect to the proxy do not continue to perform the RESET procedure after a timeout. In order to resurrect them, we simply start a RESET procedure.
Diffstat (limited to 'openbsc')
-rw-r--r--openbsc/include/openbsc/gprs_ns.h3
-rw-r--r--openbsc/src/gprs/gprs_ns.c33
2 files changed, 21 insertions, 15 deletions
diff --git a/openbsc/include/openbsc/gprs_ns.h b/openbsc/include/openbsc/gprs_ns.h
index 4ccf4c7b..24a79745 100644
--- a/openbsc/include/openbsc/gprs_ns.h
+++ b/openbsc/include/openbsc/gprs_ns.h
@@ -209,6 +209,9 @@ struct gprs_nsvc *nsvc_create(struct gprs_ns_inst *nsi, uint16_t nsvci);
void nsvc_delete(struct gprs_nsvc *nsvc);
struct gprs_nsvc *nsvc_by_nsei(struct gprs_ns_inst *nsi, uint16_t nsei);
+/* Initiate a RESET procedure (including timer start, ...)*/
+int gprs_nsvc_reset(struct gprs_nsvc *nsvc, uint8_t cause);
+
/* Add NS-specific VTY stuff */
int gprs_ns_vty_init(struct gprs_ns_inst *nsi);
diff --git a/openbsc/src/gprs/gprs_ns.c b/openbsc/src/gprs/gprs_ns.c
index dc12953e..6a6cfe15 100644
--- a/openbsc/src/gprs/gprs_ns.c
+++ b/openbsc/src/gprs/gprs_ns.c
@@ -720,7 +720,7 @@ int gprs_ns_rcvmsg(struct gprs_ns_inst *nsi, struct msgb *msg,
nsvc->state = NSE_S_BLOCKED | NSE_S_ALIVE;
nsvc->remote_state = NSE_S_BLOCKED | NSE_S_ALIVE;
rate_ctr_inc(&nsvc->ctrg->ctr[NS_CTR_BLOCKED]);
- if (nsvc->remote_end_is_sgsn) {
+ if (nsvc->persistent || nsvc->remote_end_is_sgsn) {
/* stop RESET timer */
bsc_del_timer(&nsvc->timer);
/* Initiate TEST proc.: Send ALIVE and start timer */
@@ -894,6 +894,22 @@ int nsip_listen(struct gprs_ns_inst *nsi, uint16_t udp_port)
return ret;
}
+/* Initiate a RESET procedure */
+int gprs_nsvc_reset(struct gprs_nsvc *nsvc, uint8_t cause)
+{
+ /* Mark NS-VC locally as blocked and dead */
+ nsvc->state = NSE_S_BLOCKED;
+ /* Send NS-RESET PDU */
+ if (gprs_ns_tx_reset(nsvc, cause) < 0) {
+ LOGP(DNS, LOGL_ERROR, "NSEI=%u, error resetting NS-VC\n",
+ nsvc->nsei);
+ }
+ /* Start Tns-reset */
+ nsvc_start_timer(nsvc, NSVC_TIMER_TNS_RESET);
+
+ return nsvc;
+}
+
/* Establish a connection (from the BSS) to the SGSN */
struct gprs_nsvc *nsip_connect(struct gprs_ns_inst *nsi,
struct sockaddr_in *dest, uint16_t nsei,
@@ -909,18 +925,5 @@ struct gprs_nsvc *nsip_connect(struct gprs_ns_inst *nsi,
nsvc->nsvci = nsvci;
nsvc->remote_end_is_sgsn = 1;
- /* Initiate a RESET procedure */
- /* Mark NS-VC locally as blocked and dead */
- nsvc->state = NSE_S_BLOCKED;
- /* Send NS-RESET PDU */
- if (gprs_ns_tx_reset(nsvc, NS_CAUSE_OM_INTERVENTION) < 0) {
- LOGP(DNS, LOGL_ERROR, "NSEI=%u, error resetting NS-VC\n",
- nsei);
- }
- /* Start Tns-reset */
- nsvc_start_timer(nsvc, NSVC_TIMER_TNS_RESET);
-
- return nsvc;
+ return gprs_nsvc_reset(nsvc, NS_CAUSE_OM_INTERVENTION);
}
-
-