void SingleSendBuffer::retain_all(RepoId pub_id) { if (Transport_debug_level > 5) { GuidConverter converter(pub_id); ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) SingleSendBuffer::retain_all() - ") ACE_TEXT("copying out blocks for publication: %C\n"), OPENDDS_STRING(converter).c_str() )); } for (BufferMap::iterator it(this->buffers_.begin()); it != this->buffers_.end();) { if (it->second.first && it->second.second) { if (retain_buffer(pub_id, it->second) == REMOVE_ERROR) { GuidConverter converter(pub_id); ACE_ERROR((LM_WARNING, ACE_TEXT("(%P|%t) WARNING: ") ACE_TEXT("SingleSendBuffer::retain_all: ") ACE_TEXT("failed to retain data from publication: %C!\n"), OPENDDS_STRING(converter).c_str())); release(it++); } else { ++it; } } else { const FragmentMap::iterator fm_it = fragments_.find(it->first); if (fm_it != fragments_.end()) { for (BufferMap::iterator bm_it = fm_it->second.begin(); bm_it != fm_it->second.end();) { if (retain_buffer(pub_id, bm_it->second) == REMOVE_ERROR) { GuidConverter converter(pub_id); ACE_ERROR((LM_WARNING, ACE_TEXT("(%P|%t) WARNING: ") ACE_TEXT("SingleSendBuffer::retain_all: failed to ") ACE_TEXT("retain fragment data from publication: %C!\n"), OPENDDS_STRING(converter).c_str())); release(bm_it++); } else { ++bm_it; } } } ++it; } } }
// ------------------------------------------------ // Function: icmp_parse() // ------------------------------------------------ // Input: Message buffer // Output: - // ------------------------------------------------ // Description: Parse a ICMP message // ------------------------------------------------ void icmp_parse(PPBUF pbuf) { // --------------------- // checksum verification // --------------------- icmp_checksum(pbuf->data, pbuf->size); if(chk_H != 0xff) return; if(chk_L != 0xff) return; // ------------------------------- // checks recognized message types // ------------------------------- switch(ICMP(pbuf->data)->type) { case PING_REQUEST: // --------- // answer it // --------- retain_buffer(pbuf); ip_answer(pbuf); ICMP(pbuf->data)->type = PING_REPLY; // --------------- // update checksum // --------------- ICMP(pbuf->data)->checksum = 0; icmp_checksum(pbuf->data, pbuf->size); ICMP(pbuf->data)->checksum = HTONS(~WORDOF(chk_H, chk_L)); // ---------------------------- // sends answer to IP interface // ---------------------------- ip_send(pbuf); release_buffer(pbuf); break; case PING_REPLY: // -------------------------------------- // answer received, signal waiting thread // -------------------------------------- os_signal(SIG_ICMP); break; } }