On Tue, May 30, 2017 at 09:27:28AM +0200, Martin Pieuchot wrote:
> Here's a simple refactoring diff to simplify the next one.  The upcoming
> diff will be unlocking IP forwarding paths, so I want to keep it as
> small as possible.
> 
> The idea of the refactoring below is to introduce two wrappers functions
> around IP queues.  In the next iteration they will call the protocol
> function directly.
> 
> ok?

Totally, makes switching a lot easier. Go  for it.

 
> Index: dev/usb/if_umb.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/usb/if_umb.c,v
> retrieving revision 1.13
> diff -u -p -r1.13 if_umb.c
> --- dev/usb/if_umb.c  18 May 2017 14:48:27 -0000      1.13
> +++ dev/usb/if_umb.c  30 May 2017 07:23:02 -0000
> @@ -768,7 +768,6 @@ umb_output(struct ifnet *ifp, struct mbu
>  int
>  umb_input(struct ifnet *ifp, struct mbuf *m, void *cookie)
>  {
> -     struct niqueue *inq;
>       uint8_t ipv;
>  
>       if ((ifp->if_flags & IFF_UP) == 0) {
> @@ -789,12 +788,12 @@ umb_input(struct ifnet *ifp, struct mbuf
>       ifp->if_ibytes += m->m_pkthdr.len;
>       switch (ipv) {
>       case 4:
> -             inq = &ipintrq;
> -             break;
> +             ipv4_input(ifp, m);
> +             return 1;
>  #ifdef INET6
>       case 6:
> -             inq = &ip6intrq;
> -             break;
> +             ipv6_input(ifp, m);
> +             return 1;
>  #endif /* INET6 */
>       default:
>               ifp->if_ierrors++;
> @@ -803,7 +802,6 @@ umb_input(struct ifnet *ifp, struct mbuf
>               m_freem(m);
>               return 1;
>       }
> -     niq_enqueue(inq, m);
>       return 1;
>  }
>  
> Index: net/if.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if.c,v
> retrieving revision 1.501
> diff -u -p -r1.501 if.c
> --- net/if.c  30 May 2017 06:42:13 -0000      1.501
> +++ net/if.c  30 May 2017 07:23:02 -0000
> @@ -734,8 +734,6 @@ if_input(struct ifnet *ifp, struct mbuf_
>  int
>  if_input_local(struct ifnet *ifp, struct mbuf *m, sa_family_t af)
>  {
> -     struct niqueue *ifq = NULL;
> -
>  #if NBPFILTER > 0
>       /*
>        * Only send packets to bpf if they are destinated to local
> @@ -758,33 +756,28 @@ if_input_local(struct ifnet *ifp, struct
>       ifp->if_opackets++;
>       ifp->if_obytes += m->m_pkthdr.len;
>  
> +     ifp->if_ipackets++;
> +     ifp->if_ibytes += m->m_pkthdr.len;
> +
>       switch (af) {
>       case AF_INET:
> -             ifq = &ipintrq;
> +             ipv4_input(ifp, m);
>               break;
>  #ifdef INET6
>       case AF_INET6:
> -             ifq = &ip6intrq;
> +             ipv6_input(ifp, m);
>               break;
>  #endif /* INET6 */
>  #ifdef MPLS
>       case AF_MPLS:
> -             ifp->if_ipackets++;
> -             ifp->if_ibytes += m->m_pkthdr.len;
>               mpls_input(m);
> -             return (0);
> +             break;
>  #endif /* MPLS */
>       default:
>               printf("%s: can't handle af%d\n", ifp->if_xname, af);
>               m_freem(m);
>               return (EAFNOSUPPORT);
>       }
> -
> -     if (niq_enqueue(ifq, m) != 0)
> -             return (ENOBUFS);
> -
> -     ifp->if_ipackets++;
> -     ifp->if_ibytes += m->m_pkthdr.len;
>  
>       return (0);
>  }
> Index: net/if_ethersubr.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if_ethersubr.c,v
> retrieving revision 1.244
> diff -u -p -r1.244 if_ethersubr.c
> --- net/if_ethersubr.c        28 May 2017 12:51:34 -0000      1.244
> +++ net/if_ethersubr.c        30 May 2017 07:23:02 -0000
> @@ -374,8 +374,8 @@ ether_input(struct ifnet *ifp, struct mb
>  decapsulate:
>       switch (etype) {
>       case ETHERTYPE_IP:
> -             inq = &ipintrq;
> -             break;
> +             ipv4_input(ifp, m);
> +             return (1);
>  
>       case ETHERTYPE_ARP:
>               if (ifp->if_flags & IFF_NOARP)
> @@ -394,8 +394,8 @@ decapsulate:
>        * Schedule IPv6 software interrupt for incoming IPv6 packet.
>        */
>       case ETHERTYPE_IPV6:
> -             inq = &ip6intrq;
> -             break;
> +             ipv6_input(ifp, m);
> +             return (1);
>  #endif /* INET6 */
>  #if NPPPOE > 0 || defined(PIPEX)
>       case ETHERTYPE_PPPOEDISC:
> Index: net/if_mpe.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if_mpe.c,v
> retrieving revision 1.59
> diff -u -p -r1.59 if_mpe.c
> --- net/if_mpe.c      4 May 2017 15:00:24 -0000       1.59
> +++ net/if_mpe.c      30 May 2017 07:23:02 -0000
> @@ -396,7 +396,7 @@ mpe_input(struct mbuf *m, struct ifnet *
>               bpf_mtap_af(ifp->if_bpf, AF_INET, m, BPF_DIRECTION_IN);
>  #endif
>  
> -     niq_enqueue(&ipintrq, m);
> +     ipv4_input(ifp, m);
>  }
>  
>  #ifdef INET6
> @@ -428,6 +428,6 @@ mpe_input6(struct mbuf *m, struct ifnet 
>               bpf_mtap_af(ifp->if_bpf, AF_INET6, m, BPF_DIRECTION_IN);
>  #endif
>  
> -     niq_enqueue(&ip6intrq, m);
> +     ipv6_input(ifp, m);
>  }
>  #endif       /* INET6 */
> Index: net/if_ppp.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if_ppp.c,v
> retrieving revision 1.107
> diff -u -p -r1.107 if_ppp.c
> --- net/if_ppp.c      27 May 2017 18:39:17 -0000      1.107
> +++ net/if_ppp.c      30 May 2017 07:23:02 -0000
> @@ -1396,10 +1396,8 @@ ppp_inproc(struct ppp_softc *sc, struct 
>               m->m_data += PPP_HDRLEN;
>               m->m_len -= PPP_HDRLEN;
>  
> -             if (niq_enqueue(&ipintrq, m) != 0)
> -                     rv = 0; /* failure */
> -             else
> -                     rv = 1; /* ipintrq success */
> +             ipv4_input(ifp, m);
> +             rv = 1;
>               break;
>  
>       default:
> Index: net/if_pppx.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if_pppx.c,v
> retrieving revision 1.60
> diff -u -p -r1.60 if_pppx.c
> --- net/if_pppx.c     28 May 2017 18:43:51 -0000      1.60
> +++ net/if_pppx.c     30 May 2017 07:23:03 -0000
> @@ -318,7 +318,6 @@ pppxwrite(dev_t dev, struct uio *uio, in
>       struct pppx_if  *pxi;
>       uint32_t proto;
>       struct mbuf *top, **mp, *m;
> -     struct niqueue *ifq;
>       int tlen;
>       int error = 0;
>       size_t mlen;
> @@ -396,20 +395,17 @@ pppxwrite(dev_t dev, struct uio *uio, in
>  
>       switch (proto) {
>       case AF_INET:
> -             ifq = &ipintrq;
> +             ipv4_input(&pxi->pxi_if, top);
>               break;
>  #ifdef INET6
>       case AF_INET6:
> -             ifq = &ip6intrq;
> +             ipv6_input(&pxi->pxi_if, top);
>               break;
>  #endif
>       default:
>               m_freem(top);
>               return (EAFNOSUPPORT);
>       }
> -
> -     if (niq_enqueue(ifq, top) != 0)
> -             return (ENOBUFS);
>  
>       return (error);
>  }
> Index: net/if_spppsubr.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if_spppsubr.c,v
> retrieving revision 1.163
> diff -u -p -r1.163 if_spppsubr.c
> --- net/if_spppsubr.c 14 Apr 2017 15:11:31 -0000      1.163
> +++ net/if_spppsubr.c 30 May 2017 07:23:03 -0000
> @@ -58,8 +58,6 @@
>  #include <netinet/in.h>
>  #include <netinet/in_var.h>
>  #include <netinet/ip.h>
> -#include <netinet/tcp.h>
> -#include <netinet/if_ether.h>
>  
>  #ifdef INET6
>  #include <netinet6/in6_ifattach.h>
> @@ -417,7 +415,6 @@ void
>  sppp_input(struct ifnet *ifp, struct mbuf *m)
>  {
>       struct ppp_header ht;
> -     struct niqueue *inq = NULL;
>       struct sppp *sp = (struct sppp *)ifp;
>       struct timeval tv;
>       int debug = ifp->if_flags & IFF_DEBUG;
> @@ -438,7 +435,6 @@ sppp_input(struct ifnet *ifp, struct mbu
>                           SPP_ARGS(ifp), m->m_pkthdr.len);
>         drop:
>               m_freem (m);
> -       dropped:
>               ++ifp->if_ierrors;
>               ++ifp->if_iqdrops;
>               return;
> @@ -503,8 +499,11 @@ sppp_input(struct ifnet *ifp, struct mbu
>                       return;
>               case PPP_IP:
>                       if (sp->state[IDX_IPCP] == STATE_OPENED) {
> -                             inq = &ipintrq;
>                               sp->pp_last_activity = tv.tv_sec;
> +                             if (ifp->if_flags & IFF_UP) {
> +                                     ipv4_input(ifp, m);
> +                                     return;
> +                             }
>                       }
>                       break;
>  #ifdef INET6
> @@ -515,8 +514,11 @@ sppp_input(struct ifnet *ifp, struct mbu
>                       return;
>               case PPP_IPV6:
>                       if (sp->state[IDX_IPV6CP] == STATE_OPENED) {
> -                             inq = &ip6intrq;
>                               sp->pp_last_activity = tv.tv_sec;
> +                             if (ifp->if_flags & IFF_UP) {
> +                                     ipv6_input(ifp, m);
> +                                     return;
> +                             }
>                       }
>                       break;
>  #endif
> @@ -533,16 +535,7 @@ sppp_input(struct ifnet *ifp, struct mbu
>               goto drop;
>       }
>  
> -     if (! (ifp->if_flags & IFF_UP) || ! inq)
> -             goto drop;
> -
> -     if (niq_enqueue(inq, m) != 0) {
> -             /* Queue overflow. */
> -             if (debug)
> -                     log(LOG_DEBUG, SPP_FMT "protocol queue overflow\n",
> -                             SPP_ARGS(ifp));
> -             goto dropped;
> -     }
> +     goto drop;
>  }
>  
>  /*
> Index: net/if_tun.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if_tun.c,v
> retrieving revision 1.174
> diff -u -p -r1.174 if_tun.c
> --- net/if_tun.c      27 May 2017 06:44:14 -0000      1.174
> +++ net/if_tun.c      30 May 2017 07:23:03 -0000
> @@ -835,7 +835,6 @@ int
>  tun_dev_write(struct tun_softc *tp, struct uio *uio, int ioflag)
>  {
>       struct ifnet            *ifp;
> -     struct niqueue          *ifq;
>       u_int32_t               *th;
>       struct mbuf             *top, **mp, *m;
>       int                     error = 0, tlen;
> @@ -928,27 +927,22 @@ tun_dev_write(struct tun_softc *tp, stru
>       top->m_pkthdr.ph_rtableid = ifp->if_rdomain;
>       top->m_pkthdr.ph_ifidx = ifp->if_index;
>  
> +     ifp->if_ipackets++;
> +     ifp->if_ibytes += top->m_pkthdr.len;
> +
>       switch (ntohl(*th)) {
>       case AF_INET:
> -             ifq = &ipintrq;
> +             ipv4_input(ifp, top);
>               break;
>  #ifdef INET6
>       case AF_INET6:
> -             ifq = &ip6intrq;
> +             ipv6_input(ifp, top);
>               break;
>  #endif
>       default:
>               m_freem(top);
>               return (EAFNOSUPPORT);
>       }
> -
> -     if (niq_enqueue(ifq, top) != 0) {
> -             ifp->if_collisions++;
> -             return (ENOBUFS);
> -     }
> -
> -     ifp->if_ipackets++;
> -     ifp->if_ibytes += top->m_pkthdr.len;
>  
>       return (error);
>  }
> Index: net/pipex.c
> ===================================================================
> RCS file: /cvs/src/sys/net/pipex.c,v
> retrieving revision 1.100
> diff -u -p -r1.100 pipex.c
> --- net/pipex.c       28 May 2017 20:48:29 -0000      1.100
> +++ net/pipex.c       30 May 2017 07:23:03 -0000
> @@ -1096,20 +1096,15 @@ pipex_ip_input(struct mbuf *m0, struct p
>               bpf_mtap_af(ifp->if_bpf, AF_INET, m0, BPF_DIRECTION_IN);
>  #endif
>  
> -     if (niq_enqueue(&ipintrq, m0) != 0) {
> -             ifp->if_collisions++;
> -             goto dropped;
> -     }
> -
>       ifp->if_ipackets++;
>       ifp->if_ibytes += len;
>       session->stat.ipackets++;
>       session->stat.ibytes += len;
> +     ipv4_input(ifp, m0);
>  
>       return;
>  drop:
>       m_freem(m0);
> -dropped:
>       session->stat.ierrors++;
>  }
>  
> @@ -1147,19 +1142,11 @@ pipex_ip6_input(struct mbuf *m0, struct 
>               bpf_mtap_af(ifp->if_bpf, AF_INET6, m0, BPF_DIRECTION_IN);
>  #endif
>  
> -     if (niq_enqueue(&ip6intrq, m0) != 0) {
> -             ifp->if_collisions++;
> -             goto dropped;
> -     }
> -
>       ifp->if_ipackets++;
>       ifp->if_ibytes += len;
>       session->stat.ipackets++;
>       session->stat.ibytes += len;
> -
> -     return;
> -dropped:
> -     session->stat.ierrors++;
> +     ipv6_input(ifp, m0);
>  }
>  #endif
>  
> Index: netinet/in.h
> ===================================================================
> RCS file: /cvs/src/sys/netinet/in.h,v
> retrieving revision 1.122
> diff -u -p -r1.122 in.h
> --- netinet/in.h      4 May 2017 15:00:24 -0000       1.122
> +++ netinet/in.h      30 May 2017 07:23:03 -0000
> @@ -800,7 +800,6 @@ __END_DECLS
>  
>  #ifdef _KERNEL
>  extern          int inetctlerrmap[];
> -extern          struct niqueue ipintrq;      /* ip packet input queue */
>  extern          struct in_addr zeroin_addr;
>  
>  struct mbuf;
> @@ -808,6 +807,8 @@ struct sockaddr;
>  struct sockaddr_in;
>  struct ifaddr;
>  struct in_ifaddr;
> +
> +void    ipv4_input(struct ifnet *, struct mbuf *);
>  
>  int     in_broadcast(struct in_addr, u_int);
>  int     in_canforward(struct in_addr);
> Index: netinet/ip_divert.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_divert.c,v
> retrieving revision 1.46
> diff -u -p -r1.46 ip_divert.c
> --- netinet/ip_divert.c       5 Apr 2017 13:35:18 -0000       1.46
> +++ netinet/ip_divert.c       30 May 2017 07:23:03 -0000
> @@ -134,6 +134,7 @@ divert_output(struct inpcb *inp, struct 
>  
>       if (dir == PF_IN) {
>               ipaddr.sin_addr = sin->sin_addr;
> +             /* XXXSMP ifa_ifwithaddr() is not safe. */
>               ifa = ifa_ifwithaddr(sintosa(&ipaddr), m->m_pkthdr.ph_rtableid);
>               if (ifa == NULL) {
>                       error = EADDRNOTAVAIL;
> @@ -150,7 +151,8 @@ divert_output(struct inpcb *inp, struct 
>               ip->ip_sum = in_cksum(m, off);
>               in_proto_cksum_out(m, NULL);
>  
> -             niq_enqueue(&ipintrq, m);
> +             /* XXXSMP ``ifa'' is not reference counted. */
> +             ipv4_input(ifa->ifa_ifp, m);
>       } else {
>               error = ip_output(m, NULL, &inp->inp_route,
>                   IP_ALLOWBROADCAST | IP_RAWOUTPUT, NULL, NULL, 0);
> Index: netinet/ip_gre.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_gre.c,v
> retrieving revision 1.64
> diff -u -p -r1.64 ip_gre.c
> --- netinet/ip_gre.c  4 May 2017 17:58:46 -0000       1.64
> +++ netinet/ip_gre.c  30 May 2017 07:23:03 -0000
> @@ -93,7 +93,6 @@ int
>  gre_input2(struct mbuf *m, int hlen, int proto)
>  {
>       struct greip *gip;
> -     struct niqueue *ifq;
>       struct gre_softc *sc;
>       u_short flags;
>       u_int af;
> @@ -160,13 +159,11 @@ gre_input2(struct mbuf *m, int hlen, int
>                        */
>                       if (gre_wccp == 2) 
>                               hlen += 4;
> -             case ETHERTYPE_IP: /* shouldn't need a schednetisr(), as */
> -                     ifq = &ipintrq;          /* we are in ip_input */
> +             case ETHERTYPE_IP:
>                       af = AF_INET;
>                       break;
>  #ifdef INET6
>               case ETHERTYPE_IPV6:
> -                     ifq = &ip6intrq;
>                       af = AF_INET6;
>                       break;
>  #endif
> @@ -205,7 +202,19 @@ gre_input2(struct mbuf *m, int hlen, int
>       pf_pkt_addr_changed(m);
>  #endif
>  
> -     niq_enqueue(ifq, m);
> +     switch (af) {
> +     case AF_INET:
> +             ipv4_input(&sc->sc_if, m);
> +             break;
> +#ifdef INET6
> +     case AF_INET6:
> +             ipv6_input(&sc->sc_if, m);
> +             break;
> +#endif
> +     default:
> +             return (0);
> +     }
> +
>  
>       return (1);     /* packet is done, no further processing needed */
>  }
> @@ -334,7 +343,7 @@ gre_mobile_input(struct mbuf **mp, int *
>       pf_pkt_addr_changed(m);
>  #endif
>  
> -     niq_enqueue(&ipintrq, m);
> +     ipv4_input(&sc->sc_if, m);
>       return IPPROTO_DONE;
>  }
>  
> Index: netinet/ip_input.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_input.c,v
> retrieving revision 1.307
> diff -u -p -r1.307 ip_input.c
> --- netinet/ip_input.c        29 May 2017 14:36:22 -0000      1.307
> +++ netinet/ip_input.c        30 May 2017 07:23:03 -0000
> @@ -208,6 +208,12 @@ ip_init(void)
>  }
>  
>  void
> +ipv4_input(struct ifnet *ifp, struct mbuf *m)
> +{
> +     niq_enqueue(&ipintrq, m);
> +}
> +
> +void
>  ipintr(void)
>  {
>       struct mbuf *m;
> @@ -221,7 +227,7 @@ ipintr(void)
>               if ((m->m_flags & M_PKTHDR) == 0)
>                       panic("ipintr no HDR");
>  #endif
> -             ipv4_input(m);
> +             ip_input(m);
>       }
>  }
>  
> @@ -231,7 +237,7 @@ ipintr(void)
>   * Checksum and byte swap header.  Process options. Forward or deliver.
>   */
>  void
> -ipv4_input(struct mbuf *m)
> +ip_input(struct mbuf *m)
>  {
>       struct ifnet    *ifp;
>       struct rtentry  *rt = NULL;
> Index: netinet/ip_ipip.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_ipip.c,v
> retrieving revision 1.81
> diff -u -p -r1.81 ip_ipip.c
> --- netinet/ip_ipip.c 28 May 2017 13:59:05 -0000      1.81
> +++ netinet/ip_ipip.c 30 May 2017 07:23:03 -0000
> @@ -122,7 +122,6 @@ ipip_input_gif(struct mbuf **mp, int *of
>       struct mbuf *m = *mp;
>       struct sockaddr_in *sin;
>       struct ifnet *ifp;
> -     struct niqueue *ifq = NULL;
>       struct ip *ip;
>  #ifdef INET6
>       struct sockaddr_in6 *sin6;
> @@ -319,22 +318,17 @@ ipip_input_gif(struct mbuf **mp, int *of
>  
>       switch (proto) {
>       case IPPROTO_IPV4:
> -             ifq = &ipintrq;
> +             ipv4_input(ifp, m);
>               break;
>  #ifdef INET6
>       case IPPROTO_IPV6:
> -             ifq = &ip6intrq;
> +             ipv6_input(ifp, m);
>               break;
>  #endif
>       default:
>               panic("%s: should never reach here", __func__);
>       }
>  
> -     if (niq_enqueue(ifq, m) != 0) {
> -             ipipstat_inc(ipips_qfull);
> -             DPRINTF(("%s: packet dropped because of full queue\n",
> -                 __func__));
> -     }
>       return IPPROTO_DONE;
>  }
>  
> Index: netinet/ip_var.h
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_var.h,v
> retrieving revision 1.76
> diff -u -p -r1.76 ip_var.h
> --- netinet/ip_var.h  28 May 2017 09:25:51 -0000      1.76
> +++ netinet/ip_var.h  30 May 2017 07:23:04 -0000
> @@ -248,7 +248,7 @@ int        ip_sysctl(int *, u_int, void *, siz
>  void  ip_savecontrol(struct inpcb *, struct mbuf **, struct ip *,
>           struct mbuf *);
>  void  ipintr(void);
> -void  ipv4_input(struct mbuf *);
> +void  ip_input(struct mbuf *);
>  void  ip_deliver(struct mbuf **, int *, int, int);
>  void  ip_forward(struct mbuf *, struct ifnet *, struct rtentry *, int);
>  int   rip_ctloutput(int, struct socket *, int, int, struct mbuf *);
> Index: netinet6/in6.h
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/in6.h,v
> retrieving revision 1.94
> diff -u -p -r1.94 in6.h
> --- netinet6/in6.h    4 May 2017 15:00:24 -0000       1.94
> +++ netinet6/in6.h    30 May 2017 07:23:04 -0000
> @@ -405,7 +405,6 @@ typedef   __socklen_t     socklen_t;      /* length
>  
>  #ifdef _KERNEL
>  extern       u_char inet6ctlerrmap[];
> -extern       struct niqueue ip6intrq;        /* IP6 packet input queue */
>  extern       struct in6_addr zeroin6_addr;
>  
>  struct mbuf;
> @@ -712,6 +711,8 @@ ifatoia6(struct ifaddr *ifa)
>  
>  __BEGIN_DECLS
>  struct cmsghdr;
> +
> +void    ipv6_input(struct ifnet *, struct mbuf *);
>  
>  extern int inet6_opt_init(void *, socklen_t);
>  extern int inet6_opt_append(void *, socklen_t, int, u_int8_t,
> Index: netinet6/ip6_divert.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/ip6_divert.c,v
> retrieving revision 1.46
> diff -u -p -r1.46 ip6_divert.c
> --- netinet6/ip6_divert.c     13 Mar 2017 20:18:21 -0000      1.46
> +++ netinet6/ip6_divert.c     30 May 2017 07:23:04 -0000
> @@ -139,6 +139,7 @@ divert6_output(struct inpcb *inp, struct
>  
>       if (dir == PF_IN) {
>               ip6addr.sin6_addr = sin6->sin6_addr;
> +             /* XXXSMP ``ifa'' is not reference counted. */
>               ifa = ifa_ifwithaddr(sin6tosa(&ip6addr),
>                   m->m_pkthdr.ph_rtableid);
>               if (ifa == NULL) {
> @@ -154,7 +155,8 @@ divert6_output(struct inpcb *inp, struct
>                */
>               in6_proto_cksum_out(m, NULL);
>  
> -             niq_enqueue(&ip6intrq, m); /* return error on q full? */
> +             /* XXXSMP ``ifa'' is not reference counted. */
> +             ipv6_input(ifa->ifa_ifp, m);
>       } else {
>               error = ip6_output(m, NULL, &inp->inp_route6,
>                   IP_ALLOWBROADCAST | IP_RAWOUTPUT, NULL, NULL);
> Index: netinet6/ip6_input.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/ip6_input.c,v
> retrieving revision 1.191
> diff -u -p -r1.191 ip6_input.c
> --- netinet6/ip6_input.c      29 May 2017 14:36:22 -0000      1.191
> +++ netinet6/ip6_input.c      30 May 2017 07:23:04 -0000
> @@ -160,6 +160,12 @@ ip6_init(void)
>       ip6counters = counters_alloc(ip6s_ncounters);
>  }
>  
> +void
> +ipv6_input(struct ifnet *ifp, struct mbuf *m)
> +{
> +     niq_enqueue(&ip6intrq, m);
> +}
> +
>  /*
>   * IP6 input interrupt handling. Just pass the packet to ip6_input.
>   */
> Index: netmpls/mpls_input.c
> ===================================================================
> RCS file: /cvs/src/sys/netmpls/mpls_input.c,v
> retrieving revision 1.59
> diff -u -p -r1.59 mpls_input.c
> --- netmpls/mpls_input.c      2 Mar 2017 03:09:50 -0000       1.59
> +++ netmpls/mpls_input.c      30 May 2017 07:23:04 -0000
> @@ -121,14 +121,26 @@ mpls_input(struct mbuf *m)
>  do_v4:
>                               if (mpls_ip_adjttl(m, ttl))
>                                       return;
> -                             niq_enqueue(&ipintrq, m);
> +                             ifp = if_get(m->m_pkthdr.ph_ifidx);
> +                             if (ifp == NULL) {
> +                                     m_freem(m);
> +                                     return;
> +                             }
> +                             ipv4_input(ifp, m);
> +                             if_put(ifp);
>                               return;
>  #ifdef INET6
>                       case MPLS_LABEL_IPV6NULL:
>  do_v6:
>                               if (mpls_ip6_adjttl(m, ttl))
>                                       return;
> -                             niq_enqueue(&ip6intrq, m);
> +                             ifp = if_get(m->m_pkthdr.ph_ifidx);
> +                             if (ifp == NULL) {
> +                                     m_freem(m);
> +                                     return;
> +                             }
> +                             ipv6_input(ifp, m);
> +                             if_put(ifp);
>                               return;
>  #endif       /* INET6 */
>                       case MPLS_LABEL_IMPLNULL:
> 

-- 
:wq Claudio

Reply via email to