diff freeDiameter/p_psm.c @ 78:a58f0757c06a

Added code for DPR/DPA
author Sebastien Decugis <sdecugis@nict.go.jp>
date Tue, 01 Dec 2009 16:24:06 +0900
parents 42bd29c4128b
children d273a2ce19c8
line wrap: on
line diff
--- a/freeDiameter/p_psm.c	Tue Dec 01 14:30:29 2009 +0900
+++ b/freeDiameter/p_psm.c	Tue Dec 01 16:24:06 2009 +0900
@@ -93,9 +93,8 @@
 	if (peer->p_cb2) {
 		CHECK_FCT_DO( (*peer->p_cb2)(&peer->p_hdr.info),
 			{
-				TRACE_DEBUG(FULL, "Validation failed, moving to state CLOSING");
-				peer->p_hdr.info.runtime.pir_state = STATE_CLOSING;
-				fd_psm_terminate(peer);
+				TRACE_DEBUG(FULL, "Validation failed, terminating the connection");
+				fd_psm_terminate(peer, "DO_NOT_WANT_TO_TALK_TO_YOU" );
 			} );
 		peer->p_cb2 = NULL;
 		return 0;
@@ -160,6 +159,10 @@
 			}
 			break;
 			
+			case FDEVP_TERMINATE:
+				/* Do not free the string since it is a constant */
+			break;
+			
 			case FDEVP_CNX_INCOMING: {
 				struct cnx_incoming * evd = ev->data;
 				CHECK_FCT_DO( fd_msg_free(evd->cer), /* continue */);
@@ -215,6 +218,8 @@
 /* Set timeout timer of next event */
 void fd_psm_next_timeout(struct fd_peer * peer, int add_random, int delay)
 {
+	TRACE_DEBUG(FULL, "Peer timeout reset to %d seconds%s", delay, add_random ? " (+/- 2)" : "" );
+	
 	/* Initialize the timer */
 	CHECK_POSIX_DO(  clock_gettime( CLOCK_REALTIME,  &peer->p_psm_timer ), ASSERT(0) );
 	
@@ -235,8 +240,6 @@
 	
 	peer->p_psm_timer.tv_sec += delay;
 	
-	TRACE_DEBUG(FULL, "Peer timeout reset to %d seconds%s", delay, add_random ? " (+/- 2)" : "" );
-	
 #ifdef SLOW_PSM
 	/* temporary for debug */
 	peer->p_psm_timer.tv_sec += 10;
@@ -347,7 +350,7 @@
 			case STATE_OPEN:
 			case STATE_REOPEN:
 				/* We cannot just close the conenction, we have to send a DPR first */
-				CHECK_FCT_DO( fd_p_dp_initiate(peer), goto psm_end );
+				CHECK_FCT_DO( fd_p_dp_initiate(peer, ev_data), goto psm_end );
 				goto psm_loop;
 			
 			/*	
@@ -470,6 +473,8 @@
 			
 			case CC_DISCONNECT_PEER:
 				CHECK_FCT_DO( fd_p_dp_handle(&msg, (hdr->msg_flags & CMD_FLAG_REQUEST), peer), goto psm_end );
+				if (peer->p_hdr.info.runtime.pir_state == STATE_CLOSING)
+					goto psm_end;
 				break;
 			
 			case CC_DEVICE_WATCHDOG:
@@ -711,13 +716,13 @@
 }
 
 /* End the PSM (clean ending) */
-int fd_psm_terminate(struct fd_peer * peer )
+int fd_psm_terminate(struct fd_peer * peer, char * reason )
 {
 	TRACE_ENTRY("%p", peer);
 	CHECK_PARAMS( CHECK_PEER(peer) );
 	
 	if (peer->p_hdr.info.runtime.pir_state != STATE_ZOMBIE) {
-		CHECK_FCT( fd_event_send(peer->p_events, FDEVP_TERMINATE, 0, NULL) );
+		CHECK_FCT( fd_event_send(peer->p_events, FDEVP_TERMINATE, 0, reason) );
 	} else {
 		TRACE_DEBUG(FULL, "Peer '%s' was already terminated", peer->p_hdr.info.pi_diamid);
 	}
"Welcome to our mercurial repository"