03 Oct, 2020

1 commit


30 Sep, 2020

1 commit

  • When an L2TPv3 session receives a data frame with an incorrect cookie
    l2tp_core logs a warning message and bumps a stats counter to reflect
    the fact that the packet has been dropped.

    However, the stats counter in question is missing from the l2tp_netlink
    get message for tunnel and session instances.

    Include the statistic in the netlink get response.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     

19 Sep, 2020

1 commit

  • Historically L2TP core statistics count the L2TP header in the
    per-session and per-tunnel byte counts tracked for transmission and
    receipt.

    Now that l2tp_xmit_skb updates tx stats, it is necessary for
    l2tp_xmit_core to pass out the length of the transmitted packet so that
    the statistics can be updated correctly.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     

04 Sep, 2020

6 commits

  • l2tp_tunnel_closeall is called as a part of tunnel shutdown in order to
    close all the sessions held by the tunnel. The code it uses to close a
    session duplicates what l2tp_session_delete does.

    Rather than duplicating the code, have l2tp_tunnel_closeall call
    l2tp_session_delete instead.

    This involves a very minor change to locking in l2tp_tunnel_closeall.
    Previously, l2tp_tunnel_closeall checked the session "dead" flag while
    holding tunnel->hlist_lock. This allowed for the code to step to the
    next session in the list without releasing the lock if the current
    session happened to be in the process of closing already.

    By calling l2tp_session_delete instead, l2tp_tunnel_closeall must now
    drop and regain the hlist lock for each session in the tunnel list.
    Given that the likelihood of a session being in the process of closing
    when the tunnel is closed, it seems worth this very minor potential
    loss of efficiency to avoid duplication of the session delete code.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     
  • The l2tp tunnel and session structures contain a "magic feather" field
    which was originally intended to help trace lifetime bugs in the code.

    Since the introduction of the shared kernel refcount code in refcount.h,
    and l2tp's porting to those APIs, we are covered by the refcount code's
    checks and warnings. Duplicating those checks in the l2tp code isn't
    useful.

    However, magic feather checks are still useful to help to detect bugs
    stemming from misuse/trampling of the sk_user_data pointer in struct
    sock. The l2tp code makes extensive use of sk_user_data to stash
    pointers to the tunnel and session structures, and if another subsystem
    overwrites sk_user_data it's important to detect this.

    As such, rework l2tp's magic feather checks to focus on validating the
    tunnel and session data structures when they're extracted from
    sk_user_data.

    * Add a new accessor function l2tp_sk_to_tunnel which contains a magic
    feather check, and is used by l2tp_core and l2tp_ip[6]
    * Comment l2tp_udp_encap_recv which doesn't use this new accessor function
    because of the specific nature of the codepath it is called in
    * Drop l2tp_session_queue_purge's check on the session magic feather:
    it is called from code which is walking the tunnel session list, and
    hence doesn't need validation
    * Drop l2tp_session_free's check on the tunnel magic feather: the
    intention of this check is covered by refcount.h's reference count
    sanity checking
    * Add session magic validation in pppol2tp_ioctl. On failure return
    -EBADF, which mirrors the approach in pppol2tp_[sg]etsockopt.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     
  • l2tp_xmit_skb has a number of failure paths which are not reflected in
    the tunnel and session statistics because the stats are updated by
    l2tp_xmit_core. Hence any errors occurring before l2tp_xmit_core is
    called are missed from the statistics.

    Refactor the transmit path slightly to capture all error paths.

    l2tp_xmit_skb now leaves all the actual work of transmission to
    l2tp_xmit_core, and updates the statistics based on l2tp_xmit_core's
    return code.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     
  • The argument is unused, so remove it.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     
  • The data_len argument passed to l2tp_xmit_core is no longer used, so
    remove it.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     
  • All callers pass the session structure's hdr_len field as the header
    length parameter to l2tp_xmit_skb.

    Since we're passing a pointer to the session structure to l2tp_xmit_skb
    anyway, there's not much point breaking the header length out as a
    separate argument.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     

23 Aug, 2020

