34 #include <tins/small_uint.h>
35 #include <tins/endianness.h>
36 #include <tins/ip_address.h>
37 #include <tins/pdu_option.h>
38 #include <tins/macros.h>
39 #include <tins/cxxstd.h>
44 class OutputMemoryStream;
63 class TINS_API
IP :
public PDU {
127 #if TINS_IS_LITTLE_ENDIAN
131 #elif TINS_IS_BIG_ENDIAN
142 #if TINS_IS_LITTLE_ENDIAN
143 : number(0), op_class(0), copied(0) {}
145 : copied(0), op_class(0), number(0) {}
158 #if TINS_IS_LITTLE_ENDIAN
159 : number(value & 0x1f),
160 op_class((value >> 5) & 0x03),
161 copied((value >> 7) & 0x01) {}
162 #elif TINS_IS_BIG_ENDIAN
163 : copied((value >> 7) & 0x01),
164 op_class((value >> 5) & 0x03),
165 number(value & 0x1f) {}
174 option_identifier(OptionNumber number, OptionClass op_class,
176 #if TINS_IS_LITTLE_ENDIAN
177 : number(
static_cast<uint8_t
>(number)), op_class(
static_cast<uint8_t
>(op_class)), copied(copied) {}
179 : copied(copied), op_class(
static_cast<uint8_t
>(op_class)), number(
static_cast<uint8_t
>(number)) {}
186 return number == rhs.number && op_class == rhs.op_class && copied == rhs.copied;
199 uint16_t security, compartments;
200 uint16_t handling_restrictions;
205 uint16_t hand_res = 0,
207 : security(sec), compartments(comp),
208 handling_restrictions(hand_res), transmission_control(tcc) { }
217 typedef std::vector<address_type> routes_type;
223 : pointer(ptr), routes(rts) {}
254 static metadata extract_metadata(
const uint8_t *buffer, uint32_t total_sz);
280 IP(
const uint8_t* buffer, uint32_t total_sz);
285 return static_cast<uint32_t
>(tot_len());
294 return this->header_.ihl;
312 return Endian::be_to_host(header_.tot_len);
320 uint16_t
id()
const {
321 return Endian::be_to_host(header_.id);
335 return Endian::be_to_host(header_.frag_off);
347 return Endian::be_to_host(header_.frag_off) & 0x1fff;
356 return static_cast<Flags>(Endian::be_to_host(header_.frag_off) >> 13);
374 return header_.protocol;
383 return Endian::be_to_host(header_.check);
408 return header_.version;
426 void tos(uint8_t new_tos);
433 void id(uint16_t new_id);
463 void flags(
Flags new_flags);
470 void ttl(uint8_t new_ttl);
488 void protocol(uint8_t new_protocol);
519 void add_option(
const option& opt);
530 options_.push_back(std::move(opt));
541 template<
typename... Args>
543 options_.emplace_back(std::forward<Args>(args)...);
556 bool remove_option(option_identifier
id);
567 const option* search_option(option_identifier
id)
const;
586 void security(
const security_type& data);
594 add_route_option(131, data);
603 add_route_option(137, data);
612 add_route_option(7, data);
620 void stream_identifier(uint16_t stream_id);
632 security_type security()
const;
644 return search_route_option(131);
657 return search_route_option(137);
669 return search_route_option(7);
680 uint16_t stream_identifier()
const;
689 uint32_t header_size()
const;
703 bool matches_response(
const uint8_t* ptr, uint32_t total_sz)
const;
718 bool is_fragmented()
const;
732 return new IP(*
this);
735 static const uint8_t DEFAULT_TTL;
739 #if TINS_IS_LITTLE_ENDIAN
757 void head_len(small_uint<4> new_head_len);
758 void tot_len(uint16_t new_tot_len);
760 void prepare_for_serialize();
761 uint32_t calculate_options_size()
const;
762 uint32_t pad_options_size(uint32_t size)
const;
763 void init_ip_fields();
764 void write_serialization(uint8_t* buffer, uint32_t total_sz);
765 void write_option(
const option& opt, Memory::OutputMemoryStream& stream);
766 void add_route_option(option_identifier
id,
const generic_route_option_type& data);
767 generic_route_option_type search_route_option(option_identifier
id)
const;
768 void checksum(uint16_t new_check);
769 options_type::const_iterator search_option_iterator(option_identifier
id)
const;
770 options_type::iterator search_option_iterator(option_identifier
id);
772 options_type options_;
Class that represents an IP PDU.
Definition: ip.h:63
TINS_DEPRECATED(uint16_t frag_off() const)
Getter for the fragment offset field.
Definition: ip.h:334
small_uint< 4 > version() const
Getter for the version field.
Definition: ip.h:407
uint16_t tot_len() const
Getter for the total length field.
Definition: ip.h:311
OptionClass
Enum indicating the option's class.
Definition: ip.h:90
uint16_t checksum() const
Getter for the checksum field.
Definition: ip.h:382
uint8_t protocol() const
Getter for the protocol field.
Definition: ip.h:373
std::vector< option > options_type
Definition: ip.h:246
generic_route_option_type record_route_type
Definition: ip.h:241
uint8_t tos() const
Getter for the type of service field.
Definition: ip.h:302
small_uint< 13 > fragment_offset() const
Getter for the fragment offset field.
Definition: ip.h:346
const options_type & options() const
Getter for the IP options.
Definition: ip.h:415
PDUType pdu_type() const
Getter for the PDU's type.
Definition: ip.h:724
ssrr_type ssrr() const
Searchs and returns a Strict Source and Record Route option.
Definition: ip.h:656
lsrr_type lsrr() const
Searchs and returns a Loose Source and Record Route option.
Definition: ip.h:643
IPv4Address address_type
Definition: ip.h:73
address_type src_addr() const
Getter for the source address field.
Definition: ip.h:391
generic_route_option_type lsrr_type
Definition: ip.h:231
PDUOption< option_identifier, IP > option
Definition: ip.h:193
void ssrr(const ssrr_type &data)
Adds a Strict Source and Record Route option.
Definition: ip.h:602
void add_option(Args &&... args)
Adds an IP option.
Definition: ip.h:542
address_type dst_addr() const
Getter for the destination address field.
Definition: ip.h:399
Flags flags() const
Getter for the flags field.
Definition: ip.h:355
TINS_DEPRECATED(void frag_off(uint16_t new_frag_off))
Setter for the fragment offset field.
void lsrr(const lsrr_type &data)
Adds a Loose Source and Record Route option.
Definition: ip.h:593
small_uint< 4 > head_len() const
Getter for the header length field.
Definition: ip.h:293
OptionNumber
Enum indicating the option's id number.
Definition: ip.h:100
uint8_t ttl() const
Getter for the time to live field.
Definition: ip.h:364
record_route_type record_route() const
Searchs and returns a Record Route option.
Definition: ip.h:668
void record_route(const record_route_type &data)
Adds a Record Route option.
Definition: ip.h:611
uint32_t advertised_size() const
The whole chain of PDU's advertised size, including this one.
Definition: ip.h:284
uint16_t id() const
Getter for the id field.
Definition: ip.h:320
IP * clone() const
Definition: ip.h:731
generic_route_option_type ssrr_type
Definition: ip.h:236
void add_option(option &&opt)
Adds an IP option.
Definition: ip.h:529
Abstraction of an IPv4 address.
Definition: ip_address.h:45
Abstraction of a network interface.
Definition: network_interface.h:47
Represents a PDU option field.
Definition: pdu_option.h:201
Base class for protocol data units.
Definition: pdu.h:107
PDUType
Enum which identifies each type of PDU.
Definition: pdu.h:127
Sends packets through a network interface.
Definition: packet_sender.h:118
The Tins namespace.
Definition: address_range.h:38
The type used to represent an option's type.
Definition: ip.h:126
option_identifier(uint8_t value) option_identifier(OptionNumber number
Constructs this option from a single uint8_t value.
option_identifier()
Default constructor.
Definition: ip.h:141
bool operator==(const option_identifier &rhs) const
Equality operator.
Definition: ip.h:185