Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 19 Jul 2024 16:26:43 +0200
From:      Kristof Provost <kp@FreeBSD.org>
To:        Konstantin Belousov <kib@FreeBSD.org>
Cc:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   Re: git: ef2a572bf6bd - main - ipsec_offload: kernel infrastructure
Message-ID:  <E73D7994-C3C4-4823-BBD5-DEB2AEB6663E@FreeBSD.org>
In-Reply-To: <202407121125.46CBP8eo093121@gitrepo.freebsd.org>
References:  <202407121125.46CBP8eo093121@gitrepo.freebsd.org>

index | next in thread | previous in thread | raw e-mail

[-- Attachment #1 --]
On 12 Jul 2024, at 13:25, Konstantin Belousov wrote:
> The branch main has been updated by kib:
>
> URL: 
> https://cgit.FreeBSD.org/src/commit/?id=ef2a572bf6bdcac97ef29ce631d2f50f938e1ec8
>
> commit ef2a572bf6bdcac97ef29ce631d2f50f938e1ec8
> Author:     Konstantin Belousov <kib@FreeBSD.org>
> AuthorDate: 2021-08-22 19:38:04 +0000
> Commit:     Konstantin Belousov <kib@FreeBSD.org>
> CommitDate: 2024-07-12 04:27:58 +0000
>
>     ipsec_offload: kernel infrastructure
>
>     Inline IPSEC offload moves almost whole IPSEC processing from the
>     CPU/MCU and possibly crypto accelerator, to the network card.
>
>     The transmitted packet content is not touched by CPU during TX
>     operations, kernel only does the required policy and security
>     association lookups to find out that given flow is offloaded, and 
> then
>     packet is transmitted as plain text to the card. For driver 
> convenience,
>     a metadata is attached to the packet identifying SA which must 
> process
>     the packet. Card does encryption of the payload, padding, 
> calculates
>     authentication, and does the reformat according to the policy.
>
>     Similarly, on receive, card does the decapsulation, decryption, 
> and
>     authentification.  Kernel receives the identifier of SA that was
>     used to process the packet, together with the plain-text packet.
>
>     Overall, payload octets are only read or written by card DMA 
> engine,
>     removing a lot of memory subsystem overhead, and saving CPU time 
> because
>     IPSEC algos calculations are avoided.
>
>     If driver declares support for inline IPSEC offload (with the
>     IFCAP2_IPSEC_OFFLOAD capability set and registering method table 
> struct
>     if_ipsec_accel_methods), kernel offers the SPD and SAD to driver.
>     Driver decides which policies and SAs can be offloaded based on
>     hardware capacity, and acks/nacks each SA for given interface to
>     kernel.  Kernel needs to keep this information to make a decision 
> to
>     skip software processing on TX, and to assume processing already 
> done
>     on RX.  This shadow SPD/SAD database of offloads is rooted from
>     policies (struct secpolicy accel_ifps, struct ifp_handle_sp) and 
> SAs
>     (struct secasvar accel_ipfs, struct ifp_handle_sav).
>
>     Some extensions to the PF_KEY socket allow to limit interfaces for
>     which given SP/SA could be offloaded (proposed for offload).  
> Also,
>     additional statistics extensions allow to observe 
> allocation/octet/use
>     counters for specific SA.
>
>     Since SPs and SAs are typically instantiated in non-sleepable 
> context,
>     while offloading them into card is expected to require costly 
> async
>     manipulations of the card state, calls to the driver for offload 
> and
>     termination are executed in the threaded taskqueue.  It also 
> solves
>     the issue of allocating resources needed for the offload database.
>     Neither ipf_handle_sp nor ipf_handle_sav do not add reference to 
> the
>     owning SP/SA, the offload must be terminated before last reference 
> is
>     dropped.  ipsec_accel only adds transient references to ensure 
> safe
>     pointer ownership by taskqueue.
>
>     Maintaining the SA counters for hardware-accelerated packets is 
> the
>     duty of the driver.  The helper 
> ipsec_accel_drv_sa_lifetime_update()
>     is provided to hide accel infrastructure from drivers which would 
> use
>     expected callout to query hardware periodically for updates.
>
>     Reviewed by:    rscheff (transport, stack integration), np
>     Sponsored by:   NVIDIA networking
>     Differential revision:  https://reviews.freebsd.org/D44219
> ---
>  sys/conf/files               |    2 +
>  sys/conf/options             |    1 +
>  sys/modules/ipsec/Makefile   |    5 +-
>  sys/netipsec/ipsec.c         |   17 +
>  sys/netipsec/ipsec.h         |   11 +
>  sys/netipsec/ipsec_input.c   |   11 +
>  sys/netipsec/ipsec_offload.c | 1061 
> ++++++++++++++++++++++++++++++++++++++++++
>  sys/netipsec/ipsec_offload.h |  191 ++++++++
>  sys/netipsec/ipsec_output.c  |   15 +
>  sys/netipsec/ipsec_pcb.c     |   38 +-
>  sys/netipsec/key.c           |  270 ++++++++++-
>  sys/netipsec/key.h           |    6 +
>  sys/netipsec/key_debug.c     |    5 +
>  sys/netipsec/keydb.h         |   14 +
>  14 files changed, 1628 insertions(+), 19 deletions(-)
>
I’m seeing messages like `ipsec_accel_sa_install_newkey: spi 0x1001 
flags 0x40 seq 0` running the test suite now.
Are those stray debug printfs?

Best regards,
Kristof
[-- Attachment #2 --]
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/xhtml; charset=utf-8">
</head>
<body><div style="font-family: sans-serif;"><div class="markdown" style="white-space: normal;">
<p dir="auto">On 12 Jul 2024, at 13:25, Konstantin Belousov wrote:</p>
</div><div class="plaintext" style="white-space: normal;"><blockquote style="margin: 0 0 5px; padding-left: 5px; border-left: 2px solid #136BCE; color: #136BCE;"><p dir="auto">The branch main has been updated by kib:</p>
<p dir="auto">URL: <a href="https://cgit.FreeBSD.org/src/commit/?id=ef2a572bf6bdcac97ef29ce631d2f50f938e1ec8">https://cgit.FreeBSD.org/src/commit/?id=ef2a572bf6bdcac97ef29ce631d2f50f938e1ec8</a></p>;
<p dir="auto">commit ef2a572bf6bdcac97ef29ce631d2f50f938e1ec8
<br>
Author:     Konstantin Belousov &lt;kib@FreeBSD.org&gt;
<br>
AuthorDate: 2021-08-22 19:38:04 +0000
<br>
Commit:     Konstantin Belousov &lt;kib@FreeBSD.org&gt;
<br>
CommitDate: 2024-07-12 04:27:58 +0000</p>
<p dir="auto">    ipsec_offload: kernel infrastructure</p>
<p dir="auto">    Inline IPSEC offload moves almost whole IPSEC processing from the
<br>
    CPU/MCU and possibly crypto accelerator, to the network card.</p>
<p dir="auto">    The transmitted packet content is not touched by CPU during TX
<br>
    operations, kernel only does the required policy and security
<br>
    association lookups to find out that given flow is offloaded, and then
<br>
    packet is transmitted as plain text to the card. For driver convenience,
<br>
    a metadata is attached to the packet identifying SA which must process
<br>
    the packet. Card does encryption of the payload, padding, calculates
<br>
    authentication, and does the reformat according to the policy.</p>
<p dir="auto">    Similarly, on receive, card does the decapsulation, decryption, and
<br>
    authentification.  Kernel receives the identifier of SA that was
<br>
    used to process the packet, together with the plain-text packet.</p>
<p dir="auto">    Overall, payload octets are only read or written by card DMA engine,
<br>
    removing a lot of memory subsystem overhead, and saving CPU time because
<br>
    IPSEC algos calculations are avoided.</p>
<p dir="auto">    If driver declares support for inline IPSEC offload (with the
<br>
    IFCAP2_IPSEC_OFFLOAD capability set and registering method table struct
<br>
    if_ipsec_accel_methods), kernel offers the SPD and SAD to driver.
<br>
    Driver decides which policies and SAs can be offloaded based on
<br>
    hardware capacity, and acks/nacks each SA for given interface to
<br>
    kernel.  Kernel needs to keep this information to make a decision to
<br>
    skip software processing on TX, and to assume processing already done
<br>
    on RX.  This shadow SPD/SAD database of offloads is rooted from
<br>
    policies (struct secpolicy accel_ifps, struct ifp_handle_sp) and SAs
<br>
    (struct secasvar accel_ipfs, struct ifp_handle_sav).</p>
<p dir="auto">    Some extensions to the PF_KEY socket allow to limit interfaces for
<br>
    which given SP/SA could be offloaded (proposed for offload).  Also,
<br>
    additional statistics extensions allow to observe allocation/octet/use
<br>
    counters for specific SA.</p>
<p dir="auto">    Since SPs and SAs are typically instantiated in non-sleepable context,
<br>
    while offloading them into card is expected to require costly async
<br>
    manipulations of the card state, calls to the driver for offload and
<br>
    termination are executed in the threaded taskqueue.  It also solves
<br>
    the issue of allocating resources needed for the offload database.
<br>
    Neither ipf_handle_sp nor ipf_handle_sav do not add reference to the
<br>
    owning SP/SA, the offload must be terminated before last reference is
<br>
    dropped.  ipsec_accel only adds transient references to ensure safe
<br>
    pointer ownership by taskqueue.</p>
<p dir="auto">    Maintaining the SA counters for hardware-accelerated packets is the
<br>
    duty of the driver.  The helper ipsec_accel_drv_sa_lifetime_update()
<br>
    is provided to hide accel infrastructure from drivers which would use
<br>
    expected callout to query hardware periodically for updates.</p>
<p dir="auto">    Reviewed by:    rscheff (transport, stack integration), np
<br>
    Sponsored by:   NVIDIA networking
<br>
    Differential revision:  <a href="https://reviews.freebsd.org/D44219">https://reviews.freebsd.org/D44219</a>;
<br>
---
<br>
 sys/conf/files               |    2 +
<br>
 sys/conf/options             |    1 +
<br>
 sys/modules/ipsec/Makefile   |    5 +-
<br>
 sys/netipsec/ipsec.c         |   17 +
<br>
 sys/netipsec/ipsec.h         |   11 +
<br>
 sys/netipsec/ipsec_input.c   |   11 +
<br>
 sys/netipsec/ipsec_offload.c | 1061 ++++++++++++++++++++++++++++++++++++++++++
<br>
 sys/netipsec/ipsec_offload.h |  191 ++++++++
<br>
 sys/netipsec/ipsec_output.c  |   15 +
<br>
 sys/netipsec/ipsec_pcb.c     |   38 +-
<br>
 sys/netipsec/key.c           |  270 ++++++++++-
<br>
 sys/netipsec/key.h           |    6 +
<br>
 sys/netipsec/key_debug.c     |    5 +
<br>
 sys/netipsec/keydb.h         |   14 +
<br>
 14 files changed, 1628 insertions(+), 19 deletions(-)</p>
<br></blockquote></div>
<div class="markdown" style="white-space: normal;">
<p dir="auto">I’m seeing messages like <code style="padding: 0 0.25em; background-color: #E4E4E4;">ipsec_accel_sa_install_newkey: spi 0x1001 flags 0x40 seq 0</code> running the test suite now.<br>
Are those stray debug printfs?</p>
<p dir="auto">Best regards,<br>
Kristof</p>

</div>
</div>
</body>

</html>
help

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?E73D7994-C3C4-4823-BBD5-DEB2AEB6663E>