We destroy pppx(4) related sessions while we performing PIPEXDSESSION
command. But with pppac(4) we set session's state to
PIPEX_STATE_CLOSE_WAIT2 and we wait garbage collector to do destruction.

We removed `pipex{in,out}q'. So we can safe destroy session in any time.
I propose to make pppac(4) session destruction path the same as pppx(4)
does. Now we destroy them while performing PIPEXDSESSION commad too.
Also there is no in-kernel garbage collector for pppac(4) sessions.
yasuoka@ pointed me that npppd(8) should kill expired sessions.

This not only makes pppac(4) closer to pppx(4) but simplify code and
allow us to make safe pppx(4) session processing by pipex_timer().
So this is preparation step to restore in-kernel timeout for pppx(4)
too.


Index: sys/net/pipex.c
===================================================================
RCS file: /cvs/src/sys/net/pipex.c,v
retrieving revision 1.124
diff -u -p -r1.124 pipex.c
--- sys/net/pipex.c     12 Aug 2020 08:41:39 -0000      1.124
+++ sys/net/pipex.c     12 Aug 2020 09:07:12 -0000
@@ -536,29 +536,6 @@ out:
        return error;
 }
 
-int
-pipex_notify_close_session(struct pipex_session *session)
-{
-       NET_ASSERT_LOCKED();
-       session->state = PIPEX_STATE_CLOSE_WAIT;
-       session->stat.idle_time = 0;
-       LIST_INSERT_HEAD(&pipex_close_wait_list, session, state_list);
-
-       return (0);
-}
-
-int
-pipex_notify_close_session_all(void)
-{
-       struct pipex_session *session;
-
-       NET_ASSERT_LOCKED();
-       LIST_FOREACH(session, &pipex_session_list, session_list)
-               if (session->state == PIPEX_STATE_OPENED)
-                       pipex_notify_close_session(session);
-       return (0);
-}
-
 Static int
 pipex_close_session(struct pipex_session_close_req *req,
     struct pipex_iface_context *iface)
@@ -573,13 +550,9 @@ pipex_close_session(struct pipex_session
        if (session->pipex_iface != iface)
                return (EINVAL);
 
-       /* remove from close_wait list */
-       if (session->state == PIPEX_STATE_CLOSE_WAIT)
-               LIST_REMOVE(session, state_list);
-
        /* get statistics before destroy the session */
        req->pcr_stat = session->stat;
-       session->state = PIPEX_STATE_CLOSED;
+       pipex_destroy_session(session);
 
        return (0);
 }
@@ -739,47 +712,25 @@ pipex_timer_stop(void)
 Static void
 pipex_timer(void *ignored_arg)
 {
-       struct pipex_session *session, *session_tmp;
+       struct pipex_session *session;
 
        timeout_add_sec(&pipex_timer_ch, pipex_prune);
 
        NET_LOCK();
        /* walk through */
-       LIST_FOREACH_SAFE(session, &pipex_session_list, session_list,
-           session_tmp) {
-               switch (session->state) {
-               case PIPEX_STATE_OPENED:
-                       if (session->timeout_sec == 0)
-                               continue;
-
-                       session->stat.idle_time++;
-                       if (session->stat.idle_time < session->timeout_sec)
-                               continue;
-
-                       pipex_notify_close_session(session);
-                       break;
-
-               case PIPEX_STATE_CLOSE_WAIT:
-               case PIPEX_STATE_CLOSE_WAIT2:
-                       /* Wait PIPEXDSESSION from userland */
-                       session->stat.idle_time++;
-                       if (session->stat.idle_time < PIPEX_CLOSE_TIMEOUT)
-                               continue;
-
-                       if (session->state == PIPEX_STATE_CLOSE_WAIT)
-                               LIST_REMOVE(session, state_list);
-                       session->state = PIPEX_STATE_CLOSED;
-                       /* FALLTHROUGH */
+       LIST_FOREACH(session, &pipex_session_list, session_list) {
+               if (session->state != PIPEX_STATE_OPENED)
+                       continue;
+               if (session->timeout_sec == 0)
+                       continue;
 
-               case PIPEX_STATE_CLOSED:
-                       pipex_destroy_session(session);
-                       break;
+               session->stat.idle_time++;
+               if (session->stat.idle_time < session->timeout_sec)
+                       continue;
 
-               default:
-                       break;
-               }
+               session->state = PIPEX_STATE_CLOSE_WAIT;
+               LIST_INSERT_HEAD(&pipex_close_wait_list, session, state_list);
        }
-
        NET_UNLOCK();
 }
 
Index: sys/net/pipex.h
===================================================================
RCS file: /cvs/src/sys/net/pipex.h,v
retrieving revision 1.27
diff -u -p -r1.27 pipex.h
--- sys/net/pipex.h     4 Aug 2020 09:32:05 -0000       1.27
+++ sys/net/pipex.h     12 Aug 2020 09:07:13 -0000
@@ -197,9 +197,6 @@ void                  pipex_init (void);
 void                  pipex_iface_init (struct pipex_iface_context *, u_int);
 void                  pipex_iface_fini (struct pipex_iface_context *);
 
-int                   pipex_notify_close_session(struct pipex_session 
*session);
-int                   pipex_notify_close_session_all(void);
-
 struct mbuf           *pipex_output (struct mbuf *, int, int, struct 
pipex_iface_context *);
 struct pipex_session  *pipex_pppoe_lookup_session (struct mbuf *);
 struct mbuf           *pipex_pppoe_input (struct mbuf *, struct pipex_session 
*);

Reply via email to