28const boost::unordered_map<std::type_index, Low_lvl_packet::Packet_type_info>
32 { std::type_index{
typeid(Syn_packet)},
34 { std::type_index{
typeid(Syn_ack_packet)},
36 { std::type_index{
typeid(Syn_ack_ack_packet)},
37 { 2,
"SYN_ACK_ACK" } },
38 { std::type_index{
typeid(Data_packet)},
40 { std::type_index{
typeid(Ack_packet)},
42 { std::type_index{
typeid(Rst_packet)},
63 m_verbose_ostream_manip([
this](std::ostream& os) -> std::ostream& {
return to_ostream(os,
true); }),
64 m_concise_ostream_manip([
this](std::ostream& os) -> std::ostream& {
return to_ostream(os,
false); })
71 m_serialized_metadata(logger)
110 using std::type_index;
116 return it->second.m_type_id_str;
121 using std::type_index;
127 return it->second.m_raw_type_id;
144 "total added output size [" << size <<
"] bytes; final buffer contents including added output: "
151 "total added output size [" << size <<
"] bytes.");
160 using boost::asio::const_buffer;
161 using std::type_index;
171 static_assert(
sizeof raw_type_id_ref == 1,
172 "Raw packet type ID should be small enough for byte ordering to be a non-issue.");
173 size_t size =
sizeof raw_type_id_ref;
174 raw_bufs->push_back(const_buffer(&raw_type_id_ref, size));
189 size += raw_bufs->back().size();
193 size += raw_bufs->back().size();
204 using boost::asio::const_buffer;
217 static_assert(!native_is_big_endian(),
218 "Byte ordering in this platform is not conducive to zero-copy serialization.");
221 size_t size = serialize_common_header_to_raw_data(raw_bufs);
225 const auto* raw_seq_num = &(m_init_seq_num.raw_num_ref());
226 raw_bufs->push_back(const_buffer(raw_seq_num,
sizeof *raw_seq_num));
227 size +=
sizeof *raw_seq_num;
229 if (!m_serialized_metadata.empty())
231 raw_bufs->push_back(const_buffer(m_serialized_metadata.const_data(), m_serialized_metadata.size()));
232 size += m_serialized_metadata.size();
240 using boost::asio::const_buffer;
244 static_assert(!native_is_big_endian(),
245 "Byte ordering in this platform is not conducive to zero-copy serialization.");
248 size_t size = serialize_common_header_to_raw_data(raw_bufs);
251 raw_bufs->push_back(const_buffer(raw_seq_num,
sizeof *raw_seq_num));
252 size +=
sizeof *raw_seq_num;
255 raw_bufs->push_back(const_buffer(&m_packed.m_security_token,
256 sizeof m_packed.m_security_token +
sizeof m_packed.m_rcv_wnd));
257 size += raw_bufs->back().size();
264 using boost::asio::const_buffer;
268 static_assert(!native_is_big_endian(),
269 "Byte ordering in this platform is not conducive to zero-copy serialization.");
272 size_t size = serialize_common_header_to_raw_data(raw_bufs);
275 raw_bufs->push_back(const_buffer(&m_packed.m_security_token,
276 sizeof m_packed.m_security_token +
sizeof m_packed.m_rcv_wnd));
277 size += raw_bufs->back().size();
284 using boost::asio::const_buffer;
285 using std::numeric_limits;
291 static_assert(!native_is_big_endian(),
292 "Byte ordering in this platform is not conducive to zero-copy serialization.");
295 size_t size = serialize_common_header_to_raw_data(raw_bufs);
298 raw_bufs->push_back(const_buffer(raw_seq_num,
sizeof *raw_seq_num));
299 size +=
sizeof *raw_seq_num;
303 raw_bufs->push_back(const_buffer(&m_rexmit_id,
sizeof m_rexmit_id));
304 size +=
sizeof m_rexmit_id;
307 assert(!m_data.empty());
310 const size_t data_size = m_data.size();
311 using data_size_raw_t =
decltype(m_data_size_raw);
312 assert(data_size <= numeric_limits<data_size_raw_t>::max());
314 m_data_size_raw = data_size_raw_t(data_size);
315 raw_bufs->push_back(const_buffer(&m_data_size_raw,
sizeof m_data_size_raw));
316 size +=
sizeof m_data_size_raw;
318 raw_bufs->push_back(const_buffer(m_data.const_data(), data_size));
319 size += m_data.size();
326 using boost::asio::const_buffer;
327 using std::numeric_limits;
333 static_assert(!native_is_big_endian(),
334 "Byte ordering in this platform is not conducive to zero-copy serialization.");
337 size_t size = serialize_common_header_to_raw_data(raw_bufs);
339 raw_bufs->push_back(const_buffer(&m_rcv_wnd,
sizeof m_rcv_wnd));
340 size +=
sizeof m_rcv_wnd;
343 const size_t pkts_size = m_opt_rexmit_on
344 ? m_rcv_acked_packets_rexmit_on_out.size()
345 : m_rcv_acked_packets_rexmit_off_out.size();
346 using pkts_size_t =
decltype(m_rcv_acked_packets_rexmit_out_size);
347 assert(pkts_size <= numeric_limits<pkts_size_t>::max());
349 m_rcv_acked_packets_rexmit_out_size = pkts_size_t(pkts_size);
350 raw_bufs->push_back(const_buffer(&m_rcv_acked_packets_rexmit_out_size,
sizeof(pkts_size_t)));
351 size +=
sizeof(pkts_size_t);
363 raw_bufs->push_back(const_buffer(m_rcv_acked_packets_rexmit_on_out.data(),
364 m_rcv_acked_packets_rexmit_on_out.size()
365 *
sizeof(
decltype(m_rcv_acked_packets_rexmit_on_out)::value_type)));
369 raw_bufs->push_back(const_buffer(m_rcv_acked_packets_rexmit_off_out.data(),
370 m_rcv_acked_packets_rexmit_off_out.size()
371 *
sizeof(
decltype(m_rcv_acked_packets_rexmit_off_out)::value_type)));
373 size += raw_bufs->back().size();
381 return serialize_common_header_to_raw_data(raw_bufs);
388 using boost::asio::buffer;
389 using boost::asio::const_buffer;
390 using boost::endian::little_to_native;
393 Const_buffer raw_buf{raw_packet->const_data(), raw_packet->size()};
398 const size_t raw_buf_size = raw_buf.size();
401 (
"Deserializing Low_lvl_packet; "
402 "total raw buffer size [" << raw_buf_size <<
"] bytes; buffer contents: "
416 const size_t common_data_size
420 if (raw_buf_size < common_data_size)
422 FLOW_LOG_WARNING(
"Unable to deserialize low-level packet: The packet is too small: "
423 "[" << raw_buf_size <<
"] bytes.");
431 const uint8_t* common_data =
static_cast<const uint8_t*
>(raw_buf.data());
433 raw_buf = raw_buf + common_data_size;
436 const auto& raw_type_id = *common_data;
437 common_data +=
sizeof raw_type_id;
443 ? create_uninit_packet_base<Syn_packet>(logger_ptr)
445 ? create_uninit_packet_base<Syn_ack_packet>(logger_ptr)
447 ? create_uninit_packet_base<Syn_ack_ack_packet>(logger_ptr)
449 ? create_uninit_packet_base<Data_packet>(logger_ptr)
451 ? create_uninit_packet_base<Ack_packet>(logger_ptr)
453 ? create_uninit_packet_base<Rst_packet>(logger_ptr)
457 FLOW_LOG_WARNING(
"Unable to deserialize low-level packet: The packet type is invalid: "
458 "[" <<
int(raw_type_id) <<
"].");
463 const auto& opt_rexmit_on_raw
464 = *
reinterpret_cast<const opt_rexmit_on_raw_t*
>(common_data);
465 common_data +=
sizeof opt_rexmit_on_raw;
466 packet->m_opt_rexmit_on = (opt_rexmit_on_raw != 0);
469 const auto& reserved2 = *
reinterpret_cast<const reserved2_t*
>(common_data);
470 common_data +=
sizeof reserved2;
473 FLOW_LOG_WARNING(
"Unable to deserialize low-level packet: The packet format is unknown.");
478 const auto& src_port_raw = *
reinterpret_cast<const flow_port_t*
>(common_data);
479 common_data +=
sizeof src_port_raw;
480 packet->m_packed.m_src_port = little_to_native(src_port_raw);
482 const auto& dst_port_raw = *
reinterpret_cast<const flow_port_t*
>(common_data);
483 common_data +=
sizeof dst_port_raw;
484 packet->m_packed.m_dst_port = little_to_native(dst_port_raw);
487 assert(common_data ==
static_cast<const uint8_t*
>(raw_buf.data()));
489 FLOW_LOG_TRACE(
"Deserialized packet [" << packet <<
"] common info: "
490 "NetFlow ports [" << packet->m_packed.m_src_port <<
"] -> [" << packet->m_packed.m_dst_port <<
"]; "
491 "opt_rexmit_on = [" << packet->m_opt_rexmit_on <<
"]; "
492 "common serialized size was [" << common_data_size <<
"].");
495 if (!packet->deserialize_type_specific_data_from_raw_data_packet(&raw_buf, prefer_no_move, raw_packet))
507 "Deserialized packet: Final version: "
509 << (data_sev ? packet->m_verbose_ostream_manip : packet->m_concise_ostream_manip)
517 [[maybe_unused]]
bool prefer_no_move,
521 using boost::asio::buffer;
522 using boost::endian::little_to_native;
529 const size_t raw_buf_size = raw_buf->size();
530 if (raw_buf_size < min_data_size)
533 "packet: The packet is too small: ["<< raw_buf_size <<
"] bytes.");
538 const uint8_t* data =
static_cast<const uint8_t*
>(raw_buf->data());
539 (*raw_buf) = ((*raw_buf) + min_data_size);
542 data +=
sizeof seq_num_raw;
555 assert(data ==
static_cast<const uint8_t*
>(raw_buf->data()));
562 "metadata size ["<< n_copied <<
"] bytes; "
563 "serialized size beyond common header was [" << raw_buf_size <<
"].");
569 [[maybe_unused]]
bool prefer_no_move,
573 using boost::endian::little_to_native;
581 const size_t raw_buf_size = raw_buf->size();
582 if (raw_buf_size != exp_data_size)
585 "packet: The packet is of wrong size: ["<< raw_buf_size <<
"] bytes.");
590 const uint8_t* data =
static_cast<const uint8_t*
>(raw_buf->data());
591 (*raw_buf) = ((*raw_buf) + exp_data_size);
594 data +=
sizeof seq_num_raw;
599 const auto& security_token_raw = *
reinterpret_cast<const security_token_t*
>(data);
600 data +=
sizeof security_token_raw;
601 m_packed.m_security_token = little_to_native(security_token_raw);
603 const auto& rcv_wnd_raw = *
reinterpret_cast<const rcv_wnd_t*
>(data);
604 data +=
sizeof rcv_wnd_raw;
605 m_packed.m_rcv_wnd = little_to_native(rcv_wnd_raw);
607 assert(data ==
static_cast<const uint8_t*
>(raw_buf->data()));
611 "rcv_wnd ["<<
m_packed.m_rcv_wnd <<
"] bytes; "
612 "serialized size beyond common header was [" << raw_buf_size <<
"].");
618 [[maybe_unused]]
bool prefer_no_move,
622 using boost::endian::little_to_native;
628 const size_t exp_data_size =
sizeof m_packed.m_security_token +
sizeof m_packed.m_rcv_wnd;
629 const size_t raw_buf_size = raw_buf->size();
630 if (raw_buf_size != exp_data_size)
633 "packet: The packet is too small: ["<< raw_buf_size <<
"] bytes.");
638 const uint8_t* data =
static_cast<const uint8_t*
>(raw_buf->data());
639 (*raw_buf) = ((*raw_buf) + exp_data_size);
641 const auto& security_token_raw = *
reinterpret_cast<const security_token_t*
>(data);
642 data +=
sizeof security_token_raw;
643 m_packed.m_security_token = little_to_native(security_token_raw);
645 const auto& rcv_wnd_raw = *
reinterpret_cast<const rcv_wnd_t*
>(data);
646 data +=
sizeof rcv_wnd_raw;
647 m_packed.m_rcv_wnd = little_to_native(rcv_wnd_raw);
649 assert(data ==
static_cast<const uint8_t*
>(raw_buf->data()));
652 "rcv_wnd ["<<
m_packed.m_rcv_wnd <<
"] bytes; "
653 "serialized size beyond common header was [" << raw_buf_size <<
"].");
662 using boost::asio::buffer;
663 using boost::endian::little_to_native;
664 using std::numeric_limits;
673 const size_t min_data_size
675 const size_t raw_buf_size = raw_buf->size();
676 if (raw_buf_size < min_data_size)
679 "packet: The packet is too small: ["<< raw_buf_size <<
"] bytes.");
684 const uint8_t* cur_data =
static_cast<const uint8_t*
>(raw_buf->data());
685 (*raw_buf) = ((*raw_buf) + min_data_size);
688 cur_data +=
sizeof seq_num_raw;
695 const auto& rexmit_id_raw = *
reinterpret_cast<const rexmit_id_t*
>(cur_data);
696 cur_data +=
sizeof rexmit_id_raw;
715 data_size_raw_t data_size_raw;
717 memcpy(&data_size_raw, cur_data,
sizeof data_size_raw);
718 cur_data +=
sizeof data_size_raw;
720 data_size_raw = little_to_native(data_size_raw);
722 if (data_size_raw == 0)
725 "packet: The data area specifies empty size.");
730 assert(cur_data ==
static_cast<const uint8_t*
>(raw_buf->data()));
733 const size_t data_size = raw_buf->size();
735 if ((data_size > numeric_limits<data_size_raw_t>::max())
736 || (data_size_raw_t(data_size) != data_size_raw))
739 "packet: The data area specifies size [" << data_size_raw <<
"] but has "
740 "actual size [" << data_size <<
"]. Did truncation occur somewhere?");
758 m_data.assign_copy(*raw_buf);
762 m_data = std::move(*raw_packet);
764 m_data.start_past_prefix(cur_data -
m_data.const_data());
765 assert(
m_data.const_begin() == cur_data);
768 assert(
m_data.size() == data_size);
774 "user data size [" << data_size <<
"] (" << (prefer_no_move ?
"copied" :
"moved") <<
"); "
775 "serialized size beyond common header was [" << raw_buf_size <<
"].");
780 "sequence number [" <<
m_seq_num <<
"]; "
781 "user data size [" << data_size <<
"] (" << (prefer_no_move ?
"copied" :
"moved") <<
"); "
782 "serialized size beyond common header was [" << raw_buf_size <<
"].");
789 [[maybe_unused]]
bool prefer_no_move,
793 using boost::endian::little_to_native;
794 using std::numeric_limits;
802 const size_t min_data_size =
sizeof m_rcv_wnd +
sizeof(pkts_size_raw_t);
803 const size_t raw_buf_size = raw_buf->size();
804 if (raw_buf_size < min_data_size)
807 "packet: The packet is too small: ["<< raw_buf_size <<
"] bytes.");
812 const uint8_t* data =
static_cast<const uint8_t*
>(raw_buf->data());
813 (*raw_buf) = ((*raw_buf) + min_data_size);
815 const auto& rcv_wnd_raw = *
reinterpret_cast<const rcv_wnd_t*
>(data);
816 data +=
sizeof rcv_wnd_raw;
817 m_rcv_wnd = little_to_native(rcv_wnd_raw);
822 auto pkts_size_raw = *
reinterpret_cast<const pkts_size_raw_t*
>(data);
823 data +=
sizeof pkts_size_raw;
824 pkts_size_raw = little_to_native(pkts_size_raw);
826 assert(data ==
static_cast<const uint8_t*
>(raw_buf->data()));
828 const size_t ack_size
830 const size_t n_acks = raw_buf->size() / ack_size;
831 (*raw_buf) = ((*raw_buf) + (n_acks * ack_size));
833 if ((n_acks > numeric_limits<pkts_size_raw_t>::max())
834 || (pkts_size_raw_t(n_acks) != pkts_size_raw))
837 "packet: The individual acks area specifies [" << pkts_size_raw <<
"] acks but has "
838 "actual ack count [" << n_acks <<
"]. Did truncation occur somewhere?");
846 for (
size_t ack_idx = 0; ack_idx != n_acks; ++ack_idx)
849 data +=
sizeof seq_num_raw;
851 seq_num.
set_raw_num(little_to_native(seq_num_raw));
855 const auto& ack_delay_raw = *
reinterpret_cast<const ack_delay_t*
>(data);
856 data +=
sizeof ack_delay_raw;
860 unsigned int rexmit_id;
863 const auto& rexmit_id_raw = *
reinterpret_cast<const rexmit_id_t*
>(data);
864 data +=
sizeof rexmit_id_raw;
865 rexmit_id =
static_cast<unsigned int>(little_to_native(rexmit_id_raw));
875 assert(data ==
static_cast<const uint8_t*
>(raw_buf->data()));
879 const size_t remaining_buf_size = raw_buf->size();
880 if (remaining_buf_size != 0)
883 "Unexpected trailing data: [" << remaining_buf_size <<
"] bytes.");
891 "serialized size beyond common header was [" << raw_buf_size <<
"].");
897 [[maybe_unused]]
bool prefer_no_move,
901 const size_t raw_buf_size = raw_buf->size();
902 if (raw_buf_size != 0)
905 "Unexpected trailing data: [" << raw_buf_size <<
"] bytes.");
917 constexpr char INDENTATION[] =
" ";
921 return os <<
"Low-level packet " <<
this <<
":\n"
922 << INDENTATION <<
"type: " << m_type_ostream_manip <<
"\n"
923 << INDENTATION <<
"m_src_port: " << m_packed.m_src_port <<
"\n"
924 << INDENTATION <<
"m_dst_port: " << m_packed.m_dst_port <<
"\n"
925 << INDENTATION <<
"m_opt_rexmit_on: " << m_opt_rexmit_on <<
"\n";
931 using boost::asio::buffer;
933 constexpr char INDENTATION[] =
" ";
934 constexpr char INDENTATION2[] =
" ";
938 os << INDENTATION <<
"m_init_seq_num: " << m_init_seq_num <<
"\n";
939 if (!m_serialized_metadata.empty())
941 os << INDENTATION <<
"m_serialized_metadata (" << m_serialized_metadata.size() <<
" bytes):\n";
943 buffer(m_serialized_metadata.const_data(), m_serialized_metadata.size()),
952 constexpr char INDENTATION[] =
" ";
956 return os << INDENTATION <<
"m_init_seq_num: " << m_init_seq_num <<
"\n"
957 << INDENTATION <<
"m_rcv_wnd: " << m_packed.m_rcv_wnd <<
"\n"
958 << INDENTATION <<
"m_security_token: " << m_packed.m_security_token <<
"\n";
963 constexpr char INDENTATION[] =
" ";
967 return os << INDENTATION <<
"m_rcv_wnd: " << m_packed.m_rcv_wnd <<
"\n"
968 << INDENTATION <<
"m_security_token: " << m_packed.m_security_token <<
"\n";
974 using boost::asio::buffer;
976 constexpr char INDENTATION[] =
" ";
977 constexpr char INDENTATION2[] =
" ";
981 os << INDENTATION <<
"m_seq_num: " << m_seq_num <<
"\n";
984 os << INDENTATION <<
"m_rexmit_id: " << int(m_rexmit_id) <<
"\n";
989 os << INDENTATION <<
"m_data (m_data_size=" << m_data.size() <<
" bytes)" << (verbose ?
':' :
'.') <<
"\n";
1001 using boost::asio::buffer;
1003 constexpr char INDENTATION[] =
" ";
1007 os << INDENTATION <<
"m_rcv_wnd: " << m_rcv_wnd <<
"\n";
1008 if (!m_rcv_acked_packets.empty())
1010 os << INDENTATION <<
"m_rcv_acked_packets [INCOMING] (" << m_rcv_acked_packets.size() <<
" items):\n";
1011 if (m_opt_rexmit_on)
1013 for (
auto ack : m_rcv_acked_packets)
1015 os << INDENTATION << INDENTATION << ack->m_seq_num <<
'/' << ack->m_rexmit_id
1016 <<
" : [" << ack->m_delay <<
"]\n";
1021 for (
auto ack : m_rcv_acked_packets)
1023 os << INDENTATION << INDENTATION << ack->m_seq_num <<
" : [" << ack->m_delay <<
"]\n";
1028 if (!m_rcv_acked_packets_rexmit_on_out.empty())
1030 os << INDENTATION <<
"m_rcv_acked_packets rexmit=[on] [OUTGOING] "
1031 "(m_rcv_acked_packets_rexmit_out_size="
1032 << m_rcv_acked_packets_rexmit_out_size <<
'='
1033 << m_rcv_acked_packets_rexmit_on_out.size() <<
" items):\n";
1034 for (
const auto& ack : m_rcv_acked_packets_rexmit_on_out)
1036 os << INDENTATION << INDENTATION << ack.m_basic_ack.m_seq_num_raw <<
'/' << int(ack.m_rexmit_id)
1037 <<
" : " << ack.m_basic_ack.m_delay <<
" x [" << TIME_UNIT <<
"]\n";
1040 else if (!m_rcv_acked_packets_rexmit_off_out.empty())
1042 os << INDENTATION <<
"m_rcv_acked_packets rexmit=[off] [OUTGOING] "
1043 "(m_rcv_acked_packets_rexmit_out_size="
1044 << m_rcv_acked_packets_rexmit_out_size <<
'='
1045 << m_rcv_acked_packets_rexmit_off_out.size() <<
" items):\n";
1046 for (
const auto& ack : m_rcv_acked_packets_rexmit_off_out)
1048 os << INDENTATION << INDENTATION << ack.m_seq_num_raw
1049 <<
" : " << ack.m_delay <<
" x [" << TIME_UNIT <<
"]\n";
1058 using std::type_index;
1065 m_seq_num_raw(seq_num.raw_num_ref()),
1072 unsigned int rexmit_id,
1074 m_basic_ack(seq_num, delay),
const Component & get_log_component() const
Returns reference to the stored Component object, particularly as many FLOW_LOG_*() macros expect.
Log_context(Logger *logger=nullptr)
Constructs Log_context by storing the given pointer to a Logger and a null Component.
Logger * get_logger() const
Returns the stored Logger pointer, particularly as many FLOW_LOG_*() macros expect.
Interface that the user should implement, passing the implementing Logger into logging classes (Flow'...
virtual bool should_log(Sev sev, const Component &component) const =0
Given attributes of a hypothetical message that would be logged, return true if that message should b...
An internal net_flow sequence number identifying a piece of data.
void set_raw_num(seq_num_t num)
Sets the raw sequence number.
uint64_t seq_num_t
Raw sequence number type.
void set_metadata(char num_line_id=0, const Sequence_number &zero_point={}, seq_num_delta_t multiple_size=0)
Updates the full set of metadata (used at least for convenient convention-based logging but not actua...
boost::shared_ptr< Low_lvl_packet > Ptr
Short-hand for ref-counted pointer to mutable values of type Target_type::element_type (a-la T*).
#define FLOW_LOG_DATA(ARG_stream_fragment)
Logs a DATA message into flow::log::Logger *get_logger() with flow::log::Component get_log_component(...
#define FLOW_LOG_INFO(ARG_stream_fragment)
Logs an INFO message into flow::log::Logger *get_logger() with flow::log::Component get_log_component...
#define FLOW_LOG_WITHOUT_CHECKING(ARG_sev, ARG_stream_fragment)
Identical to FLOW_LOG_WITH_CHECKING() but foregoes the filter (Logger::should_log()) check.
#define FLOW_LOG_WARNING(ARG_stream_fragment)
Logs a WARNING message into flow::log::Logger *get_logger() with flow::log::Component get_log_compone...
#define FLOW_LOG_TRACE_WITHOUT_CHECKING(ARG_stream_fragment)
Logs a TRACE message into flow::log::Logger *get_logger() with flow::log::Component get_log_component...
#define FLOW_LOG_DATA_WITHOUT_CHECKING(ARG_stream_fragment)
Logs a DATA message into flow::log::Logger *get_logger() with flow::log::Component get_log_component(...
#define FLOW_LOG_SET_CONTEXT(ARG_logger_ptr, ARG_component_payload)
For the rest of the block within which this macro is instantiated, causes all FLOW_LOG_....
#define FLOW_LOG_TRACE(ARG_stream_fragment)
Logs a TRACE message into flow::log::Logger *get_logger() with flow::log::Component get_log_component...
@ S_DATA
Message satisfies Sev::S_TRACE description AND contains variable-length structure (like packet,...
@ S_TRACE
Message indicates any condition that may occur with great frequency (thus verbose if logged).
Flow module containing the API and implementation of the Flow network protocol, a TCP-inspired stream...
uint16_t flow_port_t
Logical Flow port type (analogous to a UDP/TCP port in spirit but in no way relevant to UDP/TCP).
std::string buffers_dump_string(const Const_buffer_sequence &data, const std::string &indentation, size_t bytes_per_line)
Identical to buffers_to_ostream() but returns an std::string instead of writing to a given ostream.
std::ostream & buffers_to_ostream(std::ostream &os, const Const_buffer_sequence &data, const std::string &indentation, size_t bytes_per_line)
Writes a multi- or single-line string representation of the provided binary data to an output stream,...
Blob_with_log_context<> Blob
A concrete Blob_with_log_context that compile-time-disables Basic_blob::share() and the sharing API d...
Flow_log_component
The flow::log::Component payload enumeration comprising various log components used by Flow's own int...
Fine_clock::duration Fine_duration
A high-res time duration as computed from two Fine_time_pts.
unsigned char uint8_t
Byte. Best way to represent a byte of binary data. This is 8 bits on all modern systems.
Individual_ack_rexmit_off(const Sequence_number &seq_num, ack_delay_t delay)
Constructs object.
Individual_ack_rexmit_on(const Sequence_number &seq_num, unsigned int rexmit_id, ack_delay_t delay)
Constructs object.
Specifies the incoming (post-deserialization) acknowledgment of a single received Data_packet.
boost::shared_ptr< Individual_ack > Ptr
Short-hand for ref-counted pointer to mutable objects of this class.
Internal net_flow struct that encapsulates the Flow-protocol low-level ACK packet.
std::vector< boost::shared_ptr< Individual_ack > > m_rcv_acked_packets
List of incoming (post-deserialization of ACK) acknowledgments of DATA packets, each identified by it...
uint64_t ack_delay_t
Type used to store the ACK delay for a given individual acknowledged packet.
std::ostream & to_ostream(std::ostream &os, bool verbose) const override
Implements Low_lvl_packet API.
rcv_wnd_t m_rcv_wnd
Current receive window (remaining Receive buffer size) of the ACK sender.
bool deserialize_type_specific_data_from_raw_data_packet(Const_buffer *raw_buf, bool prefer_no_move, util::Blob *raw_packet) override
Implements Low_lvl_packet API.
size_t serialize_to_raw_data(Const_buffer_sequence *raw_bufs) const override
Implements Low_lvl_packet API.
uint16_t m_rcv_acked_packets_rexmit_out_size
This is the serialized version of m_rcv_acked_packets_rexmit_{on|off}_out.size() and m_rcv_acked_pack...
Fine_duration Ack_delay_time_unit
Ack_delay_time_unit{1} is the duration corresponding to the ack_delay_t value 1; and proportionally f...
Ack_packet(log::Logger *logger_ptr)
The implementation of Low_lvl_packet::create_uninit_packet() for this sub-type of Low_lvl_packet.
Internal net_flow struct that encapsulates the Flow-protocol low-level DATA packet.
uint16_t m_data_size_raw
This is the serialized version of m_data.size() (see m_data).
std::ostream & to_ostream(std::ostream &os, bool verbose) const override
Implements Low_lvl_packet API.
Data_packet(log::Logger *logger_ptr)
The implementation of Low_lvl_packet::create_uninit_packet() for this sub-type of Low_lvl_packet.
Sequence_number m_seq_num
The sequence number of the first byte in the payload; i.e., of m_data.front(), a/k/a m_data[0].
rexmit_id_t m_rexmit_id
Retransmit counter of the DATA packet being sent.
bool deserialize_type_specific_data_from_raw_data_packet(Const_buffer *raw_buf, bool prefer_no_move, util::Blob *raw_packet) override
Implements Low_lvl_packet API.
util::Blob m_data
The payload.
size_t serialize_to_raw_data(Const_buffer_sequence *raw_bufs) const override
Implements Low_lvl_packet API.
uint8_t m_opt_rexmit_on_raw
This is the serialized version of the multi-byte bool Low_lvl_packet::m_opt_rexmit_on.
const uint16_t m_reserved2
Unused space reserved for future use, ensuring correct alignment of other fields and headers.
Aux_raw_data()
Constructs a mostly-uninitialized object, except for the const member(s), if any.
Internal net_flow struct that encapsulates the Flow-protocol low-level packet structure and serves as...
uint32_t rcv_wnd_t
Type used to store the size of m_rcv_wnd member in a couple of different packet types.
uint8_t rexmit_id_t
Type used to store the retransmission count in DATA and ACK packets.
Aux_raw_data m_aux_raw_data
Auxilliary data area necessary for serialize_to_raw_data() to work.
static Ptr create_from_raw_data_packet(log::Logger *logger_ptr, util::Blob *raw_packet, bool prefer_no_move)
Constructs packet on the heap with values determined by the given raw binary data as presumably recei...
static const std::string & type_id_to_str(const std::type_index &type_id)
Returns a brief (a few characters) string description of the given packet type given as type_index(ty...
struct flow::net_flow::Low_lvl_packet::@7 m_packed
Packed group affected by #pragma pack.
virtual std::ostream & to_ostream(std::ostream &os, bool verbose=false) const
Writes a multi-line representation of *this to an output stream.
Low_lvl_packet(log::Logger *logger_ptr)
Constructs packet with uninitialized (essentially random) values.
static const boost::unordered_map< std::type_index, Packet_type_info > S_NATIVE_TYPE_ID_TO_PACKET_TYPE_INFO
Mapping from native typeid(), a/k/a packet type (for all possible packet types), to the set of proper...
size_t serialize_to_raw_data_and_log(Const_buffer_sequence *raw_bufs) const
Identical to serialize_to_raw_data() but adds log-level-appropriate logging after the operation.
static const uint8_t & type_id_native_to_raw(const std::type_info &type_id)
Helper that looks up the Packet_type_info::m_raw_type_id value for the given typeid(p),...
std::vector< Const_buffer > Const_buffer_sequence
Short-hand for sequence of immutable buffers; i.e., a sequence of 1 or more scattered areas in memory...
std::ostream & type_to_ostream(std::ostream &os) const
Writes a brief representation of typeid(*this) – i.e., the packet type (ACK, RST, etc....
const Function< std::ostream &(std::ostream &)> m_type_ostream_manip
ostream manipulator (argument to ostream <<) that will output packet's type ("ACK",...
uint64_t security_token_t
Type used for m_security_token member of a couple different packet types.
virtual size_t serialize_to_raw_data(Const_buffer_sequence *raw_bufs) const =0
Serializes the current logical packet data from *this into the given Const_buffer_sequence,...
boost::asio::const_buffer Const_buffer
Short-hand for boost.asio immutable buffer, which essentially is a pointer to and length of a memory ...
size_t serialize_common_header_to_raw_data(Const_buffer_sequence *raw_bufs) const
Helper for serialize_to_raw_data() implementations in sub-types that encodes the header common to all...
bool m_opt_rexmit_on
Option indicating whether this connection is using retransmission or not.
Internal net_flow struct that encapsulates the Flow-protocol low-level RST packet.
size_t serialize_to_raw_data(Const_buffer_sequence *raw_bufs) const override
Implements Low_lvl_packet API.
Rst_packet(log::Logger *logger_ptr)
The implementation of Low_lvl_packet::create_uninit_packet() for this sub-type of Low_lvl_packet.
bool deserialize_type_specific_data_from_raw_data_packet(Const_buffer *raw_buf, bool prefer_no_move, util::Blob *raw_packet) override
Implements Low_lvl_packet API.
Internal net_flow struct that encapsulates the Flow-protocol low-level SYN_ACK_ACK packet.
std::ostream & to_ostream(std::ostream &os, bool verbose) const override
Implements Low_lvl_packet API.
bool deserialize_type_specific_data_from_raw_data_packet(Const_buffer *raw_buf, bool prefer_no_move, util::Blob *raw_packet) override
Implements Low_lvl_packet API.
struct flow::net_flow::Syn_ack_ack_packet::@9 m_packed
Packed group affected by #pragma pack.
size_t serialize_to_raw_data(Const_buffer_sequence *raw_bufs) const override
Implements Low_lvl_packet API.
Syn_ack_ack_packet(log::Logger *logger_ptr)
The implementation of Low_lvl_packet::create_uninit_packet() for this sub-type of Low_lvl_packet.
Internal net_flow struct that encapsulates the Flow-protocol low-level SYN_ACK packet.
Sequence_number m_init_seq_num
Same meaning as Syn_packet::m_init_seq_num but applied to the essentially independent opposite traffi...
bool deserialize_type_specific_data_from_raw_data_packet(Const_buffer *raw_buf, bool prefer_no_move, util::Blob *raw_packet) override
Implements Low_lvl_packet API.
Syn_ack_packet(log::Logger *logger_ptr)
The implementation of Low_lvl_packet::create_uninit_packet() for this sub-type of Low_lvl_packet.
size_t serialize_to_raw_data(Const_buffer_sequence *raw_bufs) const override
Implements Low_lvl_packet API.
std::ostream & to_ostream(std::ostream &os, bool verbose) const override
Implements Low_lvl_packet API.
struct flow::net_flow::Syn_ack_packet::@8 m_packed
Packed group affected by #pragma pack.
Internal net_flow struct that encapsulates the Flow-protocol low-level SYN packet.
std::ostream & to_ostream(std::ostream &os, bool verbose) const override
Implements Low_lvl_packet API.
Syn_packet(log::Logger *logger_ptr)
The implementation of Low_lvl_packet::create_uninit_packet() for this sub-type of Low_lvl_packet.
util::Blob m_serialized_metadata
Arbitrary serialized user-supplied metadata to send in SYN, where it can be deserialized by the user ...
bool deserialize_type_specific_data_from_raw_data_packet(Const_buffer *raw_buf, bool prefer_no_move, util::Blob *raw_packet) override
Implements Low_lvl_packet API.
Sequence_number m_init_seq_num
The Initial Sequence Number (ISN) of the sequence number line that the sender of this SYN will be usi...
size_t serialize_to_raw_data(Const_buffer_sequence *raw_bufs) const override
Implements Low_lvl_packet API.