mirror of
https://github.com/ARMSX2/ARMSX2.git
synced 2026-08-24 16:50:16 -07:00
136 lines
2.9 KiB
C++
136 lines
2.9 KiB
C++
// SPDX-FileCopyrightText: 2002-2026 PCSX2 Dev Team
|
|
// SPDX-License-Identifier: GPL-3.0+
|
|
|
|
#pragma once
|
|
|
|
#include "DEV9/PacketReader/Payload.h"
|
|
#include "IP_Address.h"
|
|
#include "IP_Options.h"
|
|
#include "IP_Payload.h"
|
|
|
|
#include "common/Pcsx2Defs.h"
|
|
|
|
#include <vector>
|
|
|
|
namespace PacketReader::IP
|
|
{
|
|
enum struct IP_Type : u8
|
|
{
|
|
ICMP = 0x01,
|
|
IGMP = 0x02,
|
|
TCP = 0x06,
|
|
UDP = 0x11
|
|
};
|
|
|
|
class IP_Packet : public Payload
|
|
{
|
|
private:
|
|
const u8 _verHi = 4 << 4;
|
|
int headerLength = 20;
|
|
|
|
u8 dscp = 0;
|
|
//Flags
|
|
|
|
//u16 length;
|
|
|
|
u16 id = 0; //used during reassembly fragmented packets
|
|
private:
|
|
u8 fragmentFlags1 = 0;
|
|
u8 fragmentFlags2 = 0;
|
|
//Fragment Flags
|
|
public:
|
|
u8 timeToLive = 0;
|
|
u8 protocol;
|
|
|
|
private:
|
|
u16 checksum;
|
|
|
|
public:
|
|
IP_Address sourceIP{};
|
|
IP_Address destinationIP{};
|
|
std::vector<IPOption*> options;
|
|
|
|
private:
|
|
std::unique_ptr<IP_Payload> payload;
|
|
|
|
public:
|
|
int GetHeaderLength() const;
|
|
|
|
//DSCP/TOS Flags
|
|
|
|
/* Upper 3 Bits
|
|
* DSCP Class is equal to TOS precedence
|
|
* DSCP vs TOS
|
|
* Default (xxx000), Low Effort (xxx010)
|
|
* 0 = Routine Class 0
|
|
* Assured Forwarding (xxx000, xxx010, xxx100, xxx110)
|
|
* 1 = Priority Class 1
|
|
* 2 = Immediate Class 2
|
|
* 3 = Flash Class 3
|
|
* 4 = Flash Override Class 4
|
|
* Expedited Forwarding (xxx110, xxx100)
|
|
* 5 = Critical Class 5
|
|
* Not Defined (xxx000)
|
|
* 6 = Internetwork Control Class 6
|
|
* 7 = Network Control Class 7
|
|
*
|
|
* Lower 3 Bits
|
|
* In TOS, defined as follows
|
|
* bit 0: Reliability
|
|
* bit 1: Throughput
|
|
* bit 2: Low Delay
|
|
* In DSCP, defined as following (bits 1-2)
|
|
* Class 0, Low Effort, 1
|
|
* Class 1-4, Assured Forwarding drop probability, Low = 1, Mid = 2, High = 3
|
|
* Class 5, Expedited Forwarding, 3
|
|
* bit0: Set to zero
|
|
*/
|
|
u8 GetDscpValue() const;
|
|
void SetDscpValue(u8 value);
|
|
|
|
/* 2 bits
|
|
* In TOS, defined as follows
|
|
* Bit 0: Unused
|
|
* Bit 1: Low Cost
|
|
* In DSCP, defined as follows
|
|
* 0 = ECN not supported
|
|
* 1,2 ECN Supported
|
|
* 3 = Congestion Encountered
|
|
*/
|
|
u8 GetDscpECN() const;
|
|
void SetDscpECN(u8 value);
|
|
|
|
//Fragment Flags
|
|
//bit 0, reserverd
|
|
|
|
bool GetDoNotFragment() const;
|
|
void SetDoNotFragment(bool value);
|
|
|
|
bool GetMoreFragments() const;
|
|
void SetMoreFragments(bool value);
|
|
|
|
//Untested
|
|
u16 GetFragmentOffset() const;
|
|
|
|
//Takes ownership of payload
|
|
IP_Packet(IP_Payload* data);
|
|
IP_Packet(const u8* buffer, int bufferSize, bool fromICMP = false);
|
|
IP_Packet(const IP_Packet&);
|
|
|
|
IP_Payload* GetPayload() const;
|
|
|
|
virtual int GetLength();
|
|
virtual void WriteBytes(u8* buffer, int* offset);
|
|
virtual IP_Packet* Clone() const;
|
|
|
|
bool VerifyChecksum();
|
|
static u16 InternetChecksum(const u8* buffer, int length);
|
|
|
|
~IP_Packet();
|
|
|
|
private:
|
|
void ReComputeHeaderLen();
|
|
void CalculateChecksum();
|
|
};
|
|
} // namespace PacketReader::IP
|