From 1e6131bad6b47efbd35c5e7095637ed2aeaecd70 Mon Sep 17 00:00:00 2001 From: Justin Hibbits Date: Wed, 1 Feb 2023 09:56:34 -0500 Subject: [PATCH] IfAPI: Add needed APIs for mbuf support Summary: Add 2 new APIs for supporting recent mbuf changes: * 36e0a362ac added the m_snd_tag_alloc() wrapper around if_snd_tag_alloc(). Push this down to the ifnet level. * 4d7a1361ef adds the m_rcvif_serialize()/m_rcvif_restore() KPIs to serialize and restore an ifnet pointer. Add the necessary wrapper to get the index generation for this. Reviewed By: jhb Sponsored by: Juniper Networks, Inc. Differential Revision: https://reviews.freebsd.org/D38340 --- sys/kern/kern_mbuf.c | 12 +++++------- sys/net/if.c | 16 ++++++++++++++++ sys/net/if_var.h | 3 +++ 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/sys/kern/kern_mbuf.c b/sys/kern/kern_mbuf.c index d47b1fbf3c60..84dea05f1bbb 100644 --- a/sys/kern/kern_mbuf.c +++ b/sys/kern/kern_mbuf.c @@ -1586,9 +1586,7 @@ m_snd_tag_alloc(struct ifnet *ifp, union if_snd_tag_alloc_params *params, struct m_snd_tag **mstp) { - if (ifp->if_snd_tag_alloc == NULL) - return (EOPNOTSUPP); - return (ifp->if_snd_tag_alloc(ifp, params, mstp)); + return (if_snd_tag_alloc(ifp, params, mstp)); } void @@ -1620,13 +1618,13 @@ m_rcvif_serialize(struct mbuf *m) u_short idx, gen; M_ASSERTPKTHDR(m); - idx = m->m_pkthdr.rcvif->if_index; - gen = m->m_pkthdr.rcvif->if_idxgen; + idx = if_getindex(m->m_pkthdr.rcvif); + gen = if_getidxgen(m->m_pkthdr.rcvif); m->m_pkthdr.rcvidx = idx; m->m_pkthdr.rcvgen = gen; if (__predict_false(m->m_pkthdr.leaf_rcvif != NULL)) { - idx = m->m_pkthdr.leaf_rcvif->if_index; - gen = m->m_pkthdr.leaf_rcvif->if_idxgen; + idx = if_getindex(m->m_pkthdr.leaf_rcvif); + gen = if_getidxgen(m->m_pkthdr.leaf_rcvif); } else { idx = -1; gen = 0; diff --git a/sys/net/if.c b/sys/net/if.c index 8bb5ed0043e5..43d1e2b95a63 100644 --- a/sys/net/if.c +++ b/sys/net/if.c @@ -4295,6 +4295,12 @@ if_getindex(const if_t ifp) return ((struct ifnet *)ifp)->if_index; } +int +if_getidxgen(const if_t ifp) +{ + return (ifp->if_idxgen); +} + void if_setdescr(if_t ifp, char *descrbuf) { @@ -4845,6 +4851,16 @@ if_setsndtagallocfn(if_t ifp, if_snd_tag_alloc_t alloc_fn) ((struct ifnet *)ifp)->if_snd_tag_alloc = alloc_fn; } +int +if_snd_tag_alloc(struct ifnet *ifp, union if_snd_tag_alloc_params *params, + struct m_snd_tag **mstp) +{ + + if (ifp->if_snd_tag_alloc == NULL) + return (EOPNOTSUPP); + return (ifp->if_snd_tag_alloc(ifp, params, mstp)); +} + void if_setgetcounterfn(if_t ifp, if_get_counter_t fn) { diff --git a/sys/net/if_var.h b/sys/net/if_var.h index b4cdcf27253f..f33b4fc590c7 100644 --- a/sys/net/if_var.h +++ b/sys/net/if_var.h @@ -578,6 +578,7 @@ int if_setcapenablebit(if_t ifp, int setcap, int clearcap); int if_getcapenable(const if_t ifp); int if_getdunit(const if_t ifp); int if_getindex(const if_t ifp); +int if_getidxgen(const if_t ifp); const char *if_getdname(const if_t ifp); void if_setdname(if_t ifp, const char *name); const char *if_name(if_t ifp); @@ -650,6 +651,8 @@ bool if_altq_is_enabled(if_t ifp); void *if_getafdata(if_t ifp, int); +int if_snd_tag_alloc(struct ifnet *ifp, union if_snd_tag_alloc_params *params, + struct m_snd_tag **mstp); /* * Traversing through interface address lists. */