hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/net/core/pktgen.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 * Authors:
34 * Copyright 2001, 2002 by Robert Olsson <robert.olsson@its.uu.se>
....@@ -7,12 +8,6 @@
78 * Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
89 * Ben Greear <greearb@candelatech.com>
910 * Jens Låås <jens.laas@data.slu.se>
10
- *
11
- * This program is free software; you can redistribute it and/or
12
- * modify it under the terms of the GNU General Public License
13
- * as published by the Free Software Foundation; either version
14
- * 2 of the License, or (at your option) any later version.
15
- *
1611 *
1712 * A tool for loading the network with preconfigurated packets.
1813 * The tool is implemented as a linux module. Parameters are output
....@@ -60,9 +55,8 @@
6055 *
6156 * Integrated to 2.5.x 021029 --Lucio Maciel (luciomaciel@zipmail.com.br)
6257 *
63
- *
6458 * 021124 Finished major redesign and rewrite for new functionality.
65
- * See Documentation/networking/pktgen.txt for how to use this.
59
+ * See Documentation/networking/pktgen.rst for how to use this.
6660 *
6761 * The new operation:
6862 * For each CPU one thread/process is created at start. This process checks
....@@ -114,7 +108,6 @@
114108 *
115109 * Fixed src_mac command to set source mac of packet to value specified in
116110 * command by Adit Ranadive <adit.262@gmail.com>
117
- *
118111 */
119112
120113 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
....@@ -158,6 +151,7 @@
158151 #include <linux/etherdevice.h>
159152 #include <linux/kthread.h>
160153 #include <linux/prefetch.h>
154
+#include <linux/mmzone.h>
161155 #include <net/net_namespace.h>
162156 #include <net/checksum.h>
163157 #include <net/ipv6.h>
....@@ -541,12 +535,12 @@
541535 return single_open(file, pgctrl_show, PDE_DATA(inode));
542536 }
543537
544
-static const struct file_operations pktgen_fops = {
545
- .open = pgctrl_open,
546
- .read = seq_read,
547
- .llseek = seq_lseek,
548
- .write = pgctrl_write,
549
- .release = single_release,
538
+static const struct proc_ops pktgen_proc_ops = {
539
+ .proc_open = pgctrl_open,
540
+ .proc_read = seq_read,
541
+ .proc_lseek = seq_lseek,
542
+ .proc_write = pgctrl_write,
543
+ .proc_release = single_release,
550544 };
551545
552546 static int pktgen_if_show(struct seq_file *seq, void *v)
....@@ -928,7 +922,7 @@
928922 pkt_dev->min_pkt_size = value;
929923 pkt_dev->cur_pkt_size = value;
930924 }
931
- sprintf(pg_result, "OK: min_pkt_size=%u",
925
+ sprintf(pg_result, "OK: min_pkt_size=%d",
932926 pkt_dev->min_pkt_size);
933927 return count;
934928 }
....@@ -945,7 +939,7 @@
945939 pkt_dev->max_pkt_size = value;
946940 pkt_dev->cur_pkt_size = value;
947941 }
948
- sprintf(pg_result, "OK: max_pkt_size=%u",
942
+ sprintf(pg_result, "OK: max_pkt_size=%d",
949943 pkt_dev->max_pkt_size);
950944 return count;
951945 }
....@@ -965,7 +959,7 @@
965959 pkt_dev->max_pkt_size = value;
966960 pkt_dev->cur_pkt_size = value;
967961 }
968
- sprintf(pg_result, "OK: pkt_size=%u", pkt_dev->min_pkt_size);
962
+ sprintf(pg_result, "OK: pkt_size=%d", pkt_dev->min_pkt_size);
969963 return count;
970964 }
971965
....@@ -987,7 +981,7 @@
987981
988982 i += len;
989983 pkt_dev->nfrags = value;
990
- sprintf(pg_result, "OK: frags=%u", pkt_dev->nfrags);
984
+ sprintf(pg_result, "OK: frags=%d", pkt_dev->nfrags);
991985 return count;
992986 }
993987 if (!strcmp(name, "delay")) {
....@@ -1152,7 +1146,7 @@
11521146 (!(pkt_dev->odev->priv_flags & IFF_TX_SKB_SHARING)))))
11531147 return -ENOTSUPP;
11541148 pkt_dev->burst = value < 1 ? 1 : value;
1155
- sprintf(pg_result, "OK: burst=%d", pkt_dev->burst);
1149
+ sprintf(pg_result, "OK: burst=%u", pkt_dev->burst);
11561150 return count;
11571151 }
11581152 if (!strcmp(name, "node")) {
....@@ -1713,12 +1707,12 @@
17131707 return single_open(file, pktgen_if_show, PDE_DATA(inode));
17141708 }
17151709
1716
-static const struct file_operations pktgen_if_fops = {
1717
- .open = pktgen_if_open,
1718
- .read = seq_read,
1719
- .llseek = seq_lseek,
1720
- .write = pktgen_if_write,
1721
- .release = single_release,
1710
+static const struct proc_ops pktgen_if_proc_ops = {
1711
+ .proc_open = pktgen_if_open,
1712
+ .proc_read = seq_read,
1713
+ .proc_lseek = seq_lseek,
1714
+ .proc_write = pktgen_if_write,
1715
+ .proc_release = single_release,
17221716 };
17231717
17241718 static int pktgen_thread_show(struct seq_file *seq, void *v)
....@@ -1850,12 +1844,12 @@
18501844 return single_open(file, pktgen_thread_show, PDE_DATA(inode));
18511845 }
18521846
1853
-static const struct file_operations pktgen_thread_fops = {
1854
- .open = pktgen_thread_open,
1855
- .read = seq_read,
1856
- .llseek = seq_lseek,
1857
- .write = pktgen_thread_write,
1858
- .release = single_release,
1847
+static const struct proc_ops pktgen_thread_proc_ops = {
1848
+ .proc_open = pktgen_thread_open,
1849
+ .proc_read = seq_read,
1850
+ .proc_lseek = seq_lseek,
1851
+ .proc_write = pktgen_thread_write,
1852
+ .proc_release = single_release,
18591853 };
18601854
18611855 /* Think find or remove for NN */
....@@ -1932,7 +1926,7 @@
19321926
19331927 pkt_dev->entry = proc_create_data(dev->name, 0600,
19341928 pn->proc_dir,
1935
- &pktgen_if_fops,
1929
+ &pktgen_if_proc_ops,
19361930 pkt_dev);
19371931 if (!pkt_dev->entry)
19381932 pr_err("can't move proc entry for '%s'\n",
....@@ -2009,8 +2003,8 @@
20092003 return -ENODEV;
20102004 }
20112005
2012
- if (odev->type != ARPHRD_ETHER) {
2013
- pr_err("not an ethernet device: \"%s\"\n", ifname);
2006
+ if (odev->type != ARPHRD_ETHER && odev->type != ARPHRD_LOOPBACK) {
2007
+ pr_err("not an ethernet or loopback device: \"%s\"\n", ifname);
20142008 err = -EINVAL;
20152009 } else if (!netif_running(odev)) {
20162010 pr_err("device is down: \"%s\"\n", ifname);
....@@ -2124,9 +2118,11 @@
21242118 rcu_read_lock();
21252119 in_dev = __in_dev_get_rcu(pkt_dev->odev);
21262120 if (in_dev) {
2127
- if (in_dev->ifa_list) {
2128
- pkt_dev->saddr_min =
2129
- in_dev->ifa_list->ifa_address;
2121
+ const struct in_ifaddr *ifa;
2122
+
2123
+ ifa = rcu_dereference(in_dev->ifa_list);
2124
+ if (ifa) {
2125
+ pkt_dev->saddr_min = ifa->ifa_address;
21302126 pkt_dev->saddr_max = pkt_dev->saddr_min;
21312127 }
21322128 }
....@@ -2160,8 +2156,7 @@
21602156 s64 remaining;
21612157 struct hrtimer_sleeper t;
21622158
2163
- hrtimer_init_sleeper_on_stack(&t, CLOCK_MONOTONIC, HRTIMER_MODE_ABS,
2164
- current);
2159
+ hrtimer_init_sleeper_on_stack(&t, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
21652160 hrtimer_set_expires(&t.timer, spin_until);
21662161
21672162 remaining = ktime_to_ns(hrtimer_expires_remaining(&t.timer));
....@@ -2175,10 +2170,9 @@
21752170 end_time = ktime_get();
21762171 } while (ktime_compare(end_time, spin_until) < 0);
21772172 } else {
2178
- /* see do_nanosleep */
21792173 do {
21802174 set_current_state(TASK_INTERRUPTIBLE);
2181
- hrtimer_start_expires(&t.timer, HRTIMER_MODE_ABS);
2175
+ hrtimer_sleeper_start_expires(&t, HRTIMER_MODE_ABS);
21822176
21832177 if (likely(t.task))
21842178 schedule();
....@@ -2520,7 +2514,7 @@
25202514 skb->_skb_refdst = (unsigned long)&pkt_dev->xdst.u.dst | SKB_DST_NOREF;
25212515
25222516 rcu_read_lock_bh();
2523
- err = x->outer_mode->output(x, skb);
2517
+ err = pktgen_xfrm_outer_mode_output(x, skb);
25242518 rcu_read_unlock_bh();
25252519 if (err) {
25262520 XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTSTATEMODEERROR);
....@@ -2656,7 +2650,7 @@
26562650 }
26572651 get_page(pkt_dev->page);
26582652 skb_frag_set_page(skb, i, pkt_dev->page);
2659
- skb_shinfo(skb)->frags[i].page_offset = 0;
2653
+ skb_frag_off_set(&skb_shinfo(skb)->frags[i], 0);
26602654 /*last fragment, fill rest of data*/
26612655 if (i == (frags - 1))
26622656 skb_frag_size_set(&skb_shinfo(skb)->frags[i],
....@@ -3368,7 +3362,7 @@
33683362 /* skb was 'freed' by stack, so clean few
33693363 * bits and reuse it
33703364 */
3371
- skb_reset_tc(skb);
3365
+ skb_reset_redirect(skb);
33723366 } while (--burst > 0);
33733367 goto out; /* Skips xmit_mode M_START_XMIT */
33743368 } else if (pkt_dev->xmit_mode == M_QUEUE_XMIT) {
....@@ -3410,7 +3404,6 @@
34103404 HARD_TX_LOCK(odev, txq, smp_processor_id());
34113405
34123406 if (unlikely(netif_xmit_frozen_or_drv_stopped(txq))) {
3413
- ret = NETDEV_TX_BUSY;
34143407 pkt_dev->last_ok = 0;
34153408 goto unlock;
34163409 }
....@@ -3437,7 +3430,7 @@
34373430 net_info_ratelimited("%s xmit error: %d\n",
34383431 pkt_dev->odevname, ret);
34393432 pkt_dev->errors++;
3440
- /* fallthru */
3433
+ fallthrough;
34413434 case NETDEV_TX_BUSY:
34423435 /* Retry it next time */
34433436 refcount_dec(&(pkt_dev->skb->users));
....@@ -3636,7 +3629,7 @@
36363629 pkt_dev->svlan_cfi = 0;
36373630 pkt_dev->svlan_id = 0xffff;
36383631 pkt_dev->burst = 1;
3639
- pkt_dev->node = -1;
3632
+ pkt_dev->node = NUMA_NO_NODE;
36403633
36413634 err = pktgen_setup_dev(t->net, pkt_dev, ifname);
36423635 if (err)
....@@ -3645,7 +3638,7 @@
36453638 pkt_dev->clone_skb = pg_clone_skb_d;
36463639
36473640 pkt_dev->entry = proc_create_data(ifname, 0600, t->net->proc_dir,
3648
- &pktgen_if_fops, pkt_dev);
3641
+ &pktgen_if_proc_ops, pkt_dev);
36493642 if (!pkt_dev->entry) {
36503643 pr_err("cannot create %s/%s procfs entry\n",
36513644 PG_PROC_DIR, ifname);
....@@ -3706,7 +3699,7 @@
37063699 cpu_to_node(cpu),
37073700 "kpktgend_%d", cpu);
37083701 if (IS_ERR(p)) {
3709
- pr_err("kernel_thread() failed for cpu %d\n", t->cpu);
3702
+ pr_err("kthread_create_on_node() failed for cpu %d\n", t->cpu);
37103703 list_del(&t->th_list);
37113704 kfree(t);
37123705 return PTR_ERR(p);
....@@ -3715,7 +3708,7 @@
37153708 t->tsk = p;
37163709
37173710 pe = proc_create_data(t->tsk->comm, 0600, pn->proc_dir,
3718
- &pktgen_thread_fops, t);
3711
+ &pktgen_thread_proc_ops, t);
37193712 if (!pe) {
37203713 pr_err("cannot create %s/%s procfs entry\n",
37213714 PG_PROC_DIR, t->tsk->comm);
....@@ -3800,7 +3793,7 @@
38003793 pr_warn("cannot create /proc/net/%s\n", PG_PROC_DIR);
38013794 return -ENODEV;
38023795 }
3803
- pe = proc_create(PGCTRL, 0600, pn->proc_dir, &pktgen_fops);
3796
+ pe = proc_create(PGCTRL, 0600, pn->proc_dir, &pktgen_proc_ops);
38043797 if (pe == NULL) {
38053798 pr_err("cannot create %s procfs entry\n", PGCTRL);
38063799 ret = -EINVAL;