Mercurial > hg > freeDiameter
diff freeDiameter/peers.c @ 37:cc3c59fe98fe
Lot of cleanups in peer structure management
author | Sebastien Decugis <sdecugis@nict.go.jp> |
---|---|
date | Thu, 05 Nov 2009 14:28:46 +0900 |
parents | 1498b3c7304c |
children | 2b1cba7e949d |
line wrap: on
line diff
--- a/freeDiameter/peers.c Mon Nov 02 17:31:36 2009 +0900 +++ b/freeDiameter/peers.c Thu Nov 05 14:28:46 2009 +0900 @@ -68,15 +68,15 @@ fd_list_init(&p->p_hdr.chain, p); - fd_list_init(&p->p_hdr.info.pi_endpoints, NULL); - fd_list_init(&p->p_hdr.info.pi_apps, NULL); + fd_list_init(&p->p_hdr.info.pi_endpoints, p); + fd_list_init(&p->p_hdr.info.runtime.pir_apps, p); p->p_eyec = EYEC_PEER; + fd_list_init(&p->p_actives, p); fd_list_init(&p->p_expiry, p); - fd_list_init(&p->p_actives, p); + CHECK_FCT( fd_fifo_new(&p->p_tosend) ); p->p_hbh = lrand48(); - CHECK_FCT( fd_fifo_new(&p->p_events) ); - CHECK_FCT( fd_fifo_new(&p->p_tosend) ); + fd_list_init(&p->p_sr.srs, p); CHECK_POSIX( pthread_mutex_init(&p->p_sr.mtx, NULL) ); @@ -97,27 +97,17 @@ /* Copy the informations from the parameters received */ CHECK_MALLOC( p->p_hdr.info.pi_diamid = strdup(info->pi_diamid) ); - if (info->pi_realm) { - CHECK_MALLOC( p->p_hdr.info.pi_realm = strdup(info->pi_realm) ); + + memcpy( &p->p_hdr.info.config, &info->config, sizeof(p->p_hdr.info.config) ); + /* Duplicate the strings if provided */ + if (info->config.pic_realm) { + CHECK_MALLOC( p->p_hdr.info.config.pic_realm = strdup(info->config.pic_realm) ); + } + if (info->config.pic_priority) { + CHECK_MALLOC( p->p_hdr.info.config.pic_realm = strdup(info->config.pic_priority) ); } - p->p_hdr.info.pi_flags.pro3 = info->pi_flags.pro3; - p->p_hdr.info.pi_flags.pro4 = info->pi_flags.pro4; - p->p_hdr.info.pi_flags.alg = info->pi_flags.alg; - p->p_hdr.info.pi_flags.sec = info->pi_flags.sec; - p->p_hdr.info.pi_flags.exp = info->pi_flags.exp; - p->p_hdr.info.pi_flags.persist = info->pi_flags.persist; - - p->p_hdr.info.pi_lft = info->pi_lft; - p->p_hdr.info.pi_port = info->pi_port; - p->p_hdr.info.pi_tctimer = info->pi_tctimer; - p->p_hdr.info.pi_twtimer = info->pi_twtimer; - - if (info->pi_sec_data.priority) { - CHECK_MALLOC( p->p_hdr.info.pi_sec_data.priority = strdup(info->pi_sec_data.priority) ); - } - - /* Move the items from one list to the other */ + /* Move the list of endpoints into the peer */ if (info->pi_endpoints.next) while (!FD_IS_LIST_EMPTY( &info->pi_endpoints ) ) { li = info->pi_endpoints.next; @@ -125,7 +115,6 @@ fd_list_insert_before(&p->p_hdr.info.pi_endpoints, li); } - /* The internal data */ if (orig_dbg) { CHECK_MALLOC( p->p_dbgorig = strdup(orig_dbg) ); @@ -149,15 +138,15 @@ } /* We can insert the new peer object */ - if (! ret) { - /* Update expiry list */ - CHECK_FCT_DO( ret = fd_p_expi_update( p ), goto out ); - - /* Insert the new element in the list */ - fd_list_insert_before( li, &p->p_hdr.chain ); - } + if (! ret) + do { + /* Update expiry list */ + CHECK_FCT_DO( ret = fd_p_expi_update( p ), break ); -out: + /* Insert the new element in the list */ + fd_list_insert_before( li, &p->p_hdr.chain ); + } while (0); + CHECK_POSIX( pthread_rwlock_unlock(&fd_g_peers_rw) ); if (ret) { CHECK_FCT( fd_peer_free(&p) ); @@ -202,7 +191,7 @@ return; } -/* Destroy a structure once all cleanups have been performed */ +/* Destroy a structure once cleanups have been performed (fd_psm_abord, ...) */ int fd_peer_free(struct fd_peer ** ptr) { struct fd_peer *p; @@ -216,33 +205,22 @@ CHECK_PARAMS( FD_IS_LIST_EMPTY(&p->p_hdr.chain) ); - free_null(p->p_hdr.info.pi_diamid); - free_null(p->p_hdr.info.pi_realm); + free_null(p->p_hdr.info.pi_diamid); + + free_null(p->p_hdr.info.config.pic_realm); + free_null(p->p_hdr.info.config.pic_priority); + + free_null(p->p_hdr.info.runtime.pir_realm); + free_null(p->p_hdr.info.runtime.pir_prodname); + free_list( &p->p_hdr.info.runtime.pir_apps ); + free_list( &p->p_hdr.info.pi_endpoints ); - TODO("Free the security data if any ?"); - free_null(p->p_hdr.info.pi_prodname); - free_list( &p->p_hdr.info.pi_apps ); free_null(p->p_dbgorig); - ASSERT(FD_IS_LIST_EMPTY(&p->p_expiry)); - ASSERT(FD_IS_LIST_EMPTY(&p->p_actives)); - CHECK_FCT( fd_thr_term(&p->p_psm) ); - while ( fd_fifo_tryget(p->p_events, &t) == 0 ) { - struct fd_event * ev = t; - TRACE_DEBUG(FULL, "Found event %d(%p) in queue of peer %p being destroyed", ev->code, ev->data, p); - free(ev); - } - CHECK_FCT( fd_fifo_del(&p->p_events) ); + fd_list_unlink(&p->p_expiry); + fd_list_unlink(&p->p_actives); - CHECK_FCT( fd_thr_term(&p->p_outthr) ); - - if (p->p_cnxctx) { - fd_cnx_destroy(p->p_cnxctx); - } - - /* Requeue any remaining message into global structures if possible */ - fd_peer_failover_msg(p); CHECK_FCT_DO( fd_fifo_del(&p->p_tosend), /* continue */ ); CHECK_POSIX_DO( pthread_mutex_destroy(&p->p_sr.mtx), /* continue */); @@ -255,7 +233,7 @@ return 0; } -/* Terminate peer module (destroy all peers) */ +/* Terminate peer module (destroy all peers, first gently, then violently) */ int fd_peer_fini() { struct fd_list * li; @@ -273,7 +251,7 @@ for (li = fd_g_peers.next; li != &fd_g_peers; li = li->next) { struct fd_peer * peer = (struct fd_peer *)li; - if (peer->p_hdr.info.pi_state != STATE_ZOMBIE) { + if (peer->p_hdr.info.runtime.pir_state != STATE_ZOMBIE) { CHECK_FCT_DO( fd_psm_terminate(peer), /* continue */ ); } else { li = li->prev; /* to avoid breaking the loop */ @@ -286,8 +264,8 @@ if (!list_empty) { CHECK_SYS( clock_gettime(CLOCK_REALTIME, &now) ); - TRACE_DEBUG(INFO, "Waiting for connections shutdown... (%d sec max)", DPR_TIMEOUT); - wait_until.tv_sec = now.tv_sec + DPR_TIMEOUT; + TRACE_DEBUG(INFO, "Waiting for connections shutdown... (%d sec max)", DPR_TIMEOUT + 1); + wait_until.tv_sec = now.tv_sec + DPR_TIMEOUT + 1; wait_until.tv_nsec = now.tv_nsec; } @@ -300,7 +278,7 @@ CHECK_FCT_DO( pthread_rwlock_wrlock(&fd_g_peers_rw), /* continue */ ); for (li = fd_g_peers.next; li != &fd_g_peers; li = li->next) { struct fd_peer * peer = (struct fd_peer *)li; - if (peer->p_hdr.info.pi_state == STATE_ZOMBIE) { + if (peer->p_hdr.info.runtime.pir_state == STATE_ZOMBIE) { li = li->prev; /* to avoid breaking the loop */ fd_list_unlink(&peer->p_hdr.chain); fd_list_insert_before(&purge, &peer->p_hdr.chain); @@ -350,32 +328,28 @@ return; } - fd_log_debug("> %s\t%s", STATE_STR(peer->p_hdr.info.pi_state), peer->p_hdr.info.pi_diamid); + fd_log_debug("> %s\t%s", STATE_STR(peer->p_hdr.info.runtime.pir_state), peer->p_hdr.info.pi_diamid); if (details > INFO) { - fd_log_debug("\t(rlm:%s)", peer->p_hdr.info.pi_realm); - if (peer->p_hdr.info.pi_prodname) - fd_log_debug("\t['%s' %u]", peer->p_hdr.info.pi_prodname, peer->p_hdr.info.pi_firmrev); + fd_log_debug("\t(rlm:%s)", peer->p_hdr.info.runtime.pir_realm ?: "(unknown)"); + if (peer->p_hdr.info.runtime.pir_prodname) + fd_log_debug("\t['%s' %u]", peer->p_hdr.info.runtime.pir_prodname, peer->p_hdr.info.runtime.pir_firmrev); } fd_log_debug("\n"); if (details > FULL) { /* Dump all info */ - fd_log_debug("\tEntry origin : %s\n", peer->p_dbgorig); - fd_log_debug("\tFlags : %s%s%s%s%s - %s%s%s\n", - peer->p_hdr.info.pi_flags.pro3 == PI_P3_DEFAULT ? "" : - (peer->p_hdr.info.pi_flags.pro3 == PI_P3_IP ? "IP." : "IPv6."), - peer->p_hdr.info.pi_flags.pro4 == PI_P4_DEFAULT ? "" : - (peer->p_hdr.info.pi_flags.pro4 == PI_P4_TCP ? "TCP." : "SCTP."), - peer->p_hdr.info.pi_flags.alg ? "PrefTCP." : "", - peer->p_hdr.info.pi_flags.sec == PI_SEC_DEFAULT ? "" : - (peer->p_hdr.info.pi_flags.sec == PI_SEC_NONE ? "IPSec." : "InbandTLS."), - peer->p_hdr.info.pi_flags.exp ? "Expire." : "", - peer->p_hdr.info.pi_flags.inband_none ? "InbandIPsec." : "", - peer->p_hdr.info.pi_flags.inband_tls ? "InbandTLS." : "", - peer->p_hdr.info.pi_flags.relay ? "Relay (0xffffff)" : "No relay" + fd_log_debug("\tEntry origin : %s\n", peer->p_dbgorig?: "not set"); + fd_log_debug("\tConfig flags : %s%s%s%s%s - %s%s%s\n", + peer->p_hdr.info.config.pic_flags.pro3 == PI_P3_DEFAULT ? "" : + (peer->p_hdr.info.config.pic_flags.pro3 == PI_P3_IP ? "IP." : "IPv6."), + peer->p_hdr.info.config.pic_flags.pro4 == PI_P4_DEFAULT ? "" : + (peer->p_hdr.info.config.pic_flags.pro4 == PI_P4_TCP ? "TCP." : "SCTP."), + peer->p_hdr.info.config.pic_flags.alg ? "PrefTCP." : "", + peer->p_hdr.info.config.pic_flags.sec & PI_SEC_NONE ? "NoTLSok" :"", + peer->p_hdr.info.config.pic_flags.sec & PI_SEC_TLS_OLD ? "OldTLS" :"", + peer->p_hdr.info.config.pic_flags.exp ? "Expire." : "", + peer->p_hdr.info.config.pic_flags.persist ? "Persist." : "" ); - fd_log_debug("\tLifetime : %d sec\n", peer->p_hdr.info.pi_lft); - - TODO("Dump remaining useful information"); + fd_log_debug("\tLifetime : %d sec\n", peer->p_hdr.info.config.pic_lft); } } @@ -443,8 +417,8 @@ peer->p_flags.pf_responder = 1; /* Set this peer to expire on inactivity */ - peer->p_hdr.info.pi_flags.exp = PI_EXP_INACTIVE; - peer->p_hdr.info.pi_lft = 3600 * 3; /* 3 hours without any message */ + peer->p_hdr.info.config.pic_flags.exp = PI_EXP_INACTIVE; + peer->p_hdr.info.config.pic_lft = 3600 * 3; /* 3 hours without any message */ /* Upgrade the lock to write lock */ CHECK_POSIX_DO( ret = pthread_rwlock_wrlock(&fd_g_peers_rw), goto out );