From 7fb7e6154c0a286b1d4126642218c7a2f1d0d77c Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Mon, 3 May 2010 21:11:22 +0200 Subject: [PATCH] [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. --- openbsc/src/gprs_ns.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/openbsc/src/gprs_ns.c b/openbsc/src/gprs_ns.c index 72558ca42..3d9bb8963 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);