Navigation


Changeset 1103:d8591b1c56cd in freeDiameter for libfdcore/p_psm.c


Ignore:
Timestamp:
May 10, 2013, 7:48:57 PM (11 years ago)
Author:
Sebastien Decugis <sdecugis@freediameter.net>
Branch:
default
Phase:
public
Message:

Implemented a few hooks

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libfdcore/p_psm.c

    r1085 r1103  
    483483                struct msg * msg = NULL;
    484484                struct msg_hdr * hdr;
     485                struct fd_cnx_rcvdata rcv_data;
     486                struct fd_msg_pmdl * pmdl = NULL;
     487               
     488                rcv_data.buffer = ev_data;
     489                rcv_data.length = ev_sz;
     490                pmdl = fd_msg_pmdl_get_inbuf(rcv_data.buffer, rcv_data.length);
    485491               
    486492                /* Parse the received buffer */
    487493                CHECK_FCT_DO( fd_msg_parse_buffer( (void *)&ev_data, ev_sz, &msg),
    488494                        {
    489                                 fd_log_debug("Received invalid data from peer '%s', closing the connection", peer->p_hdr.info.pi_diamid);
     495                                fd_hook_call(HOOK_MESSAGE_PARSING_ERROR, NULL, peer, &rcv_data, pmdl );
    490496                                free(ev_data);
    491497                                CHECK_FCT_DO( fd_event_send(peer->p_events, FDEVP_CNX_ERROR, 0, NULL), goto psm_reset );
     
    493499                        } );
    494500                       
     501                fd_hook_associate(msg, pmdl);
     502       
    495503                /* If the current state does not allow receiving messages, just drop it */
    496504                if (cur_state == STATE_CLOSED) {
    497505                        /* In such case, just discard the message */
    498                         //fd_msg_log( FD_MSG_LOG_DROPPED, msg, "Purged from peer '%s''s queue (CLOSED state).", peer->p_hdr.info.pi_diamid );
     506                        fd_hook_call(HOOK_MESSAGE_DROPPED, msg, peer, "Message purged from queue, peer in CLOSED state", fd_msg_pmdl_get(msg));
    499507                        fd_msg_free(msg);
    500508                        goto psm_loop;
    501509                }
    502510               
    503                 /* Log incoming message */
    504                 //fd_msg_log( FD_MSG_LOG_RECEIVED, msg, "Received %zdb from '%s' (%s)", ev_sz, peer->p_hdr.info.pi_diamid, STATE_STR(cur_state) );
    505        
    506511                /* Extract the header */
    507512                CHECK_FCT_DO( fd_msg_hdr(msg, &hdr), goto psm_end );
     
    513518                        CHECK_FCT_DO( fd_p_sr_fetch(&peer->p_sr, hdr->msg_hbhid, &req), goto psm_end );
    514519                        if (req == NULL) {
    515                                 //fd_msg_log( FD_MSG_LOG_DROPPED, msg, "Answer received with no corresponding sent request." );
     520                                fd_hook_call(HOOK_MESSAGE_DROPPED, msg, peer, "Answer received with no corresponding sent request.", fd_msg_pmdl_get(msg));
    516521                                fd_msg_free(msg);
    517522                                goto psm_loop;
     
    521526                        CHECK_FCT_DO( fd_msg_answ_associate( msg, req ), goto psm_end );
    522527                       
    523                         /* Display the delay to receive the answer */
    524                         {
    525                                 //fd_msg_log( FD_MSG_LOG_TIMING, msg, "Answer received in %ld.%6.6ld sec.", (long)delay.tv_sec, delay.tv_nsec / 1000 );
    526                         }
    527528                } else {
    528529                        /* Mark the incoming request so that we know we have pending answers for this peer */
     
    531532                        CHECK_POSIX_DO( pthread_mutex_unlock(&peer->p_state_mtx), goto psm_end  );
    532533                }
     534               
     535                /* Log incoming message */
     536                fd_hook_call(HOOK_MESSAGE_RECEIVED, msg, peer, NULL, fd_msg_pmdl_get(msg));
    533537               
    534538                if (cur_state == STATE_OPEN_NEW) {
     
    569573                                case STATE_WAITCEA:
    570574                                case STATE_CLOSED:
    571                                 default:
     575                                default: {
    572576                                        /* In such case, just discard the message */
    573                                         //fd_msg_log( FD_MSG_LOG_DROPPED, msg, "Received from peer '%s' while connection was not in state %s.", peer->p_hdr.info.pi_diamid, STATE_STR(cur_state) );
     577                                        char buf[128];
     578                                        snprintf(buf, sizeof(buf), "Received while peer state machine was in state %s.", STATE_STR(cur_state));
     579                                        fd_hook_call(HOOK_MESSAGE_DROPPED, msg, peer, buf, fd_msg_pmdl_get(msg));
    574580                                        fd_msg_free(msg);
     581                                }
    575582                        }
    576583                        goto psm_loop;
     
    579586                /* Link-local message: They must be understood by our dictionary, otherwise we return an error */
    580587                {
    581                         int ret = fd_msg_parse_or_error( &msg );
     588                        struct msg * error = NULL;
     589                        int ret = fd_msg_parse_or_error( &msg, &error );
    582590                        if (ret != EBADMSG) {
    583                                 CHECK_FCT_DO( ret, goto psm_end );
     591                                CHECK_FCT_DO( ret,
     592                                        {
     593                                                LOG_E("%s: An unexpected error occurred while parsing a link-local message", peer->p_hdr.info.pi_diamid);
     594                                                fd_msg_free(msg);
     595                                                goto psm_end;
     596                                        } );
    584597                        } else {
    585                                 if (msg) {
     598                                if (msg == NULL) {
    586599                                        /* Send the error back to the peer */
    587                                         CHECK_FCT_DO( ret = fd_out_send(&msg, NULL, peer, FD_CNX_ORDERED),  );
    588                                         if (msg) {
     600                                        CHECK_FCT_DO( ret = fd_out_send(&error, NULL, peer, FD_CNX_ORDERED),  );
     601                                        if (error) {
    589602                                                /* Only if an error occurred & the message was not saved / dumped */
    590                                                 //fd_msg_log( FD_MSG_LOG_DROPPED, msg, "Internal error: Problem while sending (%s)", strerror(ret) );
    591                                                 CHECK_FCT_DO( fd_msg_free(msg), goto psm_end);
     603                                                LOG_E("%s: error sending a message", peer->p_hdr.info.pi_diamid);
     604                                                CHECK_FCT_DO( fd_msg_free(error), goto psm_end);
    592605                                        }
    593606                                } else {
    594607                                        /* We received an invalid answer, let's disconnect */
     608                                        LOG_E("%s: Received invalid answer to Base protocol message, disconnecting...", peer->p_hdr.info.pi_diamid);
     609                                        CHECK_FCT_DO( fd_msg_free(msg), goto psm_end);
    595610                                        CHECK_FCT_DO( fd_event_send(peer->p_events, FDEVP_CNX_ERROR, 0, NULL), goto psm_reset );
    596611                                }
     
    602617                switch (hdr->msg_code) {
    603618                        case CC_CAPABILITIES_EXCHANGE:
    604                                 CHECK_FCT_DO( fd_p_ce_msgrcv(&msg, (hdr->msg_flags & CMD_FLAG_REQUEST), peer), goto psm_reset );
     619                                CHECK_FCT_DO( fd_p_ce_msgrcv(&msg, (hdr->msg_flags & CMD_FLAG_REQUEST), peer),
     620                                        {
     621                                                if (msg)
     622                                                        CHECK_FCT_DO( fd_msg_free(msg), );
     623                                                goto psm_reset;
     624                                        } );
    605625                                break;
    606626                       
     
    671691                                /* Mark the connection problem */
    672692                                peer->p_flags.pf_cnx_pb = 1;
     693                       
     694                                fd_hook_call(HOOK_PEER_CONNECT_FAILED, NULL, peer, "The connection was broken", NULL);
    673695                               
    674696                                /* Destroy the connection, restart the timer to a new connection attempt */
     
    732754                }
    733755                if (params->cer) {
    734                         //fd_msg_log( FD_MSG_LOG_DROPPED, params->cer, "Internal error: this CER was not handled as expected." );
    735756                        CHECK_FCT_DO( fd_msg_free(params->cer), );
    736757                        params->cer = NULL;
     
    753774                        case STATE_WAITCNXACK_ELEC:
    754775                        case STATE_WAITCNXACK:
     776                                LOG_D("%s: Connection established", peer->p_hdr.info.pi_diamid);
    755777                                fd_p_ce_handle_newcnx(peer, cnx);
    756778                                break;
     
    781803                               
    782804                        case STATE_WAITCNXACK:
     805                                LOG_D("%s: Connection attempt failed", peer->p_hdr.info.pi_diamid);
    783806                                /* Go back to CLOSE */
    784807                                fd_psm_next_timeout(peer, 1, peer->p_hdr.info.config.pic_tctimer ?: fd_g_config->cnf_timer_tc);
     
    803826                               
    804827                        case STATE_CLOSED:
     828                                LOG_D("%s: Connecting...", peer->p_hdr.info.pi_diamid);
    805829                                CHECK_FCT_DO( fd_psm_change_state(peer, STATE_WAITCNXACK), goto psm_end );
    806830                                fd_psm_next_timeout(peer, 0, CNX_TIMEOUT);
     
    811835                                /* Mark the connection problem */
    812836                                peer->p_flags.pf_cnx_pb = 1;
    813                         case STATE_CLOSING:
    814837                        case STATE_WAITCNXACK:
    815838                        case STATE_WAITCEA:
     839                                fd_hook_call(HOOK_PEER_CONNECT_FAILED, NULL, peer, "Timeout while waiting for remote peer", NULL);
     840                        case STATE_CLOSING:
    816841                                /* Destroy the connection, restart the timer to a new connection attempt */
    817842                                fd_psm_next_timeout(peer, 1, peer->p_hdr.info.config.pic_tctimer ?: fd_g_config->cnf_timer_tc);
     
    849874       
    850875psm_end:
     876        LOG_N("%s: Going to ZOMBIE state (no more activity)", peer->p_hdr.info.pi_diamid);
    851877        fd_psm_cleanup(peer, 1);
    852878        TRACE_DEBUG(INFO, "'%s'\t-> STATE_ZOMBIE (terminated)\t'%s'",
Note: See TracChangeset for help on using the changeset viewer.