summaryrefslogtreecommitdiffstats
path: root/openbsc
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2010-05-03 21:11:22 +0200
committerHarald Welte <laforge@gnumonks.org>2010-05-04 07:20:45 +0200
commit7fb7e6154c0a286b1d4126642218c7a2f1d0d77c (patch)
treebea403a34c92ef4c4dbf7b5f8101d930434c4a66 /openbsc
parent570fb83fd570660cd56c0272a0a123bc660baa38 (diff)
[gprs] NS: If we are the BSS side, UNBLOCK the connection after it is ALIVE
After RESET / RESET-ACK and ALIVE / ALIVE-ACK, the connection needs to be unblocked from the BSS side to the SGSN.
Diffstat (limited to 'openbsc')
-rw-r--r--openbsc/src/gprs_ns.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/openbsc/src/gprs_ns.c b/openbsc/src/gprs_ns.c
index 72558ca4..3d9bb896 100644
--- a/openbsc/src/gprs_ns.c
+++ b/openbsc/src/gprs_ns.c
@@ -433,6 +433,11 @@ int gprs_ns_rcvmsg(struct gprs_ns_inst *nsi, struct msgb *msg,
bsc_del_timer(&nsvc->timer);
/* start Tns-test */
nsvc_start_timer(nsvc, NSVC_TIMER_TNS_TEST);
+ if (nsvc->remote_end_is_sgsn) {
+ /* FIXME: this should be one level higher */
+ if (nsvc->state & NSE_S_BLOCKED)
+ rc = gprs_ns_tx_simple(nsvc, NS_PDUT_UNBLOCK);
+ }
break;
case NS_PDUT_UNITDATA:
/* actual user data */
@@ -454,6 +459,8 @@ int gprs_ns_rcvmsg(struct gprs_ns_inst *nsi, struct msgb *msg,
/* send ALIVE PDU */
rc = gprs_ns_tx_simple(nsvc, NS_PDUT_ALIVE);
nsvc_start_timer(nsvc, NSVC_TIMER_TNS_ALIVE);
+ /* mark local state as BLOCKED + ALIVE */
+ nsvc->state = NSE_S_BLOCKED | NSE_S_ALIVE;
}
break;
case NS_PDUT_UNBLOCK:
@@ -466,6 +473,8 @@ int gprs_ns_rcvmsg(struct gprs_ns_inst *nsi, struct msgb *msg,
DEBUGP(DGPRS, "NSEI=%u Rx NS UNBLOCK ACK\n", nsvc->nsei);
/* mark remote NS-VC as unblocked + active */
nsvc->remote_state = NSE_S_ALIVE;
+ if (nsvc->remote_end_is_sgsn)
+ nsvc->state = NSE_S_ALIVE;
break;
case NS_PDUT_BLOCK:
DEBUGP(DGPRS, "NSEI=%u Rx NS BLOCK\n", nsvc->nsei);