Changeset 1104:757df62cadb6 in freeDiameter for libfdcore/p_psm.c
- Timestamp:
- May 10, 2013, 7:49:19 PM (11 years ago)
- Branch:
- default
- Parents:
- 1103:d8591b1c56cd (diff), 1059:a1d6e1980132 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent. - Phase:
- public
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
libfdcore/p_psm.c
r1058 r1104 241 241 case FDEVP_CNX_INCOMING: { 242 242 struct cnx_incoming * evd = ev->data; 243 fd_msg_log( FD_MSG_LOG_DROPPED, evd->cer, "Message discarded while cleaning peer state machine queue." );243 //fd_msg_log( FD_MSG_LOG_DROPPED, evd->cer, "Message discarded while cleaning peer state machine queue." ); 244 244 CHECK_FCT_DO( fd_msg_free(evd->cer), /* continue */); 245 245 fd_cnx_destroy(evd->cnx); … … 451 451 TRACE_DEBUG(INFO, "Invalid event received in PSM '%s' : %d", peer->p_hdr.info.pi_diamid, event); 452 452 ASSERT(0); /* we should investigate this situation */ 453 goto psm_loop;454 }455 456 /* Handle the (easy) debug event now */457 if (event == FDEVP_DUMP_ALL) {458 fd_peer_dump(peer, ANNOYING);459 453 goto psm_loop; 460 454 } … … 489 483 struct msg * msg = NULL; 490 484 struct msg_hdr * hdr; 491 struct timespec rcvon; 492 493 /* Retrieve the piggytailed timestamp */ 494 memcpy(&rcvon, ev_data+ev_sz, sizeof(struct timespec)); 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); 495 491 496 492 /* Parse the received buffer */ 497 493 CHECK_FCT_DO( fd_msg_parse_buffer( (void *)&ev_data, ev_sz, &msg), 498 494 { 499 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 ); 500 496 free(ev_data); 501 497 CHECK_FCT_DO( fd_event_send(peer->p_events, FDEVP_CNX_ERROR, 0, NULL), goto psm_reset ); … … 503 499 } ); 504 500 505 CHECK_FCT_DO( fd_msg_ts_set_recv(msg, &rcvon), /* ... */);506 501 fd_hook_associate(msg, pmdl); 502 507 503 /* If the current state does not allow receiving messages, just drop it */ 508 504 if (cur_state == STATE_CLOSED) { 509 505 /* In such case, just discard the message */ 510 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)); 511 507 fd_msg_free(msg); 512 508 goto psm_loop; 513 509 } 514 510 515 /* Log incoming message */516 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) );517 518 511 /* Extract the header */ 519 512 CHECK_FCT_DO( fd_msg_hdr(msg, &hdr), goto psm_end ); … … 525 518 CHECK_FCT_DO( fd_p_sr_fetch(&peer->p_sr, hdr->msg_hbhid, &req), goto psm_end ); 526 519 if (req == NULL) { 527 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)); 528 521 fd_msg_free(msg); 529 522 goto psm_loop; … … 533 526 CHECK_FCT_DO( fd_msg_answ_associate( msg, req ), goto psm_end ); 534 527 535 /* Display the delay to receive the answer */536 {537 struct timespec reqsent, delay;538 (void) fd_msg_ts_get_sent(req, &reqsent);539 TS_DIFFERENCE( &delay, &reqsent, &rcvon );540 fd_msg_log( FD_MSG_LOG_TIMING, msg, "Answer received in %ld.%6.6ld sec.", (long)delay.tv_sec, delay.tv_nsec / 1000 );541 }542 528 } else { 543 529 /* Mark the incoming request so that we know we have pending answers for this peer */ … … 546 532 CHECK_POSIX_DO( pthread_mutex_unlock(&peer->p_state_mtx), goto psm_end ); 547 533 } 534 535 /* Log incoming message */ 536 fd_hook_call(HOOK_MESSAGE_RECEIVED, msg, peer, NULL, fd_msg_pmdl_get(msg)); 548 537 549 538 if (cur_state == STATE_OPEN_NEW) { … … 584 573 case STATE_WAITCEA: 585 574 case STATE_CLOSED: 586 default: 575 default: { 587 576 /* In such case, just discard the message */ 588 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)); 589 580 fd_msg_free(msg); 581 } 590 582 } 591 583 goto psm_loop; … … 594 586 /* Link-local message: They must be understood by our dictionary, otherwise we return an error */ 595 587 { 596 int ret = fd_msg_parse_or_error( &msg ); 588 struct msg * error = NULL; 589 int ret = fd_msg_parse_or_error( &msg, &error ); 597 590 if (ret != EBADMSG) { 598 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 } ); 599 597 } else { 600 if (msg ) {598 if (msg == NULL) { 601 599 /* Send the error back to the peer */ 602 CHECK_FCT_DO( ret = fd_out_send(& msg, NULL, peer, FD_CNX_ORDERED), );603 if ( msg) {600 CHECK_FCT_DO( ret = fd_out_send(&error, NULL, peer, FD_CNX_ORDERED), ); 601 if (error) { 604 602 /* Only if an error occurred & the message was not saved / dumped */ 605 fd_msg_log( FD_MSG_LOG_DROPPED, msg, "Internal error: Problem while sending (%s)", strerror(ret) );606 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); 607 605 } 608 606 } else { 609 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); 610 610 CHECK_FCT_DO( fd_event_send(peer->p_events, FDEVP_CNX_ERROR, 0, NULL), goto psm_reset ); 611 611 } … … 617 617 switch (hdr->msg_code) { 618 618 case CC_CAPABILITIES_EXCHANGE: 619 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 } ); 620 625 break; 621 626 … … 652 657 /* Cleanup the message if not done */ 653 658 if (msg) { 654 fd_msg_log( FD_MSG_LOG_DROPPED, msg, "Received un-handled non-routable command from peer '%s'.", peer->p_hdr.info.pi_diamid );659 //fd_msg_log( FD_MSG_LOG_DROPPED, msg, "Received un-handled non-routable command from peer '%s'.", peer->p_hdr.info.pi_diamid ); 655 660 CHECK_FCT_DO( fd_msg_free(msg), /* continue */); 656 661 msg = NULL; … … 660 665 /* At this point the message must have been fully handled already */ 661 666 if (msg) { 662 fd_msg_log( FD_MSG_LOG_DROPPED, msg, "Internal error ('%s'): unhandled message.", peer->p_hdr.info.pi_diamid );667 //fd_msg_log( FD_MSG_LOG_DROPPED, msg, "Internal error ('%s'): unhandled message.", peer->p_hdr.info.pi_diamid ); 663 668 fd_msg_free(msg); 664 669 } … … 686 691 /* Mark the connection problem */ 687 692 peer->p_flags.pf_cnx_pb = 1; 693 694 fd_hook_call(HOOK_PEER_CONNECT_FAILED, NULL, peer, "The connection was broken", NULL); 688 695 689 696 /* Destroy the connection, restart the timer to a new connection attempt */ … … 721 728 CHECK_FCT_DO( fd_cnx_getremoteeps(peer->p_cnxctx, &peer->p_hdr.info.pi_endpoints), /* ignore the error */); 722 729 723 /* We do not support local endpoints change currently, but it could be added here if needed (refresh fd_g_config->cnf_endpoints)*/ 724 725 if (TRACE_BOOL(ANNOYING)) { 726 TRACE_DEBUG(ANNOYING, "New remote endpoint(s):" ); 727 fd_ep_dump(6, &peer->p_hdr.info.pi_endpoints); 730 /* We do not support local endpoints change currently, but it could be added here if needed (refresh fd_g_config->cnf_endpoints) */ 731 { 732 char * buf = NULL; 733 size_t len = 0; 734 LOG_D("New remote endpoint(s): %s", fd_ep_dump(&buf, &len, NULL, 6, &peer->p_hdr.info.pi_endpoints) ?: "error"); 735 free(buf); 728 736 } 729 737 … … 746 754 } 747 755 if (params->cer) { 748 fd_msg_log( FD_MSG_LOG_DROPPED, params->cer, "Internal error: this CER was not handled as expected." );749 756 CHECK_FCT_DO( fd_msg_free(params->cer), ); 750 757 params->cer = NULL; … … 767 774 case STATE_WAITCNXACK_ELEC: 768 775 case STATE_WAITCNXACK: 776 LOG_D("%s: Connection established", peer->p_hdr.info.pi_diamid); 769 777 fd_p_ce_handle_newcnx(peer, cnx); 770 778 break; … … 795 803 796 804 case STATE_WAITCNXACK: 805 LOG_D("%s: Connection attempt failed", peer->p_hdr.info.pi_diamid); 797 806 /* Go back to CLOSE */ 798 807 fd_psm_next_timeout(peer, 1, peer->p_hdr.info.config.pic_tctimer ?: fd_g_config->cnf_timer_tc); … … 817 826 818 827 case STATE_CLOSED: 828 LOG_D("%s: Connecting...", peer->p_hdr.info.pi_diamid); 819 829 CHECK_FCT_DO( fd_psm_change_state(peer, STATE_WAITCNXACK), goto psm_end ); 820 830 fd_psm_next_timeout(peer, 0, CNX_TIMEOUT); … … 825 835 /* Mark the connection problem */ 826 836 peer->p_flags.pf_cnx_pb = 1; 827 case STATE_CLOSING:828 837 case STATE_WAITCNXACK: 829 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: 830 841 /* Destroy the connection, restart the timer to a new connection attempt */ 831 842 fd_psm_next_timeout(peer, 1, peer->p_hdr.info.config.pic_tctimer ?: fd_g_config->cnf_timer_tc); … … 863 874 864 875 psm_end: 876 LOG_N("%s: Going to ZOMBIE state (no more activity)", peer->p_hdr.info.pi_diamid); 865 877 fd_psm_cleanup(peer, 1); 866 878 TRACE_DEBUG(INFO, "'%s'\t-> STATE_ZOMBIE (terminated)\t'%s'", -
libfdcore/p_psm.c
r1103 r1104 336 336 peer->p_psm_timer.tv_sec += random() % 4; 337 337 peer->p_psm_timer.tv_nsec+= random() % 1000000000L; 338 if (peer->p_psm_timer.tv_nsec > 1000000000L) {338 if (peer->p_psm_timer.tv_nsec >= 1000000000L) { 339 339 peer->p_psm_timer.tv_nsec -= 1000000000L; 340 340 peer->p_psm_timer.tv_sec ++;
Note: See TracChangeset
for help on using the changeset viewer.