Changeset 1103:d8591b1c56cd in freeDiameter for libfdcore/p_psm.c
- Timestamp:
- May 10, 2013, 7:48:57 PM (11 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libfdcore/p_psm.c
r1085 r1103 483 483 struct msg * msg = NULL; 484 484 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); 485 491 486 492 /* Parse the received buffer */ 487 493 CHECK_FCT_DO( fd_msg_parse_buffer( (void *)&ev_data, ev_sz, &msg), 488 494 { 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 ); 490 496 free(ev_data); 491 497 CHECK_FCT_DO( fd_event_send(peer->p_events, FDEVP_CNX_ERROR, 0, NULL), goto psm_reset ); … … 493 499 } ); 494 500 501 fd_hook_associate(msg, pmdl); 502 495 503 /* If the current state does not allow receiving messages, just drop it */ 496 504 if (cur_state == STATE_CLOSED) { 497 505 /* 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)); 499 507 fd_msg_free(msg); 500 508 goto psm_loop; 501 509 } 502 510 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 506 511 /* Extract the header */ 507 512 CHECK_FCT_DO( fd_msg_hdr(msg, &hdr), goto psm_end ); … … 513 518 CHECK_FCT_DO( fd_p_sr_fetch(&peer->p_sr, hdr->msg_hbhid, &req), goto psm_end ); 514 519 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)); 516 521 fd_msg_free(msg); 517 522 goto psm_loop; … … 521 526 CHECK_FCT_DO( fd_msg_answ_associate( msg, req ), goto psm_end ); 522 527 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 }527 528 } else { 528 529 /* Mark the incoming request so that we know we have pending answers for this peer */ … … 531 532 CHECK_POSIX_DO( pthread_mutex_unlock(&peer->p_state_mtx), goto psm_end ); 532 533 } 534 535 /* Log incoming message */ 536 fd_hook_call(HOOK_MESSAGE_RECEIVED, msg, peer, NULL, fd_msg_pmdl_get(msg)); 533 537 534 538 if (cur_state == STATE_OPEN_NEW) { … … 569 573 case STATE_WAITCEA: 570 574 case STATE_CLOSED: 571 default: 575 default: { 572 576 /* 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)); 574 580 fd_msg_free(msg); 581 } 575 582 } 576 583 goto psm_loop; … … 579 586 /* Link-local message: They must be understood by our dictionary, otherwise we return an error */ 580 587 { 581 int ret = fd_msg_parse_or_error( &msg ); 588 struct msg * error = NULL; 589 int ret = fd_msg_parse_or_error( &msg, &error ); 582 590 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 } ); 584 597 } else { 585 if (msg ) {598 if (msg == NULL) { 586 599 /* 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) { 589 602 /* 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); 592 605 } 593 606 } else { 594 607 /* 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); 595 610 CHECK_FCT_DO( fd_event_send(peer->p_events, FDEVP_CNX_ERROR, 0, NULL), goto psm_reset ); 596 611 } … … 602 617 switch (hdr->msg_code) { 603 618 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 } ); 605 625 break; 606 626 … … 671 691 /* Mark the connection problem */ 672 692 peer->p_flags.pf_cnx_pb = 1; 693 694 fd_hook_call(HOOK_PEER_CONNECT_FAILED, NULL, peer, "The connection was broken", NULL); 673 695 674 696 /* Destroy the connection, restart the timer to a new connection attempt */ … … 732 754 } 733 755 if (params->cer) { 734 //fd_msg_log( FD_MSG_LOG_DROPPED, params->cer, "Internal error: this CER was not handled as expected." );735 756 CHECK_FCT_DO( fd_msg_free(params->cer), ); 736 757 params->cer = NULL; … … 753 774 case STATE_WAITCNXACK_ELEC: 754 775 case STATE_WAITCNXACK: 776 LOG_D("%s: Connection established", peer->p_hdr.info.pi_diamid); 755 777 fd_p_ce_handle_newcnx(peer, cnx); 756 778 break; … … 781 803 782 804 case STATE_WAITCNXACK: 805 LOG_D("%s: Connection attempt failed", peer->p_hdr.info.pi_diamid); 783 806 /* Go back to CLOSE */ 784 807 fd_psm_next_timeout(peer, 1, peer->p_hdr.info.config.pic_tctimer ?: fd_g_config->cnf_timer_tc); … … 803 826 804 827 case STATE_CLOSED: 828 LOG_D("%s: Connecting...", peer->p_hdr.info.pi_diamid); 805 829 CHECK_FCT_DO( fd_psm_change_state(peer, STATE_WAITCNXACK), goto psm_end ); 806 830 fd_psm_next_timeout(peer, 0, CNX_TIMEOUT); … … 811 835 /* Mark the connection problem */ 812 836 peer->p_flags.pf_cnx_pb = 1; 813 case STATE_CLOSING:814 837 case STATE_WAITCNXACK: 815 838 case STATE_WAITCEA: 839 fd_hook_call(HOOK_PEER_CONNECT_FAILED, NULL, peer, "Timeout while waiting for remote peer", NULL); 840 case STATE_CLOSING: 816 841 /* Destroy the connection, restart the timer to a new connection attempt */ 817 842 fd_psm_next_timeout(peer, 1, peer->p_hdr.info.config.pic_tctimer ?: fd_g_config->cnf_timer_tc); … … 849 874 850 875 psm_end: 876 LOG_N("%s: Going to ZOMBIE state (no more activity)", peer->p_hdr.info.pi_diamid); 851 877 fd_psm_cleanup(peer, 1); 852 878 TRACE_DEBUG(INFO, "'%s'\t-> STATE_ZOMBIE (terminated)\t'%s'",
Note: See TracChangeset
for help on using the changeset viewer.