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)); }
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(); }