All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCHv2] PPPoL2TP: Add more code snippets
@ 2023-04-18 14:33 Samuel Thibault
  2023-04-19  8:27 ` Bagas Sanjaya
  0 siblings, 1 reply; 2+ messages in thread
From: Samuel Thibault @ 2023-04-18 14:33 UTC (permalink / raw)
  To: James Chapman, tparkin, edumazet
  Cc: davem, kuba, pabeni, corbet, netdev, linux-doc, linux-kernel

The existing documentation was not telling that one has to create a PPP
channel and a PPP interface to get PPPoL2TP data offloading working.

Also, tunnel switching was not mentioned, so that people were thinking
it was not supported, while it actually is.

Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>

---
Difference from v1:
- follow kernel coding style
- check for failures
- also mention netlink and ip for configuring the link
- fix bridging channels

 Documentation/networking/l2tp.rst |   97 ++++++++++++++++++++++++++++++++++++--
 1 file changed, 93 insertions(+), 4 deletions(-)

--- a/Documentation/networking/l2tp.rst
+++ b/Documentation/networking/l2tp.rst
@@ -387,11 +387,16 @@ Sample userspace code:
   - Create session PPPoX data socket::
 
         struct sockaddr_pppol2tp sax;
-        int fd;
+        int session_fd;
+        int ret;
 
         /* Note, the tunnel socket must be bound already, else it
          * will not be ready
          */
+        session_fd = socket(AF_PPPOX, SOCK_DGRAM, PX_PROTO_OL2TP);
+        if (session_fd < 0)
+                return -errno;
+
         sax.sa_family = AF_PPPOX;
         sax.sa_protocol = PX_PROTO_OL2TP;
         sax.pppol2tp.fd = tunnel_fd;
@@ -406,11 +411,95 @@ Sample userspace code:
         /* session_fd is the fd of the session's PPPoL2TP socket.
          * tunnel_fd is the fd of the tunnel UDP / L2TPIP socket.
          */
-        fd = connect(session_fd, (struct sockaddr *)&sax, sizeof(sax));
-        if (fd < 0 ) {
+        ret = connect(session_fd, (struct sockaddr *)&sax, sizeof(sax));
+        if (ret < 0 ) {
+                close(session_fd);
+                return -errno;
+        }
+
+        return session_fd;
+
+L2TP control packets will still be available for read on `tunnel_fd`.
+
+  - Create PPP channel::
+
+        int chindx;
+        int ppp_chan_fd;
+
+        ret = ioctl(session_fd, PPPIOCGCHAN, &chindx);
+        if (ret < 0)
+                return -errno;
+
+        ppp_chan_fd = open("/dev/ppp", O_RDWR);
+        if (ppp_chan_fd < 0)
+                return -errno;
+
+        ret = ioctl(ppp_chan_fd, PPPIOCATTCHAN, &chindx);
+        if (ret < 0) {
+                close(ppp_chan_fd);
                 return -errno;
         }
-        return 0;
+
+        return ppp_chan_fd;
+
+Non-data PPP frames will be available for read on `ppp_chan_fd`.
+
+  - Create PPP interface::
+
+        int ppp_if_fd;
+        int ifunit = -1;
+
+        ppp_if_fd = open("/dev/ppp", O_RDWR);
+        if (ppp_chan_fd < 0)
+                return -errno;
+
+        ret = ioctl(ppp_if_fd, PPPIOCNEWUNIT, &ifunit);
+        if (ret < 0) {
+                close(ppp_if_fd);
+                return -errno;
+        }
+
+        ret = ioctl(ppp_chan_fd, PPPIOCCONNECT, ifunit);
+        if (ret < 0) {
+                close(ppp_if_fd);
+                return -errno;
+        }
+
+        return ppp_chan_fd;
+
+The ppp<ifunit> interface can then be configured as usual with netlink's
+RTM_NEWLINK, RTM_NEWADDR, RTM_NEWROUTE, or ioctl's SIOCSIFMTU, SIOCSIFADDR,
+SIOCSIFDSTADDR, SIOCSIFNETMASK, SIOCSIFFLAGS, or with the `ip` command.
+
+  - L2TP session bridging (also called L2TP tunnel switching or L2TP multihop)
+is supported by bridging the ppp channels of the two L2TP sessions to be
+bridged::
+
+        int chindx1;
+        int chindx2;
+        int ppp_chan_fd;
+
+        ret = ioctl(session_fd1, PPPIOCGCHAN, &chindx1);
+        if (ret < 0)
+                return -errno;
+
+        ret = ioctl(session_fd2, PPPIOCGCHAN, &chind2x);
+        if (ret < 0)
+                return -errno;
+
+        ppp_chan_fd = open("/dev/ppp", O_RDWR);
+        ret = ioctl(ppp_chan_fd, PPPIOCATTCHAN, &chindx1);
+        if (ret < 0) {
+                close(ppp_chan_fd);
+                return -errno;
+        }
+
+        ret = ioctl(ppp_chan_fd, PPPIOCBRIDGECHAN, &chindx2);
+        close(ppp_chan_fd);
+        if (ret < 0)
+                return -errno;
+
+See more details for the PPP side in ppp_generic.rst.
 
 Old L2TPv2-only API
 -------------------

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCHv2] PPPoL2TP: Add more code snippets
  2023-04-18 14:33 [PATCHv2] PPPoL2TP: Add more code snippets Samuel Thibault
@ 2023-04-19  8:27 ` Bagas Sanjaya
  0 siblings, 0 replies; 2+ messages in thread
From: Bagas Sanjaya @ 2023-04-19  8:27 UTC (permalink / raw)
  To: Samuel Thibault, James Chapman, tparkin, edumazet, davem, kuba,
	pabeni, corbet, netdev, linux-doc, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 1225 bytes --]

On Tue, Apr 18, 2023 at 04:33:07PM +0200, Samuel Thibault wrote:
> +  - L2TP session bridging (also called L2TP tunnel switching or L2TP multihop)
> +is supported by bridging the ppp channels of the two L2TP sessions to be
> +bridged::
> +

The list text isn't aligned, hence Sphinx warning:

Documentation/networking/l2tp.rst:475: WARNING: Block quote ends without a blank line; unexpected unindent.

I have applied the fixup:

---- >8 ----
diff --git a/Documentation/networking/l2tp.rst b/Documentation/networking/l2tp.rst
index 3664d95268c9cc..e4c67f29e3639d 100644
--- a/Documentation/networking/l2tp.rst
+++ b/Documentation/networking/l2tp.rst
@@ -472,8 +472,8 @@ RTM_NEWLINK, RTM_NEWADDR, RTM_NEWROUTE, or ioctl's SIOCSIFMTU, SIOCSIFADDR,
 SIOCSIFDSTADDR, SIOCSIFNETMASK, SIOCSIFFLAGS, or with the `ip` command.
 
   - L2TP session bridging (also called L2TP tunnel switching or L2TP multihop)
-is supported by bridging the ppp channels of the two L2TP sessions to be
-bridged::
+    is supported by bridging the ppp channels of the two L2TP sessions to be
+    bridged::
 
         int chindx1;
         int chindx2;

Thanks.

-- 
An old man doll... just what I always wanted! - Clara

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2023-04-19  8:28 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-04-18 14:33 [PATCHv2] PPPoL2TP: Add more code snippets Samuel Thibault
2023-04-19  8:27 ` Bagas Sanjaya

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.