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();
200 using boost::asio::const_buffer;
213 static_assert(!native_is_big_endian(),
214 "Byte ordering in this platform is not conducive to zero-copy serialization.");
217 size_t size = serialize_common_header_to_raw_data(raw_bufs);
221 const auto* raw_seq_num = &(m_init_seq_num.raw_num_ref());
222 raw_bufs->push_back(const_buffer(raw_seq_num,
sizeof *raw_seq_num));
223 size +=
sizeof *raw_seq_num;
225 if (!m_serialized_metadata.empty())
227 raw_bufs->push_back(const_buffer(m_serialized_metadata.const_data(), m_serialized_metadata.size()));
228 size += m_serialized_metadata.size();
236 using boost::asio::const_buffer;
240 static_assert(!native_is_big_endian(),
241 "Byte ordering in this platform is not conducive to zero-copy serialization.");
244 size_t size = serialize_common_header_to_raw_data(raw_bufs);
247 raw_bufs->push_back(const_buffer(raw_seq_num,
sizeof *raw_seq_num));
248 size +=
sizeof *raw_seq_num;
251 raw_bufs->push_back(const_buffer(&m_packed.m_security_token,
252 sizeof m_packed.m_security_token +
sizeof m_packed.m_rcv_wnd));
253 size += raw_bufs->back().size();
260 using boost::asio::const_buffer;
264 static_assert(!native_is_big_endian(),
265 "Byte ordering in this platform is not conducive to zero-copy serialization.");
268 size_t size = serialize_common_header_to_raw_data(raw_bufs);
271 raw_bufs->push_back(const_buffer(&m_packed.m_security_token,
272 sizeof m_packed.m_security_token +
sizeof m_packed.m_rcv_wnd));
273 size += raw_bufs->back().size();
280 using boost::asio::const_buffer;
281 using std::numeric_limits;
287 static_assert(!native_is_big_endian(),
288 "Byte ordering in this platform is not conducive to zero-copy serialization.");
291 size_t size = serialize_common_header_to_raw_data(raw_bufs);
294 raw_bufs->push_back(const_buffer(raw_seq_num,
sizeof *raw_seq_num));
295 size +=
sizeof *raw_seq_num;
299 raw_bufs->push_back(const_buffer(&m_rexmit_id,
sizeof m_rexmit_id));
300 size +=
sizeof m_rexmit_id;
303 assert(!m_data.empty());
306 const size_t data_size = m_data.size();
307 using data_size_raw_t =
decltype(m_data_size_raw);
308 assert(data_size <= numeric_limits<data_size_raw_t>::max());
310 m_data_size_raw = data_size_raw_t(data_size);
311 raw_bufs->push_back(const_buffer(&m_data_size_raw,
sizeof m_data_size_raw));
312 size +=
sizeof m_data_size_raw;
314 raw_bufs->push_back(const_buffer(m_data.const_data(), data_size));
315 size += m_data.size();
322 using boost::asio::const_buffer;
323 using std::numeric_limits;
329 static_assert(!native_is_big_endian(),
330 "Byte ordering in this platform is not conducive to zero-copy serialization.");
333 size_t size = serialize_common_header_to_raw_data(raw_bufs);
335 raw_bufs->push_back(const_buffer(&m_rcv_wnd,
sizeof m_rcv_wnd));
336 size +=
sizeof m_rcv_wnd;
339 const size_t pkts_size = m_opt_rexmit_on
340 ? m_rcv_acked_packets_rexmit_on_out.size()
341 : m_rcv_acked_packets_rexmit_off_out.size();
342 using pkts_size_t =
decltype(m_rcv_acked_packets_rexmit_out_size);
343 assert(pkts_size <= numeric_limits<pkts_size_t>::max());
345 m_rcv_acked_packets_rexmit_out_size = pkts_size_t(pkts_size);
346 raw_bufs->push_back(const_buffer(&m_rcv_acked_packets_rexmit_out_size,
sizeof(pkts_size_t)));
347 size +=
sizeof(pkts_size_t);
359 raw_bufs->push_back(const_buffer(m_rcv_acked_packets_rexmit_on_out.data(),
360 m_rcv_acked_packets_rexmit_on_out.size()
361 *
sizeof(
decltype(m_rcv_acked_packets_rexmit_on_out)::value_type)));
365 raw_bufs->push_back(const_buffer(m_rcv_acked_packets_rexmit_off_out.data(),
366 m_rcv_acked_packets_rexmit_off_out.size()
367 *
sizeof(
decltype(m_rcv_acked_packets_rexmit_off_out)::value_type)));
369 size += raw_bufs->back().size();
377 return serialize_common_header_to_raw_data(raw_bufs);
384 using boost::asio::buffer;
385 using boost::asio::const_buffer;
386 using boost::endian::little_to_native;
389 Const_buffer raw_buf(raw_packet->const_data(), raw_packet->size());
394 const size_t raw_buf_size = raw_buf.size();
397 (
"Deserializing Low_lvl_packet; "
398 "total raw buffer size [" << raw_buf_size <<
"] bytes; buffer contents: "
412 const size_t common_data_size
416 if (raw_buf_size < common_data_size)
418 FLOW_LOG_WARNING(
"Unable to deserialize low-level packet: The packet is too small: "
419 "[" << raw_buf_size <<
"] bytes.");
427 const uint8_t* common_data =
static_cast<const uint8_t*
>(raw_buf.data());
429 raw_buf = raw_buf + common_data_size;
432 const auto& raw_type_id = *common_data;
433 common_data +=
sizeof raw_type_id;
439 ? create_uninit_packet_base<Syn_packet>(logger_ptr)
441 ? create_uninit_packet_base<Syn_ack_packet>(logger_ptr)
443 ? create_uninit_packet_base<Syn_ack_ack_packet>(logger_ptr)
445 ? create_uninit_packet_base<Data_packet>(logger_ptr)
447 ? create_uninit_packet_base<Ack_packet>(logger_ptr)
449 ? create_uninit_packet_base<Rst_packet>(logger_ptr)
453 FLOW_LOG_WARNING(
"Unable to deserialize low-level packet: The packet type is invalid: "
454 "[" <<
int(raw_type_id) <<
"].");
459 const auto& opt_rexmit_on_raw
460 = *
reinterpret_cast<const opt_rexmit_on_raw_t*
>(common_data);
461 common_data +=
sizeof opt_rexmit_on_raw;
462 packet->m_opt_rexmit_on = (opt_rexmit_on_raw != 0);
465 const auto& reserved2 = *
reinterpret_cast<const reserved2_t*
>(common_data);
466 common_data +=
sizeof reserved2;
469 FLOW_LOG_WARNING(
"Unable to deserialize low-level packet: The packet format is unknown.");
474 const auto& src_port_raw = *
reinterpret_cast<const flow_port_t*
>(common_data);
475 common_data +=
sizeof src_port_raw;
476 packet->m_packed.m_src_port = little_to_native(src_port_raw);
478 const auto& dst_port_raw = *
reinterpret_cast<const flow_port_t*
>(common_data);
479 common_data +=
sizeof dst_port_raw;
480 packet->m_packed.m_dst_port = little_to_native(dst_port_raw);
483 assert(common_data ==
static_cast<const uint8_t*
>(raw_buf.data()));
485 FLOW_LOG_TRACE(
"Deserialized packet [" << packet <<
"] common info: "
486 "NetFlow ports [" << packet->m_packed.m_src_port <<
"] -> [" << packet->m_packed.m_dst_port <<
"]; "
487 "opt_rexmit_on = [" << packet->m_opt_rexmit_on <<
"]; "
488 "common serialized size was [" << common_data_size <<
"].");
491 if (!packet->deserialize_type_specific_data_from_raw_data_packet(&raw_buf, prefer_no_move, raw_packet))
503 "Deserialized packet: Final version: "
505 << (data_sev ? packet->m_verbose_ostream_manip : packet->m_concise_ostream_manip)
513 [[maybe_unused]]
bool prefer_no_move,
517 using boost::asio::buffer;
518 using boost::endian::little_to_native;
525 const size_t raw_buf_size = raw_buf->size();
526 if (raw_buf_size < min_data_size)
529 "packet: The packet is too small: ["<< raw_buf_size <<
"] bytes.");
534 const uint8_t* data =
static_cast<const uint8_t*
>(raw_buf->data());
535 (*raw_buf) = ((*raw_buf) + min_data_size);
538 data +=
sizeof seq_num_raw;
551 assert(data ==
static_cast<const uint8_t*
>(raw_buf->data()));
558 "metadata size ["<< n_copied <<
"] bytes; "
559 "serialized size beyond common header was [" << raw_buf_size <<
"].");
565 [[maybe_unused]]
bool prefer_no_move,
569 using boost::endian::little_to_native;
577 const size_t raw_buf_size = raw_buf->size();
578 if (raw_buf_size != exp_data_size)
581 "packet: The packet is of wrong size: ["<< raw_buf_size <<
"] bytes.");
586 const uint8_t* data =
static_cast<const uint8_t*
>(raw_buf->data());
587 (*raw_buf) = ((*raw_buf) + exp_data_size);
590 data +=
sizeof seq_num_raw;
595 const auto& security_token_raw = *
reinterpret_cast<const security_token_t*
>(data);
596 data +=
sizeof security_token_raw;
597 m_packed.m_security_token = little_to_native(security_token_raw);
599 const auto& rcv_wnd_raw = *
reinterpret_cast<const rcv_wnd_t*
>(data);
600 data +=
sizeof rcv_wnd_raw;
601 m_packed.m_rcv_wnd = little_to_native(rcv_wnd_raw);
603 assert(data ==
static_cast<const uint8_t*
>(raw_buf->data()));
607 "rcv_wnd ["<<
m_packed.m_rcv_wnd <<
"] bytes; "
608 "serialized size beyond common header was [" << raw_buf_size <<
"].");
614 [[maybe_unused]]
bool prefer_no_move,
618 using boost::endian::little_to_native;
624 const size_t exp_data_size =
sizeof m_packed.m_security_token +
sizeof m_packed.m_rcv_wnd;
625 const size_t raw_buf_size = raw_buf->size();
626 if (raw_buf_size != exp_data_size)
629 "packet: The packet is too small: ["<< raw_buf_size <<
"] bytes.");
634 const uint8_t* data =
static_cast<const uint8_t*
>(raw_buf->data());
635 (*raw_buf) = ((*raw_buf) + exp_data_size);
637 const auto& security_token_raw = *
reinterpret_cast<const security_token_t*
>(data);
638 data +=
sizeof security_token_raw;
639 m_packed.m_security_token = little_to_native(security_token_raw);
641 const auto& rcv_wnd_raw = *
reinterpret_cast<const rcv_wnd_t*
>(data);
642 data +=
sizeof rcv_wnd_raw;
643 m_packed.m_rcv_wnd = little_to_native(rcv_wnd_raw);
645 assert(data ==
static_cast<const uint8_t*
>(raw_buf->data()));
648 "rcv_wnd ["<<
m_packed.m_rcv_wnd <<
"] bytes; "
649 "serialized size beyond common header was [" << raw_buf_size <<
"].");
658 using boost::asio::buffer;
659 using boost::endian::little_to_native;
660 using std::numeric_limits;
669 const size_t min_data_size
671 const size_t raw_buf_size = raw_buf->size();
672 if (raw_buf_size < min_data_size)
675 "packet: The packet is too small: ["<< raw_buf_size <<
"] bytes.");
680 const uint8_t* cur_data =
static_cast<const uint8_t*
>(raw_buf->data());
681 (*raw_buf) = ((*raw_buf) + min_data_size);
684 cur_data +=
sizeof seq_num_raw;
691 const auto& rexmit_id_raw = *
reinterpret_cast<const rexmit_id_t*
>(cur_data);
692 cur_data +=
sizeof rexmit_id_raw;
711 data_size_raw_t data_size_raw;
713 memcpy(&data_size_raw, cur_data,
sizeof data_size_raw);
714 cur_data +=
sizeof data_size_raw;
716 data_size_raw = little_to_native(data_size_raw);
718 if (data_size_raw == 0)
721 "packet: The data area specifies empty size.");
726 assert(cur_data ==
static_cast<const uint8_t*
>(raw_buf->data()));
729 const size_t data_size = raw_buf->size();
731 if ((data_size > numeric_limits<data_size_raw_t>::max())
732 || (data_size_raw_t(data_size) != data_size_raw))
735 "packet: The data area specifies size [" << data_size_raw <<
"] but has "
736 "actual size [" << data_size <<
"]. Did truncation occur somewhere?");
754 m_data.assign_copy(*raw_buf);
758 m_data = std::move(*raw_packet);
760 m_data.start_past_prefix(cur_data -
m_data.const_data());
761 assert(
m_data.const_begin() == cur_data);
764 assert(
m_data.size() == data_size);
770 "user data size [" << data_size <<
"] (" << (prefer_no_move ?
"copied" :
"moved") <<
"); "
771 "serialized size beyond common header was [" << raw_buf_size <<
"].");
776 "sequence number [" <<
m_seq_num <<
"]; "
777 "user data size [" << data_size <<
"] (" << (prefer_no_move ?
"copied" :
"moved") <<
"); "
778 "serialized size beyond common header was [" << raw_buf_size <<
"].");
785 [[maybe_unused]]
bool prefer_no_move,
789 using boost::endian::little_to_native;
790 using std::numeric_limits;
798 const size_t min_data_size =
sizeof m_rcv_wnd +
sizeof(pkts_size_raw_t);
799 const size_t raw_buf_size = raw_buf->size();
800 if (raw_buf_size < min_data_size)
803 "packet: The packet is too small: ["<< raw_buf_size <<
"] bytes.");
808 const uint8_t* data =
static_cast<const uint8_t*
>(raw_buf->data());
809 (*raw_buf) = ((*raw_buf) + min_data_size);
811 const auto& rcv_wnd_raw = *
reinterpret_cast<const rcv_wnd_t*
>(data);
812 data +=
sizeof rcv_wnd_raw;
813 m_rcv_wnd = little_to_native(rcv_wnd_raw);
818 auto pkts_size_raw = *
reinterpret_cast<const pkts_size_raw_t*
>(data);
819 data +=
sizeof pkts_size_raw;
820 pkts_size_raw = little_to_native(pkts_size_raw);
822 assert(data ==
static_cast<const uint8_t*
>(raw_buf->data()));
824 const size_t ack_size
826 const size_t n_acks = raw_buf->size() / ack_size;
827 (*raw_buf) = ((*raw_buf) + (n_acks * ack_size));
829 if ((n_acks > numeric_limits<pkts_size_raw_t>::max())
830 || (pkts_size_raw_t(n_acks) != pkts_size_raw))
833 "packet: The individual acks area specifies [" << pkts_size_raw <<
"] acks but has "
834 "actual ack count [" << n_acks <<
"]. Did truncation occur somewhere?");
842 for (
size_t ack_idx = 0; ack_idx != n_acks; ++ack_idx)
845 data +=
sizeof seq_num_raw;
847 seq_num.
set_raw_num(little_to_native(seq_num_raw));
851 const auto& ack_delay_raw = *
reinterpret_cast<const ack_delay_t*
>(data);
852 data +=
sizeof ack_delay_raw;
856 unsigned int rexmit_id;
859 const auto& rexmit_id_raw = *
reinterpret_cast<const rexmit_id_t*
>(data);
860 data +=
sizeof rexmit_id_raw;
861 rexmit_id =
static_cast<unsigned int>(little_to_native(rexmit_id_raw));
871 assert(data ==
static_cast<const uint8_t*
>(raw_buf->data()));
875 const size_t remaining_buf_size = raw_buf->size();
876 if (remaining_buf_size != 0)
879 "Unexpected trailing data: [" << remaining_buf_size <<
"] bytes.");
887 "serialized size beyond common header was [" << raw_buf_size <<
"].");
893 [[maybe_unused]]
bool prefer_no_move,
897 const size_t raw_buf_size = raw_buf->size();
898 if (raw_buf_size != 0)
901 "Unexpected trailing data: [" << raw_buf_size <<
"] bytes.");
913 constexpr char INDENTATION[] =
" ";
917 return os <<
"Low-level packet " <<
this <<
":\n"
918 << INDENTATION <<
"type: " << m_type_ostream_manip <<
"\n"
919 << INDENTATION <<
"m_src_port: " << m_packed.m_src_port <<
"\n"
920 << INDENTATION <<
"m_dst_port: " << m_packed.m_dst_port <<
"\n"
921 << INDENTATION <<
"m_opt_rexmit_on: " << m_opt_rexmit_on <<
"\n";
927 using boost::asio::buffer;
929 constexpr char INDENTATION[] =
" ";
930 constexpr char INDENTATION2[] =
" ";
934 os << INDENTATION <<
"m_init_seq_num: " << m_init_seq_num <<
"\n";
935 if (!m_serialized_metadata.empty())
937 os << INDENTATION <<
"m_serialized_metadata (" << m_serialized_metadata.size() <<
" bytes):\n";
939 buffer(m_serialized_metadata.const_data(), m_serialized_metadata.size()),
948 constexpr char INDENTATION[] =
" ";
952 return os << INDENTATION <<
"m_init_seq_num: " << m_init_seq_num <<
"\n"
953 << INDENTATION <<
"m_rcv_wnd: " << m_packed.m_rcv_wnd <<
"\n"
954 << INDENTATION <<
"m_security_token: " << m_packed.m_security_token <<
"\n";
959 constexpr char INDENTATION[] =
" ";
963 return os << INDENTATION <<
"m_rcv_wnd: " << m_packed.m_rcv_wnd <<
"\n"
964 << INDENTATION <<
"m_security_token: " << m_packed.m_security_token <<
"\n";
970 using boost::asio::buffer;
972 constexpr char INDENTATION[] =
" ";
973 constexpr char INDENTATION2[] =
" ";
977 os << INDENTATION <<
"m_seq_num: " << m_seq_num <<
"\n";
980 os << INDENTATION <<
"m_rexmit_id: " << int(m_rexmit_id) <<
"\n";
985 os << INDENTATION <<
"m_data (m_data_size=" << m_data.size() <<
" bytes)" << (verbose ?
':' :
'.') <<
"\n";
997 using boost::asio::buffer;
999 constexpr char INDENTATION[] =
" ";
1003 os << INDENTATION <<
"m_rcv_wnd: " << m_rcv_wnd <<
"\n";
1004 if (!m_rcv_acked_packets.empty())
1006 os << INDENTATION <<
"m_rcv_acked_packets [INCOMING] (" << m_rcv_acked_packets.size() <<
" items):\n";
1007 if (m_opt_rexmit_on)
1009 for (
auto ack : m_rcv_acked_packets)
1011 os << INDENTATION << INDENTATION << ack->m_seq_num <<
'/' << ack->m_rexmit_id
1012 <<
" : [" << ack->m_delay <<
"]\n";
1017 for (
auto ack : m_rcv_acked_packets)
1019 os << INDENTATION << INDENTATION << ack->m_seq_num <<
" : [" << ack->m_delay <<
"]\n";
1024 if (!m_rcv_acked_packets_rexmit_on_out.empty())
1026 os << INDENTATION <<
"m_rcv_acked_packets rexmit=[on] [OUTGOING] "
1027 "(m_rcv_acked_packets_rexmit_out_size="
1028 << m_rcv_acked_packets_rexmit_out_size <<
'='
1029 << m_rcv_acked_packets_rexmit_on_out.size() <<
" items):\n";
1030 for (
const auto& ack : m_rcv_acked_packets_rexmit_on_out)
1032 os << INDENTATION << INDENTATION << ack.m_basic_ack.m_seq_num_raw <<
'/' << int(ack.m_rexmit_id)
1033 <<
" : " << ack.m_basic_ack.m_delay <<
" x [" << TIME_UNIT <<
"]\n";
1036 else if (!m_rcv_acked_packets_rexmit_off_out.empty())
1038 os << INDENTATION <<
"m_rcv_acked_packets rexmit=[off] [OUTGOING] "
1039 "(m_rcv_acked_packets_rexmit_out_size="
1040 << m_rcv_acked_packets_rexmit_out_size <<
'='
1041 << m_rcv_acked_packets_rexmit_off_out.size() <<
" items):\n";
1042 for (
const auto& ack : m_rcv_acked_packets_rexmit_off_out)
1044 os << INDENTATION << INDENTATION << ack.m_seq_num_raw
1045 <<
" : " << ack.m_delay <<
" x [" << TIME_UNIT <<
"]\n";
1054 using std::type_index;
1061 m_seq_num_raw(seq_num.raw_num_ref()),
1068 unsigned int rexmit_id,
1070 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=0)
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_metadata(char num_line_id=0, const Sequence_number &zero_point=Sequence_number(), seq_num_delta_t multiple_size=0)
Updates the full set of metadata (used at least for convenient convention-based logging but not actua...
void set_raw_num(seq_num_t num)
Sets the raw sequence number.
uint64_t seq_num_t
Raw sequence number type.
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.