18 #include <hicn/transport/auth/crypto_hash.h>
19 #include <hicn/transport/auth/crypto_suite.h>
20 #include <hicn/transport/auth/key_id.h>
21 #include <hicn/transport/core/name.h>
22 #include <hicn/transport/core/payload_type.h>
23 #include <hicn/transport/errors/malformed_packet_exception.h>
24 #include <hicn/transport/portability/portability.h>
25 #include <hicn/transport/utils/branch_prediction.h>
26 #include <hicn/transport/utils/membuf.h>
27 #include <hicn/transport/utils/object_pool.h>
33 class AsymmetricSigner;
34 class SymmetricSigner;
36 class AsymmetricVerifier;
37 class SymmetricVerifier;
52 public std::enable_shared_from_this<Packet> {
61 using Ptr = std::shared_ptr<Packet>;
62 using MemBufPtr = std::shared_ptr<utils::MemBuf>;
63 using Format = hicn_format_t;
64 static constexpr
size_t default_mtu = 1500;
71 Packet(Format format = HF_INET6_TCP, std::size_t additional_header_size = 0);
78 Packet(CopyBufferOp,
const uint8_t *buffer, std::size_t size);
80 Packet(WrapBufferOp, uint8_t *buffer, std::size_t length, std::size_t size);
82 Packet(CreateOp, uint8_t *buffer, std::size_t length, std::size_t size,
83 Format format = HF_INET6_TCP, std::size_t additional_header_size = 0);
95 friend bool operator==(
const Packet &l_packet,
const Packet &r_packet);
99 static std::size_t getHeaderSizeFromFormat(Format format,
100 std::size_t signature_size = 0) {
101 std::size_t header_length;
103 int is_ah = _is_ah(format);
104 return is_ah * (header_length + signature_size) + (!is_ah) * header_length;
107 static std::size_t getHeaderSizeFromBuffer(Format format,
108 const uint8_t *buffer);
110 static std::size_t getPayloadSizeFromBuffer(Format format,
111 const uint8_t *buffer);
113 static bool isInterest(
const uint8_t *buffer);
117 static Format getFormatFromBuffer(
const uint8_t *buffer, std::size_t length) {
118 Format format = HF_UNSPEC;
125 packet_start_ =
reinterpret_cast<hicn_header_t *
>(writableData());
128 payload_type_ = PayloadType::UNSPECIFIED;
136 void setFormat(Packet::Format format = HF_INET6_TCP,
137 std::size_t additional_header_size = 0);
139 std::size_t payloadSize()
const;
141 std::size_t headerSize()
const;
143 std::shared_ptr<utils::MemBuf> acquireMemBufReference();
145 virtual const Name &getName()
const = 0;
147 virtual Name &getWritableName() = 0;
149 virtual void setName(
const Name &name) = 0;
151 virtual void setLifetime(uint32_t lifetime) = 0;
153 virtual uint32_t getLifetime()
const = 0;
155 Packet &appendPayload(
const uint8_t *buffer, std::size_t length);
157 Packet &appendPayload(std::unique_ptr<utils::MemBuf> &&payload);
159 std::unique_ptr<utils::MemBuf> getPayload()
const;
161 Packet &updateLength(std::size_t length = 0);
163 PayloadType getPayloadType()
const;
165 Packet &setPayloadType(PayloadType payload_type);
167 Format getFormat()
const;
171 static void dump(uint8_t *buffer, std::size_t length);
173 virtual void setLocator(
const ip_address_t &locator) = 0;
182 uint64_t getSignatureTimestamp()
const;
184 void setValidationAlgorithm(
const auth::CryptoSuite &validation_algorithm);
186 auth::CryptoSuite getValidationAlgorithm()
const;
188 void setKeyId(
const auth::KeyId &key_id);
190 auth::KeyId getKeyId()
const;
192 virtual auth::CryptoHash computeDigest(auth::CryptoHashType algorithm)
const;
195 uint16_t partial_csum =
196 csum(data() + HICN_V6_TCP_HDRLEN, length() - HICN_V6_TCP_HDRLEN, 0);
199 current = current->next()) {
200 partial_csum = csum(current->data(), current->length(), ~partial_csum);
209 bool checkIntegrity()
const;
213 bool testSyn()
const;
216 bool testAck()
const;
219 bool testRst()
const;
222 bool testFin()
const;
224 std::string printFlags()
const;
226 Packet &setSrcPort(uint16_t srcPort);
227 Packet &setDstPort(uint16_t dstPort);
228 uint16_t getSrcPort()
const;
229 uint16_t getDstPort()
const;
231 Packet &setTTL(uint8_t hops);
232 uint8_t getTTL()
const;
235 virtual void resetForHash() = 0;
236 void setSignatureSize(std::size_t size_bytes);
237 void setSignatureSizeGap(std::size_t size_bytes);
238 void prependPayload(
const uint8_t **buffer, std::size_t *size);
240 bool authenticationHeader()
const {
return _is_ah(format_); }
242 std::size_t getSignatureSize()
const {
254 std::size_t getSignatureSizeGap()
const {
257 hicn_packet_get_signature_gap(format_, packet_start_, &size_bytes);
263 return (
size_t)size_bytes;
266 std::size_t getSignatureSizeReal()
const {
267 return getSignatureSize() - getSignatureSizeGap();
270 uint8_t *getSignature()
const;
274 std::size_t header_offset_;
275 mutable Format format_;
277 mutable PayloadType payload_type_;