181 lines
4.6 KiB
C++
181 lines
4.6 KiB
C++
#include "network/packet.h"
|
|
|
|
namespace dofs {
|
|
|
|
Packet::Packet(NodeId src_node,
|
|
PortId src_port,
|
|
NodeId dst_node,
|
|
PortId dst_port,
|
|
PacketProtocol proto,
|
|
FlowPriority prio,
|
|
PacketSeq seq,
|
|
FlowId flow,
|
|
uint16_t entropy,
|
|
uint8_t notifications,
|
|
Bytes payload_bytes) noexcept
|
|
: _src_node(src_node),
|
|
_src_port(src_port),
|
|
_dst_node(dst_node),
|
|
_dst_port(dst_port),
|
|
_protocol(proto),
|
|
_seq(seq),
|
|
_flow(flow),
|
|
_entropy(entropy),
|
|
_payload_size((proto == PacketProtocol::DATA) ?
|
|
payload_bytes : Bytes{0}),
|
|
_groups(0),
|
|
_notifications(static_cast<uint8_t>(notifications & 0x07)) {
|
|
const uint8_t p = static_cast<uint8_t>(prio) & 0x03;
|
|
_notifications = static_cast<uint8_t>(
|
|
(_notifications & ~PRIORITY_MASK) |
|
|
(p << PRIORITY_SHIFT));
|
|
}
|
|
|
|
NodeId Packet::src_node() const noexcept {
|
|
return _src_node;
|
|
}
|
|
PortId Packet::src_port() const noexcept {
|
|
return _src_port;
|
|
}
|
|
NodeId Packet::dst_node() const noexcept {
|
|
return _dst_node;
|
|
}
|
|
PortId Packet::dst_port() const noexcept {
|
|
return _dst_port;
|
|
}
|
|
PacketProtocol Packet::protocol() const noexcept {
|
|
return _protocol;
|
|
}
|
|
PacketSeq Packet::seq() const noexcept {
|
|
return _seq;
|
|
}
|
|
FlowId Packet::flow_id() const noexcept {
|
|
return _flow;
|
|
}
|
|
uint32_t Packet::entropy() const noexcept {
|
|
return _entropy;
|
|
}
|
|
|
|
void Packet::set_src_node(NodeId n) noexcept {
|
|
_src_node = n;
|
|
}
|
|
void Packet::set_src_port(PortId p) noexcept {
|
|
_src_port = p;
|
|
}
|
|
void Packet::set_dst_node(NodeId n) noexcept {
|
|
_dst_node = n;
|
|
}
|
|
void Packet::set_dst_port(PortId p) noexcept {
|
|
_dst_port = p;
|
|
}
|
|
void Packet::set_seq(PacketSeq s) noexcept {
|
|
_seq = s;
|
|
}
|
|
void Packet::set_flow_id(FlowId f) noexcept {
|
|
_flow = f;
|
|
}
|
|
void Packet::set_entropy(uint32_t e) noexcept {
|
|
_entropy = e;
|
|
}
|
|
void Packet::set_protocol(PacketProtocol p) noexcept {
|
|
_protocol = p;
|
|
}
|
|
|
|
void Packet::set_payload_size(Bytes size) noexcept {
|
|
_payload_size = size;
|
|
}
|
|
|
|
void Packet::set_ecn_enabled(bool v) noexcept {
|
|
if (v)
|
|
_notifications |= ECN_ENABLED_MASK;
|
|
else
|
|
_notifications &= ~ECN_ENABLED_MASK;
|
|
}
|
|
void Packet::set_ecn_marked(bool v) noexcept {
|
|
if (v)
|
|
_notifications |= ECN_MARK_MASK;
|
|
else
|
|
_notifications &= ~ECN_MARK_MASK;
|
|
}
|
|
void Packet::set_eof(bool v) noexcept {
|
|
if (v)
|
|
_notifications |= EOF_MASK;
|
|
else
|
|
_notifications &= ~EOF_MASK;
|
|
}
|
|
|
|
bool Packet::is_ecn_enabled() const noexcept {
|
|
return (_notifications & ECN_ENABLED_MASK) != 0;
|
|
}
|
|
|
|
bool Packet::is_ecn() const noexcept {
|
|
return _notifications & ECN_MARK_MASK;
|
|
}
|
|
|
|
bool Packet::is_eof() const noexcept {
|
|
return (_notifications & EOF_MASK) != 0;
|
|
}
|
|
|
|
FlowPriority Packet::priority() const noexcept {
|
|
const uint8_t pr = static_cast<uint8_t>(
|
|
(_notifications & PRIORITY_MASK) >>
|
|
PRIORITY_SHIFT);
|
|
|
|
return static_cast<FlowPriority>(pr);
|
|
}
|
|
|
|
uint8_t Packet::priority_raw() const noexcept {
|
|
return static_cast<uint8_t>((_notifications & PRIORITY_MASK) >>
|
|
PRIORITY_SHIFT);
|
|
}
|
|
|
|
Bytes Packet::header_size() const noexcept {
|
|
return HEADER_SIZE_BYTES;
|
|
}
|
|
|
|
Bytes Packet::payload_size() const noexcept {
|
|
switch (_protocol) {
|
|
case PacketProtocol::DATA:
|
|
return _payload_size;
|
|
|
|
case PacketProtocol::ACK:
|
|
case PacketProtocol::NACK:
|
|
return 0;
|
|
|
|
case PacketProtocol::HEADER_TRIM:
|
|
case PacketProtocol::HEADER_TRIM_BACK:
|
|
return 0;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
Bytes Packet::total_size() const noexcept {
|
|
switch (_protocol) {
|
|
case PacketProtocol::DATA:
|
|
return HEADER_SIZE_BYTES + _payload_size;
|
|
|
|
case PacketProtocol::ACK:
|
|
case PacketProtocol::NACK:
|
|
return ACK_SIZE_BYTES;
|
|
|
|
case PacketProtocol::HEADER_TRIM:
|
|
case PacketProtocol::HEADER_TRIM_BACK:
|
|
return HEADER_SIZE_BYTES;
|
|
}
|
|
|
|
return HEADER_SIZE_BYTES;
|
|
}
|
|
|
|
PacketGroups Packet::groups() const noexcept {
|
|
return _groups;
|
|
}
|
|
void Packet::set_groups(PacketGroups g) noexcept {
|
|
_groups = g;
|
|
}
|
|
void Packet::add_groups(PacketGroups gmask) noexcept {
|
|
_groups |= gmask;
|
|
}
|
|
|
|
} // namespace dofs
|