L2TPv2 tunnels are often used as a part of a home broadband connection,
using a PPP link to connect the subscriber network into the Internet
Service Provider's network.

In this scenario, PPPoE is widely used between the L2TP Access
Concentrator (LAC) and the subscriber.  The LAC effectively acts as a
PPPoE server, switching PPP frames from incoming PPPoE packets into an
L2TP session.  The PPP session is then terminated at the L2TP Network
Server (LNS) on the edge of the ISP's IP network.

This patchset adds a driver to the L2TP subsystem to support this mode
of operation.

The new driver, l2tp_ac_pppoe, adds support for the existing pseudowire
type L2TP_PWTYPE_PPP_AC, and is instantiated using the existing L2TP
netlink L2TP_CMD_SESSION_CREATE.  It is expected to be used as follows:

 * A userspace PPPoE daemon running on the LAC handles the PPPoE
   discovery process up to the point of assigning a PPPoE session ID and
   sending the PADS packet to the PPPoE peer to establish the PPPoE
   session.
 * Userspace code running on the LAC then instantiates an L2TP tunnel
   and session with the LNS using the L2TP control protocol.
 * Finally, the data path for PPPoE session frames through the L2TP
   session to the LAC is instantiated by sending a genetlink
   L2TP_CMD_SESSION_CREATE command to the kernel, including
   the PPPoE-specific metadata required for L2TP_PWTYPE_PPP_AC sessions
   (this is documented in the patch series commit comments).

Supporting this driver submission we have two examples of userspace
projects which use L2TP_PWTYPE_PPP_AC:

 * https://github.com/katalix/l2tp-ktest

   This is a unit-test suite for the kernel L2TP subsystem which has
   been updated to include basic lifetime and datapath tests for
   l2tp_ac_pppoe.

   The new tests are automatically enabled when l2tp_ac_pppoe
   availability is detected, and hence support for l2tp_ac_pppoe is on
   the master branch of the git repository.

 * https://github.com/katalix/go-l2tp

   This is a Go library for building L2TP applications on Linux, and
   includes a suite of example daemons which utilise the library.

   The daemon kpppoed implements the PPPoE discovery protocol, and spawns
   an instance of a daemon kl2tpd which handles the L2TP control protocol
   and instantiates the kernel data path.

   The code utilising l2tp_ac_pppoe is on the branch tp_002_pppoe_1
   pending merge of this patchset in the kernel.

Notes on the patchset itself:

 * Patches 1-4 lay groundwork for the addition of the new driver, making
   tweaks to the l2tp netlink code to allow l2tp_ac_pppoe to access the
   netlink attributes it requires.
 * Patch 5 adds the new driver itself and hooks it into the kernel
   configuration and build system.
 * Patch 6 updates the l2tp documentation under Documentation/ to
   include information about the new driver.

Tom Parkin (6):
  l2tp: add netlink info to session create callback
  l2tp: tweak netlink session create to allow L2TPv2 ac_pppoe
  l2tp: allow v2 netlink session create to pass ifname attribute
  l2tp: add netlink attributes for ac_ppp session creation
  l2tp: add ac_pppoe pseudowire driver
  docs: networking: update l2tp.rst to document PPP_AC pseudowires

 Documentation/networking/l2tp.rst |  69 +++--
 include/uapi/linux/l2tp.h         |   2 +
 net/l2tp/Kconfig                  |   7 +
 net/l2tp/Makefile                 |   1 +
 net/l2tp/l2tp_ac_pppoe.c          | 446 ++++++++++++++++++++++++++++++
 net/l2tp/l2tp_core.h              |   4 +-
 net/l2tp/l2tp_eth.c               |   3 +-
 net/l2tp/l2tp_netlink.c           |  20 +-
 net/l2tp/l2tp_ppp.c               |   3 +-
 9 files changed, 527 insertions(+), 28 deletions(-)
 create mode 100644 net/l2tp/l2tp_ac_pppoe.c

-- 
2.17.1

Reply via email to