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.