Received: by 2002:a05:6a10:8395:0:0:0:0 with SMTP id n21csp8961pxh; Tue, 9 Nov 2021 06:35:25 -0800 (PST) X-Google-Smtp-Source: ABdhPJyPJYP/WcSHpX0WCobdowy3CzcY9kd5KiLmkP++qIwTs9kPpU+sDvh4x00ZIdA4lmUKFE+g X-Received: by 2002:a50:d8cf:: with SMTP id y15mr11002311edj.66.1636468525602; Tue, 09 Nov 2021 06:35:25 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1636468525; cv=none; d=google.com; s=arc-20160816; b=GSrFe34r+gDYIhsNtIT1ekRU4XKK+j2rvo5K9LBf6sWG0t0ljZuqPd6w6TzBCuLYcE t7ulcAyndy8UB6YOs7aEhUHvq52JHR7AU5WD4PMF0ZQeOTD0II+9ebuqhOnRNBFygmHd imInEhP6xkK/B4f41xS86fwj0ZI4PlTZScmTaXjSrnfOQeECt6P7ND7dwrR5g9+s02Hp ltNPw8wW6p/qyf3nYAWqv+UJW9rrg7Yr9mJBqZ6v8MuzAotjdfpXkqVmkQ7x6hiInN+i 8F7HRaaAZLlhdF08Bk2p7jZEFxMl9905BDweeRZSrCuwLmkZxnRm2YcWBU0j6Rvsk6T3 04JQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:message-id:date:subject:cc:to:from; bh=+hsWKIszmttEzkGh7Bn/gCjebfAhLgy3TlcjkM4TVu0=; b=fVVcDi0nHJukIWvlAfRoq5pndwsVU4DPeCU30BB0TFPgTmbed+bqREqH+0/Rfu9TB7 tUbD5obGoDkqjPVv2j4DKbWsqQ1x9PJXN5InZCzo8SIgP7rh4pQRHGBoRcln9Kl28Y/v JUlccQtSHW7UDfpf63k4Q4voRjh4AxP1AHbIohCuHnJpdGToWNpePP6bTAXKjkUwiNyA Xb2PzJozUsH7bJxYBtYrubL5K1Gd7NayeUtIXDoDvQ4WjmCdPIr1jSJJJj4nY8Uajdpn TFAWkpGTxKPPwXWINnmzHY052eH4wC+CSIadq2Pk0GC22AEf1HVbSkyzfIgfrz41HYW4 7rJQ== 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=mediatek.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id eb14si18528429edb.35.2021.11.09.06.35.00; Tue, 09 Nov 2021 06:35:25 -0800 (PST) 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=mediatek.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243362AbhKIHDI (ORCPT + 99 others); Tue, 9 Nov 2021 02:03:08 -0500 Received: from mailgw01.mediatek.com ([60.244.123.138]:36656 "EHLO mailgw01.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S243389AbhKIHDC (ORCPT ); Tue, 9 Nov 2021 02:03:02 -0500 X-UUID: 94ae060bcbb5478296e847ce0c92951a-20211109 X-UUID: 94ae060bcbb5478296e847ce0c92951a-20211109 Received: from mtkexhb02.mediatek.inc [(172.21.101.103)] by mailgw01.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 2058828200; Tue, 09 Nov 2021 15:00:12 +0800 Received: from mtkmbs10n2.mediatek.inc (172.21.101.183) by mtkmbs07n2.mediatek.inc (172.21.101.141) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 9 Nov 2021 15:00:10 +0800 Received: from mbjsdccf07.mediatek.inc (10.15.20.246) by mtkmbs10n2.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.2.792.3 via Frontend Transport; Tue, 9 Nov 2021 15:00:10 +0800 From: Rocco Yue To: "David S . Miller" , Jakub Kicinski , Jonathan Corbet , Hideaki YOSHIFUJI , David Ahern , Matthias Brugger CC: , , , , , , , , Rocco Yue Subject: [PATCH net-next] ipv6: don't generate link-local addr in random or privacy mode Date: Tue, 9 Nov 2021 14:55:26 +0800 Message-ID: <20211109065526.16772-1-rocco.yue@mediatek.com> X-Mailer: git-send-email 2.18.0 MIME-Version: 1.0 Content-Type: text/plain X-MTK: N Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In the 3GPP TS 29.061, here is a description as follows: "In order to avoid any conflict between the link-local address of the MS and that of the GGSN, the Interface-Identifier used by the MS to build its link-local address shall be assigned by the GGSN. The GGSN ensures the uniqueness of this Interface-Identifier. The MT shall then enforce the use of this Interface-Identifier by the TE" In other words, in the cellular network, GGSN determines whether to reply a solicited RA message by identifying the bottom 64 bits of the source address of the received RS message. Therefore, cellular network device's ipv6 link-local address should be set as the format of fe80::(GGSN assigned IID). To meet the above spec requirement, this patch adds two new addr_gen_mode: 1) IN6_ADDR_GEN_MODE_STABLE_PRIVACY_NO_LLA, this mode is suitable for cellular networks that support RFC7217. In this mode, the kernel doesn't generate a link-local address for the cellular NIC, and generates an ipv6 stable privacy global address after receiving the RA message. 2) IN6_ADDR_GEN_MODE_RANDOM_NO_LLA, in this mode, the kernel doesn't generate a link-local address for the cellular NIC, and will use the bottom 64 bits of the link-local address(same as the IID assigned by GGSN) to form an ipv6 global address after receiveing the RA message. Signed-off-by: Rocco Yue --- include/uapi/linux/if_link.h | 2 ++ net/ipv6/addrconf.c | 22 ++++++++++++++++------ tools/include/uapi/linux/if_link.h | 2 ++ 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h index eebd3894fe89..9c5695744c7d 100644 --- a/include/uapi/linux/if_link.h +++ b/include/uapi/linux/if_link.h @@ -428,6 +428,8 @@ enum in6_addr_gen_mode { IN6_ADDR_GEN_MODE_NONE, IN6_ADDR_GEN_MODE_STABLE_PRIVACY, IN6_ADDR_GEN_MODE_RANDOM, + IN6_ADDR_GEN_MODE_STABLE_PRIVACY_NO_LLA, + IN6_ADDR_GEN_MODE_RANDOM_NO_LLA, }; /* Bridge section */ diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 3445f8017430..0045de10f4b5 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -392,7 +392,8 @@ static struct inet6_dev *ipv6_add_dev(struct net_device *dev) timer_setup(&ndev->rs_timer, addrconf_rs_timer, 0); memcpy(&ndev->cnf, dev_net(dev)->ipv6.devconf_dflt, sizeof(ndev->cnf)); - if (ndev->cnf.stable_secret.initialized) + if (ndev->cnf.stable_secret.initialized && + ndev->cnf.addr_gen_mode != IN6_ADDR_GEN_MODE_STABLE_PRIVACY_NO_LLA) ndev->cnf.addr_gen_mode = IN6_ADDR_GEN_MODE_STABLE_PRIVACY; ndev->cnf.mtu6 = dev->mtu; @@ -2578,7 +2579,8 @@ static void manage_tempaddrs(struct inet6_dev *idev, static bool is_addr_mode_generate_stable(struct inet6_dev *idev) { return idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_STABLE_PRIVACY || - idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_RANDOM; + idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_RANDOM || + idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_STABLE_PRIVACY_NO_LLA; } int addrconf_prefix_rcv_add_addr(struct net *net, struct net_device *dev, @@ -3331,6 +3333,8 @@ static void addrconf_addr_gen(struct inet6_dev *idev, bool prefix_route) 0, 0, GFP_KERNEL); break; case IN6_ADDR_GEN_MODE_NONE: + case IN6_ADDR_GEN_MODE_RANDOM_NO_LLA: + case IN6_ADDR_GEN_MODE_STABLE_PRIVACY_NO_LLA: default: /* will not add any link local address */ break; @@ -5798,7 +5802,9 @@ static int check_addr_gen_mode(int mode) if (mode != IN6_ADDR_GEN_MODE_EUI64 && mode != IN6_ADDR_GEN_MODE_NONE && mode != IN6_ADDR_GEN_MODE_STABLE_PRIVACY && - mode != IN6_ADDR_GEN_MODE_RANDOM) + mode != IN6_ADDR_GEN_MODE_RANDOM && + mode != IN6_ADDR_GEN_MODE_STABLE_PRIVACY_NO_LLA && + mode != IN6_ADDR_GEN_MODE_RANDOM_NO_LLA) return -EINVAL; return 1; } @@ -6428,15 +6434,19 @@ static int addrconf_sysctl_stable_secret(struct ctl_table *ctl, int write, for_each_netdev(net, dev) { struct inet6_dev *idev = __in6_dev_get(dev); - if (idev) { + if (idev && idev->cnf.addr_gen_mode != + IN6_ADDR_GEN_MODE_STABLE_PRIVACY_NO_LLA) { idev->cnf.addr_gen_mode = IN6_ADDR_GEN_MODE_STABLE_PRIVACY; } } } else { struct inet6_dev *idev = ctl->extra1; - - idev->cnf.addr_gen_mode = IN6_ADDR_GEN_MODE_STABLE_PRIVACY; + if (idev->cnf.addr_gen_mode != + IN6_ADDR_GEN_MODE_STABLE_PRIVACY_NO_LLA) { + idev->cnf.addr_gen_mode = + IN6_ADDR_GEN_MODE_STABLE_PRIVACY; + } } out: diff --git a/tools/include/uapi/linux/if_link.h b/tools/include/uapi/linux/if_link.h index b3610fdd1fee..fb69137aea89 100644 --- a/tools/include/uapi/linux/if_link.h +++ b/tools/include/uapi/linux/if_link.h @@ -241,6 +241,8 @@ enum in6_addr_gen_mode { IN6_ADDR_GEN_MODE_NONE, IN6_ADDR_GEN_MODE_STABLE_PRIVACY, IN6_ADDR_GEN_MODE_RANDOM, + IN6_ADDR_GEN_MODE_STABLE_PRIVACY_NO_LLA, + IN6_ADDR_GEN_MODE_RANDOM_NO_LLA, }; /* Bridge section */ -- 2.18.0