• James Chapman's avatar
    l2tp: add tunnel/session get_next helpers · aa92c1ce
    James Chapman authored
    l2tp management APIs and procfs/debugfs iterate over l2tp tunnel and
    session lists. Since these lists are now implemented using IDR, we can
    use IDR get_next APIs to iterate them. Add tunnel/session get_next
    functions to do so.
    
    The session get_next functions get the next session in a given tunnel
    and need to account for l2tpv2 and l2tpv3 differences:
    
     * l2tpv2 sessions are keyed by tunnel ID / session ID. Iteration for
       a given tunnel ID, TID, can therefore start with a key given by
       TID/0 and finish when the next entry's tunnel ID is not TID. This
       is possible only because the tunnel ID part of the key is the upper
       16 bits and the session ID part the lower 16 bits; when idr_next
       increments the key value, it therefore finds the next sessions of
       the current tunnel before those of the next tunnel. Entries with
       session ID 0 are always skipped because they are used internally by
       pppol2tp.
    
     * l2tpv3 sessions are keyed by session ID. Iteration starts at the
       first IDR entry and skips entries where the tunnel does not
       match. Iteration must also consider session ID collisions and walk
       the list of colliding sessions (if any) for one which matches the
       supplied tunnel.
    Signed-off-by: default avatarJames Chapman <jchapman@katalix.com>
    Signed-off-by: default avatarTom Parkin <tparkin@katalix.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    aa92c1ce
l2tp_core.c 51.7 KB