On Mon, Jan 08, 2018 at 11:49:05AM +1000, David Gwynne wrote:
> i want this so it makes mpls_input have the same function signature
> as all the other protocol input functions we care about.
>
> it also helps mpls_input because it looks up the interface the mpls
> packet was received on, but it's always called by the interface
> that the packet was receieved on.
>
> on a related note, does anyone have an opinion on what a representative
> mpls test setup looks like?
>
> anyway, ok?
OK bluhm@
> Index: net/if.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if.c,v
> retrieving revision 1.534
> diff -u -p -r1.534 if.c
> --- net/if.c 4 Jan 2018 10:48:02 -0000 1.534
> +++ net/if.c 8 Jan 2018 01:43:50 -0000
> @@ -756,7 +756,7 @@ if_input_local(struct ifnet *ifp, struct
> #endif /* INET6 */
> #ifdef MPLS
> case AF_MPLS:
> - mpls_input(m);
> + mpls_input(ifp, m);
> break;
> #endif /* MPLS */
> default:
> Index: net/if_ethersubr.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if_ethersubr.c,v
> retrieving revision 1.248
> diff -u -p -r1.248 if_ethersubr.c
> --- net/if_ethersubr.c 4 Jan 2018 00:33:54 -0000 1.248
> +++ net/if_ethersubr.c 8 Jan 2018 01:43:50 -0000
> @@ -434,7 +434,7 @@ ether_input(struct ifnet *ifp, struct mb
> #ifdef MPLS
> case ETHERTYPE_MPLS:
> case ETHERTYPE_MPLS_MCAST:
> - mpls_input(m);
> + mpls_input(ifp, m);
> return (1);
> #endif
> default:
> Index: netinet/ip_ether.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_ether.c,v
> retrieving revision 1.97
> diff -u -p -r1.97 ip_ether.c
> --- netinet/ip_ether.c 20 Nov 2017 10:35:24 -0000 1.97
> +++ netinet/ip_ether.c 8 Jan 2018 01:43:50 -0000
> @@ -130,7 +130,7 @@ mplsip_decap(struct mbuf *m, int iphlen)
> pf_pkt_addr_changed(m);
> #endif
>
> - mpls_input(m);
> + mpls_input(&sc->gif_if, m);
> }
>
> struct gif_softc *
> Index: netinet/ip_gre.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_gre.c,v
> retrieving revision 1.68
> diff -u -p -r1.68 ip_gre.c
> --- netinet/ip_gre.c 20 Nov 2017 10:35:24 -0000 1.68
> +++ netinet/ip_gre.c 8 Jan 2018 01:43:50 -0000
> @@ -175,7 +175,7 @@ gre_input2(struct mbuf *m, int hlen, int
> #ifdef MPLS
> case ETHERTYPE_MPLS:
> case ETHERTYPE_MPLS_MCAST:
> - mpls_input(m);
> + mpls_input(&sc->sc_if, m);
> return (1);
> #endif
> default: /* others not yet supported */
> Index: netmpls/mpls.h
> ===================================================================
> RCS file: /cvs/src/sys/netmpls/mpls.h,v
> retrieving revision 1.37
> diff -u -p -r1.37 mpls.h
> --- netmpls/mpls.h 28 Feb 2017 07:07:07 -0000 1.37
> +++ netmpls/mpls.h 8 Jan 2018 01:43:50 -0000
> @@ -185,6 +185,6 @@ struct mbuf *mpls_shim_push(struct mbuf
>
> int mpls_output(struct ifnet *, struct mbuf *, struct sockaddr *,
> struct rtentry *);
> -void mpls_input(struct mbuf *);
> +void mpls_input(struct ifnet *, struct mbuf *);
>
> #endif /* _KERNEL */
> Index: netmpls/mpls_input.c
> ===================================================================
> RCS file: /cvs/src/sys/netmpls/mpls_input.c,v
> retrieving revision 1.65
> diff -u -p -r1.65 mpls_input.c
> --- netmpls/mpls_input.c 8 Dec 2017 22:10:34 -0000 1.65
> +++ netmpls/mpls_input.c 8 Jan 2018 01:43:50 -0000
> @@ -53,36 +53,32 @@ struct mbuf *mpls_ip6_adjttl(struct mbuf
> struct mbuf *mpls_do_error(struct mbuf *, int, int, int);
>
> void
> -mpls_input(struct mbuf *m)
> +mpls_input(struct ifnet *ifp, struct mbuf *m)
> {
> struct sockaddr_mpls *smpls;
> struct sockaddr_mpls sa_mpls;
> struct shim_hdr *shim;
> struct rtentry *rt;
> struct rt_mpls *rt_mpls;
> - struct ifnet *ifp;
> u_int8_t ttl;
> int hasbos;
>
> - if ((ifp = if_get(m->m_pkthdr.ph_ifidx)) == NULL ||
> - !ISSET(ifp->if_xflags, IFXF_MPLS)) {
> + if (!ISSET(ifp->if_xflags, IFXF_MPLS)) {
> m_freem(m);
> - if_put(ifp);
> return;
> }
>
> /* drop all broadcast and multicast packets */
> if (m->m_flags & (M_BCAST | M_MCAST)) {
> m_freem(m);
> - if_put(ifp);
> return;
> }
>
> - if (m->m_len < sizeof(*shim))
> - if ((m = m_pullup(m, sizeof(*shim))) == NULL) {
> - if_put(ifp);
> + if (m->m_len < sizeof(*shim)) {
> + m = m_pullup(m, sizeof(*shim));
> + if (m == NULL)
> return;
> - }
> + }
>
> shim = mtod(m, struct shim_hdr *);
>
> @@ -98,10 +94,9 @@ mpls_input(struct mbuf *m)
> if (ttl-- <= 1) {
> /* TTL exceeded */
> m = mpls_do_error(m, ICMP_TIMXCEED, ICMP_TIMXCEED_INTRANS, 0);
> - if (m == NULL) {
> - if_put(ifp);
> + if (m == NULL)
> return;
> - }
> +
> shim = mtod(m, struct shim_hdr *);
> ttl = ntohl(shim->shim_label & MPLS_TTL_MASK);
> }
> @@ -116,10 +111,8 @@ mpls_input(struct mbuf *m)
>
> if (ntohl(smpls->smpls_label) < MPLS_LABEL_RESERVED_MAX) {
> m = mpls_shim_pop(m);
> - if (m == NULL) {
> - if_put(ifp);
> + if (m == NULL)
> return;
> - }
> if (!hasbos) {
> /*
> * RFC 4182 relaxes the position of the
> @@ -135,30 +128,22 @@ mpls_input(struct mbuf *m)
> switch (ntohl(smpls->smpls_label)) {
> case MPLS_LABEL_IPV4NULL:
> do_v4:
> - if ((m = mpls_ip_adjttl(m, ttl)) == NULL) {
> - if_put(ifp);
> + if ((m = mpls_ip_adjttl(m, ttl)) == NULL)
> return;
> - }
> ipv4_input(ifp, m);
> - if_put(ifp);
> return;
> #ifdef INET6
> case MPLS_LABEL_IPV6NULL:
> do_v6:
> - if ((m = mpls_ip6_adjttl(m, ttl)) == NULL) {
> - if_put(ifp);
> + if ((m = mpls_ip6_adjttl(m, ttl)) == NULL)
> return;
> - }
> ipv6_input(ifp, m);
> - if_put(ifp);
> return;
> #endif /* INET6 */
> case MPLS_LABEL_IMPLNULL:
> if (m->m_len < sizeof(u_char) &&
> - (m = m_pullup(m, sizeof(u_char))) == NULL) {
> - if_put(ifp);
> + (m = m_pullup(m, sizeof(u_char))) == NULL)
> return;
> - }
> switch (*mtod(m, u_char *) >> 4) {
> case IPVERSION:
> goto do_v4;
> @@ -168,18 +153,16 @@ do_v6:
> #endif
> default:
> m_freem(m);
> - if_put(ifp);
> return;
> }
> default:
> /* Other cases are not handled for now */
> m_freem(m);
> - if_put(ifp);
> return;
> }
> }
> }
> - if_put(ifp);
> +
> ifp = NULL;
>
> rt = rtalloc(smplstosa(smpls), RT_RESOLVE, m->m_pkthdr.ph_rtableid);