23 #if (BYTE_ORDER == LITTLE_ENDIAN)
57 static_assert(
sizeof(
iphdr) == 20,
"iphdr size is not 20 bytes");
155 #define PCPP_IP_DONT_FRAGMENT 0x40
156 #define PCPP_IP_MORE_FRAGMENTS 0x20
221 std::vector<IPv4Address> res;
223 if (m_Data ==
nullptr)
230 uint8_t valueOffset =
static_cast<uint8_t
>(1);
232 while (
static_cast<size_t>(valueOffset) < dataSize)
235 memcpy(&curValue, m_Data->recordValue + valueOffset,
sizeof(uint32_t));
241 valueOffset +=
static_cast<uint8_t
>(4);
259 if (m_Data ==
nullptr)
271 uint8_t valueOffset =
static_cast<uint8_t
>(2);
274 while (
static_cast<size_t>(valueOffset) < dataSize)
277 memcpy(&curValue, m_Data->recordValue + valueOffset,
sizeof(uint32_t));
287 readIPAddr = !readIPAddr;
289 valueOffset +=
static_cast<uint8_t
>(4);
305 static bool canAssign(
const uint8_t* recordRawData,
size_t tlvDataLen)
307 auto data =
reinterpret_cast<TLVRawData const*
>(recordRawData);
311 if (tlvDataLen <
sizeof(TLVRawData::recordType))
315 data->recordType ==
static_cast<uint8_t
>(
IPV4OPT_NOP))
325 if (m_Data ==
nullptr)
329 m_Data->recordType ==
static_cast<uint8_t
>(
IPV4OPT_NOP))
330 return sizeof(uint8_t);
332 return static_cast<size_t>(m_Data->recordLen);
337 if (m_Data ==
nullptr)
341 m_Data->recordType ==
static_cast<uint8_t
>(
IPV4OPT_NOP))
344 return static_cast<size_t>(m_Data->recordLen) - (2 *
sizeof(uint8_t));
364 bool m_BuilderParamsValid;
377 m_BuilderParamsValid =
true;
387 m_BuilderParamsValid =
true;
451 return reinterpret_cast<iphdr*
>(m_Data);
586 m_TempHeaderExtension;
608 static inline bool isDataValid(
const uint8_t* data,
size_t dataLen);
616 static std::vector<FieldDescriptor>
all()
621 std::copy(extra.begin(), extra.end(), std::back_inserter(result));
657 int m_NumOfTrailingBytes;
658 int m_TempHeaderExtension;
661 void copyLayerData(
const IPv4Layer& other);
662 uint8_t* getOptionsBasePtr()
const
664 return m_Data +
sizeof(
iphdr);
667 void adjustOptionsTrailer(
size_t totalOptSize);
669 void initLayerInPacket(
bool setTotalLenAsDataLen);
676 const iphdr* hdr =
reinterpret_cast<const iphdr*
>(data);
Definition: IpAddress.h:318
Definition: IpAddress.h:30
uint32_t toInt() const
Definition: IpAddress.h:155
Definition: IPv4Layer.h:410
IPv4Option getNextOption(IPv4Option &option) const
iphdr * getIPv4Header() const
Definition: IPv4Layer.h:449
size_t getHeaderLen() const override
Definition: IPv4Layer.h:583
IPv4Layer()
A constructor that allocates a new IPv4 header with empty fields.
uint8_t getFragmentFlags() const
IPv4Address getSrcIPv4Address() const
Definition: IPv4Layer.h:464
IPAddress getDstIPAddress() const override
Definition: IPv4Layer.h:479
IPAddress getSrcIPAddress() const override
Definition: IPv4Layer.h:457
void parseNextLayer() override
static bool isDataValid(const uint8_t *data, size_t dataLen)
Definition: IPv4Layer.h:674
IPv4Option addOption(const IPv4OptionBuilder &optionBuilder)
IPv4Layer(const IPv4Address &srcIP, const IPv4Address &dstIP)
IPv4Layer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
IPv4Option getOption(IPv4OptionTypes option) const
void setDstIPv4Address(const IPv4Address &ipAddr)
Definition: IPv4Layer.h:493
void serializeLayer(ObjectScope &serializer) const override
void setSrcIPv4Address(const IPv4Address &ipAddr)
Definition: IPv4Layer.h:471
IPv4Layer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet, bool setTotalLenAsDataLen)
void computeCalculateFields() override
OsiModelLayer getOsiModelLayer() const override
Definition: IPv4Layer.h:599
bool isLastFragment() const
IPv4Layer & operator=(const IPv4Layer &other)
IPv4Address getDstIPv4Address() const
Definition: IPv4Layer.h:486
IPv4Layer(const IPv4Layer &other)
A copy constructor that copy the entire header from the other IPv4Layer (including IPv4 options)
size_t getOptionCount() const
IPv4Option addOptionAfter(const IPv4OptionBuilder &optionBuilder, IPv4OptionTypes prevOptionType=IPV4OPT_Unknown)
IPv4Option getFirstOption() const
bool removeOption(IPv4OptionTypes option)
uint16_t getFragmentOffset() const
bool isFirstFragment() const
std::string toString() const override
Definition: IPv4Layer.h:362
IPv4OptionBuilder(IPv4OptionTypes optionType, const uint8_t *optionValue, uint8_t optionValueLen)
Definition: IPv4Layer.h:374
IPv4OptionBuilder(IPv4OptionTypes optionType, uint16_t optionValue)
Definition: IPv4Layer.h:384
IPv4OptionBuilder(const IPv4TimestampOptionValue ×tampValue)
IPv4OptionBuilder(IPv4OptionTypes optionType, const std::vector< IPv4Address > &ipList)
Definition: IPv4Layer.h:203
IPv4Option(uint8_t *optionRawData)
Definition: IPv4Layer.h:207
std::vector< IPv4Address > getValueAsIpList() const
Definition: IPv4Layer.h:219
~IPv4Option() override=default
A d'tor for this class, currently does nothing.
IPv4OptionTypes getIPv4OptionType() const
Definition: IPv4Layer.h:296
size_t getDataSize() const override
Definition: IPv4Layer.h:335
size_t getTotalSize() const override
Definition: IPv4Layer.h:323
static bool canAssign(const uint8_t *recordRawData, size_t tlvDataLen)
Definition: IPv4Layer.h:305
IPv4TimestampOptionValue getTimestampOptionValue() const
Definition: IPv4Layer.h:254
Definition: Serializers.h:230
Definition: TLVData.h:374
static bool canAssign(const uint8_t *recordRawData, size_t tlvDataLen)
Definition: TLVData.h:67
Definition: TLVData.h:219
The main namespace for the PcapPlusPlus lib.
Definition: AssertionUtils.h:19
IPv4OptionTypes
An enum for supported IPv4 option types.
Definition: IPv4Layer.h:110
@ IPV4OPT_MTUReply
MTU Reply.
Definition: IPv4Layer.h:120
@ IPV4OPT_QuickStart
Quick-Start.
Definition: IPv4Layer.h:122
@ IPV4OPT_LooseSourceRoute
Loose Source Route.
Definition: IPv4Layer.h:130
@ IPV4OPT_Traceroute
Traceroute.
Definition: IPv4Layer.h:126
@ IPV4OPT_NOP
No Operation.
Definition: IPv4Layer.h:114
@ IPV4OPT_UpstreamMulticastPkt
Upstream Multicast Pkt.
Definition: IPv4Layer.h:150
@ IPV4OPT_DynamicPacketState
Dynamic Packet State.
Definition: IPv4Layer.h:148
@ IPV4OPT_EndOfOptionsList
End of Options List.
Definition: IPv4Layer.h:112
@ IPV4OPT_ExtendedSecurity
Extended Security.
Definition: IPv4Layer.h:132
@ IPV4OPT_RouterAlert
Router Alert.
Definition: IPv4Layer.h:144
@ IPV4OPT_SelectiveDirectedBroadcast
Selective Directed Broadcast.
Definition: IPv4Layer.h:146
@ IPV4OPT_Security
Security.
Definition: IPv4Layer.h:128
@ IPV4OPT_Timestamp
Timestamp.
Definition: IPv4Layer.h:124
@ IPV4OPT_Unknown
Unknown IPv4 option.
Definition: IPv4Layer.h:152
@ IPV4OPT_AddressExtension
Address Extension.
Definition: IPv4Layer.h:142
@ IPV4OPT_CommercialSecurity
Commercial Security.
Definition: IPv4Layer.h:134
@ IPV4OPT_MTUProbe
MTU Probe.
Definition: IPv4Layer.h:118
@ IPV4OPT_StrictSourceRoute
Strict Source Route.
Definition: IPv4Layer.h:138
@ IPV4OPT_ExtendedInternetProtocol
Extended Internet Protocol.
Definition: IPv4Layer.h:140
@ IPV4OPT_StreamID
Stream ID.
Definition: IPv4Layer.h:136
@ IPV4OPT_RecordRoute
Record Route.
Definition: IPv4Layer.h:116
OsiModelLayer
An enum representing OSI model layers.
Definition: ProtocolType.h:420
@ OsiModelNetworkLayer
Network layer (layer 3)
Definition: ProtocolType.h:426
IPProtocolTypes
An enum for all possible IPv4 and IPv6 protocol types.
Definition: IPv4Layer.h:61
@ PACKETPP_IPPROTO_ROUTING
IPv6 Routing header.
Definition: IPv4Layer.h:85
@ PACKETPP_IPPROTO_AH
authentication header
Definition: IPv4Layer.h:93
@ PACKETPP_IPPROTO_ICMP
Internet Control Message Protocol.
Definition: IPv4Layer.h:67
@ PACKETPP_IPPROTO_IPIP
IPIP tunnels (older KA9Q tunnels use 94)
Definition: IPv4Layer.h:71
@ PACKETPP_IPPROTO_FRAGMENT
IPv6 fragmentation header.
Definition: IPv4Layer.h:87
@ PACKETPP_IPPROTO_UDP
User Datagram Protocol.
Definition: IPv4Layer.h:79
@ PACKETPP_IPPROTO_IP
Dummy protocol for TCP.
Definition: IPv4Layer.h:63
@ PACKETPP_IPPROTO_ESP
encapsulating security payload
Definition: IPv4Layer.h:91
@ PACKETPP_IPPROTO_IGMP
Internet Gateway Management Protocol.
Definition: IPv4Layer.h:69
@ PACKETPP_IPPROTO_GRE
GRE protocol.
Definition: IPv4Layer.h:89
@ PACKETPP_IPPROTO_TCP
Transmission Control Protocol.
Definition: IPv4Layer.h:73
@ PACKETPP_IPPROTO_ICMPV6
ICMPv6.
Definition: IPv4Layer.h:95
@ PACKETPP_IPPROTO_PUP
PUP protocol.
Definition: IPv4Layer.h:77
@ PACKETPP_IPPROTO_VRRP
VRRP protocol.
Definition: IPv4Layer.h:101
@ PACKETPP_IPPROTO_IDP
XNS IDP protocol.
Definition: IPv4Layer.h:81
@ PACKETPP_IPPROTO_EGP
Exterior Gateway Protocol.
Definition: IPv4Layer.h:75
@ PACKETPP_IPPROTO_HOPOPTS
IPv6 Hop-by-Hop options.
Definition: IPv4Layer.h:65
@ PACKETPP_IPPROTO_DSTOPTS
IPv6 Destination options.
Definition: IPv4Layer.h:99
@ PACKETPP_IPPROTO_RAW
Raw IP packets.
Definition: IPv4Layer.h:103
@ PACKETPP_IPPROTO_NONE
IPv6 no next header.
Definition: IPv4Layer.h:97
@ PACKETPP_IPPROTO_MAX
Maximum value.
Definition: IPv4Layer.h:105
@ PACKETPP_IPPROTO_IPV6
IPv6 header.
Definition: IPv4Layer.h:83
Definition: Serializers.h:18
Definition: IPv4Layer.h:614
static std::vector< FieldDescriptor > all()
Definition: IPv4Layer.h:616
static const FieldDescriptor IpProtocol
Next layer's protocol (e.g. 6 for TCP, 17 for UDP)
Definition: IPv4Layer.h:635
static const FieldDescriptor Option
One option's type name (e.g. "NOP"); an Options element, not included in all()
Definition: IPv4Layer.h:650
static const FieldDescriptor IsFragment
Whether this packet is a fragment.
Definition: IPv4Layer.h:641
static const FieldDescriptor IpId
IP identification field, in host byte order.
Definition: IPv4Layer.h:632
static const FieldDescriptor FragmentOffset
Fragment offset, in 8-byte units.
Definition: IPv4Layer.h:644
static const FieldDescriptor TotalLength
Total length, in host byte order.
Definition: IPv4Layer.h:638
static const FieldDescriptor DstIp
Destination IP address, as a string.
Definition: IPv4Layer.h:629
static const FieldDescriptor Options
Array of header options; elements described by Option.
Definition: IPv4Layer.h:647
static const FieldDescriptor SrcIp
Source IP address, as a string.
Definition: IPv4Layer.h:626
Definition: IPv4Layer.h:162
TimestampType type
The timestamp value type.
Definition: IPv4Layer.h:177
std::vector< IPv4Address > ipAddresses
A list of IPv4 addresses parsed from the IPv4 timestamp option value.
Definition: IPv4Layer.h:183
TimestampType
An enum for IPv4 timestamp option types.
Definition: IPv4Layer.h:165
@ Unknown
Invalid or unknown value type.
Definition: IPv4Layer.h:173
@ TimestampsForPrespecifiedIPs
The IPv4 addresses are prespecified.
Definition: IPv4Layer.h:171
@ TimestampAndIP
Value containing both timestamps and IPv4 addresses.
Definition: IPv4Layer.h:169
@ TimestampOnly
Value containing only timestamps.
Definition: IPv4Layer.h:167
std::vector< uint32_t > timestamps
A list of timestamps parsed from the IPv4 timestamp option value.
Definition: IPv4Layer.h:180
void clear()
Definition: IPv4Layer.h:191
IPv4TimestampOptionValue()
The default constructor.
Definition: IPv4Layer.h:186
static std::vector< FieldDescriptor > all()
Definition: Layer.h:214
Definition: IPv4Layer.h:22
uint8_t typeOfService
type of service, same as Differentiated Services Code Point (DSCP)
Definition: IPv4Layer.h:35
uint32_t ipDst
IPv4 address of the receiver of the packet.
Definition: IPv4Layer.h:53
uint16_t headerChecksum
Error-checking of the header.
Definition: IPv4Layer.h:49
uint8_t ipVersion
IP version number, has the value of 4 for IPv4.
Definition: IPv4Layer.h:27
uint32_t ipSrc
IPv4 address of the sender of the packet.
Definition: IPv4Layer.h:51
uint8_t protocol
Defines the protocol used in the data portion of the IP datagram. Must be one of IPProtocolTypes.
Definition: IPv4Layer.h:47
uint16_t fragmentOffset
Fragment offset field, measured in units of eight-byte blocks (64 bits)
Definition: IPv4Layer.h:42
uint16_t ipId
Definition: IPv4Layer.h:40
uint8_t timeToLive
Definition: IPv4Layer.h:45
uint16_t totalLength
Entire packet (fragment) size, including header and data, in bytes.
Definition: IPv4Layer.h:37
uint8_t internetHeaderLength
IP header length, has the value of 5 for IPv4.
Definition: IPv4Layer.h:25