From nobody Tue Apr 29 11:41:51 2025 X-Original-To: dev-commits-src-branches@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4Zmz1X4Gz5z5tvJ6; Tue, 29 Apr 2025 11:41:52 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R11" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Zmz1W62NHz3wqg; Tue, 29 Apr 2025 11:41:51 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1745926911; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=1dO4ePAzFRWsIggdbQg0WvaFo3oRuNWmAgSJ0LtqUxE=; b=mJtxrYZUgrDyrsXoAkk3vRK80aWQ8oiHAzrMRBQUbSRUpj8JYYCW2ksGSpL5VCdN2eLMjA eEYtHfOxzjmQXmWOR7WeqxjY+HmxA505YT/k7j7m9bUQAMIHHqSdra25mO/3cD3PPiGfeF KRdpE8di9+moWgH8nIzFG1/2CX+uL4lm95POeY0qJSYQVHzVUbwq2EYPutKjW9084HxEFc xbReN8rZfXKpMgmYUdX7DhxZKbOpBgaoqMaP4Ig58vsdPOXC6qd7INQUCT4NDF4E5gZgd0 11KhYGe7XYt1VMYMHnbtnaNHI4sXPeiKzMvWuTrqUJQPB05hpw1qxggIgqoQqw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1745926911; a=rsa-sha256; cv=none; b=PoFMC2lrNVZhWlYVPxx40nwhcqfNh7D/5M5P2NzHUbTZ1WtPsDsGPkr8uuGWXr2aQRlP2F hN2gZ7/Nvl2POZGcWBF/NdhaQP88HCX0Dt6rBfD6XhKxQoWnPwJvnO7x2GHdQ+ww57ysfZ wAmDwOFsTPHlYtdM5EqngHoy8jUKvi5XKcfVcixQilsapciE60IK0b5Y+DuLQhFHmDlL+T NyMOwB9tcDmat6dADYAnZdq/oSAwWo/3fzWh4Pz0vOcpEhyeDbITwcX3yKmB/J7GXf07CV PERatIxl1rj5jnlVfpABUWzG9Tj2wR6BKK56hKfdIfqsjixLRESWcTBgC4Bvsw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1745926911; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=1dO4ePAzFRWsIggdbQg0WvaFo3oRuNWmAgSJ0LtqUxE=; b=CxVy07xce16Jd7FjicQ3ywspDWT44e9sdEGZdpIlAr6DiU1zeqmw8oNatVtFU0Lixgf4YG IraWjVhQSeo0S6ttj5mr/uZV7ENfsHoS+3HoWBUaDTTsPz2GGQ9gzskTfy0eMg+9anso9v h2dp8ItI+ZkiJWZVo/7z7qyjV6vmitGaI3tPHXzbwr1Af+BDw4YN7FG7/o2xjB7HNylBIm 7XNoVuqTmZ+rE0Y+J7oKV1RQc09vawnmrScPyZ+9jhDWC3kxHszxNlmKt6JmSO4WUbPMci MhhbFzXgZCYKpPsPA37bdFsAao+9EEvhmhhM6GSnnLShL8YL5qeDs9ug7DNxhQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4Zmz1W5cp1z3yZ; Tue, 29 Apr 2025 11:41:51 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 53TBfp8E046242; Tue, 29 Apr 2025 11:41:51 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 53TBfpVq046239; Tue, 29 Apr 2025 11:41:51 GMT (envelope-from git) Date: Tue, 29 Apr 2025 11:41:51 GMT Message-Id: <202504291141.53TBfpVq046239@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: "Bjoern A. Zeeb" Subject: git: c08c12712e88 - stable/14 - LinuxKPI: 802.11: lkpi_hw_crypto_prepare and lkpi_hw_crypto_tailroom List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-branches@freebsd.org Sender: owner-dev-commits-src-branches@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: bz X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: c08c12712e88adc00b72ccb8e5a6495477556805 Auto-Submitted: auto-generated The branch stable/14 has been updated by bz: URL: https://cgit.FreeBSD.org/src/commit/?id=c08c12712e88adc00b72ccb8e5a6495477556805 commit c08c12712e88adc00b72ccb8e5a6495477556805 Author: Bjoern A. Zeeb AuthorDate: 2025-04-15 20:59:45 +0000 Commit: Bjoern A. Zeeb CommitDate: 2025-04-29 10:49:30 +0000 LinuxKPI: 802.11: lkpi_hw_crypto_prepare and lkpi_hw_crypto_tailroom Split lkpi_hw_crypto_prepare() up per cipher suite and in addition to the CCMP implementation start drafting the TKIP implementation. Also add lkpi_hw_crypto_tailroom() dealing with any possible tailroom we need to prepare for the driver to fill in details later. Add support for that to lkpi_80211_txq_tx_one(). Sponsored by: The FreeBSD Foundation (cherry picked from commit 98e55905ab8ac34a0b88a1863c1b88e6fe3a8c13) --- sys/compat/linuxkpi/common/src/linux_80211.c | 130 ++++++++++++++++++++++----- 1 file changed, 110 insertions(+), 20 deletions(-) diff --git a/sys/compat/linuxkpi/common/src/linux_80211.c b/sys/compat/linuxkpi/common/src/linux_80211.c index 8e56862d7a92..baad8ad00a69 100644 --- a/sys/compat/linuxkpi/common/src/linux_80211.c +++ b/sys/compat/linuxkpi/common/src/linux_80211.c @@ -4590,34 +4590,56 @@ lkpi_ic_raw_xmit(struct ieee80211_node *ni, struct mbuf *m, #ifdef LKPI_80211_HW_CRYPTO static int -lkpi_hw_crypto_prepare(struct lkpi_sta *lsta, struct ieee80211_key *k, - struct sk_buff *skb) +lkpi_hw_crypto_prepare_tkip(struct ieee80211_key *k, + struct ieee80211_key_conf *kc, struct sk_buff *skb) { - struct ieee80211_tx_info *info; - struct ieee80211_key_conf *kc; struct ieee80211_hdr *hdr; uint32_t hlen, hdrlen; - uint8_t *p; + uint8_t *p, *m; - KASSERT(lsta != NULL, ("%s: lsta is NULL", __func__)); - KASSERT(k != NULL, ("%s: key is NULL", __func__)); - KASSERT(skb != NULL, ("%s: skb is NULL", __func__)); + /* + * Check if we have anythig to do as requested by driver + * or if we are done? + */ + if ((kc->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE) == 0 && + (kc->flags & IEEE80211_KEY_FLAG_GENERATE_IV) == 0) + return (0); - kc = lsta->kc[k->wk_keyix]; + hlen = k->wk_cipher->ic_header; + if (skb_headroom(skb) < hlen) + return (ENOSPC); - info = IEEE80211_SKB_CB(skb); - info->control.hw_key = kc; + hdr = (void *)skb->data; + hdrlen = ieee80211_hdrlen(hdr->frame_control); + p = skb_push(skb, hlen); + memmove(p, p + hlen, hdrlen); - /* MUST NOT happen. KASSERT? */ - if (kc == NULL) { - ic_printf(lsta->ni->ni_ic, "%s: lsta %p k %p skb %p, " - "kc is NULL on hw crypto offload\n", __func__, lsta, k, skb); - return (ENXIO); + /* + * Put in zeroed space for the MMIC if requested. + * XXX-BZ in theory this is not the right place but given we + * are here we know we do hw_crypto so not much missing. + */ + if ((kc->flags & IEEE80211_KEY_FLAG_PUT_MIC_SPACE) != 0) { + m = skb_put(skb, 8); + memset(m, 0, 8); } + /* If driver request space only we are done. */ + if ((kc->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE) != 0) + return (0); + + p += hdrlen; + k->wk_cipher->ic_setiv(k, p); - IMPROVE("the following should be WLAN_CIPHER_SUITE specific"); - /* We currently only support CCMP so we hardcode things here. */ + return (ENXIO); +} +static int +lkpi_hw_crypto_prepare_ccmp(struct ieee80211_key *k, + struct ieee80211_key_conf *kc, struct sk_buff *skb) +{ + struct ieee80211_hdr *hdr; + uint32_t hlen, hdrlen; + uint8_t *p; hdr = (void *)skb->data; @@ -4649,6 +4671,67 @@ lkpi_hw_crypto_prepare(struct lkpi_sta *lsta, struct ieee80211_key *k, return (0); } + +static int +lkpi_hw_crypto_prepare(struct lkpi_sta *lsta, struct ieee80211_key *k, + struct sk_buff *skb) +{ + struct ieee80211_tx_info *info; + struct ieee80211_key_conf *kc; + + KASSERT(lsta != NULL, ("%s: lsta is NULL", __func__)); + KASSERT(k != NULL, ("%s: key is NULL", __func__)); + KASSERT(skb != NULL, ("%s: skb is NULL", __func__)); + + kc = lsta->kc[k->wk_keyix]; + + info = IEEE80211_SKB_CB(skb); + info->control.hw_key = kc; + + /* MUST NOT happen. KASSERT? */ + if (kc == NULL) { + ic_printf(lsta->ni->ni_ic, "%s: lsta %p k %p skb %p, " + "kc is NULL on hw crypto offload\n", __func__, lsta, k, skb); + return (ENXIO); + } + + switch (kc->cipher) { + case WLAN_CIPHER_SUITE_TKIP: + return (lkpi_hw_crypto_prepare_tkip(k, kc, skb)); + case WLAN_CIPHER_SUITE_CCMP: + return (lkpi_hw_crypto_prepare_ccmp(k, kc, skb)); + case WLAN_CIPHER_SUITE_WEP40: + case WLAN_CIPHER_SUITE_WEP104: + case WLAN_CIPHER_SUITE_CCMP_256: + case WLAN_CIPHER_SUITE_GCMP: + case WLAN_CIPHER_SUITE_GCMP_256: + case WLAN_CIPHER_SUITE_AES_CMAC: + case WLAN_CIPHER_SUITE_BIP_CMAC_256: + case WLAN_CIPHER_SUITE_BIP_GMAC_128: + case WLAN_CIPHER_SUITE_BIP_GMAC_256: + default: + ic_printf(lsta->ni->ni_ic, "%s: lsta %p k %p kc %p skb %p, " + "unsupported cipher suite %u (%s)\n", __func__, lsta, k, kc, + skb, kc->cipher, lkpi_cipher_suite_to_name(kc->cipher)); + return (EOPNOTSUPP); + } +} + +static uint8_t +lkpi_hw_crypto_tailroom(struct lkpi_sta *lsta, struct ieee80211_key *k) +{ + struct ieee80211_key_conf *kc; + + kc = lsta->kc[k->wk_keyix]; + if (kc == NULL) + return (0); + + IMPROVE("which other flags need tailroom?"); + if (kc->flags & (IEEE80211_KEY_FLAG_PUT_MIC_SPACE)) + return (32); /* Large enough to hold everything and pow2. */ + + return (0); +} #endif static void @@ -4671,7 +4754,7 @@ lkpi_80211_txq_tx_one(struct lkpi_sta *lsta, struct mbuf *m) struct lkpi_txq *ltxq; void *buf; ieee80211_keyix keyix; - uint8_t ac, tid; + uint8_t ac, tid, tailroom; M_ASSERTPKTHDR(m); #ifdef LINUXKPI_DEBUG_80211 @@ -4729,13 +4812,20 @@ lkpi_80211_txq_tx_one(struct lkpi_sta *lsta, struct mbuf *m) ieee80211_radiotap_tx(ni->ni_vap, m); } +#ifdef LKPI_80211_HW_CRYPTO + if (lkpi_hwcrypto && keyix != IEEE80211_KEYIX_NONE) + tailroom = lkpi_hw_crypto_tailroom(lsta, k); + else +#endif + tailroom = 0; + /* * net80211 should handle hw->extra_tx_headroom. * Though for as long as we are copying we don't mind. * XXX-BZ rtw88 asks for too much headroom for ipv6+tcp: * https://lists.freebsd.org/archives/freebsd-transport/2022-February/000012.html */ - skb = dev_alloc_skb(hw->extra_tx_headroom + m->m_pkthdr.len); + skb = dev_alloc_skb(hw->extra_tx_headroom + tailroom + m->m_pkthdr.len); if (skb == NULL) { static uint8_t skb_alloc_failures = 0;