On Sat, Jul 09, 2022 at 10:46:56PM +0900, YASUOKA Masahiko wrote:
> Hello,
> 
> On Sat, 9 Jul 2022 01:43:41 +0300
> Vitaliy Makkoveev <m...@openbsd.org> wrote:
> > On Sat, Jul 09, 2022 at 12:08:49AM +0300, Vitaliy Makkoveev wrote:
> >> Thanks for pointing.
> >> 
> >> > On 8 Jul 2022, at 23:13, Alexander Bluhm <alexander.bl...@gmx.net> wrote:
> >> > 
> >> > On Fri, Jul 08, 2022 at 05:42:23PM +0300, Vitaliy Makkoveev wrote:
> >> >> The update diff below. I also found we need to increment 'pxc_oerrors'
> >> >> counter on `session_tmp' instead of session.
> >> > 
> >> >> +                       m = m_copym(m0, 0, M_COPYALL, M_NOWAIT)
> >> > 
> >> > Does this compile?  There is a ; missing.
> >> > 
> >> > otherwise OK bluhm@
> >> > 
> >> 
> > 
> > The fixed diff. yasuoka@, it this diff ok by you?
> 
> Other than the compile error, ok yasuoka
> 
> but the last diff seems not ok.
> 

Sorry, I sent the previous diff again. There is the right one.

Index: sys/net/pipex.c
===================================================================
RCS file: /cvs/src/sys/net/pipex.c,v
retrieving revision 1.143
diff -u -p -r1.143 pipex.c
--- sys/net/pipex.c     2 Jul 2022 08:50:42 -0000       1.143
+++ sys/net/pipex.c     8 Jul 2022 22:40:44 -0000
@@ -842,20 +842,38 @@ pipex_ip_output(struct mbuf *m0, struct 
 
                m0->m_flags &= ~(M_BCAST|M_MCAST);
 
-               LIST_FOREACH(session_tmp, &pipex_session_list, session_list) {
+               mtx_enter(&pipex_list_mtx);
+
+               session_tmp = LIST_FIRST(&pipex_session_list);
+               while (session_tmp != NULL) {
+                       struct pipex_session *session_save = NULL;
+
                        if (session_tmp->ownersc != session->ownersc)
-                               continue;
+                               goto next;
                        if ((session->flags & (PIPEX_SFLAGS_IP_FORWARD |
                            PIPEX_SFLAGS_IP6_FORWARD)) == 0)
-                               continue;
+                               goto next;
+
+                       refcnt_take(&session_tmp->pxs_refcnt);
+                       mtx_leave(&pipex_list_mtx);
+
                        m = m_copym(m0, 0, M_COPYALL, M_NOWAIT);
-                       if (m == NULL) {
-                               counters_inc(session->stat_counters,
+                       if (m != NULL)
+                               pipex_ppp_output(m, session_tmp, PPP_IP);
+                       else
+                               counters_inc(session_tmp->stat_counters,
                                    pxc_oerrors);
-                               continue;
-                       }
-                       pipex_ppp_output(m, session_tmp, PPP_IP);
+
+                       mtx_enter(&pipex_list_mtx);
+                       session_save = session_tmp;
+next:
+                       session_tmp = LIST_NEXT(session_tmp, session_list);
+                       if (session_save != NULL)
+                               pipex_rele_session(session_save);
                }
+
+               mtx_leave(&pipex_list_mtx);
+
                m_freem(m0);
        }
 

Reply via email to