libraries/pcappp/include/pcapplusplus/MplsLayer.h

127 lines
3.4 KiB
C++

#ifndef PACKETPP_MPLS_LAYER
#define PACKETPP_MPLS_LAYER
#include "Layer.h"
/// @file
/**
* \namespace pcpp
* \brief The main namespace for the PcapPlusPlus lib
*/
namespace pcpp
{
/**
* @class MplsLayer
* Represents a MPLS (Multi-Protocol Label Switching) layer
*/
class MplsLayer : public Layer
{
private:
#pragma pack(push, 1)
struct mpls_header
{
uint16_t hiLabel;
uint8_t misc;
uint8_t ttl;
};
#pragma pack(pop)
mpls_header* getMplsHeader() const { return (mpls_header*)m_Data; }
public:
/** A constructor that creates the layer from an existing packet raw data
* @param[in] data A pointer to the raw data
* @param[in] dataLen Size of the data in bytes
* @param[in] prevLayer A pointer to the previous layer
* @param[in] packet A pointer to the Packet instance where layer will be stored in
*/
MplsLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet) : Layer(data, dataLen, prevLayer, packet) { m_Protocol = MPLS; }
/**
* A constructor that allocates a new MPLS header
* @param[in] mplsLabel MPLS label
* @param[in] ttl Time-to-leave value
* @param[in] experimentalUseValue Experimental use value
* @param[in] bottomOfStack Bottom-of-stack value which indicate whether the next layer will also be a MPLS label or not
*/
MplsLayer(uint32_t mplsLabel, uint8_t ttl, uint8_t experimentalUseValue, bool bottomOfStack);
virtual ~MplsLayer() {}
/**
* @return TTL value of the MPLS header
*/
uint8_t getTTL() const { return getMplsHeader()->ttl; }
/**
* Set the TTL value
* @param[in] ttl The TTL value to set
*/
void setTTL(uint8_t ttl) { getMplsHeader()->ttl = ttl; }
/**
* Get an indication whether the next layer is also be a MPLS label or not
* @return True if it's the last MPLS layer, false otherwise
*/
bool isBottomOfStack() const;
/**
* Set the bottom-of-stack bit in the MPLS label
* @param[in] val Set or unset the bit
*/
void setBottomOfStack(bool val);
/**
* @return The exp value (3 bits) of the MPLS label
*/
uint8_t getExperimentalUseValue() const;
/**
* Set the exp value (3 bits) of the MPLS label
* @param[in] val The exp value to set. val must be a valid number meaning between 0 and 7 (inclusive)
* @return True if exp value was set successfully or false if val has invalid value
*/
bool setExperimentalUseValue(uint8_t val);
/**
* @return The MPLS label value (20 bits)
*/
uint32_t getMplsLabel() const;
/**
* Set the MPLS label (20 bits)
* @param[in] label The label to set. label must be a valid number meaning between 0 and 0xFFFFF (inclusive)
* @return True if label was set successfully or false if label has invalid value
*/
bool setMplsLabel(uint32_t label);
// implement abstract methods
/**
* Currently identifies the following next layers: IPv4Layer, IPv6Layer, MplsLayer. Otherwise sets PayloadLayer
*/
void parseNextLayer();
/**
* @return Size of MPLS header (4 bytes)
*/
size_t getHeaderLen() const { return sizeof(mpls_header); }
/**
* Set/unset the bottom-of-stack bit according to next layer: if it's a MPLS layer then bottom-of-stack will be unset. If it's not a
* MPLS layer this bit will be set
*/
void computeCalculateFields();
std::string toString() const;
OsiModelLayer getOsiModelLayer() const { return OsiModelNetworkLayer; }
};
} // namespace pcpp
#endif /* PACKETPP_MPLS_LAYER */