diff options
author | David Gwynne <dlg@cvs.openbsd.org> | 2021-02-20 05:01:34 +0000 |
---|---|---|
committer | David Gwynne <dlg@cvs.openbsd.org> | 2021-02-20 05:01:34 +0000 |
commit | fbecb2a235a07ab0c7fbfbf12d4c0988a745b27b (patch) | |
tree | 0308f2009e017150abf58ae16946bcf7e5332824 | |
parent | 0ae6ec51848d2e8a60d43f496b6257f5d8fb4266 (diff) |
move gre and mgre from calling l3 input handlers to using if_vinput.
using if_vinput factors out a lot of repeated code between tunnel
drivers, and it means monitor mode works on gre and mgre now too.
make the l2 gre interfaces do some things in the same order while
here.
-rw-r--r-- | sys/net/if_gre.c | 57 |
1 files changed, 11 insertions, 46 deletions
diff --git a/sys/net/if_gre.c b/sys/net/if_gre.c index cf5b51292a6..72e8f467da6 100644 --- a/sys/net/if_gre.c +++ b/sys/net/if_gre.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_gre.c,v 1.164 2021/01/19 07:31:47 mvs Exp $ */ +/* $OpenBSD: if_gre.c,v 1.165 2021/02/20 05:01:33 dlg Exp $ */ /* $NetBSD: if_gre.c,v 1.9 1999/10/25 19:18:11 drochner Exp $ */ /* @@ -590,6 +590,8 @@ gre_clone_create(struct if_clone *ifc, int unit) ifp->if_mtu = GREMTU; ifp->if_flags = IFF_POINTOPOINT|IFF_MULTICAST; ifp->if_xflags = IFXF_CLONED; + ifp->if_bpf_mtap = p2p_bpf_mtap; + ifp->if_input = p2p_input; ifp->if_output = gre_output; ifp->if_start = gre_start; ifp->if_ioctl = gre_ioctl; @@ -659,6 +661,8 @@ mgre_clone_create(struct if_clone *ifc, int unit) ifp->if_mtu = GREMTU; ifp->if_flags = IFF_MULTICAST|IFF_SIMPLEX; ifp->if_xflags = IFXF_CLONED; + ifp->if_bpf_mtap = p2p_bpf_mtap; + ifp->if_input = p2p_input; ifp->if_rtrequest = mgre_rtrequest; ifp->if_output = mgre_output; ifp->if_start = mgre_start; @@ -1006,12 +1010,8 @@ gre_input_key(struct mbuf **mp, int *offp, int type, int af, uint8_t otos, caddr_t buf; struct gre_header *gh; struct gre_h_key *gkh; - void (*input)(struct ifnet *, struct mbuf *); struct mbuf *(*patch)(const struct gre_tunnel *, struct mbuf *, uint8_t *, uint8_t); -#if NBPFILTER > 0 - int bpf_af = AF_UNSPEC; /* bpf */ -#endif int mcast = 0; uint8_t itos; @@ -1114,19 +1114,13 @@ gre_input_key(struct mbuf **mp, int *offp, int type, int af, uint8_t otos, /* FALLTHROUGH */ } case htons(ETHERTYPE_IP): -#if NBPFILTER > 0 - bpf_af = AF_INET; -#endif + m->m_pkthdr.ph_family = AF_INET; patch = gre_ipv4_patch; - input = ipv4_input; break; #ifdef INET6 case htons(ETHERTYPE_IPV6): -#if NBPFILTER > 0 - bpf_af = AF_INET6; -#endif + m->m_pkthdr.ph_family = AF_INET6; patch = gre_ipv6_patch; - input = ipv6_input; break; #endif #ifdef MPLS @@ -1134,11 +1128,8 @@ gre_input_key(struct mbuf **mp, int *offp, int type, int af, uint8_t otos, mcast = M_MCAST|M_BCAST; /* fallthrough */ case htons(ETHERTYPE_MPLS): -#if NBPFILTER > 0 - bpf_af = AF_MPLS; -#endif + m->m_pkthdr.ph_family = AF_MPLS; patch = gre_mpls_patch; - input = mpls_input; break; #endif case htons(0): @@ -1189,22 +1180,8 @@ gre_input_key(struct mbuf **mp, int *offp, int type, int af, uint8_t otos, m->m_flags &= ~(M_MCAST|M_BCAST); m->m_flags |= mcast; - m->m_pkthdr.ph_ifidx = ifp->if_index; - m->m_pkthdr.ph_rtableid = ifp->if_rdomain; - -#if NPF > 0 - pf_pkt_addr_changed(m); -#endif - - counters_pkt(ifp->if_counters, - ifc_ipackets, ifc_ibytes, m->m_pkthdr.len); - -#if NBPFILTER > 0 - if (ifp->if_bpf) - bpf_mtap_af(ifp->if_bpf, bpf_af, m, BPF_DIRECTION_IN); -#endif - (*input)(ifp, m); + if_vinput(ifp, m); return (IPPROTO_DONE); decline: *mp = m; @@ -1333,10 +1310,6 @@ egre_input(const struct gre_tunnel *key, struct mbuf *m, int hlen, uint8_t otos) m->m_flags &= ~(M_MCAST|M_BCAST); -#if NPF > 0 - pf_pkt_addr_changed(m); -#endif - gre_l2_prio(&sc->sc_tunnel, m, otos); if_vinput(&sc->sc_ac.ac_if, m); @@ -1581,13 +1554,9 @@ nvgre_input(const struct gre_tunnel *key, struct mbuf *m, int hlen, SET(m->m_pkthdr.csum_flags, M_FLOWID); m->m_pkthdr.ph_flowid = bemtoh32(&key->t_key) & ~GRE_KEY_ENTROPY; - gre_l2_prio(&sc->sc_tunnel, m, otos); - m->m_flags &= ~(M_MCAST|M_BCAST); -#if NPF > 0 - pf_pkt_addr_changed(m); -#endif + gre_l2_prio(&sc->sc_tunnel, m, otos); if_vinput(&sc->sc_ac.ac_if, m); @@ -4213,13 +4182,9 @@ eoip_input(struct gre_tunnel *key, struct mbuf *m, if (m->m_pkthdr.len != len) m_adj(m, len - m->m_pkthdr.len); - gre_l2_prio(&sc->sc_tunnel, m, otos); - m->m_flags &= ~(M_MCAST|M_BCAST); -#if NPF > 0 - pf_pkt_addr_changed(m); -#endif + gre_l2_prio(&sc->sc_tunnel, m, otos); if_vinput(&sc->sc_ac.ac_if, m); |