git: 66f0e2017f7c - main - ipsec_offload: add ipsec_accel_drv_sa_lifetime_fetch()
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 20 Aug 2024 12:43:52 UTC
The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=66f0e2017f7cd804f31ae4fc2ad38607d85a08d3 commit 66f0e2017f7cd804f31ae4fc2ad38607d85a08d3 Author: Konstantin Belousov <kib@FreeBSD.org> AuthorDate: 2024-08-18 13:22:28 +0000 Commit: Konstantin Belousov <kib@FreeBSD.org> CommitDate: 2024-08-20 12:42:13 +0000 ipsec_offload: add ipsec_accel_drv_sa_lifetime_fetch() A function to fetch hardware counters for offloaded SA on specific interface. Sponsored by: NVidia networking --- sys/netipsec/ipsec_offload.c | 29 +++++++++++++++++++++++++++++ sys/netipsec/ipsec_offload.h | 4 ++++ sys/netipsec/key.c | 15 +++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/sys/netipsec/ipsec_offload.c b/sys/netipsec/ipsec_offload.c index 4d81803f4be7..bbf98ac7a676 100644 --- a/sys/netipsec/ipsec_offload.c +++ b/sys/netipsec/ipsec_offload.c @@ -157,6 +157,8 @@ static struct mbuf *ipsec_accel_key_setaccelif_impl(struct secasvar *sav); static void ipsec_accel_on_ifdown_impl(struct ifnet *ifp); static void ipsec_accel_drv_sa_lifetime_update_impl(struct secasvar *sav, if_t ifp, u_int drv_spi, uint64_t octets, uint64_t allocs); +static int ipsec_accel_drv_sa_lifetime_fetch_impl(struct secasvar *sav, + if_t ifp, u_int drv_spi, uint64_t *octets, uint64_t *allocs); static void ipsec_accel_ifdetach_event(void *arg, struct ifnet *ifp); static void @@ -177,6 +179,8 @@ ipsec_accel_init(void *arg) ipsec_accel_on_ifdown_p = ipsec_accel_on_ifdown_impl; ipsec_accel_drv_sa_lifetime_update_p = ipsec_accel_drv_sa_lifetime_update_impl; + ipsec_accel_drv_sa_lifetime_fetch_p = + ipsec_accel_drv_sa_lifetime_fetch_impl; pctrie_init(&drv_spi_pctrie); ipsec_accel_ifdetach_event_tag = EVENTHANDLER_REGISTER( ifnet_departure_event, ipsec_accel_ifdetach_event, NULL, @@ -200,6 +204,7 @@ ipsec_accel_fini(void *arg) ipsec_accel_key_setaccelif_p = NULL; ipsec_accel_on_ifdown_p = NULL; ipsec_accel_drv_sa_lifetime_update_p = NULL; + ipsec_accel_drv_sa_lifetime_fetch_p = NULL; ipsec_accel_sync_imp(); clean_unrhdr(drv_spi_unr); /* avoid panic, should go later */ clear_unrhdr(drv_spi_unr); @@ -1017,6 +1022,30 @@ out: NET_EPOCH_EXIT(et); } +static int +ipsec_accel_drv_sa_lifetime_fetch_impl(struct secasvar *sav, + if_t ifp, u_int drv_spi, uint64_t *octets, uint64_t *allocs) +{ + struct ifp_handle_sav *i; + int error; + + NET_EPOCH_ASSERT(); + error = 0; + + mtx_lock(&ipsec_accel_cnt_lock); + CK_LIST_FOREACH(i, &sav->accel_ifps, sav_link) { + if (i->ifp == ifp && i->drv_spi == drv_spi) { + *octets = i->cnt_octets; + *allocs = i->cnt_allocs; + break; + } + } + if (i == NULL) + error = ENOENT; + mtx_unlock(&ipsec_accel_cnt_lock); + return (error); +} + static void ipsec_accel_sa_lifetime_hw(struct secasvar *sav, if_t ifp, struct seclifetime *lft) diff --git a/sys/netipsec/ipsec_offload.h b/sys/netipsec/ipsec_offload.h index 72055a110951..904fe6252396 100644 --- a/sys/netipsec/ipsec_offload.h +++ b/sys/netipsec/ipsec_offload.h @@ -64,6 +64,8 @@ extern struct mbuf *(*ipsec_accel_key_setaccelif_p)(struct secasvar *sav); extern void (*ipsec_accel_on_ifdown_p)(struct ifnet *ifp); extern void (*ipsec_accel_drv_sa_lifetime_update_p)(struct secasvar *sav, if_t ifp, u_int drv_spi, uint64_t octets, uint64_t allocs); +extern int (*ipsec_accel_drv_sa_lifetime_fetch_p)(struct secasvar *sav, + if_t ifp, u_int drv_spi, uint64_t *octets, uint64_t *allocs); #ifdef IPSEC_OFFLOAD /* @@ -191,6 +193,8 @@ struct ipsec_accel_in_tag *ipsec_accel_input_tag_lookup(const struct mbuf *); void ipsec_accel_on_ifdown(struct ifnet *ifp); void ipsec_accel_drv_sa_lifetime_update(struct secasvar *sav, if_t ifp, u_int drv_spi, uint64_t octets, uint64_t allocs); +int ipsec_accel_drv_sa_lifetime_fetch(struct secasvar *sav, + if_t ifp, u_int drv_spi, uint64_t *octets, uint64_t *allocs); #endif /* _KERNEL */ diff --git a/sys/netipsec/key.c b/sys/netipsec/key.c index 149173e0b5f6..5a3e5727bc2e 100644 --- a/sys/netipsec/key.c +++ b/sys/netipsec/key.c @@ -112,6 +112,8 @@ struct mbuf *(*ipsec_accel_key_setaccelif_p)(struct secasvar *sav); void (*ipsec_accel_on_ifdown_p)(struct ifnet *ifp); void (*ipsec_accel_drv_sa_lifetime_update_p)(struct secasvar *sav, if_t ifp, u_int drv_spi, uint64_t octets, uint64_t allocs); +int (*ipsec_accel_drv_sa_lifetime_fetch_p)(struct secasvar *sav, if_t ifp, + u_int drv_spi, uint64_t *octets, uint64_t *allocs); #endif #define FULLMASK 0xff @@ -8990,4 +8992,17 @@ ipsec_accel_drv_sa_lifetime_update(struct secasvar *sav, if_t ifp, if (p != NULL) p(sav, ifp, drv_spi, octets, allocs); } + +int +ipsec_accel_drv_sa_lifetime_fetch(struct secasvar *sav, + if_t ifp, u_int drv_spi, uint64_t *octets, uint64_t *allocs) +{ + int (*p)(struct secasvar *sav, if_t ifp, u_int drv_spi, + uint64_t *octets, uint64_t *allocs); + + p = atomic_load_ptr(&ipsec_accel_drv_sa_lifetime_fetch_p); + if (p == NULL) + return (EOPNOTSUPP); + return (p(sav, ifp, drv_spi, octets, allocs)); +} #endif