Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp2463649pxf; Sat, 20 Mar 2021 17:37:48 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzCmbJy1XU3csYmQXoMW3lN0ZvB/z5dZk88HehumzlMXQy2wCU54450BAFCTZmTIIGvOrIu X-Received: by 2002:a05:6402:38d:: with SMTP id o13mr17796761edv.337.1616287067880; Sat, 20 Mar 2021 17:37:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1616287067; cv=none; d=google.com; s=arc-20160816; b=ON3lR3WTDj8oYXX1R3rliChRSqNjFxMesafKeKxFcACghYGdSUj4n6rktUNFvcPOfD US7AAKgiCcUhbJF2eO2IwORQ6z+IUV9MUaJGAeqgbeIi3wXbHjISL+Bo6HmY+8td/uaU hTrXtm+S2utNIqp71B+F6Tes7KrzvOav83SVOzR+66Ch/j03nXna5JbJQNTg5+nYBMRL KNl7YCYsk/nMgK5lspuDdFaUQguKuE+6XLydkzQziBubolVsQciVOg9RDCJh/raMKIY3 npOAGr0AI3lDg6DTGFizrqf/N8eE2DB6Tr/2r7xSi43VRDxObVTn+5lHvBnVI3EAM2la 6pYA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:to:content-transfer-encoding:mime-version :message-id:date:subject:cc:from; bh=uS2GL9FNMZtcgYHhCJWuNe0RNim05pdEWGybcXAmD70=; b=t3Rg8Qoh1Cb+3H0beIA50TFVd8ez1MzkorSexO4X4SRlTHitV833+SSxV6zhjjoCA+ JXVdODIqKK64+lXBFM46p8VOlgv+AjQM/XlaX6x7aqw3HLazuUwsXdlU5hpV7v4XcwA0 fR8CT9SJLvsUaEMR9XO/I5ggNh1uYwITEM9qLPqinJgXuGRHvsQ3NmQV22+Qb5RHdJ2W sv4u9UhcFVmhgCgukT79vEsDEZ0HGkRbjPmRQU043z/4FnOtC8NUzewziVUvMuB0zrJE YIhU+WPbDN0vziF3Eqt2ij/OxykshnH9JNMxhy7tx7QpxaLAlVsGDkcF3np/hRw3KSkA 6wfw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id a6si8018389ejs.736.2021.03.20.17.37.25; Sat, 20 Mar 2021 17:37:47 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229874AbhCUAWW (ORCPT + 99 others); Sat, 20 Mar 2021 20:22:22 -0400 Received: from relay7-d.mail.gandi.net ([217.70.183.200]:49209 "EHLO relay7-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229766AbhCUAVq (ORCPT ); Sat, 20 Mar 2021 20:21:46 -0400 X-Originating-IP: 95.232.69.74 Received: from enhorning.arpa1.net (host-95-232-69-74.retail.telecomitalia.it [95.232.69.74]) (Authenticated sender: pbl@bestov.io) by relay7-d.mail.gandi.net (Postfix) with ESMTPSA id 2B15B20002; Sun, 21 Mar 2021 00:21:40 +0000 (UTC) From: Riccardo Paolo Bestetti Cc: Riccardo Paolo Bestetti , "David S. Miller" , Hideaki YOSHIFUJI , David Ahern , Jakub Kicinski , netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH] ipv4/raw: support binding to nonlocal addresses Date: Sun, 21 Mar 2021 01:20:45 +0100 Message-Id: <20210321002045.23700-1-pbl@bestov.io> X-Mailer: git-send-email 2.31.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit To: unlisted-recipients:; (no To-header on input) Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add support to inet raw sockets for binding to nonlocal addresses through the IP_FREEBIND and IP_TRANSPARENT socket options, as well as the ipv4.ip_nonlocal_bind kernel parameter. Signed-off-by: Riccardo Paolo Bestetti --- net/ipv4/raw.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index 50a73178d63a..734c0332b54b 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c @@ -717,6 +717,7 @@ static int raw_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len) { struct inet_sock *inet = inet_sk(sk); struct sockaddr_in *addr = (struct sockaddr_in *) uaddr; + struct net *net = sock_net(sk); u32 tb_id = RT_TABLE_LOCAL; int ret = -EINVAL; int chk_addr_ret; @@ -732,7 +733,8 @@ static int raw_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len) tb_id); ret = -EADDRNOTAVAIL; - if (addr->sin_addr.s_addr && chk_addr_ret != RTN_LOCAL && + if (!inet_can_nonlocal_bind(net, inet) && + addr->sin_addr.s_addr && chk_addr_ret != RTN_LOCAL && chk_addr_ret != RTN_MULTICAST && chk_addr_ret != RTN_BROADCAST) goto out; inet->inet_rcv_saddr = inet->inet_saddr = addr->sin_addr.s_addr; -- 2.31.0