Files
unison/src/internet/test/tcp-error-model.h
2022-10-14 14:13:12 +00:00

187 lines
4.8 KiB
C++

/*
* Copyright (c) 2015 Natale Patriciello <natale.patriciello@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation;
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#ifndef TCPERRORCHANNEL_H
#define TCPERRORCHANNEL_H
#include "ns3/error-model.h"
#include "ns3/ipv4-header.h"
#include "ns3/tcp-header.h"
namespace ns3
{
/**
* \ingroup internet-test
* \ingroup tests
*
* \brief A general (TCP-aware) error model.
*
* The class is responsible to take away the IP and TCP header from the packet,
* and then to interrogate the method ShouldDrop, dropping the packet accordingly
* to the returned value.
*/
class TcpGeneralErrorModel : public ErrorModel
{
public:
/**
* \brief Get the type ID.
* \return the object TypeId
*/
static TypeId GetTypeId();
TcpGeneralErrorModel();
/**
* \brief Set the drop callback.
* \param cb The callback to be set.
*/
void SetDropCallback(Callback<void, const Ipv4Header&, const TcpHeader&, Ptr<const Packet>> cb)
{
m_dropCallback = cb;
}
protected:
/**
* \brief Check if the packet should be dropped.
* \param ipHeader The packet IPv4 header.
* \param tcpHeader The packet TCP header.
* \param packetSize The packet size.
* \returns True if the packet should be dropped.
*/
virtual bool ShouldDrop(const Ipv4Header& ipHeader,
const TcpHeader& tcpHeader,
uint32_t packetSize) = 0;
private:
bool DoCorrupt(Ptr<Packet> p) override;
Callback<void, const Ipv4Header&, const TcpHeader&, Ptr<const Packet>>
m_dropCallback; //!< Drop callback.
};
/**
* \ingroup internet-test
* \ingroup tests
*
* \brief An error model TCP aware: it drops the sequence number declared.
*
* \see AddSeqToKill
*/
class TcpSeqErrorModel : public TcpGeneralErrorModel
{
public:
/**
* \brief Get the type ID.
* \return the object TypeId
*/
static TypeId GetTypeId();
TcpSeqErrorModel()
: TcpGeneralErrorModel()
{
}
/**
* \brief Add the sequence number to the list of segments to be killed
*
* Calling x times this function indicates that you want to kill
* the segment x times.
*
* \param seq sequence number to be killed
*/
void AddSeqToKill(const SequenceNumber32& seq)
{
m_seqToKill.insert(m_seqToKill.end(), seq);
}
protected:
bool ShouldDrop(const Ipv4Header& ipHeader,
const TcpHeader& tcpHeader,
uint32_t packetSize) override;
protected:
std::list<SequenceNumber32> m_seqToKill; //!< List of the sequence numbers to be dropped.
private:
void DoReset() override;
};
/**
* \ingroup internet-test
* \ingroup tests
*
* \brief Error model which drop packets with specified TCP flags.
*
* Set the flags with SetFlagToKill and the number of the packets with such flags
* which should be killed.
*
* \see SetFlagToKill
* \see SetKillRepeat
*
*/
class TcpFlagErrorModel : public TcpGeneralErrorModel
{
public:
/**
* \brief Get the type ID.
* \return the object TypeId
*/
static TypeId GetTypeId();
TcpFlagErrorModel();
/**
* \brief Set the flags of the segment that should be killed
*
* \param flags Flags
*/
void SetFlagToKill(TcpHeader::Flags_t flags)
{
m_flagsToKill = flags;
}
/**
* \brief Set how many packets should be killed
*
* If the flags are the same, this specified the numbers of drops:
*
* # -1 for infinite drops
* # 0 for no drops
* # >1 the number of drops
*
* \param killNumber Specifies the number of times the packet should be killed
*/
void SetKillRepeat(int16_t killNumber)
{
m_killNumber = killNumber;
}
protected:
bool ShouldDrop(const Ipv4Header& ipHeader,
const TcpHeader& tcpHeader,
uint32_t packetSize) override;
protected:
TcpHeader::Flags_t m_flagsToKill; //!< Flags a packet should have to be dropped.
int16_t m_killNumber; //!< The number of times the packet should be killed.
private:
void DoReset() override;
};
} // namespace ns3
#endif // TCPERRORCHANNEL_H