8 commits

  • The l2tp subsystem now uses standard kernel logging APIs for
    informational and warning messages, and tracepoints for debug
    information.

    Now that the tunnel and session debug flags are unused, remove the field
    from the core structures.

    Various system calls (in the case of l2tp_ppp) and netlink messages
    handle the getting and setting of debug flags. To avoid userspace
    breakage don't modify the API of these calls; simply ignore set
    requests, and send dummy data for get requests.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     
  • All l2tp's informational and warning logging is now carried out using
    standard kernel APIs.

    Debugging information is now handled using tracepoints.

    Now that no code is using the custom logging macros, remove them from
    l2tp_core.h.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     
  • Add lifetime event tracing for tunnel and session instances, tracking
    tunnel and session registration, deletion, and eventual freeing.

    Port the data path sequence number debug logging to use trace points
    rather than custom debug macros.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     
  • l2tp can provide a better debug experience using tracepoints rather than
    printk-style logging.

    Add tracepoint definitions in trace.h for use in the l2tp subsystem
    code.

    Add preprocessor definitions for the length of session and tunnel names
    in l2tp_core.h so we can reuse these in trace.h.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     
  • The l2tp subsystem doesn't currently make use of tracepoints.

    As a starting point for adding tracepoints, add skeleton infrastructure
    for defining tracepoints for the subsystem, and for having them build
    appropriately whether compiled into the kernel or built as a module.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     
  • The l2tp_* log wrappers only emit messages of a given category if the
    tunnel or session structure has the appropriate flag set in its debug
    field. Flags default to being unset.

    For warning messages, this doesn't make a lot of sense since an
    administrator is likely to want to know about datapath warnings without
    needing to tweak the debug flags setting for a given tunnel or session
    instance.

    Modify l2tp_warn callsites to use pr_warn_ratelimited instead for
    unconditional output of warning messages.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     
  • l2tp_ppp in particular had a lot of log messages for tracing
    [get|set]sockopt calls. These aren't especially useful, so remove
    these messages.

    Several log messages flagging error conditions were logged using
    l2tp_info: they're better off as l2tp_warn.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     
  • l2tp had logging to trace data frame receipt and transmission, including
    code to dump packet contents. This was originally intended to aid
    debugging of core l2tp packet handling, but is of limited use now that
    code is stable.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     

31 Jul, 2020

6 commits

  • * Improve the description of the key l2tp subsystem data structures.
    * Add high-level description of the main APIs for interacting with l2tp
    core.
    * Add documentation for the l2tp netlink session command callbacks.
    * Document the session pseudowire callbacks.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     
  • All of the l2tp subsystem's exported symbols are exported using
    EXPORT_SYMBOL_GPL, except for l2tp_recv_common and l2tp_ioctl.

    These functions alone are not useful without the rest of the l2tp
    infrastructure, so there's no practical benefit to these symbols using a
    different export policy.

    Change these exports to use EXPORT_SYMBOL_GPL for consistency with the
    rest of l2tp.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     
  • The structure of an L2TP data packet header varies depending on the
    version of the L2TP protocol being used.

    struct l2tp_session used to have a build_header callback to abstract
    this difference away. It's clearer to simply choose the correct
    function to use when building the data packet (and we save on the
    function pointer in the session structure).

    This approach does mean dereferencing the parent tunnel structure in
    order to determine the tunnel version, but we're doing that in the
    transmit path in any case.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     
  • l2tp_session_delete is used to schedule a session instance for deletion.
    The function itself always returns zero, and none of its direct callers
    check its return value, so have the function return void.

    This change de-facto changes the l2tp netlink session_delete callback
    prototype since all pseudowires currently use l2tp_session_delete for
    their implementation of that operation.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     
  • Tunnel and session instances are reference counted, and shouldn't be
    directly freed by pseudowire code.

    Rather than exporting l2tp_tunnel_free and l2tp_session_free, make them
    private to l2tp_core.c, and export the refcount functions instead.

    In order to do this, the refcount functions cannot be declared as
    inline. Since the codepaths which take and drop tunnel and session
    references are not directly in the datapath this shouldn't cause
    performance issues.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     
  • When __l2tp_session_unhash was first added it was used outside of
    l2tp_core.c, but that's no longer the case.

    As such, there's no longer a need to export the function. Make it
    private inside l2tp_core.c, and relocate it to avoid having to declare
    the function prototype in l2tp_core.h.

    Since the function is no longer used outside l2tp_core.c, remove the
    "__" prefix since we don't need to indicate anything special about its
    expected use to callers.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     

25 Jul, 2020

