When the kernel module (Linux or FreeBSD) notifies us that a peer has
disconnected we'd like to get a final count of the in/out bytes for that
peer.
We can't request that information any more, because the kernel has
already removed the peer at that point.
Have the kernel send that information as part of the "delete peer"
notification, and update the counters a final time.
This implements the FreeBSD-specific DCO code, but not the
Linux-specific code. It will simply add 0 to the count on Linux.
Signed-off-by: Kristof Provost <kprovost@netgate.com>
Acked-by: Gert Doering <gert@greenie.muc.de>
Message-Id: <
20221205164103.9190-3-kprovost@netgate.com>
URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg25614.html
Signed-off-by: Gert Doering <gert@greenie.muc.de>
(cherry picked from commit
6674963debfb88c0dd3dd4eae4533010ffc319b1)
else
{
dco->dco_del_peer_reason = OVPN_DEL_PEER_REASON_EXPIRED;
+
+ if (nvlist_exists_nvlist(nvl, "bytes"))
+ {
+ const nvlist_t *bytes = nvlist_get_nvlist(nvl, "bytes");
+
+ dco->dco_read_bytes = nvlist_get_number(bytes, "in");
+ dco->dco_write_bytes = nvlist_get_number(bytes, "out");
+ }
+
dco->dco_message_type = OVPN_CMD_DEL_PEER;
}
int dco_message_type;
int dco_message_peer_id;
int dco_del_peer_reason;
+ uint64_t dco_read_bytes;
+ uint64_t dco_write_bytes;
} dco_context_t;
#endif /* defined(ENABLE_DCO) && defined(TARGET_FREEBSD) */
int dco_message_type;
int dco_message_peer_id;
int dco_del_peer_reason;
+ uint64_t dco_read_bytes;
+ uint64_t dco_write_bytes;
} dco_context_t;
#endif /* defined(ENABLE_DCO) && defined(TARGET_LINUX) */
* installed, and we do not need to clean up the state in the kernel */
mi->context.c2.tls_multi->dco_peer_id = -1;
mi->context.sig->signal_text = reason;
+ mi->context.c2.dco_read_bytes = dco->dco_read_bytes;
+ mi->context.c2.dco_write_bytes = dco->dco_write_bytes;
multi_signal_instance(m, mi, SIGTERM);
}
dco->dco_message_type = 0;
dco->dco_message_peer_id = -1;
+ dco->dco_read_bytes = 0;
+ dco->dco_write_bytes = 0;
return ret > 0;
}
#endif /* if defined(ENABLE_DCO) && defined(TARGET_LINUX) */