1. 08 2月, 2014 6 次提交
    • G
      l2tp: old functions cleanup · fc4562cd
      Guillaume Nault 提交于
        * l2tp_session_disconnect() now always succeeds.
        * l2tp_tunnel_cancel_session() now can be replaced by
          l2tp_session_free().
      Signed-off-by: NGuillaume Nault <g.nault@alphalink.fr>
      fc4562cd
    • G
      l2tp: use same context for tunnels and session control channels · 175ff4ce
      Guillaume Nault 提交于
      Run the control channels of L2TP sessions in their tunnel context to
      avoid context calls between tunnels and sessions.
      
      Tunnels and sessions now use the new state STATE_INIT as their initial
      state (allows to differentiate between tunnels and sessions that are
      starting or stopping). The STATE_CLOSE state isn't implicitely set to
      0 by memset() anymore, so its value is changed for consistency with the
      other STATE_* values.
      
      With tunnels and sessions running in the same context, sessions can
      remove themselves from their tunnel without having to perform context
      calls. Tunnels can also remove sessions directly, without having to
      asynchronously notify them. So the set of l2tp_tunnel_free_session*()
      functions becomes useless. Sessions can also check if they're the last
      session of the tunnel and automatically disconnect the tunnel if need
      be. So the l2tp_tunnel_session_freed() callback can be removed.
      The 'sess_count' field is now used to track the number of sessions
      stored in the 'sessions' field of tunnels. It's incremented as soon
      as a session is added and everytime one is removed.
      
      The callback, used by data channels to notify their L2TP control session
      of disconnection, is now executed in the tunnel context. The session ID
      is used by the tunnel to find which session the disconnection applies
      to. The session may well get destroyed by other means between the time
      of the context call and the time of the callback execution.
      
      The l2tp_tunnel_start_session() function doesn't need to create a new
      context for the session. It now only sets the session establishment
      timer and directly runs the session startup callback.
      
      Since l2tp_session_free() can now handle sessions in any state and is
      called within the tunnel context, there is no need for a special
      l2tp_tunnel_cancel_session() (for now, this function is kept for patch
      clarity).
      
      Now that session packets are sent while in tunnel context,
      l2tp_session_send() only needs to set the header session ID and can
      directly call l2tp_tunnel_send(). For reception, the tunnel also
      directly calls l2tp_session_recv().
      Signed-off-by: NGuillaume Nault <g.nault@alphalink.fr>
      175ff4ce
    • G
      l2tp: launch session data channels in their own context · 12119439
      Guillaume Nault 提交于
      Split L2TP control and data channels operations. The data channel of an
      L2TP session now runs in its own triton context.
      The L2TP control session initialises and launches the data channel
      context in l2tp_session_start_data_channel(). Then all data channel
      operations (e.g. PPP negociation) are performed in this context.
      
      When the data channel stops, it checks if the control channel is still
      running; if so, it notifies the control channel about its disconnection
      using the l2tp_session_apses_finished() callback.
      The control channel similarly checks for data channel execution and
      notifies about L2TP layer disconnection using apses_stop().
      Since the presence of the data channel is checked using its context
      field, the STATE_PPP state isn't required anymore. So L2TP control
      sessions now automatically enter STATE_ESTB in l2tp_session_connect().
      
      A new set of states (APSTATE_*) are defined for tracking evolution of
      data channels. Data channels also handle statistics using these new
      states.
      Signed-off-by: NGuillaume Nault <g.nault@alphalink.fr>
      12119439
    • G
      l2tp: prepare for starting data channels in their own context · 74ce7e07
      Guillaume Nault 提交于
      Define a new function for initialising and starting the data channel of
      an L2TP session. For now, l2tp_session_start_data_channel() only
      gathers the data channel specific operations, previously handled by
      l2tp_tunnel_alloc_session() and l2tp_session_connect().
      
      While here, move deletion of the session establishment timer to the
      beginning of l2tp_session_connect(), so that it will stop even if the
      function fails.
      Signed-off-by: NGuillaume Nault <g.nault@alphalink.fr>
      74ce7e07
    • G
      l2tp: handle tunnel/session dependencies with reference counters · 3b5fb8b7
      Guillaume Nault 提交于
      Use reference counters to track tunnels and sessions usage.
      Tunnels hold a reference to each of their sessions while sessions hold
      a reference to the tunnel they belong to. Tunnels and sessions also
      hold themselves to ensure that l2tp_{tunnel_session}_free() will be
      called before their reference counter drops to zero.
      
      Once the reference counter drops to zero, the tunnel or session is
      destroyed. Destruction may happen in any context, so context dependant
      operations still have to be done in l2tp_{tunnel,session}_free(). On
      the other hand l2tp_{tunnel,session}_free() must not free data wich may
      be required by their reference holders.
      Signed-off-by: NGuillaume Nault <g.nault@alphalink.fr>
      3b5fb8b7
    • G
      l2tp: Fix potential use after free by tunnel context thread · 1744cf7d
      Guillaume Nault 提交于
      A triton context handler may not unregister itself while executed by
      the context thread, unless it returns -1 (otherwise the md thread may
      free the handler before the context thread stops using it).
      So l2tp_conn_read() must return -1 after calling l2tp_tunnel_free()
      (the md handler associated to l2tp_conn_read() may be unregistered
      by l2tp_tunnel_free()).
      Signed-off-by: NGuillaume Nault <g.nault@alphalink.fr>
      1744cf7d
  2. 07 2月, 2014 2 次提交
  3. 22 1月, 2014 2 次提交
  4. 20 1月, 2014 2 次提交
  5. 19 1月, 2014 3 次提交
  6. 17 1月, 2014 7 次提交
  7. 24 12月, 2013 4 次提交
  8. 13 12月, 2013 2 次提交
  9. 08 11月, 2013 3 次提交
  10. 06 11月, 2013 1 次提交
  11. 05 11月, 2013 1 次提交
  12. 03 11月, 2013 1 次提交
  13. 31 10月, 2013 2 次提交
  14. 30 10月, 2013 4 次提交