10 commits

  • l2tp_session_free called BUG_ON if the tunnel magic feather value wasn't
    correct. The intent of this was to catch lifetime bugs; for example
    early tunnel free due to incorrect use of reference counts.

    Since the tunnel magic feather being wrong indicates either early free
    or structure corruption, we can avoid doing more damage by simply
    leaving the tunnel structure alone. If the tunnel refcount isn't
    dropped when it should be, the tunnel instance will remain in the
    kernel, resulting in the tunnel structure and socket leaking.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     
  • l2tp_session_free is only called by l2tp_session_dec_refcount when the
    reference count reaches zero, so it's of limited value to validate the
    reference count value in l2tp_session_free itself.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     
  • l2tp_session_queue_purge is used during session shutdown to drop any
    skbs queued for reordering purposes according to L2TP dataplane rules.

    The BUG_ON in this function checks the session magic feather in an
    attempt to catch lifetime bugs.

    Rather than crashing the kernel with a BUG_ON, we can simply WARN_ON and
    refuse to do anything more -- in the worst case this could result in a
    leak. However this is highly unlikely given that the session purge only
    occurs from codepaths which have obtained the session by means of a lookup
    via. the parent tunnel and which check the session "dead" flag to
    protect against shutdown races.

    While we're here, have l2tp_session_queue_purge return void rather than
    an integer, since neither of the callsites checked the return value.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     
  • checkpatch advises that WARN_ON and recovery code are preferred over
    BUG_ON which crashes the kernel.

    l2tp_ppp has a BUG_ON check of struct seq_file's private pointer in
    pppol2tp_seq_start prior to accessing data through that pointer.

    Rather than crashing, we can simply bail out early and return NULL in
    order to terminate the seq file processing in much the same way as we do
    when reaching the end of tunnel/session instances to render.

    Retain a WARN_ON to help trace possible bugs in this area.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     
  • checkpatch advises that WARN_ON and recovery code are preferred over
    BUG_ON which crashes the kernel.

    l2tp_ppp.c's BUG_ON checks of the l2tp session structure's "magic" field
    occur in code paths where it's reasonably easy to recover:

    * In the case of pppol2tp_sock_to_session, we can return NULL and the
    caller will bail out appropriately. There is no change required to
    any of the callsites of this function since they already handle
    pppol2tp_sock_to_session returning NULL.

    * In the case of pppol2tp_session_destruct we can just avoid
    decrementing the reference count on the suspect session structure.
    In the worst case scenario this results in a memory leak, which is
    preferable to a crash.

    Convert these uses of BUG_ON to WARN_ON accordingly.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     
  • l2tp_tunnel_closeall is only called from l2tp_core.c, and it's easy
    to statically analyse the code path calling it to validate that it
    should never be passed a NULL tunnel pointer.

    Having a BUG_ON checking the tunnel pointer triggers a checkpatch
    warning. Since the BUG_ON is of no value, remove it to avoid the
    warning.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     
  • l2tp_session_queue_purge is only called from l2tp_core.c, and it's easy
    to statically analyse the code paths calling it to validate that it
    should never be passed a NULL session pointer.

    Having a BUG_ON checking the session pointer triggers a checkpatch
    warning. Since the BUG_ON is of no value, remove it to avoid the
    warning.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     
  • l2tp_dfs_seq_start had a BUG_ON to catch a possible programming error in
    l2tp_dfs_seq_open.

    Since we can easily bail out of l2tp_dfs_seq_start, prefer to do that
    and flag the error with a WARN_ON rather than crashing the kernel.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     
  • checkpatch warns about multiple assignments.

    Update l2tp accordingly.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     
  • Rework the remaining setsockopt code to pass a sockptr_t instead of a
    plain user pointer. This removes the last remaining set_fs(KERNEL_DS)
    outside of architecture specific code.

    Signed-off-by: Christoph Hellwig
    Acked-by: Stefan Schmidt [ieee802154]
    Acked-by: Matthieu Baerts
    Signed-off-by: David S. Miller

    Christoph Hellwig
     

24 Jul, 2020

6 commits

  • Passing "sizeof(struct blah)" in kzalloc calls is less readable,
    potentially prone to future bugs if the type of the pointer is changed,
    and triggers checkpatch warnings.

    Tweak the kzalloc calls in l2tp which use this form to avoid the
    warning.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     
  • When creating an L2TP tunnel using the netlink API, userspace must
    either pass a socket FD for the tunnel to use (for managed tunnels),
    or specify the tunnel source/destination address (for unmanaged
    tunnels).

    Since source/destination addresses may be AF_INET or AF_INET6, the l2tp
    netlink code has conditionally compiled blocks to support IPv6.

    Rather than embedding these directly into l2tp_nl_cmd_tunnel_create
    (where it makes the code difficult to read and confuses checkpatch to
    boot) split the handling of address-related attributes into a separate
    function.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     
  • l2tp_nl_tunnel_send has conditionally compiled code to support AF_INET6,
    which makes the code difficult to follow and triggers checkpatch
    warnings.

    Split the code out into functions to handle the AF_INET v.s. AF_INET6
    cases, which both improves readability and resolves the checkpatch
    warnings.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     
  • checkpatch warns about indentation and brace balancing around the
    conditionally compiled code for AF_INET6 support in
    l2tp_dfs_seq_tunnel_show.

    By adding another check on the socket address type we can make the code
    more readable while removing the checkpatch warning.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     
  • These checks are all simple and don't benefit from extra braces to
    clarify intent. Remove them for easier-reading code.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     
  • checkpatch warns about comparisons to NULL, e.g.

    CHECK: Comparison to NULL could be written "!rt"
    #474: FILE: net/l2tp/l2tp_ip.c:474:
    + if (rt == NULL) {

    These sort of comparisons are generally clearer and more readable
    the way checkpatch suggests, so update l2tp accordingly.

    Signed-off-by: Tom Parkin
    Signed-off-by: David S. Miller

    Tom Parkin
     

23 Jul, 2020

1 commit