From nobody Tue Jan 31 20:03:12 2023 X-Original-To: dev-commits-src-main@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 4P5ww11frDz3c87r; Tue, 31 Jan 2023 20:03:13 +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 "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4P5ww10ncQz3ChS; Tue, 31 Jan 2023 20:03:13 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1675195393; 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=h4wRQ5Dl6tqzo6JHa0miTYCK4b912jnAGIeT2FhOIfI=; b=MT/9rUwu8nvoF06JnrKXXBFCC0HaQvC6cp54waJxgfgCLXB+B2U6mldZTijKkSGCarbH70 Hmih7wtUix2lzaZ/8I8B5qL/7WH9gWW7xVtUDkLV8QL4sRQeQMXM7kpwK0iBFLlg8uWlvW /nkQRtjErk5u0pCpfWqs7g3mIi/OJSqi95A0a71DAOxlvtwlHrSA/uEskx0LbHiCnbXlOX XxNcseXkzJ+gVpY+10ZXeppZCfPc3CTSr2ZHV1yypMqO9a0Kc9lR/axiHPWRN+2oy/TmrL 3U70SA/+inGk1eoGDUljqkhXvEoE7puCMsKQ18e2+8ZjfnMt6eW3IB3FH8ydVA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1675195393; 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=h4wRQ5Dl6tqzo6JHa0miTYCK4b912jnAGIeT2FhOIfI=; b=ZLv7QIKUNEZlN9+3eG+776AryAmISanldKjItY7ANLYkqAbq6Aew8ljJQxN8auWO3R6hlT 1gIS9XsvTqTyjcThFHe/4oyiQ9wDeiDHF1zTHXjndgtyntmQ83O4l2CeIFJkegpCfJPfc5 Zs+i2ALr2NQH44THOcokDGf7bt+TKqH9vh4zL4STXjIPr26AKHpzIJm+Q56sO5Ld3cwyXo z1hMNZcEKPf3HCTtIPNM0DFhceLnD4Ix1WHaeFowqWre2nQLKavNrF2kDint0XEvux+gOA S617Vr0661qqBILs57f1T3RSiV4dle73tXL9rMqiv2csBIsr4TPUq/DI5YCjAA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1675195393; a=rsa-sha256; cv=none; b=BfSK3MZ2C8SzpselShCm37yPFmRZtlUSE/Q/amVzWqH5rgtLG3kA/dksnl2XqNUBqx+jab aMQpJqjUywBRJs/mWxOb7PCcsEfRFDgCYlet5GpohZoaz9ehgdpedb7hA48tp1ibxQTPz2 1OBKLl6lysWzDL/GQsyrMl6HvIys4ryDDXR84YmJYFvW/c6vRG+eY5qhxq78ZlQ9eDqUca G9sPkAVysvunEeIWc++SVyEKeXkBoeDda8A518Nfl55RB7fh46koX4wGyhiZrPeCkwDzJS JpHNQVwJgTJAcw6R7/Iq0Z5j3YGJGZahFw9ZE5BSEgy0aB/OkVWEQIZ4wd9WGA== 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 4P5ww06xRMz12L1; Tue, 31 Jan 2023 20:03:12 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 30VK3Cou024836; Tue, 31 Jan 2023 20:03:12 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 30VK3Cf4024835; Tue, 31 Jan 2023 20:03:12 GMT (envelope-from git) Date: Tue, 31 Jan 2023 20:03:12 GMT Message-Id: <202301312003.30VK3Cf4024835@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Justin Hibbits Subject: git: 950cc1f44fbd - main - bpf: Add "_if" tap APIs List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jhibbits X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 950cc1f44fbd5965db7b679c0aaf1bd9b432ec25 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by jhibbits: URL: https://cgit.FreeBSD.org/src/commit/?id=950cc1f44fbd5965db7b679c0aaf1bd9b432ec25 commit 950cc1f44fbd5965db7b679c0aaf1bd9b432ec25 Author: Justin Hibbits AuthorDate: 2023-01-12 20:17:33 +0000 Commit: Justin Hibbits CommitDate: 2023-01-31 20:02:14 +0000 bpf: Add "_if" tap APIs Summary: Hide more netstack by making the BPF_TAP macros real functions in the netstack. "struct ifnet" is used in the header instead of "if_t" to keep header pollution down. Sponsored by: Juniper Networks, Inc. Differential Revision: https://reviews.freebsd.org/D38103 --- sys/net/bpf.c | 25 +++++++++++++++++++++++++ sys/net/bpf.h | 27 ++++++++++----------------- sys/net/ethernet.h | 15 +++++---------- sys/net/if_ethersubr.c | 12 ++++++++++++ 4 files changed, 52 insertions(+), 27 deletions(-) diff --git a/sys/net/bpf.c b/sys/net/bpf.c index ab733f1d68ec..ffac63ef95d9 100644 --- a/sys/net/bpf.c +++ b/sys/net/bpf.c @@ -2349,6 +2349,13 @@ bpf_tap(struct bpf_if *bp, u_char *pkt, u_int pktlen) NET_EPOCH_EXIT(et); } +void +bpf_tap_if(if_t ifp, u_char *pkt, u_int pktlen) +{ + if (bpf_peers_present(ifp->if_bpf)) + bpf_tap(ifp->if_bpf, pkt, pktlen); +} + #define BPF_CHECK_DIRECTION(d, r, i) \ (((d)->bd_direction == BPF_D_IN && (r) != (i)) || \ ((d)->bd_direction == BPF_D_OUT && (r) == (i))) @@ -2409,6 +2416,15 @@ bpf_mtap(struct bpf_if *bp, struct mbuf *m) NET_EPOCH_EXIT(et); } +void +bpf_mtap_if(if_t ifp, struct mbuf *m) +{ + if (bpf_peers_present(ifp->if_bpf)) { + M_ASSERTVALID(m); + bpf_mtap(ifp->if_bpf, m); + } +} + /* * Incoming linkage from device drivers, when packet is in * an mbuf chain and to be prepended by a contiguous header. @@ -2466,6 +2482,15 @@ bpf_mtap2(struct bpf_if *bp, void *data, u_int dlen, struct mbuf *m) NET_EPOCH_EXIT(et); } +void +bpf_mtap2_if(if_t ifp, void *data, u_int dlen, struct mbuf *m) +{ + if (bpf_peers_present(ifp->if_bpf)) { + M_ASSERTVALID(m); + bpf_mtap2(ifp->if_bpf, data, dlen, m); + } +} + #undef BPF_CHECK_DIRECTION #undef BPF_TSTAMP_NONE #undef BPF_TSTAMP_FAST diff --git a/sys/net/bpf.h b/sys/net/bpf.h index e5b8898188f1..279d2f65e7fc 100644 --- a/sys/net/bpf.h +++ b/sys/net/bpf.h @@ -53,6 +53,7 @@ typedef int32_t bpf_int32; typedef u_int32_t bpf_u_int32; typedef int64_t bpf_int64; typedef u_int64_t bpf_u_int64; +struct ifnet; /* * Alignment macros. BPF_WORDALIGN rounds up to the next multiple of @@ -421,8 +422,11 @@ struct bpf_if_ext { void bpf_bufheld(struct bpf_d *d); int bpf_validate(const struct bpf_insn *, int); void bpf_tap(struct bpf_if *, u_char *, u_int); +void bpf_tap_if(struct ifnet *, u_char *, u_int); void bpf_mtap(struct bpf_if *, struct mbuf *); +void bpf_mtap_if(struct ifnet *, struct mbuf *); void bpf_mtap2(struct bpf_if *, void *, u_int, struct mbuf *); +void bpf_mtap2_if(struct ifnet *, void *, u_int, struct mbuf *); void bpfattach(struct ifnet *, u_int, u_int); void bpfattach2(struct ifnet *, u_int, u_int, struct bpf_if **); void bpfdetach(struct ifnet *); @@ -444,22 +448,12 @@ bpf_peers_present(struct bpf_if *bpf) return (0); } -#define BPF_TAP(_ifp,_pkt,_pktlen) do { \ - if (bpf_peers_present((_ifp)->if_bpf)) \ - bpf_tap((_ifp)->if_bpf, (_pkt), (_pktlen)); \ -} while (0) -#define BPF_MTAP(_ifp,_m) do { \ - if (bpf_peers_present((_ifp)->if_bpf)) { \ - M_ASSERTVALID(_m); \ - bpf_mtap((_ifp)->if_bpf, (_m)); \ - } \ -} while (0) -#define BPF_MTAP2(_ifp,_data,_dlen,_m) do { \ - if (bpf_peers_present((_ifp)->if_bpf)) { \ - M_ASSERTVALID(_m); \ - bpf_mtap2((_ifp)->if_bpf,(_data),(_dlen),(_m)); \ - } \ -} while (0) +#define BPF_TAP(_ifp,_pkt,_pktlen) \ + bpf_tap_if((_ifp), (_pkt), (_pktlen)) +#define BPF_MTAP(_ifp,_m) \ + bpf_mtap_if((_ifp), (_m)) +#define BPF_MTAP2(_ifp,_data,_dlen,_m) \ + bpf_mtap2_if((_ifp), (_data), (_dlen), (_m)) #endif /* @@ -468,7 +462,6 @@ bpf_peers_present(struct bpf_if *bpf) #define BPF_MEMWORDS 16 /* BPF attach/detach events */ -struct ifnet; typedef void (*bpf_track_fn)(void *, struct ifnet *, int /* dlt */, int /* 1 =>'s attach */); EVENTHANDLER_DECLARE(bpf_track, bpf_track_fn); diff --git a/sys/net/ethernet.h b/sys/net/ethernet.h index 807420957aef..98b02d71da50 100644 --- a/sys/net/ethernet.h +++ b/sys/net/ethernet.h @@ -35,7 +35,7 @@ * encapsulation) and whether or not an FCS is present. */ #define ETHER_MAX_FRAME(ifp, etype, hasfcs) \ - ((ifp)->if_mtu + ETHER_HDR_LEN + \ + (if_getmtu(ifp) + ETHER_HDR_LEN + \ ((hasfcs) ? ETHER_CRC_LEN : 0) + \ (((etype) == ETHERTYPE_VLAN) ? ETHER_VLAN_ENCAP_LEN : 0)) @@ -399,15 +399,10 @@ struct ether_vlan_header { * ether_vlan_mtap. This function will re-insert VLAN tags for the duration * of the tap, so they show up properly for network analyzers. */ -#define ETHER_BPF_MTAP(_ifp, _m) do { \ - if (bpf_peers_present((_ifp)->if_bpf)) { \ - M_ASSERTVALID(_m); \ - if (((_m)->m_flags & M_VLANTAG) != 0) \ - ether_vlan_mtap((_ifp)->if_bpf, (_m), NULL, 0); \ - else \ - bpf_mtap((_ifp)->if_bpf, (_m)); \ - } \ -} while (0) +struct ifnet; +struct mbuf; +void ether_bpf_mtap_if(struct ifnet *ifp, struct mbuf *m); +#define ETHER_BPF_MTAP(_ifp, _m) ether_bpf_mtap_if((_ifp), (_m)) /* * Names for 802.1q priorities ("802.1p"). Notice that in this scheme, diff --git a/sys/net/if_ethersubr.c b/sys/net/if_ethersubr.c index b3fc71006a35..8bc66497e161 100644 --- a/sys/net/if_ethersubr.c +++ b/sys/net/if_ethersubr.c @@ -1337,6 +1337,18 @@ ether_vlanencap_proto(struct mbuf *m, uint16_t tag, uint16_t proto) return (m); } +void +ether_bpf_mtap_if(struct ifnet *ifp, struct mbuf *m) +{ + if (bpf_peers_present(ifp->if_bpf)) { + M_ASSERTVALID(m); + if ((m->m_flags & M_VLANTAG) != 0) + ether_vlan_mtap(ifp->if_bpf, m, NULL, 0); + else + bpf_mtap(ifp->if_bpf, m); + } +} + static SYSCTL_NODE(_net_link, IFT_L2VLAN, vlan, CTLFLAG_RW | CTLFLAG_MPSAFE, 0, "IEEE 802.1Q VLAN"); static SYSCTL_NODE(_net_link_vlan, PF_LINK, link,