diff options
author | Harald Welte <laforge@gnumonks.org> | 2010-05-14 11:53:08 +0000 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2010-05-14 11:53:08 +0000 |
commit | 731d1fc956f6fc5cd0c08e4536c00598e391bc75 (patch) | |
tree | 095fd550fb10ffb3392195338610f49a3b774756 | |
parent | 58e65c90a8fc43624d45acd173b0454796fa971d (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.
-rw-r--r-- | openbsc/include/openbsc/gprs_ns.h | 3 | ||||
-rw-r--r-- | openbsc/src/gprs/gprs_ns.c | 33 |
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); } - - |