Diff below factorizes some bits of route_input() into rtm_sendup(), a
function similar to pfkey_sendup().  Both functions will need the same
MP-safeness love, so it makes sense to reduce differences.

Ok?

Index: net/pfkeyv2.c
===================================================================
RCS file: /cvs/src/sys/net/pfkeyv2.c,v
retrieving revision 1.176
diff -u -p -r1.176 pfkeyv2.c
--- net/pfkeyv2.c       19 Feb 2018 08:59:52 -0000      1.176
+++ net/pfkeyv2.c       8 May 2018 09:05:04 -0000
@@ -332,21 +332,21 @@ ret:
 }
 
 int
-pfkey_sendup(struct keycb *kp, struct mbuf *packet, int more)
+pfkey_sendup(struct keycb *kp, struct mbuf *m0, int more)
 {
        struct socket *so = kp->rcb.rcb_socket;
-       struct mbuf *packet2;
+       struct mbuf *m;
 
        NET_ASSERT_LOCKED();
 
        if (more) {
-               if (!(packet2 = m_dup_pkt(packet, 0, M_DONTWAIT)))
+               if (!(m = m_dup_pkt(m0, 0, M_DONTWAIT)))
                        return (ENOMEM);
        } else
-               packet2 = packet;
+               m = m0;
 
-       if (!sbappendaddr(so, &so->so_rcv, &pfkey_addr, packet2, NULL)) {
-               m_freem(packet2);
+       if (!sbappendaddr(so, &so->so_rcv, &pfkey_addr, m, NULL)) {
+               m_freem(m);
                return (ENOBUFS);
        }
 
Index: net/rtsock.c
===================================================================
RCS file: /cvs/src/sys/net/rtsock.c,v
retrieving revision 1.263
diff -u -p -r1.263 rtsock.c
--- net/rtsock.c        24 Apr 2018 06:19:47 -0000      1.263
+++ net/rtsock.c        7 May 2018 21:44:19 -0000
@@ -113,7 +113,8 @@ int route_usrreq(struct socket *, int, s
 void   route_input(struct mbuf *m0, struct socket *, sa_family_t);
 int    route_arp_conflict(struct rtentry *, struct rt_addrinfo *);
 int    route_cleargateway(struct rtentry *, void *, unsigned int);
-void   route_senddesync(void *);
+void   rtm_senddesync(void *);
+int    rtm_sendup(struct socket *, struct mbuf *, int);
 
 int    rtm_getifa(struct rt_addrinfo *, unsigned int);
 int    rtm_output(struct rt_msghdr *, struct rtentry **, struct rt_addrinfo *,
@@ -240,7 +241,7 @@ route_attach(struct socket *so, int prot
        rp = &rop->rcb;
        so->so_pcb = rop;
        /* Init the timeout structure */
-       timeout_set(&rop->timeout, route_senddesync, rop);
+       timeout_set(&rop->timeout, rtm_senddesync, rop);
        refcnt_init(&rop->refcnt);
 
        if (curproc == NULL)
@@ -373,7 +374,7 @@ route_ctloutput(int op, struct socket *s
 }
 
 void
-route_senddesync(void *data)
+rtm_senddesync(void *data)
 {
        struct routecb  *rop;
        struct mbuf     *desync_mbuf;
@@ -479,47 +480,47 @@ route_input(struct mbuf *m0, struct sock
                        continue;
 
                if (last) {
-                       struct mbuf *n;
-                       if ((n = m_copym(m, 0, M_COPYALL, M_NOWAIT)) != NULL) {
-                               if (sbspace(last, &last->so_rcv) < (2*MSIZE) ||
-                                   sbappendaddr(last, &last->so_rcv,
-                                   &route_src, n, (struct mbuf *)NULL) == 0) {
-                                       /*
-                                        * Flag socket as desync'ed and
-                                        * flush required
-                                        */
-                                       sotoroutecb(last)->flags |=
-                                           ROUTECB_FLAG_DESYNC |
-                                           ROUTECB_FLAG_FLUSH;
-                                       route_senddesync(sotoroutecb(last));
-                                       m_freem(n);
-                               } else {
-                                       sorwakeup(last);
-                               }
-                       }
+                       rtm_sendup(last, m, 1);
                        refcnt_rele_wake(&sotoroutecb(last)->refcnt);
                }
                /* keep a reference for last */
                refcnt_take(&rop->refcnt);
                last = rop->rcb.rcb_socket;
        }
+
        if (last) {
-               if (sbspace(last, &last->so_rcv) < (2 * MSIZE) ||
-                   sbappendaddr(last, &last->so_rcv, &route_src,
-                   m, (struct mbuf *)NULL) == 0) {
-                       /* Flag socket as desync'ed and flush required */
-                       sotoroutecb(last)->flags |=
-                           ROUTECB_FLAG_DESYNC | ROUTECB_FLAG_FLUSH;
-                       route_senddesync(sotoroutecb(last));
-                       m_freem(m);
-               } else {
-                       sorwakeup(last);
-               }
+               rtm_sendup(last, m, 0);
                refcnt_rele_wake(&sotoroutecb(last)->refcnt);
        } else
                m_freem(m);
 
        SRPL_LEAVE(&sr);
+}
+
+int
+rtm_sendup(struct socket *so, struct mbuf *m0, int more)
+{
+       struct routecb *rop = sotoroutecb(so);
+       struct mbuf *m;
+
+       if (more) {
+               m = m_copym(m0, 0, M_COPYALL, M_NOWAIT);
+               if (m == NULL)
+                       return (ENOMEM);
+       } else
+               m = m0;
+
+       if (sbspace(so, &so->so_rcv) < (2 * MSIZE) ||
+           sbappendaddr(so, &so->so_rcv, &route_src, m, NULL) == 0) {
+               /* Flag socket as desync'ed and flush required */
+               rop->flags |= ROUTECB_FLAG_DESYNC | ROUTECB_FLAG_FLUSH;
+               rtm_senddesync(rop);
+               m_freem(m);
+               return (ENOBUFS);
+       }
+
+       sorwakeup(so);
+       return (0);
 }
 
 struct rt_msghdr *

Reply via email to