From patchwork Wed Feb 14 01:21:02 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Samuel Thibault X-Patchwork-Id: 200778 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:bc8a:b0:106:860b:bbdd with SMTP id dn10csp918785dyb; Tue, 13 Feb 2024 17:27:37 -0800 (PST) X-Forwarded-Encrypted: i=3; AJvYcCV9Hd4mdQOHh4qumPYQqXaB2FCaJ3JlHVI+1FNJ4qzr2w66OXzA2P5no1/5TtD+VzItRgkA836ADEHnJajj3o72b0n9Ig== X-Google-Smtp-Source: AGHT+IFZyz5w8BBJsrKJ6Lz6fqJDsKztd0Y7Bzm6+QQcIMWDNSIJkklTu9vSDoEvtMqw2ItLdAOq X-Received: by 2002:a25:c58d:0:b0:dc7:4318:8c24 with SMTP id v135-20020a25c58d000000b00dc743188c24mr1042427ybe.52.1707874057576; Tue, 13 Feb 2024 17:27:37 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1707874057; cv=pass; d=google.com; s=arc-20160816; b=knFNkD/E4CAcvc5OHqqL0+fh14un7VsDQ9lm6doB8KTdeHRo0oqlccASqhsi5DWsit MyiwvaWRiWDJnqLKS1Na7ZdgE6SkNOixin7+U9wpFPwtzaqUgw3EYf5vdnOFg6+vj0FM OV8EO5xRVgHyV0lE6BP3uN+1L6JISFpWsZugbw/pIFwz92DmscXuOUO4ZCo55nZx7V5r VFAvQ4GFMVwJAVDWIwhnISIgBpIWRLs/7we40qiowqh5x/Y4GsSjjpGwr437foStY8Yr r9X064dFxKyBh0StV0VfUmuAWXb2kO388e4coCBw4eIOfJWyquEfAnLz3o/9EzufIPEC p7zQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=user-agent:content-disposition:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:mail-followup-to:message-id :subject:cc:to:from:date; bh=HQ7zavo+1FNNMdAxJtcOL1/VmcwlIHZIkIC35KM+ExU=; fh=JzaNd15tHLiCcOTKmKFDTKFSiyDapaTrme7k5ram1mw=; b=miBZ8H8/XeZcjGKN1bFVMUdxcddnAi/G23DuccrdY8VHzhCFZ5VRNrIJOY7djSaXYx K+MXzJRUvxWyUQBPw2AFWiytbvWa61QxeP2QTsawjJOS9Zj5DqHNFK5L+WX9BkMz6a1i ZSv9g9ghAoib+gbDxoZ9Ua4rl4MKEhk4sLMplDN0mROgOeccDtzSdEWA7Rq0bWEDDxTH Iyq7gY4uzl86OLpNR2+B3+Q0ArlG6slscoYvCVs0V/NftpR760WPOXkmpJ7j5FF08hEV GCtAlgVPTHz+wcaMcosooMLEEkWJs58bwg+0mBmXIT7zt+p45SeNNiaTXHBRGCrFNueo Upbw==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; arc=pass (i=1 spf=pass spfdomain=bounce.ens-lyon.org); spf=pass (google.com: domain of linux-kernel+bounces-64662-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-64662-ouuuleilei=gmail.com@vger.kernel.org" X-Forwarded-Encrypted: i=2; AJvYcCW5QsSRhTStibrRulKas9JuePUEV83z3IUT5KzyElZ824Kq9EACbcmwM3u0G9vH6jcr9T5iIONGid0STQGjYveAkGoXQQ== Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [2604:1380:45d1:ec00::1]) by mx.google.com with ESMTPS id p12-20020a05622a13cc00b0042c5d77cb8dsi4660157qtk.300.2024.02.13.17.27.37 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Feb 2024 17:27:37 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-64662-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) client-ip=2604:1380:45d1:ec00::1; Authentication-Results: mx.google.com; arc=pass (i=1 spf=pass spfdomain=bounce.ens-lyon.org); spf=pass (google.com: domain of linux-kernel+bounces-64662-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-64662-ouuuleilei=gmail.com@vger.kernel.org" Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id 376AB1C21C8B for ; Wed, 14 Feb 2024 01:27:37 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id D7CAB101CA; Wed, 14 Feb 2024 01:21:16 +0000 (UTC) Received: from sonata.ens-lyon.org (sonata.ens-lyon.org [140.77.166.138]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0C5B2625; Wed, 14 Feb 2024 01:21:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=140.77.166.138 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707873674; cv=none; b=VToUYbtA18d0umuJ/WTrCtcTNKo2S/Em692qMsXOJgLSanmFNTD6Ic8VsqOF5gWp0Zippfak0F8BnyHyD6Lp+NU3GqrtPiQr3aKsw8ZIyilcE245y2jdDrelvQdV4kUp7ltqDhLn3C4Ne4KHqJh/3PfqRmHzQGFVhpVrqoB/NEk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707873674; c=relaxed/simple; bh=bqLD3tjF3cL5EuZmq9uiOLaB1zZv48E4vPXoo12cUto=; h=Date:From:To:Cc:Subject:Message-ID:MIME-Version:Content-Type: Content-Disposition; b=VeIDi7CabhM4ud5tOUXW5GDzjQPEWzXnzmJi0ZNqd7mUOYimpQg8iZMRrC/x8RcfJsMo+TwnDCX+8ppRj23/z7O6qQ+nC2So9kqOyyen9qcbwPmzYijYY4IRGFTMVLlBB/tFtgc9GjDJwJjwQmD6J7sofH9OCB5s32tTS7SQzkg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=ens-lyon.org; spf=pass smtp.mailfrom=bounce.ens-lyon.org; arc=none smtp.client-ip=140.77.166.138 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=ens-lyon.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bounce.ens-lyon.org Received: from localhost (localhost [127.0.0.1]) by sonata.ens-lyon.org (Postfix) with ESMTP id 11E0CA025B; Wed, 14 Feb 2024 02:21:04 +0100 (CET) Received: from sonata.ens-lyon.org ([127.0.0.1]) by localhost (sonata.ens-lyon.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id lKDa1_1_BEH5; Wed, 14 Feb 2024 02:21:03 +0100 (CET) Received: from begin (aamiens-653-1-111-57.w83-192.abo.wanadoo.fr [83.192.234.57]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by sonata.ens-lyon.org (Postfix) with ESMTPSA id 504D0A019F; Wed, 14 Feb 2024 02:21:03 +0100 (CET) Received: from samy by begin with local (Exim 4.97) (envelope-from ) id 1ra3xO-00000008bfE-36y2; Wed, 14 Feb 2024 02:21:02 +0100 Date: Wed, 14 Feb 2024 02:21:02 +0100 From: Samuel Thibault To: James Chapman , tparkin@katalix.com, edumazet@google.com, gnault@redhat.com Cc: davem@davemloft.net, kuba@kernel.org, pabeni@redhat.com, corbet@lwn.net, netdev@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCHv5] PPPoL2TP: Add more code snippets Message-ID: <20240214012102.dsdgcdgvwgfabzdi@begin> Mail-Followup-To: Samuel Thibault , James Chapman , tparkin@katalix.com, edumazet@google.com, gnault@redhat.com, davem@davemloft.net, kuba@kernel.org, pabeni@redhat.com, corbet@lwn.net, netdev@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Disposition: inline User-Agent: NeoMutt/20170609 (1.8.3) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1790835747815967181 X-GMAIL-MSGID: 1790835747815967181 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 Acked-by: Tom Parkin --- Difference from v1: - follow kernel coding style - check for failures - also mention netlink and ip for configuring the link - fix bridging channels Difference from v2: - fix text alignment Difference from v3: - fix some variables references - explicit inputs of the code snippets - explicit that bridging is supported for l2tp with PPP pseudowire type. - explicit that after bridging only the pppox sockets need to be kept - explicit that bridging can also be done with other types of ppp channels Difference from v4: - Fix coding style - Fix parameter of PPPIOCCONNECT ioctl. - Describe the ppp frame bridging. --- Documentation/networking/l2tp.rst | 133 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 127 insertions(+), 6 deletions(-) --- a/Documentation/networking/l2tp.rst +++ b/Documentation/networking/l2tp.rst @@ -386,12 +386,19 @@ Sample userspace code: - Create session PPPoX data socket:: + /* Input: the L2TP tunnel UDP socket `tunnel_fd`, which needs to be + * bound already (both sockname and peername), otherwise it will not be + * ready. + */ + struct sockaddr_pppol2tp sax; - int fd; + int session_fd; + int ret; + + session_fd = socket(AF_PPPOX, SOCK_DGRAM, PX_PROTO_OL2TP); + if (session_fd < 0) + return -errno; - /* Note, the tunnel socket must be bound already, else it - * will not be ready - */ sax.sa_family = AF_PPPOX; sax.sa_protocol = PX_PROTO_OL2TP; sax.pppol2tp.fd = tunnel_fd; @@ -406,12 +413,126 @@ 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:: + + /* Input: the session PPPoX data socket `session_fd` which was created + * as described above. + */ + + int ppp_chan_fd; + int chindx; + int ret; + + 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 ppp_chan_fd; + +LCP PPP frames will be available for read on `ppp_chan_fd`. + + - Create PPP interface:: + + /* Input: the PPP channel `ppp_chan_fd` which was created as described + * above. + */ + + int ifunit = -1; + int ppp_if_fd; + int ret; + + ppp_if_fd = open("/dev/ppp", O_RDWR); + if (ppp_if_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_if_fd; + +IPCP/IPv6CP PPP frames will be available for read on `ppp_if_fd`. + +The ppp 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. + + - Bridging L2TP sessions which have PPP pseudowire types (this is also called + L2TP tunnel switching or L2TP multihop) is supported by bridging the PPP + channels of the two L2TP sessions to be bridged:: + + /* Input: the session PPPoX data sockets `session_fd1` and `session_fd2` + * which were created as described further above. + */ + + int ppp_chan_fd; + int chindx1; + int chindx2; + int ret; + + ret = ioctl(session_fd1, PPPIOCGCHAN, &chindx1); + if (ret < 0) + return -errno; + + ret = ioctl(session_fd2, PPPIOCGCHAN, &chindx2); + 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, &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; + return 0; +It can be noted that when bridging PPP channels, the PPP session is not locally terminated, and no local PPP interface is created. PPP frames arriving on one channel are directly passed to the other channel, and vice versa. + +The PPP channel does not need to be kept open. Only the session PPPoX data +sockets need to be kept open. + +More generally, it is also possible in the same way to e.g. bridge a PPPoL2TP +PPP channel with other types of PPP channels, such as PPPoE. + +See more details for the PPP side in ppp_generic.rst. + Old L2TPv2-only API -------------------