void modAOS_VC_Frame::rebuildIdleUnitTemplate_() { MOD_DEBUG("Rebuilding Idle AOS Transfer Frame template."); idleUnitTemplateCreation_.acquire(); AOS_Transfer_Frame* newFrame = new AOS_Transfer_Frame(static_cast<size_t>(getFrameSize())); newFrame->makeIdle(getSCID()); NetworkData* idleData = new NetworkData(idlePattern_.getLength()); for (int i = 0; i < idlePattern_.getLength(); i++ ) { *(idleData->ptrUnit() + i) = static_cast<int>(idlePattern_[i]) & 0xFF; } newFrame->setDataToPattern(idleData); ndSafeRelease(idleData); ndSafeRelease(idleUnitTemplate_); idleUnitTemplate_ = newFrame; idleUnitTemplateCreation_.release(); }
int modASM_Remove::svc() { svcStart_(); ACE_UINT8* markerBuf = 0; size_t markerLen = 0; _rebuildMarker = true; NetworkData* data = 0; NetworkData* goodUnit = 0; size_t goodUnitLength = 0; size_t advanceLen = 0; size_t remainingLen = 0; size_t partialMarkerLen = 0; size_t markerOffset = 0; bool searching = false; while ( continueService() ) { std::pair<NetworkData*, int> queueTop = getData_(); if ( msg_queue()->deactivated() ) break; if ( queueTop.second < 0 ) { MOD_ERROR("getData_() call failed."); continue; } else if ( ! queueTop.first ) { MOD_ERROR("getData_() returned with null data."); continue; } data = queueTop.first; _updateMarker(markerBuf, markerLen); MOD_DEBUG("Received a %d-octet unit to test for ASMs.", data->getUnitLength()); while ( data->getUnitLength() ) { if ( ! goodUnit ) { // no unit to continue, need to find next ASM partialMarkerLen = markerLen - markerOffset; // determine if enough buffer left to find ASM // if not, check what's left and check for remainder in next buffer if ( data->getUnitLength() < partialMarkerLen ) { if ( _markerMatch(data->ptrUnit(), markerBuf + markerOffset, data->getUnitLength()) ) { // this portion is correct markerOffset += data->getUnitLength(); } else { MOD_DEBUG("Missed partial ASM, resetting marker offset and bit error count."); incPartialMismatchCount(); markerOffset = 0; _currentBitErrors = 0; } advanceLen = data->getUnitLength(); } // if so, look for ASM normally else if ( _markerMatch(data->ptrUnit(), markerBuf + markerOffset, partialMarkerLen) ) { MOD_DEBUG("Found ASM."); _asmCount++; if ( searching ) _asmDiscoveredCount++; else _asmValidCount++; searching = false; advanceLen = partialMarkerLen; markerOffset = 0; _currentBitErrors = 0; // determine if entire unit can be extracted from buffer // if so, wrap and send if ( data->getUnitLength() - partialMarkerLen >= getExpectedUnitLength() ) { MOD_DEBUG("Found complete unit."); goodUnit = data->wrapInnerPDU<NetworkData>(getExpectedUnitLength(), data->ptrUnit() + partialMarkerLen); _send(goodUnit); advanceLen += getExpectedUnitLength(); } // if not, create a new unit to hold it else { MOD_DEBUG("Holding partial unit for expected completion."); goodUnitLength = data->getUnitLength() - partialMarkerLen; goodUnit = new NetworkData(getExpectedUnitLength()); goodUnit->copyUnit(goodUnit->ptrUnit(), data->ptrUnit() + partialMarkerLen, goodUnitLength); advanceLen += goodUnitLength; }; } else { MOD_DEBUG("Missed ASM, advancing one octet at a time."); if (! searching ) _asmMissedCount++; // Only increment for the first miss, or after another ASM was found. searching = true; incSearchCount(); // data->dump(); advanceLen = 1; markerOffset = 0; _currentBitErrors = 0; } } else { // continuing previous unit, don't look for ASM remainingLen = getExpectedUnitLength() - goodUnitLength; // determine if remaining unit fits in buffer // if so, append it and send, reset goodUnit to 0 if ( data->getUnitLength() >= remainingLen ) { MOD_DEBUG("Completing partial unit with newly received data."); goodUnit->copyUnit(goodUnit->ptrUnit() + goodUnitLength, data->ptrUnit(), remainingLen); _send(goodUnit); advanceLen = remainingLen; } // if not, append it and don't send else { MOD_DEBUG("Adding to partial unit but will complete later."); goodUnit->copyUnit(goodUnit->ptrUnit() + goodUnitLength, data->ptrUnit(), data->getUnitLength()); goodUnitLength += data->getUnitLength(); advanceLen = data->getUnitLength(); } } // advance read pointer by length just used up data->rd_ptr(advanceLen); MOD_DEBUG("Buffer length is now %d.", data->getUnitLength()); } ndSafeRelease(data); } return svcEnd_(); }
bool modAOS_OCF_Insert::_insertWaitingReport(AOS_Transfer_Frame* frame) { bool success = false; if ( ! getAuxQueue()->is_empty() ) { std::pair<NetworkData*, int> auxQueueTop = getAuxData_(); if ( auxQueueTop.second < 0 ) { MOD_ERROR("getAuxData_() call failed."); } else if ( ! auxQueueTop.first ) { MOD_ERROR("getAuxData_() returned with null data."); } else { ACE_Message_Block* mb = auxQueueTop.first; TC_Comm_Link_Control_Word* clcw = dynamic_cast<TC_Comm_Link_Control_Word*>(mb); if (clcw) { MOD_DEBUG("Received a Communications Link Control Word."); _receivedReportUnitCount += 1; _receivedReportOctetCount += clcw->getUnitLength(); try { frame->setCLCW(clcw); success = true; } catch (const MissingField& e) { MOD_WARNING("Attempt to insert CLCW into frame without an OCF, dropping the CLCW."); } delete clcw; } else { NetworkData* ocf = dynamic_cast<NetworkData*>(mb); if ( ! ocf || mb->length() != AOS_Transfer_Frame::spanOperationalControlField ) { MOD_WARNING("Unrecognized %d-octet, non-Report data unit received on auxiliary queue.", mb->length()); ndSafeRelease(mb); } else { MOD_DEBUG("Type-2 Report is waiting, attempting to copy to the Operational Control Field."); _receivedReportUnitCount += 1; _receivedReportOctetCount += ocf->getUnitLength(); try { frame->setType2ReportData(ocf->ptrUnit()); success = true; } catch (const MissingField& e) { MOD_WARNING("Attempt to insert Type-2 Report into AOS Transfer Frame without an OCF, dropping the report."); } catch (const NetworkData::MalformedPayload& e) { MOD_WARNING("Attempt to insert malformed Type-2 Report into AOS Transfer Frame, dropping the report."); } ndSafeRelease(ocf); } } } } return success; }
int modAOS_VC_Frame::svc() { svcStart_(); NetworkData* data = 0; AOS_Transfer_Frame* aos = 0; while ( continueService() ) { bool frameIsValid = true; ndSafeRelease(data); // Handle all cases from previous iteration std::pair<NetworkData*, int> queueTop = getData_(); if ( msg_queue()->deactivated() ) break; if ( queueTop.second < 0 ) { MOD_ERROR("getData_() call failed."); continue; } else if ( ! queueTop.first ) { MOD_ERROR("getData_() returned with null data."); continue; } data = queueTop.first; queueTop.first = 0; MOD_DEBUG("Channel GVCID %X: Received a %d-octet VC frame.", getGVCID(), data->getTotalUnitLength()); if ( data->getTotalUnitLength() != getMRU() ) { MOD_ERROR("Received %d-octet frame when exactly %d octets are required.", data->getTotalUnitLength(), getMRU()); incBadLengthCount(); frameIsValid = false; if ( getDropBadFrames() ) continue; } if ( links_[PrimaryOutputLink] ) { ndSafeRelease(aos); aos = new AOS_Transfer_Frame( getFrameSize(), // all frames in MC have the same size data->ptrUnit() // copy the data buffer ); if ( ! aos ) { MOD_ALERT("Failed to allocate an AOS_Transfer_Frame!", getName().c_str()); } else if ( aos->getGVCID() != getGVCID() ) { ND_WARNING("[%s] Incoming frame GVCID %X does not match assigned GVCID %X.", aos->getGVCID(), getGVCID()); incBadGVCIDCount(); frameIsValid = false; if ( getDropBadFrames() ) continue; } if ( frameIsValid ) incValidFrameCount(); if (aos) { MOD_DEBUG("Sending %-octet frame to next segment.", aos->getUnitLength()); links_[PrimaryOutputLink]->send(aos); aos = 0; // important } } else { MOD_ERROR("No output target defined, dropping packet."); } } return svcEnd_(); }
int modTM_MC_Frame::svc() { svcStart_(); NetworkData* data = 0; TM_Transfer_Frame* frame = 0; while ( continueService() ) { ndSafeRelease(data); ndSafeRelease(frame); std::pair<NetworkData*, int> queueTop = getData_(); if ( msg_queue()->deactivated() ) break; if ( queueTop.second < 0 ) { MOD_ERROR("getData_() call failed."); continue; } else if ( ! queueTop.first ) { MOD_ERROR("getData_() returned with null data."); continue; } data = queueTop.first; queueTop.first = 0; MOD_DEBUG("Channel MCID %X: Received a %d-octet MC frame.", getMCID(), data->getTotalUnitLength()); if ( data->getTotalUnitLength() != getMRU() ) { MOD_ERROR("Received %d-octet frame when exactly %d octets are required.", data->getTotalUnitLength(), getMRU()); incBadLengthCount(); if ( getDropBadFrames() ) { ndSafeRelease(data); continue; } } TM_Transfer_Frame* frame = new TM_Transfer_Frame( getFrameSize(), // all frames in MC have the same size data->ptrUnit(), // copy the data getUseOperationalControl(), // existance of OCF is VC dependent getUseFrameErrorControl(), // all frames in MC have frame CRC, or not getFSHSize() // size of secondary header ); if ( ! frame ) { MOD_ALERT("Failed to allocate a TM_Transfer_Frame!", getName().c_str()); continue; } if ( frame->getMCID() != getMCID() ) { ND_WARNING("[%s] Incoming frame MCID %X does not match assigned MCID %X.", frame->getMCID(), getMCID()); incBadMCIDCount(); if ( getDropBadFrames() ) continue; } else { incValidFrameCount(); } if ( links_[PrimaryOutputLink] ) { MOD_DEBUG("Sending %-octet frame to next segment.", frame->getUnitLength()); links_[PrimaryOutputLink]->send(frame); frame = 0; // important } else { MOD_ERROR("No output target defined, dropping packet."); } } return svcEnd_(); }