Пример #1
0
TCP::TCP(IPStack& inet) :
  inet_(inet),
  listeners_(),
  connections_(),
  writeq(),
  used_ports(),
  MAX_SEG_LIFETIME(30s)
{
  inet.on_transmit_queue_available(transmit_avail_delg::from<TCP,&TCP::process_writeq>(this));
}
Пример #2
0
TCP::TCP(IPStack& inet, bool smp_enable) :
  inet_{inet},
  listeners_(),
  connections_(),
  ports_(inet.tcp_ports()),
  writeq(),
  max_seg_lifetime_{default_msl},       // 30s
  win_size_{default_ws_window_size},    // 8096*1024
  wscale_{default_window_scaling},      // 5
  timestamps_{default_timestamps},      // true
  dack_timeout_{default_dack_timeout},  // 40ms
  max_syn_backlog_{default_max_syn_backlog} // 64
{
  Expects(wscale_ <= 14 && "WScale factor cannot exceed 14");
  Expects(win_size_ <= 0x40000000 && "Invalid size");

  this->cpu_id = SMP::cpu_id();
  this->smp_enabled = smp_enable;
  std::string stat_prefix;
  if (this->smp_enabled == false)
  {
    inet.on_transmit_queue_available({this, &TCP::process_writeq});
    stat_prefix = inet.ifname();
  }
  else
  {
    SMP::global_lock();
    inet.on_transmit_queue_available({this, &TCP::smp_process_writeq});
    SMP::global_unlock();
    stat_prefix = inet.ifname() + ".cpu" + std::to_string(this->cpu_id);
  }
  bytes_rx_ = &Statman::get().create(Stat::UINT64, stat_prefix + ".tcp.rx").get_uint64();
  bytes_tx_ = &Statman::get().create(Stat::UINT64, stat_prefix + ".tcp.tx").get_uint64();
  packets_rx_ = &Statman::get().create(Stat::UINT64, stat_prefix + ".tcp.packets_rx").get_uint64();
  packets_tx_ = &Statman::get().create(Stat::UINT64, stat_prefix + ".tcp.packets_tx").get_uint64();
  incoming_connections_ = &Statman::get().create(Stat::UINT64, stat_prefix + ".tcp.conn_incoming").get_uint64();
  outgoing_connections_ = &Statman::get().create(Stat::UINT64, stat_prefix + ".tcp.conn_outgoing").get_uint64();
  connection_attempts_ = &Statman::get().create(Stat::UINT64, stat_prefix + ".tcp.conn_attempts").get_uint64();
  packets_dropped_ = &Statman::get().create(Stat::UINT32, stat_prefix + ".tcp.dropped").get_uint32();
}