0
0
mirror of https://github.com/OpenVPN/openvpn3.git synced 2024-09-19 19:52:15 +02:00

ovpn-dco: extend stats in order to retrieve both VPN and transport numbers

Signed-off-by: Antonio Quartulli <antonio@openvpn.net>
This commit is contained in:
Antonio Quartulli 2023-05-24 11:18:20 +02:00
parent 37ae62143d
commit 9b976d6e2b
No known key found for this signature in database
GPG Key ID: E30C62865881C3D6
3 changed files with 66 additions and 9 deletions

View File

@ -505,7 +505,15 @@ class OvpnDcoClient : public Client,
struct OvpnDcoPeer peer;
buf.read(&peer, sizeof(peer));
last_stats = SessionStats::DCOTransportSource::Data(peer.rx_bytes, peer.tx_bytes);
last_stats = SessionStats::DCOTransportSource::Data(peer.transport.rx_bytes,
peer.transport.tx_bytes,
peer.vpn.rx_bytes,
peer.vpn.tx_bytes,
peer.transport.rx_pkts,
peer.transport.tx_pkts,
peer.vpn.rx_pkts,
peer.vpn.tx_pkts);
break;
}

View File

@ -133,6 +133,11 @@ class SessionStats : public RC<thread_safe_refcount>
count_t tun_bytes_in = 0;
count_t tun_bytes_out = 0;
count_t transport_pkts_in = 0;
count_t transport_pkts_out = 0;
count_t tun_pkts_in = 0;
count_t tun_pkts_out = 0;
Data() = default;
Data(count_t transport_bytes_in_arg, count_t transport_bytes_out_arg)
@ -148,6 +153,26 @@ class SessionStats : public RC<thread_safe_refcount>
{
}
Data(count_t transport_bytes_in_arg,
count_t transport_bytes_out_arg,
count_t tun_bytes_in_arg,
count_t tun_bytes_out_arg,
count_t transport_pkts_in_arg,
count_t transport_pkts_out_arg,
count_t tun_pkts_in_arg,
count_t tun_pkts_out_arg)
: transport_bytes_in(transport_bytes_in_arg),
transport_bytes_out(transport_bytes_out_arg),
tun_bytes_in(tun_bytes_in_arg),
tun_bytes_out(tun_bytes_out_arg),
transport_pkts_in(transport_pkts_in_arg),
transport_pkts_out(transport_pkts_out_arg),
tun_pkts_in(tun_pkts_in_arg),
tun_pkts_out(tun_pkts_out_arg)
{
}
Data operator-(const Data &rhs) const
{
Data data;
@ -159,6 +184,14 @@ class SessionStats : public RC<thread_safe_refcount>
data.tun_bytes_in = tun_bytes_in - rhs.tun_bytes_in;
if (tun_bytes_out > rhs.tun_bytes_out)
data.tun_bytes_out = tun_bytes_out - rhs.tun_bytes_out;
if (transport_pkts_in > rhs.transport_pkts_in)
data.transport_pkts_in = transport_pkts_in - rhs.transport_pkts_in;
if (transport_pkts_out > rhs.transport_pkts_out)
data.transport_pkts_out = transport_pkts_out - rhs.transport_pkts_out;
if (tun_pkts_in > rhs.tun_pkts_in)
data.tun_pkts_in = tun_pkts_in - rhs.tun_pkts_in;
if (tun_pkts_out > rhs.tun_pkts_out)
data.tun_pkts_out = tun_pkts_out - rhs.tun_pkts_out;
return data;
}
};
@ -180,6 +213,10 @@ class SessionStats : public RC<thread_safe_refcount>
stats_[BYTES_OUT] += data.transport_bytes_out;
stats_[TUN_BYTES_IN] += data.tun_bytes_in;
stats_[TUN_BYTES_OUT] += data.tun_bytes_out;
stats_[PACKETS_IN] += data.transport_pkts_in;
stats_[PACKETS_OUT] += data.transport_pkts_out;
stats_[TUN_PACKETS_IN] += data.tun_pkts_in;
stats_[TUN_PACKETS_OUT] += data.tun_pkts_out;
}
}

View File

@ -57,8 +57,16 @@ struct OvpnDcoPeer
__u32 interval;
__u32 timeout;
} keepalive;
__u64 rx_bytes, tx_bytes;
__u32 rx_pkts, tx_pkts;
struct
{
__u64 rx_bytes, tx_bytes;
__u32 rx_pkts, tx_pkts;
} vpn;
struct
{
__u64 rx_bytes, tx_bytes;
__u32 rx_pkts, tx_pkts;
} transport;
};
/**
@ -685,8 +693,7 @@ class GeNL : public RC<thread_unsafe_refcount>
return NL_SKIP;
}
if (nla_parse(attrs, OVPN_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
genlmsg_attrlen(gnlh, 0), NULL))
if (nla_parse(attrs, OVPN_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL))
{
OPENVPN_LOG("received bogus data from ovpn-dco");
return NL_SKIP;
@ -784,10 +791,15 @@ class GeNL : public RC<thread_unsafe_refcount>
nla_len(get_peer_attrs[OVPN_GET_PEER_RESP_ATTR_SOCKADDR_REMOTE]));
peer.keepalive.interval = nla_get_u32(get_peer_attrs[OVPN_GET_PEER_RESP_ATTR_KEEPALIVE_INTERVAL]);
peer.keepalive.timeout = nla_get_u32(get_peer_attrs[OVPN_GET_PEER_RESP_ATTR_KEEPALIVE_TIMEOUT]);
peer.rx_bytes = nla_get_u64(get_peer_attrs[OVPN_GET_PEER_RESP_ATTR_RX_BYTES]);
peer.tx_bytes = nla_get_u64(get_peer_attrs[OVPN_GET_PEER_RESP_ATTR_TX_BYTES]);
peer.rx_pkts = nla_get_u32(get_peer_attrs[OVPN_GET_PEER_RESP_ATTR_RX_PACKETS]);
peer.tx_pkts = nla_get_u32(get_peer_attrs[OVPN_GET_PEER_RESP_ATTR_TX_PACKETS]);
peer.vpn.rx_bytes = nla_get_u64(get_peer_attrs[OVPN_GET_PEER_RESP_ATTR_VPN_RX_BYTES]);
peer.vpn.tx_bytes = nla_get_u64(get_peer_attrs[OVPN_GET_PEER_RESP_ATTR_VPN_TX_BYTES]);
peer.vpn.rx_pkts = nla_get_u32(get_peer_attrs[OVPN_GET_PEER_RESP_ATTR_VPN_RX_PACKETS]);
peer.vpn.tx_pkts = nla_get_u32(get_peer_attrs[OVPN_GET_PEER_RESP_ATTR_VPN_TX_PACKETS]);
peer.transport.rx_bytes = nla_get_u64(get_peer_attrs[OVPN_GET_PEER_RESP_ATTR_LINK_RX_BYTES]);
peer.transport.tx_bytes = nla_get_u64(get_peer_attrs[OVPN_GET_PEER_RESP_ATTR_LINK_TX_BYTES]);
peer.transport.rx_pkts = nla_get_u32(get_peer_attrs[OVPN_GET_PEER_RESP_ATTR_LINK_RX_PACKETS]);
peer.transport.tx_pkts = nla_get_u32(get_peer_attrs[OVPN_GET_PEER_RESP_ATTR_LINK_TX_PACKETS]);
self->reset_buffer();
self->buf.write(&gnlh->cmd, sizeof(gnlh->cmd));