Skip to content

Commit

Permalink
macos: tcp sock info support
Browse files Browse the repository at this point in the history
Signed-off-by: Ivan Prisyazhnyy <[email protected]>
  • Loading branch information
sitano committed Aug 28, 2024
1 parent aa6f9ab commit b52c519
Show file tree
Hide file tree
Showing 2 changed files with 131 additions and 1 deletion.
96 changes: 96 additions & 0 deletions galerautils/src/gu_asio.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,102 @@
#include <memory>
#include <string>

#ifdef __APPLE__

struct tcp_info {
uint8_t tcpi_state;
uint8_t tcpi_ca_state;
uint8_t tcpi_retransmits;
uint8_t tcpi_probes;
uint8_t tcpi_backoff;
uint8_t tcpi_options;
uint8_t tcpi_snd_wscale : 4, tcpi_rcv_wscale : 4;
uint8_t tcpi_delivery_rate_app_limited:1, tcpi_fastopen_client_fail:2;

uint32_t tcpi_rto;
uint32_t tcpi_ato;
uint32_t tcpi_snd_mss;
uint32_t tcpi_rcv_mss;

uint32_t tcpi_unacked;
uint32_t tcpi_sacked;
uint32_t tcpi_lost;
uint32_t tcpi_retrans;
uint32_t tcpi_fackets;

/* Times. */
uint32_t tcpi_last_data_sent;
uint32_t tcpi_last_ack_sent; /* Not remembered, sorry. */
uint32_t tcpi_last_data_recv;
uint32_t tcpi_last_ack_recv;

/* Metrics. */
uint32_t tcpi_pmtu;
uint32_t tcpi_rcv_ssthresh;
uint32_t tcpi_rtt;
uint32_t tcpi_rttvar;
uint32_t tcpi_snd_ssthresh;
uint32_t tcpi_snd_cwnd;
uint32_t tcpi_advmss;
uint32_t tcpi_reordering;

uint32_t tcpi_rcv_rtt;
uint32_t tcpi_rcv_space;

uint32_t tcpi_total_retrans;

uint64_t tcpi_pacing_rate;
uint64_t tcpi_max_pacing_rate;
uint64_t tcpi_bytes_acked; /* RFC4898 tcpEStatsAppHCThruOctetsAcked */
uint64_t tcpi_bytes_received; /* RFC4898 tcpEStatsAppHCThruOctetsReceived */
uint32_t tcpi_segs_out; /* RFC4898 tcpEStatsPerfSegsOut */
uint32_t tcpi_segs_in; /* RFC4898 tcpEStatsPerfSegsIn */

uint32_t tcpi_notsent_bytes;
uint32_t tcpi_min_rtt;
uint32_t tcpi_data_segs_in; /* RFC4898 tcpEStatsDataSegsIn */
uint32_t tcpi_data_segs_out; /* RFC4898 tcpEStatsDataSegsOut */

uint64_t tcpi_delivery_rate;

uint64_t tcpi_busy_time; /* Time (usec) busy sending data */
uint64_t tcpi_rwnd_limited; /* Time (usec) limited by receive window */
uint64_t tcpi_sndbuf_limited; /* Time (usec) limited by send buffer */

uint32_t tcpi_delivered;
uint32_t tcpi_delivered_ce;

uint64_t tcpi_bytes_sent; /* RFC4898 tcpEStatsPerfHCDataOctetsOut */
uint64_t tcpi_bytes_retrans; /* RFC4898 tcpEStatsPerfOctetsRetrans */
uint32_t tcpi_dsack_dups; /* RFC4898 tcpEStatsStackDSACKDups */
uint32_t tcpi_reord_seen; /* reordering events seen */

uint32_t tcpi_rcv_ooopack; /* Out-of-order packets received */

uint32_t tcpi_snd_wnd; /* peer's advertised receive window after
* scaling (bytes)
*/
uint32_t tcpi_rcv_wnd; /* local advertised receive window after
* scaling (bytes)
*/

uint32_t tcpi_rehash; /* PLB or timeout triggered rehash attempts */

uint16_t tcpi_total_rto; /* Total number of RTO timeouts, including
* SYN/SYN-ACK and recurring timeouts.
*/
uint16_t tcpi_total_rto_recoveries; /* Total number of RTO
* recoveries, including any
* unfinished recovery.
*/
uint32_t tcpi_total_rto_time; /* Total time spent in RTO recoveries
* in milliseconds, including any
* unfinished recovery.
*/
};

#endif

namespace gu
{
// URI schemes for networking
Expand Down
36 changes: 35 additions & 1 deletion galerautils/src/gu_asio_socket_util.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,40 @@ static void bind(Socket& socket, const gu::AsioIpAddress& addr)
}
}

#ifdef __APPLE__

template <class Socket>
static struct tcp_info get_tcp_info(Socket& socket)
{
struct tcp_info tcpi;
memset(&tcpi, 0, sizeof(tcpi));
// struct tcp_connection_info
// https://developer.apple.com/documentation/kernel/tcp_connection_info
// http://git.haproxy.org/?p=haproxy-2.6.git;a=commitdiff_plain;h=7747d465d54a1e367e9bf9c07c263d7f1f7fd481;hp=5c83e3a1563cd7face299bf08037e51f976eb5e3
// TODO needed fields:
// ret.rtt = tcpi.tcpi_rtt;
// ret.rttvar = tcpi.tcpi_rttvar;
// ret.rto = tcpi.tcpi_rto;
#if defined(__linux__)
// ret.lost = tcpi.tcpi_lost;
#else
// ret.lost = 0;
#endif /* __linux__ */
// ret.last_data_recv = tcpi.tcpi_last_data_recv;
// ret.cwnd = tcpi.tcpi_snd_cwnd;
// gu::datetime::Date now(gu::datetime::Date::monotonic());
// Critical<AsioProtonet> crit(net_);
// ret.last_queued_since = (now - last_queued_tstamp_).get_nsecs();
// ret.last_delivered_since = (now - last_delivered_tstamp_).get_nsecs();
// ret.send_queue_length = send_q_.size();
// ret.send_queue_bytes = send_q_.queued_bytes();
// ret.send_queue_segments = send_q_.segments();

return tcpi;
}

#else

template <class Socket>
static struct tcp_info get_tcp_info(Socket& socket)
{
Expand All @@ -165,7 +199,7 @@ static struct tcp_info get_tcp_info(Socket& socket)
#endif /* __linux__ || __FreeBSD__ */
return tcpi;
}

#endif

static inline std::string
uri_string (const std::string& scheme, const std::string& addr,
Expand Down

0 comments on commit b52c519

Please sign in to comment.