Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp4715984ybl; Mon, 13 Jan 2020 19:20:09 -0800 (PST) X-Google-Smtp-Source: APXvYqxK0oG6su1ZJ1Uf6bFTmHrZ7eSf0nFJ8ZeHiSPEg08o0s5S4iaqwdpCSDLISLRC8KuYS3eF X-Received: by 2002:a9d:649a:: with SMTP id g26mr6471472otl.214.1578972009018; Mon, 13 Jan 2020 19:20:09 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1578972009; cv=none; d=google.com; s=arc-20160816; b=0Pegk2/rkBWDdabl+xsgzP/5gXPK8MibNkEKLwyFHjzKGO5Ws57iStJxOJKOJARq3Z n/QEsxYDXgXRMKRlcHM4yPC90oRS02dl364edtTA+ii/QbU6O40IlC/jBk3oSZVAQV3O NR9tH0KX4hprSNZVZSuIabHPuMb0NooxsjMHLE+5I0LFpHzqNMlF9EwPqT3Af1aZxKnL wqyrug6GMjUOsZliFmIHGeJ35A8sz+Ndn4bKEhebc1WlEMvgw7w62WTpvwQbxoslO4Xh YkxE/hi6HVWKn0aReTERL44JL8Koe4oFPSZjlkNd+URU7vCrsSmM6umaSuGAANcBjxIy SoLw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=sthfGcXx9SjArwQm3b4jw5yBTOD47j551bJkJ+Qm1Zo=; b=d3IbDXIOGnMDTO41uuw/lWYJmRkKampo5M2GFzcEbIJ9dwynDFgvrit5BiTnMulRqB LsRu0dqHenN/4AtPu9Kj2Ji4Ejxs1TzattS54ngYAnLkrisfBMgaEYiCKdvr+uDopL96 v6rdj3ZW53Fa23zfTY6euDs4Zo9IIOSvNmgMoZUc+GS8veKldXYrh7n2y8ofOHlEG9Hs z//xkmC18r3EzLxgAEsgAzyEI3qKWbuShoH1U1a1kJbsh03J1US1Tl0yCrLg4TO3d1D5 XhR+bLXLJe9p7i5AWEQidz5N7+xkV6YITdSsMt1fUbnzBap0ClBRZgIvecgY80yVArpV sMqA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@163.com header.s=s110527 header.b="ek/Nqwhz"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=163.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id t20si7515536otr.64.2020.01.13.19.19.57; Mon, 13 Jan 2020 19:20:09 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@163.com header.s=s110527 header.b="ek/Nqwhz"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=163.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729641AbgANDNV (ORCPT + 99 others); Mon, 13 Jan 2020 22:13:21 -0500 Received: from mail-m972.mail.163.com ([123.126.97.2]:53584 "EHLO mail-m972.mail.163.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729015AbgANDNU (ORCPT ); Mon, 13 Jan 2020 22:13:20 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=163.com; s=s110527; h=From:Subject:Date:Message-Id:MIME-Version; bh=sthfG cXx9SjArwQm3b4jw5yBTOD47j551bJkJ+Qm1Zo=; b=ek/NqwhzNK4T/UVf8HOfX srpCwW1haOsocXrwDE9CFulPVLw8NIJxvkvUn1d5I8phReHp4u27deTGLSvRkFGV dBCnL7DrEV+RF/YEHhpipvNoiCvaXIKREiy8Yac/xdxldReBqxIaVbp3/ujiw1Lg UzKUoq8bl8ygb5ipsv14gM= Received: from xilei-TM1604.mioffice.cn (unknown [106.37.187.207]) by smtp2 (Coremail) with SMTP id GtxpCgCnOBGeMR1eFuUiAA--.5247S4; Tue, 14 Jan 2020 11:12:31 +0800 (CST) From: Niu Xilei To: davem@davemloft.net Cc: tglx@linutronix.de, fw@strlen.de, peterz@infradead.org, steffen.klassert@secunet.com, bigeasy@linutronix.de, jonathan.lemon@gmail.com, pabeni@redhat.com, anshuman.khandual@arm.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Niu Xilei Subject: [v4] pktgen: Allow configuration of IPv6 source address range Date: Tue, 14 Jan 2020 11:12:29 +0800 Message-Id: <20200114031229.8569-1-niu_xilei@163.com> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-CM-TRANSID: GtxpCgCnOBGeMR1eFuUiAA--.5247S4 X-Coremail-Antispam: 1Uf129KBjvJXoWxur47Zr17uF4DAF47CryxAFb_yoWruryUpa y3Ja43XrW3Aw43tanxJr9Fvr43uw4v9345XFW7A3sY9F1DWry0yay8G3W7KFWjgry0krWq qr4UKr4qgF4qqFUanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x07jztC7UUUUU= X-Originating-IP: [106.37.187.207] X-CM-SenderInfo: pqlxs5plohxqqrwthudrp/1tbiTh+qgFUDB6rnvwAAsY Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Pktgen can use only one IPv6 source address from output device or src6 command setting. In pressure test we need create lots of sessions more than 65535. So add src6_min and src6_max command to set the range. Signed-off-by: Niu Xilei Changes since v3: - function set_src_in6_addr use static instead of static inline - precompute min_in6_l,min_in6_h,max_in6_h,max_in6_l in setup time Changes since v2: - reword subject line Changes since v1: - only create IPv6 source address over least significant 64 bit range --- net/core/pktgen.c | 98 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 294bfcf0ce0e..890be1b4877e 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -323,6 +323,10 @@ struct pktgen_dev { struct in6_addr max_in6_daddr; struct in6_addr min_in6_saddr; struct in6_addr max_in6_saddr; + u64 max_in6_h; + u64 max_in6_l; + u64 min_in6_h; + u64 min_in6_l; /* If we're doing ranges, random or incremental, then this * defines the min/max for those ranges. @@ -1355,6 +1359,59 @@ static ssize_t pktgen_if_write(struct file *file, sprintf(pg_result, "OK: dst6_max=%s", buf); return count; } + if (!strcmp(name, "src6_min")) { + len = strn_len(&user_buffer[i], sizeof(buf) - 1); + if (len < 0) + return len; + + pkt_dev->flags |= F_IPV6; + + if (copy_from_user(buf, &user_buffer[i], len)) + return -EFAULT; + buf[len] = 0; + + in6_pton(buf, -1, pkt_dev->min_in6_saddr.s6_addr, -1, NULL); + snprintf(buf, sizeof(buf), "%pI6c", &pkt_dev->min_in6_saddr); + + memcpy(&pkt_dev->min_in6_h, pkt_dev->min_in6_saddr.s6_addr, 8); + memcpy(&pkt_dev->min_in6_l, pkt_dev->min_in6_saddr.s6_addr + 8, 8); + pkt_dev->min_in6_h = be64_to_cpu(pkt_dev->min_in6_h); + pkt_dev->min_in6_l = be64_to_cpu(pkt_dev->min_in6_l); + + pkt_dev->cur_in6_saddr = pkt_dev->min_in6_saddr; + if (debug) + pr_debug("src6_min set to: %s\n", buf); + + i += len; + sprintf(pg_result, "OK: src6_min=%s", buf); + return count; + } + if (!strcmp(name, "src6_max")) { + len = strn_len(&user_buffer[i], sizeof(buf) - 1); + if (len < 0) + return len; + + pkt_dev->flags |= F_IPV6; + + if (copy_from_user(buf, &user_buffer[i], len)) + return -EFAULT; + buf[len] = 0; + + in6_pton(buf, -1, pkt_dev->max_in6_saddr.s6_addr, -1, NULL); + snprintf(buf, sizeof(buf), "%pI6c", &pkt_dev->max_in6_saddr); + + memcpy(&pkt_dev->max_in6_h, pkt_dev->max_in6_saddr.s6_addr, 8); + memcpy(&pkt_dev->max_in6_l, pkt_dev->max_in6_saddr.s6_addr + 8, 8); + pkt_dev->max_in6_h = be64_to_cpu(pkt_dev->max_in6_h); + pkt_dev->max_in6_l = be64_to_cpu(pkt_dev->max_in6_l); + + if (debug) + pr_debug("src6_max set to: %s\n", buf); + + i += len; + sprintf(pg_result, "OK: src6_max=%s", buf); + return count; + } if (!strcmp(name, "src6")) { len = strn_len(&user_buffer[i], sizeof(buf) - 1); if (len < 0) @@ -2286,6 +2343,45 @@ static void set_cur_queue_map(struct pktgen_dev *pkt_dev) pkt_dev->cur_queue_map = pkt_dev->cur_queue_map % pkt_dev->odev->real_num_tx_queues; } +/* generate ipv6 source addr */ +static void set_src_in6_addr(struct pktgen_dev *pkt_dev) +{ + u64 min6, max6, rand, i; + struct in6_addr addr6; + __be64 addr_l, *t; + + min6 = pkt_dev->min_in6_l; + max6 = pkt_dev->max_in6_l; + + /* only generate source address in least significant 64 bits range + * most significant 64 bits must be equal + */ + if (pkt_dev->max_in6_h != pkt_dev->min_in6_h || min6 >= max6) + return; + + addr6 = pkt_dev->min_in6_saddr; + t = (__be64 *)addr6.s6_addr + 1; + + if (pkt_dev->flags & F_IPSRC_RND) { + do { + prandom_bytes(&rand, sizeof(rand)); + rand = rand % (max6 - min6) + min6; + addr_l = cpu_to_be64(rand); + memcpy(t, &addr_l, 8); + } while (ipv6_addr_loopback(&addr6) || + ipv6_addr_v4mapped(&addr6) || + ipv6_addr_is_multicast(&addr6)); + } else { + addr6 = pkt_dev->cur_in6_saddr; + i = be64_to_cpu(*t); + if (++i > max6) + i = min6; + addr_l = cpu_to_be64(i); + memcpy(t, &addr_l, 8); + } + pkt_dev->cur_in6_saddr = addr6; +} + /* Increment/randomize headers according to flags and current values * for IP src/dest, UDP src/dst port, MAC-Addr src/dst */ @@ -2454,6 +2550,8 @@ static void mod_cur_headers(struct pktgen_dev *pkt_dev) } } else { /* IPV6 * */ + set_src_in6_addr(pkt_dev); + if (!ipv6_addr_any(&pkt_dev->min_in6_daddr)) { int i; -- 2.20.1