bool GREv0Layer::unsetChecksum() { gre_basic_header* header = getGreHeader(); if (header->checksumBit == 0) { LOG_ERROR("Couldn't unset checksum as it's already unset"); return false; } // if both routing and checksum are unset we need to shorted the layer bool needToShortenLayer = (header->routingBit == 0); uint8_t* offsetPtr = getFieldValue(GreChecksumOrRouting, true); int offset = offsetPtr - m_Data; if (needToShortenLayer && !shortenLayer(offset, sizeof(uint32_t))) { LOG_ERROR("Couldn't extend layer to unset checksum"); return false; } if (!needToShortenLayer) // meaning routing bit is set - only zero the checksum field { uint16_t* checksumPtr = (uint16_t*)(m_Data + offset); *checksumPtr = 0; } header = getGreHeader(); header->checksumBit = 0; return true; }
bool TcpLayer::removeTcpOption(TcpOption optionType) { TcpOptionData* opt = getTcpOptionData(optionType); if (opt == NULL) { return false; } // calculate total TCP option size TcpOptionData* curOpt = getFirstTcpOptionData(); size_t totalOptSize = 0; while (curOpt != NULL) { totalOptSize += curOpt->getTotalSize(); curOpt = getNextTcpOptionData(curOpt); } totalOptSize -= opt->getTotalSize(); int offset = (uint8_t*)opt - m_Data; if (!shortenLayer(offset, opt->getTotalSize())) { return false; } adjustTcpOptionTrailer(totalOptSize); m_TcpOptionsCount--; return true; }
bool TcpLayer::removeTcpOption(TcpOptionType optionType) { TcpOption opt = getTcpOption(optionType); if (opt.isNull()) { return false; } // calculate total TCP option size TcpOption curOpt = getFirstTcpOption(); size_t totalOptSize = 0; while (!curOpt.isNull()) { totalOptSize += curOpt.getTotalSize(); curOpt = getNextTcpOption(curOpt); } totalOptSize -= opt.getTotalSize(); int offset = opt.getRecordBasePtr() - m_Data; if (!shortenLayer(offset, opt.getTotalSize())) { return false; } adjustTcpOptionTrailer(totalOptSize); m_OptionReader.changeTLVRecordCount(-1); return true; }
bool TcpLayer::removeAllTcpOptions() { int offset = sizeof(tcphdr); if (!shortenLayer(offset, getHeaderLen()-offset)) return false; getTcpHeader()->dataOffset = sizeof(tcphdr)/4; m_NumOfTrailingBytes = 0; m_TcpOptionsCount = 0; return true; }
bool TcpLayer::removeAllTcpOptions() { int offset = sizeof(tcphdr); if (!shortenLayer(offset, getHeaderLen()-offset)) return false; getTcpHeader()->dataOffset = sizeof(tcphdr)/4; m_NumOfTrailingBytes = 0; m_OptionReader.changeTLVRecordCount(0-getTcpOptionCount()); return true; }
bool PPPoEDiscoveryLayer::removeTag(PPPoEDiscoveryLayer::PPPoETagTypes tagType) { PPPoEDiscoveryLayer::PPPoETag* tag = getTag(tagType); if (tag == NULL) { LOG_ERROR("Couldn't find tag"); return false; } int offset = (uint8_t*)tag - m_Data; return shortenLayer(offset, tag->getTagTotalSize()); }
void TcpLayer::adjustTcpOptionTrailer(size_t totalOptSize) { int newNumberOfTrailingBytes = 0; while ((totalOptSize + newNumberOfTrailingBytes) % 4 != 0) newNumberOfTrailingBytes++; if (newNumberOfTrailingBytes < m_NumOfTrailingBytes) shortenLayer(sizeof(tcphdr)+totalOptSize, m_NumOfTrailingBytes - newNumberOfTrailingBytes); else if (newNumberOfTrailingBytes > m_NumOfTrailingBytes) extendLayer(sizeof(tcphdr)+totalOptSize, newNumberOfTrailingBytes - m_NumOfTrailingBytes); m_NumOfTrailingBytes = newNumberOfTrailingBytes; for (int i = 0; i < m_NumOfTrailingBytes; i++) m_Data[sizeof(tcphdr) + totalOptSize + i] = TCPOPT_DUMMY; getTcpHeader()->dataOffset = (sizeof(tcphdr) + totalOptSize + m_NumOfTrailingBytes)/4; }
bool GREv1Layer::unsetAcknowledgmentNum() { gre1_header* header = getGreHeader(); if (header->ackSequenceNumBit == 0) { LOG_ERROR("Couldn't unset ack number as it's already unset"); return false; } uint8_t* offsetPtr = getFieldValue(GreAck, true); int offset = offsetPtr - m_Data; if (!shortenLayer(offset, sizeof(uint32_t))) { LOG_ERROR("Couldn't shorted layer to unset ack number"); return false; } header = getGreHeader(); header->ackSequenceNumBit = 0; return true; }
bool GREv0Layer::unsetKey() { gre_basic_header* header = getGreHeader(); if (header->keyBit == 0) { LOG_ERROR("Couldn't unset key as it's already unset"); return false; } uint8_t* offsetPtr = getFieldValue(GreKey, true); int offset = offsetPtr - m_Data; if (!shortenLayer(offset, sizeof(uint32_t))) { LOG_ERROR("Couldn't shorted layer to unset key"); return false; } header = (gre_basic_header*)m_Data; header->keyBit = 0; return true; }
bool GreLayer::unsetSequenceNumber() { gre_basic_header* header = (gre_basic_header*)m_Data; if (header->sequenceNumBit == 0) { LOG_ERROR("Couldn't unset sequence number as it's already unset"); return false; } uint8_t* offsetPtr = getFieldValue(GreSeq, true); int offset = offsetPtr - m_Data; if (!shortenLayer(offset, sizeof(uint32_t))) { LOG_ERROR("Couldn't shorted layer to unset sequence number"); return false; } header = (gre_basic_header*)m_Data; header->sequenceNumBit = 0; return true; }
bool PPPoEDiscoveryLayer::removeAllTags() { int offset = sizeof(pppoe_header); return shortenLayer(offset, m_DataLen-offset); }
bool DnsLayer::removeResource(IDnsResource* resourceToRemove) { if (resourceToRemove == NULL) { LOG_DEBUG("resourceToRemove cannot be NULL"); return false; } // find the resource preceding resourceToRemove IDnsResource* prevResource = m_ResourceList; if (m_ResourceList != resourceToRemove) { while (prevResource != NULL) { IDnsResource* temp = prevResource->getNextResource(); if (temp == resourceToRemove) break; prevResource = temp; } } if (prevResource == NULL) { LOG_DEBUG("Resource not found"); return false; } // shorten the layer and fix offset in layer for all next DNS resources in the packet if (!shortenLayer(resourceToRemove->m_OffsetInLayer, resourceToRemove->getSize(), resourceToRemove)) { LOG_ERROR("Couldn't shorten the DNS layer, resource cannot be removed"); return false; } // remove resourceToRemove from the resources linked list if (m_ResourceList != resourceToRemove) { prevResource->setNexResource(resourceToRemove->getNextResource()); } else { m_ResourceList = resourceToRemove->getNextResource(); } // check whether resourceToRemove was the first of its type if (getFirstResource(resourceToRemove->getType()) == resourceToRemove) { IDnsResource* nextResource = resourceToRemove->getNextResource(); if (nextResource != NULL && nextResource->getType() == resourceToRemove->getType()) setFirstResource(resourceToRemove->getType(), nextResource); else setFirstResource(resourceToRemove->getType(), NULL); } // free resourceToRemove memory delete resourceToRemove; return true; }