diff options
| author | Harald Welte <laforge@gnumonks.org> | 2010-05-03 21:11:22 +0200 | 
|---|---|---|
| committer | Harald Welte <laforge@gnumonks.org> | 2010-05-04 07:20:45 +0200 | 
| commit | 7fb7e6154c0a286b1d4126642218c7a2f1d0d77c (patch) | |
| tree | bea403a34c92ef4c4dbf7b5f8101d930434c4a66 | |
| parent | 570fb83fd570660cd56c0272a0a123bc660baa38 (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.
| -rw-r--r-- | openbsc/src/gprs_ns.c | 9 | 
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);  | 
