0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0114
0115 #include <linux/sys.h>
0116 #include <linux/types.h>
0117 #include <linux/module.h>
0118 #include <linux/moduleparam.h>
0119 #include <linux/kernel.h>
0120 #include <linux/mutex.h>
0121 #include <linux/sched.h>
0122 #include <linux/slab.h>
0123 #include <linux/vmalloc.h>
0124 #include <linux/unistd.h>
0125 #include <linux/string.h>
0126 #include <linux/ptrace.h>
0127 #include <linux/errno.h>
0128 #include <linux/ioport.h>
0129 #include <linux/interrupt.h>
0130 #include <linux/capability.h>
0131 #include <linux/hrtimer.h>
0132 #include <linux/freezer.h>
0133 #include <linux/delay.h>
0134 #include <linux/timer.h>
0135 #include <linux/list.h>
0136 #include <linux/init.h>
0137 #include <linux/skbuff.h>
0138 #include <linux/netdevice.h>
0139 #include <linux/inet.h>
0140 #include <linux/inetdevice.h>
0141 #include <linux/rtnetlink.h>
0142 #include <linux/if_arp.h>
0143 #include <linux/if_vlan.h>
0144 #include <linux/in.h>
0145 #include <linux/ip.h>
0146 #include <linux/ipv6.h>
0147 #include <linux/udp.h>
0148 #include <linux/proc_fs.h>
0149 #include <linux/seq_file.h>
0150 #include <linux/wait.h>
0151 #include <linux/etherdevice.h>
0152 #include <linux/kthread.h>
0153 #include <linux/prefetch.h>
0154 #include <linux/mmzone.h>
0155 #include <net/net_namespace.h>
0156 #include <net/checksum.h>
0157 #include <net/ipv6.h>
0158 #include <net/udp.h>
0159 #include <net/ip6_checksum.h>
0160 #include <net/addrconf.h>
0161 #ifdef CONFIG_XFRM
0162 #include <net/xfrm.h>
0163 #endif
0164 #include <net/netns/generic.h>
0165 #include <asm/byteorder.h>
0166 #include <linux/rcupdate.h>
0167 #include <linux/bitops.h>
0168 #include <linux/io.h>
0169 #include <linux/timex.h>
0170 #include <linux/uaccess.h>
0171 #include <asm/dma.h>
0172 #include <asm/div64.h> /* do_div */
0173
0174 #define VERSION "2.75"
0175 #define IP_NAME_SZ 32
0176 #define MAX_MPLS_LABELS 16
0177 #define MPLS_STACK_BOTTOM htonl(0x00000100)
0178
0179 #define MAX_IMIX_ENTRIES 20
0180 #define IMIX_PRECISION 100
0181
0182 #define func_enter() pr_debug("entering %s\n", __func__);
0183
0184 #define PKT_FLAGS \
0185 pf(IPV6) \
0186 pf(IPSRC_RND) \
0187 pf(IPDST_RND) \
0188 pf(TXSIZE_RND) \
0189 pf(UDPSRC_RND) \
0190 pf(UDPDST_RND) \
0191 pf(UDPCSUM) \
0192 pf(NO_TIMESTAMP) \
0193 pf(MPLS_RND) \
0194 pf(QUEUE_MAP_RND) \
0195 pf(QUEUE_MAP_CPU) \
0196 pf(FLOW_SEQ) \
0197 pf(IPSEC) \
0198 pf(MACSRC_RND) \
0199 pf(MACDST_RND) \
0200 pf(VID_RND) \
0201 pf(SVID_RND) \
0202 pf(NODE) \
0203
0204 #define pf(flag) flag##_SHIFT,
0205 enum pkt_flags {
0206 PKT_FLAGS
0207 };
0208 #undef pf
0209
0210
0211 #define pf(flag) static const __u32 F_##flag = (1<<flag##_SHIFT);
0212 PKT_FLAGS
0213 #undef pf
0214
0215 #define pf(flag) __stringify(flag),
0216 static char *pkt_flag_names[] = {
0217 PKT_FLAGS
0218 };
0219 #undef pf
0220
0221 #define NR_PKT_FLAGS ARRAY_SIZE(pkt_flag_names)
0222
0223
0224 #define T_STOP (1<<0)
0225 #define T_RUN (1<<1)
0226 #define T_REMDEVALL (1<<2)
0227 #define T_REMDEV (1<<3)
0228
0229
0230 #define M_START_XMIT 0
0231 #define M_NETIF_RECEIVE 1
0232 #define M_QUEUE_XMIT 2
0233
0234
0235 #define if_lock(t) mutex_lock(&(t->if_lock));
0236 #define if_unlock(t) mutex_unlock(&(t->if_lock));
0237
0238
0239 #define PKTGEN_MAGIC 0xbe9be955
0240 #define PG_PROC_DIR "pktgen"
0241 #define PGCTRL "pgctrl"
0242
0243 #define MAX_CFLOWS 65536
0244
0245 #define VLAN_TAG_SIZE(x) ((x)->vlan_id == 0xffff ? 0 : 4)
0246 #define SVLAN_TAG_SIZE(x) ((x)->svlan_id == 0xffff ? 0 : 4)
0247
0248 struct imix_pkt {
0249 u64 size;
0250 u64 weight;
0251 u64 count_so_far;
0252 };
0253
0254 struct flow_state {
0255 __be32 cur_daddr;
0256 int count;
0257 #ifdef CONFIG_XFRM
0258 struct xfrm_state *x;
0259 #endif
0260 __u32 flags;
0261 };
0262
0263
0264 #define F_INIT (1<<0)
0265
0266 struct pktgen_dev {
0267
0268
0269
0270 struct proc_dir_entry *entry;
0271 struct pktgen_thread *pg_thread;
0272 struct list_head list;
0273 struct rcu_head rcu;
0274
0275 int running;
0276
0277
0278
0279
0280 __u32 flags;
0281 int xmit_mode;
0282 int min_pkt_size;
0283 int max_pkt_size;
0284 int pkt_overhead;
0285 int nfrags;
0286 int removal_mark;
0287
0288
0289 struct page *page;
0290 u64 delay;
0291
0292 __u64 count;
0293 __u64 sofar;
0294 __u64 tx_bytes;
0295 __u64 errors;
0296
0297
0298
0299 __u32 clone_count;
0300 int last_ok;
0301
0302
0303
0304 ktime_t next_tx;
0305 ktime_t started_at;
0306 ktime_t stopped_at;
0307 u64 idle_acc;
0308
0309 __u32 seq_num;
0310
0311 int clone_skb;
0312
0313
0314
0315
0316
0317
0318
0319
0320
0321 char dst_min[IP_NAME_SZ];
0322 char dst_max[IP_NAME_SZ];
0323 char src_min[IP_NAME_SZ];
0324 char src_max[IP_NAME_SZ];
0325
0326 struct in6_addr in6_saddr;
0327 struct in6_addr in6_daddr;
0328 struct in6_addr cur_in6_daddr;
0329 struct in6_addr cur_in6_saddr;
0330
0331 struct in6_addr min_in6_daddr;
0332 struct in6_addr max_in6_daddr;
0333 struct in6_addr min_in6_saddr;
0334 struct in6_addr max_in6_saddr;
0335
0336
0337
0338
0339 __be32 saddr_min;
0340 __be32 saddr_max;
0341 __be32 daddr_min;
0342 __be32 daddr_max;
0343
0344 __u16 udp_src_min;
0345 __u16 udp_src_max;
0346 __u16 udp_dst_min;
0347 __u16 udp_dst_max;
0348
0349
0350 __u8 tos;
0351
0352 __u8 traffic_class;
0353
0354
0355
0356 unsigned int n_imix_entries;
0357 struct imix_pkt imix_entries[MAX_IMIX_ENTRIES];
0358
0359 __u8 imix_distribution[IMIX_PRECISION];
0360
0361
0362 unsigned int nr_labels;
0363 __be32 labels[MAX_MPLS_LABELS];
0364
0365
0366 __u8 vlan_p;
0367 __u8 vlan_cfi;
0368 __u16 vlan_id;
0369
0370 __u8 svlan_p;
0371 __u8 svlan_cfi;
0372 __u16 svlan_id;
0373
0374 __u32 src_mac_count;
0375 __u32 dst_mac_count;
0376
0377 unsigned char dst_mac[ETH_ALEN];
0378 unsigned char src_mac[ETH_ALEN];
0379
0380 __u32 cur_dst_mac_offset;
0381 __u32 cur_src_mac_offset;
0382 __be32 cur_saddr;
0383 __be32 cur_daddr;
0384 __u16 ip_id;
0385 __u16 cur_udp_dst;
0386 __u16 cur_udp_src;
0387 __u16 cur_queue_map;
0388 __u32 cur_pkt_size;
0389 __u32 last_pkt_size;
0390
0391 __u8 hh[14];
0392
0393
0394
0395
0396
0397
0398
0399
0400 __u16 pad;
0401
0402 struct sk_buff *skb;
0403
0404
0405 struct net_device *odev;
0406
0407
0408
0409
0410
0411
0412
0413 netdevice_tracker dev_tracker;
0414 char odevname[32];
0415 struct flow_state *flows;
0416 unsigned int cflows;
0417 unsigned int lflow;
0418 unsigned int nflows;
0419 unsigned int curfl;
0420
0421 u16 queue_map_min;
0422 u16 queue_map_max;
0423 __u32 skb_priority;
0424 unsigned int burst;
0425 int node;
0426
0427 #ifdef CONFIG_XFRM
0428 __u8 ipsmode;
0429 __u8 ipsproto;
0430 __u32 spi;
0431 struct xfrm_dst xdst;
0432 struct dst_ops dstops;
0433 #endif
0434 char result[512];
0435 };
0436
0437 struct pktgen_hdr {
0438 __be32 pgh_magic;
0439 __be32 seq_num;
0440 __be32 tv_sec;
0441 __be32 tv_usec;
0442 };
0443
0444
0445 static unsigned int pg_net_id __read_mostly;
0446
0447 struct pktgen_net {
0448 struct net *net;
0449 struct proc_dir_entry *proc_dir;
0450 struct list_head pktgen_threads;
0451 bool pktgen_exiting;
0452 };
0453
0454 struct pktgen_thread {
0455 struct mutex if_lock;
0456 struct list_head if_list;
0457 struct list_head th_list;
0458 struct task_struct *tsk;
0459 char result[512];
0460
0461
0462
0463
0464 u32 control;
0465 int cpu;
0466
0467 wait_queue_head_t queue;
0468 struct completion start_done;
0469 struct pktgen_net *net;
0470 };
0471
0472 #define REMOVE 1
0473 #define FIND 0
0474
0475 static const char version[] =
0476 "Packet Generator for packet performance testing. "
0477 "Version: " VERSION "\n";
0478
0479 static int pktgen_remove_device(struct pktgen_thread *t, struct pktgen_dev *i);
0480 static int pktgen_add_device(struct pktgen_thread *t, const char *ifname);
0481 static struct pktgen_dev *pktgen_find_dev(struct pktgen_thread *t,
0482 const char *ifname, bool exact);
0483 static int pktgen_device_event(struct notifier_block *, unsigned long, void *);
0484 static void pktgen_run_all_threads(struct pktgen_net *pn);
0485 static void pktgen_reset_all_threads(struct pktgen_net *pn);
0486 static void pktgen_stop_all_threads(struct pktgen_net *pn);
0487
0488 static void pktgen_stop(struct pktgen_thread *t);
0489 static void pktgen_clear_counters(struct pktgen_dev *pkt_dev);
0490 static void fill_imix_distribution(struct pktgen_dev *pkt_dev);
0491
0492
0493 static int pg_count_d __read_mostly = 1000;
0494 static int pg_delay_d __read_mostly;
0495 static int pg_clone_skb_d __read_mostly;
0496 static int debug __read_mostly;
0497
0498 static DEFINE_MUTEX(pktgen_thread_lock);
0499
0500 static struct notifier_block pktgen_notifier_block = {
0501 .notifier_call = pktgen_device_event,
0502 };
0503
0504
0505
0506
0507
0508
0509 static int pgctrl_show(struct seq_file *seq, void *v)
0510 {
0511 seq_puts(seq, version);
0512 return 0;
0513 }
0514
0515 static ssize_t pgctrl_write(struct file *file, const char __user *buf,
0516 size_t count, loff_t *ppos)
0517 {
0518 char data[128];
0519 struct pktgen_net *pn = net_generic(current->nsproxy->net_ns, pg_net_id);
0520
0521 if (!capable(CAP_NET_ADMIN))
0522 return -EPERM;
0523
0524 if (count == 0)
0525 return -EINVAL;
0526
0527 if (count > sizeof(data))
0528 count = sizeof(data);
0529
0530 if (copy_from_user(data, buf, count))
0531 return -EFAULT;
0532
0533 data[count - 1] = 0;
0534
0535 if (!strcmp(data, "stop"))
0536 pktgen_stop_all_threads(pn);
0537 else if (!strcmp(data, "start"))
0538 pktgen_run_all_threads(pn);
0539 else if (!strcmp(data, "reset"))
0540 pktgen_reset_all_threads(pn);
0541 else
0542 return -EINVAL;
0543
0544 return count;
0545 }
0546
0547 static int pgctrl_open(struct inode *inode, struct file *file)
0548 {
0549 return single_open(file, pgctrl_show, pde_data(inode));
0550 }
0551
0552 static const struct proc_ops pktgen_proc_ops = {
0553 .proc_open = pgctrl_open,
0554 .proc_read = seq_read,
0555 .proc_lseek = seq_lseek,
0556 .proc_write = pgctrl_write,
0557 .proc_release = single_release,
0558 };
0559
0560 static int pktgen_if_show(struct seq_file *seq, void *v)
0561 {
0562 const struct pktgen_dev *pkt_dev = seq->private;
0563 ktime_t stopped;
0564 unsigned int i;
0565 u64 idle;
0566
0567 seq_printf(seq,
0568 "Params: count %llu min_pkt_size: %u max_pkt_size: %u\n",
0569 (unsigned long long)pkt_dev->count, pkt_dev->min_pkt_size,
0570 pkt_dev->max_pkt_size);
0571
0572 if (pkt_dev->n_imix_entries > 0) {
0573 seq_puts(seq, " imix_weights: ");
0574 for (i = 0; i < pkt_dev->n_imix_entries; i++) {
0575 seq_printf(seq, "%llu,%llu ",
0576 pkt_dev->imix_entries[i].size,
0577 pkt_dev->imix_entries[i].weight);
0578 }
0579 seq_puts(seq, "\n");
0580 }
0581
0582 seq_printf(seq,
0583 " frags: %d delay: %llu clone_skb: %d ifname: %s\n",
0584 pkt_dev->nfrags, (unsigned long long) pkt_dev->delay,
0585 pkt_dev->clone_skb, pkt_dev->odevname);
0586
0587 seq_printf(seq, " flows: %u flowlen: %u\n", pkt_dev->cflows,
0588 pkt_dev->lflow);
0589
0590 seq_printf(seq,
0591 " queue_map_min: %u queue_map_max: %u\n",
0592 pkt_dev->queue_map_min,
0593 pkt_dev->queue_map_max);
0594
0595 if (pkt_dev->skb_priority)
0596 seq_printf(seq, " skb_priority: %u\n",
0597 pkt_dev->skb_priority);
0598
0599 if (pkt_dev->flags & F_IPV6) {
0600 seq_printf(seq,
0601 " saddr: %pI6c min_saddr: %pI6c max_saddr: %pI6c\n"
0602 " daddr: %pI6c min_daddr: %pI6c max_daddr: %pI6c\n",
0603 &pkt_dev->in6_saddr,
0604 &pkt_dev->min_in6_saddr, &pkt_dev->max_in6_saddr,
0605 &pkt_dev->in6_daddr,
0606 &pkt_dev->min_in6_daddr, &pkt_dev->max_in6_daddr);
0607 } else {
0608 seq_printf(seq,
0609 " dst_min: %s dst_max: %s\n",
0610 pkt_dev->dst_min, pkt_dev->dst_max);
0611 seq_printf(seq,
0612 " src_min: %s src_max: %s\n",
0613 pkt_dev->src_min, pkt_dev->src_max);
0614 }
0615
0616 seq_puts(seq, " src_mac: ");
0617
0618 seq_printf(seq, "%pM ",
0619 is_zero_ether_addr(pkt_dev->src_mac) ?
0620 pkt_dev->odev->dev_addr : pkt_dev->src_mac);
0621
0622 seq_puts(seq, "dst_mac: ");
0623 seq_printf(seq, "%pM\n", pkt_dev->dst_mac);
0624
0625 seq_printf(seq,
0626 " udp_src_min: %d udp_src_max: %d"
0627 " udp_dst_min: %d udp_dst_max: %d\n",
0628 pkt_dev->udp_src_min, pkt_dev->udp_src_max,
0629 pkt_dev->udp_dst_min, pkt_dev->udp_dst_max);
0630
0631 seq_printf(seq,
0632 " src_mac_count: %d dst_mac_count: %d\n",
0633 pkt_dev->src_mac_count, pkt_dev->dst_mac_count);
0634
0635 if (pkt_dev->nr_labels) {
0636 seq_puts(seq, " mpls: ");
0637 for (i = 0; i < pkt_dev->nr_labels; i++)
0638 seq_printf(seq, "%08x%s", ntohl(pkt_dev->labels[i]),
0639 i == pkt_dev->nr_labels-1 ? "\n" : ", ");
0640 }
0641
0642 if (pkt_dev->vlan_id != 0xffff)
0643 seq_printf(seq, " vlan_id: %u vlan_p: %u vlan_cfi: %u\n",
0644 pkt_dev->vlan_id, pkt_dev->vlan_p,
0645 pkt_dev->vlan_cfi);
0646
0647 if (pkt_dev->svlan_id != 0xffff)
0648 seq_printf(seq, " svlan_id: %u vlan_p: %u vlan_cfi: %u\n",
0649 pkt_dev->svlan_id, pkt_dev->svlan_p,
0650 pkt_dev->svlan_cfi);
0651
0652 if (pkt_dev->tos)
0653 seq_printf(seq, " tos: 0x%02x\n", pkt_dev->tos);
0654
0655 if (pkt_dev->traffic_class)
0656 seq_printf(seq, " traffic_class: 0x%02x\n", pkt_dev->traffic_class);
0657
0658 if (pkt_dev->burst > 1)
0659 seq_printf(seq, " burst: %d\n", pkt_dev->burst);
0660
0661 if (pkt_dev->node >= 0)
0662 seq_printf(seq, " node: %d\n", pkt_dev->node);
0663
0664 if (pkt_dev->xmit_mode == M_NETIF_RECEIVE)
0665 seq_puts(seq, " xmit_mode: netif_receive\n");
0666 else if (pkt_dev->xmit_mode == M_QUEUE_XMIT)
0667 seq_puts(seq, " xmit_mode: xmit_queue\n");
0668
0669 seq_puts(seq, " Flags: ");
0670
0671 for (i = 0; i < NR_PKT_FLAGS; i++) {
0672 if (i == F_FLOW_SEQ)
0673 if (!pkt_dev->cflows)
0674 continue;
0675
0676 if (pkt_dev->flags & (1 << i))
0677 seq_printf(seq, "%s ", pkt_flag_names[i]);
0678 else if (i == F_FLOW_SEQ)
0679 seq_puts(seq, "FLOW_RND ");
0680
0681 #ifdef CONFIG_XFRM
0682 if (i == F_IPSEC && pkt_dev->spi)
0683 seq_printf(seq, "spi:%u", pkt_dev->spi);
0684 #endif
0685 }
0686
0687 seq_puts(seq, "\n");
0688
0689
0690 stopped = pkt_dev->running ? ktime_get() : pkt_dev->stopped_at;
0691 idle = pkt_dev->idle_acc;
0692 do_div(idle, NSEC_PER_USEC);
0693
0694 seq_printf(seq,
0695 "Current:\n pkts-sofar: %llu errors: %llu\n",
0696 (unsigned long long)pkt_dev->sofar,
0697 (unsigned long long)pkt_dev->errors);
0698
0699 if (pkt_dev->n_imix_entries > 0) {
0700 int i;
0701
0702 seq_puts(seq, " imix_size_counts: ");
0703 for (i = 0; i < pkt_dev->n_imix_entries; i++) {
0704 seq_printf(seq, "%llu,%llu ",
0705 pkt_dev->imix_entries[i].size,
0706 pkt_dev->imix_entries[i].count_so_far);
0707 }
0708 seq_puts(seq, "\n");
0709 }
0710
0711 seq_printf(seq,
0712 " started: %lluus stopped: %lluus idle: %lluus\n",
0713 (unsigned long long) ktime_to_us(pkt_dev->started_at),
0714 (unsigned long long) ktime_to_us(stopped),
0715 (unsigned long long) idle);
0716
0717 seq_printf(seq,
0718 " seq_num: %d cur_dst_mac_offset: %d cur_src_mac_offset: %d\n",
0719 pkt_dev->seq_num, pkt_dev->cur_dst_mac_offset,
0720 pkt_dev->cur_src_mac_offset);
0721
0722 if (pkt_dev->flags & F_IPV6) {
0723 seq_printf(seq, " cur_saddr: %pI6c cur_daddr: %pI6c\n",
0724 &pkt_dev->cur_in6_saddr,
0725 &pkt_dev->cur_in6_daddr);
0726 } else
0727 seq_printf(seq, " cur_saddr: %pI4 cur_daddr: %pI4\n",
0728 &pkt_dev->cur_saddr, &pkt_dev->cur_daddr);
0729
0730 seq_printf(seq, " cur_udp_dst: %d cur_udp_src: %d\n",
0731 pkt_dev->cur_udp_dst, pkt_dev->cur_udp_src);
0732
0733 seq_printf(seq, " cur_queue_map: %u\n", pkt_dev->cur_queue_map);
0734
0735 seq_printf(seq, " flows: %u\n", pkt_dev->nflows);
0736
0737 if (pkt_dev->result[0])
0738 seq_printf(seq, "Result: %s\n", pkt_dev->result);
0739 else
0740 seq_puts(seq, "Result: Idle\n");
0741
0742 return 0;
0743 }
0744
0745
0746 static int hex32_arg(const char __user *user_buffer, unsigned long maxlen,
0747 __u32 *num)
0748 {
0749 int i = 0;
0750 *num = 0;
0751
0752 for (; i < maxlen; i++) {
0753 int value;
0754 char c;
0755 *num <<= 4;
0756 if (get_user(c, &user_buffer[i]))
0757 return -EFAULT;
0758 value = hex_to_bin(c);
0759 if (value >= 0)
0760 *num |= value;
0761 else
0762 break;
0763 }
0764 return i;
0765 }
0766
0767 static int count_trail_chars(const char __user * user_buffer,
0768 unsigned int maxlen)
0769 {
0770 int i;
0771
0772 for (i = 0; i < maxlen; i++) {
0773 char c;
0774 if (get_user(c, &user_buffer[i]))
0775 return -EFAULT;
0776 switch (c) {
0777 case '\"':
0778 case '\n':
0779 case '\r':
0780 case '\t':
0781 case ' ':
0782 case '=':
0783 break;
0784 default:
0785 goto done;
0786 }
0787 }
0788 done:
0789 return i;
0790 }
0791
0792 static long num_arg(const char __user *user_buffer, unsigned long maxlen,
0793 unsigned long *num)
0794 {
0795 int i;
0796 *num = 0;
0797
0798 for (i = 0; i < maxlen; i++) {
0799 char c;
0800 if (get_user(c, &user_buffer[i]))
0801 return -EFAULT;
0802 if ((c >= '0') && (c <= '9')) {
0803 *num *= 10;
0804 *num += c - '0';
0805 } else
0806 break;
0807 }
0808 return i;
0809 }
0810
0811 static int strn_len(const char __user * user_buffer, unsigned int maxlen)
0812 {
0813 int i;
0814
0815 for (i = 0; i < maxlen; i++) {
0816 char c;
0817 if (get_user(c, &user_buffer[i]))
0818 return -EFAULT;
0819 switch (c) {
0820 case '\"':
0821 case '\n':
0822 case '\r':
0823 case '\t':
0824 case ' ':
0825 goto done_str;
0826 default:
0827 break;
0828 }
0829 }
0830 done_str:
0831 return i;
0832 }
0833
0834
0835
0836
0837
0838
0839 static ssize_t get_imix_entries(const char __user *buffer,
0840 struct pktgen_dev *pkt_dev)
0841 {
0842 const int max_digits = 10;
0843 int i = 0;
0844 long len;
0845 char c;
0846
0847 pkt_dev->n_imix_entries = 0;
0848
0849 do {
0850 unsigned long weight;
0851 unsigned long size;
0852
0853 len = num_arg(&buffer[i], max_digits, &size);
0854 if (len < 0)
0855 return len;
0856 i += len;
0857 if (get_user(c, &buffer[i]))
0858 return -EFAULT;
0859
0860 if (c != ',')
0861 return -EINVAL;
0862 i++;
0863
0864 if (size < 14 + 20 + 8)
0865 size = 14 + 20 + 8;
0866
0867 len = num_arg(&buffer[i], max_digits, &weight);
0868 if (len < 0)
0869 return len;
0870 if (weight <= 0)
0871 return -EINVAL;
0872
0873 pkt_dev->imix_entries[pkt_dev->n_imix_entries].size = size;
0874 pkt_dev->imix_entries[pkt_dev->n_imix_entries].weight = weight;
0875
0876 i += len;
0877 if (get_user(c, &buffer[i]))
0878 return -EFAULT;
0879
0880 i++;
0881 pkt_dev->n_imix_entries++;
0882
0883 if (pkt_dev->n_imix_entries > MAX_IMIX_ENTRIES)
0884 return -E2BIG;
0885 } while (c == ' ');
0886
0887 return i;
0888 }
0889
0890 static ssize_t get_labels(const char __user *buffer, struct pktgen_dev *pkt_dev)
0891 {
0892 unsigned int n = 0;
0893 char c;
0894 ssize_t i = 0;
0895 int len;
0896
0897 pkt_dev->nr_labels = 0;
0898 do {
0899 __u32 tmp;
0900 len = hex32_arg(&buffer[i], 8, &tmp);
0901 if (len <= 0)
0902 return len;
0903 pkt_dev->labels[n] = htonl(tmp);
0904 if (pkt_dev->labels[n] & MPLS_STACK_BOTTOM)
0905 pkt_dev->flags |= F_MPLS_RND;
0906 i += len;
0907 if (get_user(c, &buffer[i]))
0908 return -EFAULT;
0909 i++;
0910 n++;
0911 if (n >= MAX_MPLS_LABELS)
0912 return -E2BIG;
0913 } while (c == ',');
0914
0915 pkt_dev->nr_labels = n;
0916 return i;
0917 }
0918
0919 static __u32 pktgen_read_flag(const char *f, bool *disable)
0920 {
0921 __u32 i;
0922
0923 if (f[0] == '!') {
0924 *disable = true;
0925 f++;
0926 }
0927
0928 for (i = 0; i < NR_PKT_FLAGS; i++) {
0929 if (!IS_ENABLED(CONFIG_XFRM) && i == IPSEC_SHIFT)
0930 continue;
0931
0932
0933 if (!*disable && i == IPV6_SHIFT)
0934 continue;
0935
0936 if (strcmp(f, pkt_flag_names[i]) == 0)
0937 return 1 << i;
0938 }
0939
0940 if (strcmp(f, "FLOW_RND") == 0) {
0941 *disable = !*disable;
0942 return F_FLOW_SEQ;
0943 }
0944
0945 return 0;
0946 }
0947
0948 static ssize_t pktgen_if_write(struct file *file,
0949 const char __user * user_buffer, size_t count,
0950 loff_t * offset)
0951 {
0952 struct seq_file *seq = file->private_data;
0953 struct pktgen_dev *pkt_dev = seq->private;
0954 int i, max, len;
0955 char name[16], valstr[32];
0956 unsigned long value = 0;
0957 char *pg_result = NULL;
0958 int tmp = 0;
0959 char buf[128];
0960
0961 pg_result = &(pkt_dev->result[0]);
0962
0963 if (count < 1) {
0964 pr_warn("wrong command format\n");
0965 return -EINVAL;
0966 }
0967
0968 max = count;
0969 tmp = count_trail_chars(user_buffer, max);
0970 if (tmp < 0) {
0971 pr_warn("illegal format\n");
0972 return tmp;
0973 }
0974 i = tmp;
0975
0976
0977
0978 len = strn_len(&user_buffer[i], sizeof(name) - 1);
0979 if (len < 0)
0980 return len;
0981
0982 memset(name, 0, sizeof(name));
0983 if (copy_from_user(name, &user_buffer[i], len))
0984 return -EFAULT;
0985 i += len;
0986
0987 max = count - i;
0988 len = count_trail_chars(&user_buffer[i], max);
0989 if (len < 0)
0990 return len;
0991
0992 i += len;
0993
0994 if (debug) {
0995 size_t copy = min_t(size_t, count + 1, 1024);
0996 char *tp = strndup_user(user_buffer, copy);
0997
0998 if (IS_ERR(tp))
0999 return PTR_ERR(tp);
1000
1001 pr_debug("%s,%zu buffer -:%s:-\n", name, count, tp);
1002 kfree(tp);
1003 }
1004
1005 if (!strcmp(name, "min_pkt_size")) {
1006 len = num_arg(&user_buffer[i], 10, &value);
1007 if (len < 0)
1008 return len;
1009
1010 i += len;
1011 if (value < 14 + 20 + 8)
1012 value = 14 + 20 + 8;
1013 if (value != pkt_dev->min_pkt_size) {
1014 pkt_dev->min_pkt_size = value;
1015 pkt_dev->cur_pkt_size = value;
1016 }
1017 sprintf(pg_result, "OK: min_pkt_size=%d",
1018 pkt_dev->min_pkt_size);
1019 return count;
1020 }
1021
1022 if (!strcmp(name, "max_pkt_size")) {
1023 len = num_arg(&user_buffer[i], 10, &value);
1024 if (len < 0)
1025 return len;
1026
1027 i += len;
1028 if (value < 14 + 20 + 8)
1029 value = 14 + 20 + 8;
1030 if (value != pkt_dev->max_pkt_size) {
1031 pkt_dev->max_pkt_size = value;
1032 pkt_dev->cur_pkt_size = value;
1033 }
1034 sprintf(pg_result, "OK: max_pkt_size=%d",
1035 pkt_dev->max_pkt_size);
1036 return count;
1037 }
1038
1039
1040
1041 if (!strcmp(name, "pkt_size")) {
1042 len = num_arg(&user_buffer[i], 10, &value);
1043 if (len < 0)
1044 return len;
1045
1046 i += len;
1047 if (value < 14 + 20 + 8)
1048 value = 14 + 20 + 8;
1049 if (value != pkt_dev->min_pkt_size) {
1050 pkt_dev->min_pkt_size = value;
1051 pkt_dev->max_pkt_size = value;
1052 pkt_dev->cur_pkt_size = value;
1053 }
1054 sprintf(pg_result, "OK: pkt_size=%d", pkt_dev->min_pkt_size);
1055 return count;
1056 }
1057
1058 if (!strcmp(name, "imix_weights")) {
1059 if (pkt_dev->clone_skb > 0)
1060 return -EINVAL;
1061
1062 len = get_imix_entries(&user_buffer[i], pkt_dev);
1063 if (len < 0)
1064 return len;
1065
1066 fill_imix_distribution(pkt_dev);
1067
1068 i += len;
1069 return count;
1070 }
1071
1072 if (!strcmp(name, "debug")) {
1073 len = num_arg(&user_buffer[i], 10, &value);
1074 if (len < 0)
1075 return len;
1076
1077 i += len;
1078 debug = value;
1079 sprintf(pg_result, "OK: debug=%u", debug);
1080 return count;
1081 }
1082
1083 if (!strcmp(name, "frags")) {
1084 len = num_arg(&user_buffer[i], 10, &value);
1085 if (len < 0)
1086 return len;
1087
1088 i += len;
1089 pkt_dev->nfrags = value;
1090 sprintf(pg_result, "OK: frags=%d", pkt_dev->nfrags);
1091 return count;
1092 }
1093 if (!strcmp(name, "delay")) {
1094 len = num_arg(&user_buffer[i], 10, &value);
1095 if (len < 0)
1096 return len;
1097
1098 i += len;
1099 if (value == 0x7FFFFFFF)
1100 pkt_dev->delay = ULLONG_MAX;
1101 else
1102 pkt_dev->delay = (u64)value;
1103
1104 sprintf(pg_result, "OK: delay=%llu",
1105 (unsigned long long) pkt_dev->delay);
1106 return count;
1107 }
1108 if (!strcmp(name, "rate")) {
1109 len = num_arg(&user_buffer[i], 10, &value);
1110 if (len < 0)
1111 return len;
1112
1113 i += len;
1114 if (!value)
1115 return len;
1116 pkt_dev->delay = pkt_dev->min_pkt_size*8*NSEC_PER_USEC/value;
1117 if (debug)
1118 pr_info("Delay set at: %llu ns\n", pkt_dev->delay);
1119
1120 sprintf(pg_result, "OK: rate=%lu", value);
1121 return count;
1122 }
1123 if (!strcmp(name, "ratep")) {
1124 len = num_arg(&user_buffer[i], 10, &value);
1125 if (len < 0)
1126 return len;
1127
1128 i += len;
1129 if (!value)
1130 return len;
1131 pkt_dev->delay = NSEC_PER_SEC/value;
1132 if (debug)
1133 pr_info("Delay set at: %llu ns\n", pkt_dev->delay);
1134
1135 sprintf(pg_result, "OK: rate=%lu", value);
1136 return count;
1137 }
1138 if (!strcmp(name, "udp_src_min")) {
1139 len = num_arg(&user_buffer[i], 10, &value);
1140 if (len < 0)
1141 return len;
1142
1143 i += len;
1144 if (value != pkt_dev->udp_src_min) {
1145 pkt_dev->udp_src_min = value;
1146 pkt_dev->cur_udp_src = value;
1147 }
1148 sprintf(pg_result, "OK: udp_src_min=%u", pkt_dev->udp_src_min);
1149 return count;
1150 }
1151 if (!strcmp(name, "udp_dst_min")) {
1152 len = num_arg(&user_buffer[i], 10, &value);
1153 if (len < 0)
1154 return len;
1155
1156 i += len;
1157 if (value != pkt_dev->udp_dst_min) {
1158 pkt_dev->udp_dst_min = value;
1159 pkt_dev->cur_udp_dst = value;
1160 }
1161 sprintf(pg_result, "OK: udp_dst_min=%u", pkt_dev->udp_dst_min);
1162 return count;
1163 }
1164 if (!strcmp(name, "udp_src_max")) {
1165 len = num_arg(&user_buffer[i], 10, &value);
1166 if (len < 0)
1167 return len;
1168
1169 i += len;
1170 if (value != pkt_dev->udp_src_max) {
1171 pkt_dev->udp_src_max = value;
1172 pkt_dev->cur_udp_src = value;
1173 }
1174 sprintf(pg_result, "OK: udp_src_max=%u", pkt_dev->udp_src_max);
1175 return count;
1176 }
1177 if (!strcmp(name, "udp_dst_max")) {
1178 len = num_arg(&user_buffer[i], 10, &value);
1179 if (len < 0)
1180 return len;
1181
1182 i += len;
1183 if (value != pkt_dev->udp_dst_max) {
1184 pkt_dev->udp_dst_max = value;
1185 pkt_dev->cur_udp_dst = value;
1186 }
1187 sprintf(pg_result, "OK: udp_dst_max=%u", pkt_dev->udp_dst_max);
1188 return count;
1189 }
1190 if (!strcmp(name, "clone_skb")) {
1191 len = num_arg(&user_buffer[i], 10, &value);
1192 if (len < 0)
1193 return len;
1194
1195
1196
1197 if ((value > 0) &&
1198 ((pkt_dev->xmit_mode == M_NETIF_RECEIVE) ||
1199 !(pkt_dev->odev->priv_flags & IFF_TX_SKB_SHARING)))
1200 return -ENOTSUPP;
1201 if (value > 0 && pkt_dev->n_imix_entries > 0)
1202 return -EINVAL;
1203
1204 i += len;
1205 pkt_dev->clone_skb = value;
1206
1207 sprintf(pg_result, "OK: clone_skb=%d", pkt_dev->clone_skb);
1208 return count;
1209 }
1210 if (!strcmp(name, "count")) {
1211 len = num_arg(&user_buffer[i], 10, &value);
1212 if (len < 0)
1213 return len;
1214
1215 i += len;
1216 pkt_dev->count = value;
1217 sprintf(pg_result, "OK: count=%llu",
1218 (unsigned long long)pkt_dev->count);
1219 return count;
1220 }
1221 if (!strcmp(name, "src_mac_count")) {
1222 len = num_arg(&user_buffer[i], 10, &value);
1223 if (len < 0)
1224 return len;
1225
1226 i += len;
1227 if (pkt_dev->src_mac_count != value) {
1228 pkt_dev->src_mac_count = value;
1229 pkt_dev->cur_src_mac_offset = 0;
1230 }
1231 sprintf(pg_result, "OK: src_mac_count=%d",
1232 pkt_dev->src_mac_count);
1233 return count;
1234 }
1235 if (!strcmp(name, "dst_mac_count")) {
1236 len = num_arg(&user_buffer[i], 10, &value);
1237 if (len < 0)
1238 return len;
1239
1240 i += len;
1241 if (pkt_dev->dst_mac_count != value) {
1242 pkt_dev->dst_mac_count = value;
1243 pkt_dev->cur_dst_mac_offset = 0;
1244 }
1245 sprintf(pg_result, "OK: dst_mac_count=%d",
1246 pkt_dev->dst_mac_count);
1247 return count;
1248 }
1249 if (!strcmp(name, "burst")) {
1250 len = num_arg(&user_buffer[i], 10, &value);
1251 if (len < 0)
1252 return len;
1253
1254 i += len;
1255 if ((value > 1) &&
1256 ((pkt_dev->xmit_mode == M_QUEUE_XMIT) ||
1257 ((pkt_dev->xmit_mode == M_START_XMIT) &&
1258 (!(pkt_dev->odev->priv_flags & IFF_TX_SKB_SHARING)))))
1259 return -ENOTSUPP;
1260 pkt_dev->burst = value < 1 ? 1 : value;
1261 sprintf(pg_result, "OK: burst=%u", pkt_dev->burst);
1262 return count;
1263 }
1264 if (!strcmp(name, "node")) {
1265 len = num_arg(&user_buffer[i], 10, &value);
1266 if (len < 0)
1267 return len;
1268
1269 i += len;
1270
1271 if (node_possible(value)) {
1272 pkt_dev->node = value;
1273 sprintf(pg_result, "OK: node=%d", pkt_dev->node);
1274 if (pkt_dev->page) {
1275 put_page(pkt_dev->page);
1276 pkt_dev->page = NULL;
1277 }
1278 }
1279 else
1280 sprintf(pg_result, "ERROR: node not possible");
1281 return count;
1282 }
1283 if (!strcmp(name, "xmit_mode")) {
1284 char f[32];
1285
1286 memset(f, 0, 32);
1287 len = strn_len(&user_buffer[i], sizeof(f) - 1);
1288 if (len < 0)
1289 return len;
1290
1291 if (copy_from_user(f, &user_buffer[i], len))
1292 return -EFAULT;
1293 i += len;
1294
1295 if (strcmp(f, "start_xmit") == 0) {
1296 pkt_dev->xmit_mode = M_START_XMIT;
1297 } else if (strcmp(f, "netif_receive") == 0) {
1298
1299 if (pkt_dev->clone_skb > 0)
1300 return -ENOTSUPP;
1301
1302 pkt_dev->xmit_mode = M_NETIF_RECEIVE;
1303
1304
1305
1306
1307 pkt_dev->last_ok = 1;
1308 } else if (strcmp(f, "queue_xmit") == 0) {
1309 pkt_dev->xmit_mode = M_QUEUE_XMIT;
1310 pkt_dev->last_ok = 1;
1311 } else {
1312 sprintf(pg_result,
1313 "xmit_mode -:%s:- unknown\nAvailable modes: %s",
1314 f, "start_xmit, netif_receive\n");
1315 return count;
1316 }
1317 sprintf(pg_result, "OK: xmit_mode=%s", f);
1318 return count;
1319 }
1320 if (!strcmp(name, "flag")) {
1321 __u32 flag;
1322 char f[32];
1323 bool disable = false;
1324
1325 memset(f, 0, 32);
1326 len = strn_len(&user_buffer[i], sizeof(f) - 1);
1327 if (len < 0)
1328 return len;
1329
1330 if (copy_from_user(f, &user_buffer[i], len))
1331 return -EFAULT;
1332 i += len;
1333
1334 flag = pktgen_read_flag(f, &disable);
1335
1336 if (flag) {
1337 if (disable)
1338 pkt_dev->flags &= ~flag;
1339 else
1340 pkt_dev->flags |= flag;
1341 } else {
1342 sprintf(pg_result,
1343 "Flag -:%s:- unknown\nAvailable flags, (prepend ! to un-set flag):\n%s",
1344 f,
1345 "IPSRC_RND, IPDST_RND, UDPSRC_RND, UDPDST_RND, "
1346 "MACSRC_RND, MACDST_RND, TXSIZE_RND, IPV6, "
1347 "MPLS_RND, VID_RND, SVID_RND, FLOW_SEQ, "
1348 "QUEUE_MAP_RND, QUEUE_MAP_CPU, UDPCSUM, "
1349 "NO_TIMESTAMP, "
1350 #ifdef CONFIG_XFRM
1351 "IPSEC, "
1352 #endif
1353 "NODE_ALLOC\n");
1354 return count;
1355 }
1356 sprintf(pg_result, "OK: flags=0x%x", pkt_dev->flags);
1357 return count;
1358 }
1359 if (!strcmp(name, "dst_min") || !strcmp(name, "dst")) {
1360 len = strn_len(&user_buffer[i], sizeof(pkt_dev->dst_min) - 1);
1361 if (len < 0)
1362 return len;
1363
1364 if (copy_from_user(buf, &user_buffer[i], len))
1365 return -EFAULT;
1366 buf[len] = 0;
1367 if (strcmp(buf, pkt_dev->dst_min) != 0) {
1368 memset(pkt_dev->dst_min, 0, sizeof(pkt_dev->dst_min));
1369 strcpy(pkt_dev->dst_min, buf);
1370 pkt_dev->daddr_min = in_aton(pkt_dev->dst_min);
1371 pkt_dev->cur_daddr = pkt_dev->daddr_min;
1372 }
1373 if (debug)
1374 pr_debug("dst_min set to: %s\n", pkt_dev->dst_min);
1375 i += len;
1376 sprintf(pg_result, "OK: dst_min=%s", pkt_dev->dst_min);
1377 return count;
1378 }
1379 if (!strcmp(name, "dst_max")) {
1380 len = strn_len(&user_buffer[i], sizeof(pkt_dev->dst_max) - 1);
1381 if (len < 0)
1382 return len;
1383
1384 if (copy_from_user(buf, &user_buffer[i], len))
1385 return -EFAULT;
1386 buf[len] = 0;
1387 if (strcmp(buf, pkt_dev->dst_max) != 0) {
1388 memset(pkt_dev->dst_max, 0, sizeof(pkt_dev->dst_max));
1389 strcpy(pkt_dev->dst_max, buf);
1390 pkt_dev->daddr_max = in_aton(pkt_dev->dst_max);
1391 pkt_dev->cur_daddr = pkt_dev->daddr_max;
1392 }
1393 if (debug)
1394 pr_debug("dst_max set to: %s\n", pkt_dev->dst_max);
1395 i += len;
1396 sprintf(pg_result, "OK: dst_max=%s", pkt_dev->dst_max);
1397 return count;
1398 }
1399 if (!strcmp(name, "dst6")) {
1400 len = strn_len(&user_buffer[i], sizeof(buf) - 1);
1401 if (len < 0)
1402 return len;
1403
1404 pkt_dev->flags |= F_IPV6;
1405
1406 if (copy_from_user(buf, &user_buffer[i], len))
1407 return -EFAULT;
1408 buf[len] = 0;
1409
1410 in6_pton(buf, -1, pkt_dev->in6_daddr.s6_addr, -1, NULL);
1411 snprintf(buf, sizeof(buf), "%pI6c", &pkt_dev->in6_daddr);
1412
1413 pkt_dev->cur_in6_daddr = pkt_dev->in6_daddr;
1414
1415 if (debug)
1416 pr_debug("dst6 set to: %s\n", buf);
1417
1418 i += len;
1419 sprintf(pg_result, "OK: dst6=%s", buf);
1420 return count;
1421 }
1422 if (!strcmp(name, "dst6_min")) {
1423 len = strn_len(&user_buffer[i], sizeof(buf) - 1);
1424 if (len < 0)
1425 return len;
1426
1427 pkt_dev->flags |= F_IPV6;
1428
1429 if (copy_from_user(buf, &user_buffer[i], len))
1430 return -EFAULT;
1431 buf[len] = 0;
1432
1433 in6_pton(buf, -1, pkt_dev->min_in6_daddr.s6_addr, -1, NULL);
1434 snprintf(buf, sizeof(buf), "%pI6c", &pkt_dev->min_in6_daddr);
1435
1436 pkt_dev->cur_in6_daddr = pkt_dev->min_in6_daddr;
1437 if (debug)
1438 pr_debug("dst6_min set to: %s\n", buf);
1439
1440 i += len;
1441 sprintf(pg_result, "OK: dst6_min=%s", buf);
1442 return count;
1443 }
1444 if (!strcmp(name, "dst6_max")) {
1445 len = strn_len(&user_buffer[i], sizeof(buf) - 1);
1446 if (len < 0)
1447 return len;
1448
1449 pkt_dev->flags |= F_IPV6;
1450
1451 if (copy_from_user(buf, &user_buffer[i], len))
1452 return -EFAULT;
1453 buf[len] = 0;
1454
1455 in6_pton(buf, -1, pkt_dev->max_in6_daddr.s6_addr, -1, NULL);
1456 snprintf(buf, sizeof(buf), "%pI6c", &pkt_dev->max_in6_daddr);
1457
1458 if (debug)
1459 pr_debug("dst6_max set to: %s\n", buf);
1460
1461 i += len;
1462 sprintf(pg_result, "OK: dst6_max=%s", buf);
1463 return count;
1464 }
1465 if (!strcmp(name, "src6")) {
1466 len = strn_len(&user_buffer[i], sizeof(buf) - 1);
1467 if (len < 0)
1468 return len;
1469
1470 pkt_dev->flags |= F_IPV6;
1471
1472 if (copy_from_user(buf, &user_buffer[i], len))
1473 return -EFAULT;
1474 buf[len] = 0;
1475
1476 in6_pton(buf, -1, pkt_dev->in6_saddr.s6_addr, -1, NULL);
1477 snprintf(buf, sizeof(buf), "%pI6c", &pkt_dev->in6_saddr);
1478
1479 pkt_dev->cur_in6_saddr = pkt_dev->in6_saddr;
1480
1481 if (debug)
1482 pr_debug("src6 set to: %s\n", buf);
1483
1484 i += len;
1485 sprintf(pg_result, "OK: src6=%s", buf);
1486 return count;
1487 }
1488 if (!strcmp(name, "src_min")) {
1489 len = strn_len(&user_buffer[i], sizeof(pkt_dev->src_min) - 1);
1490 if (len < 0)
1491 return len;
1492
1493 if (copy_from_user(buf, &user_buffer[i], len))
1494 return -EFAULT;
1495 buf[len] = 0;
1496 if (strcmp(buf, pkt_dev->src_min) != 0) {
1497 memset(pkt_dev->src_min, 0, sizeof(pkt_dev->src_min));
1498 strcpy(pkt_dev->src_min, buf);
1499 pkt_dev->saddr_min = in_aton(pkt_dev->src_min);
1500 pkt_dev->cur_saddr = pkt_dev->saddr_min;
1501 }
1502 if (debug)
1503 pr_debug("src_min set to: %s\n", pkt_dev->src_min);
1504 i += len;
1505 sprintf(pg_result, "OK: src_min=%s", pkt_dev->src_min);
1506 return count;
1507 }
1508 if (!strcmp(name, "src_max")) {
1509 len = strn_len(&user_buffer[i], sizeof(pkt_dev->src_max) - 1);
1510 if (len < 0)
1511 return len;
1512
1513 if (copy_from_user(buf, &user_buffer[i], len))
1514 return -EFAULT;
1515 buf[len] = 0;
1516 if (strcmp(buf, pkt_dev->src_max) != 0) {
1517 memset(pkt_dev->src_max, 0, sizeof(pkt_dev->src_max));
1518 strcpy(pkt_dev->src_max, buf);
1519 pkt_dev->saddr_max = in_aton(pkt_dev->src_max);
1520 pkt_dev->cur_saddr = pkt_dev->saddr_max;
1521 }
1522 if (debug)
1523 pr_debug("src_max set to: %s\n", pkt_dev->src_max);
1524 i += len;
1525 sprintf(pg_result, "OK: src_max=%s", pkt_dev->src_max);
1526 return count;
1527 }
1528 if (!strcmp(name, "dst_mac")) {
1529 len = strn_len(&user_buffer[i], sizeof(valstr) - 1);
1530 if (len < 0)
1531 return len;
1532
1533 memset(valstr, 0, sizeof(valstr));
1534 if (copy_from_user(valstr, &user_buffer[i], len))
1535 return -EFAULT;
1536
1537 if (!mac_pton(valstr, pkt_dev->dst_mac))
1538 return -EINVAL;
1539
1540 ether_addr_copy(&pkt_dev->hh[0], pkt_dev->dst_mac);
1541
1542 sprintf(pg_result, "OK: dstmac %pM", pkt_dev->dst_mac);
1543 return count;
1544 }
1545 if (!strcmp(name, "src_mac")) {
1546 len = strn_len(&user_buffer[i], sizeof(valstr) - 1);
1547 if (len < 0)
1548 return len;
1549
1550 memset(valstr, 0, sizeof(valstr));
1551 if (copy_from_user(valstr, &user_buffer[i], len))
1552 return -EFAULT;
1553
1554 if (!mac_pton(valstr, pkt_dev->src_mac))
1555 return -EINVAL;
1556
1557 ether_addr_copy(&pkt_dev->hh[6], pkt_dev->src_mac);
1558
1559 sprintf(pg_result, "OK: srcmac %pM", pkt_dev->src_mac);
1560 return count;
1561 }
1562
1563 if (!strcmp(name, "clear_counters")) {
1564 pktgen_clear_counters(pkt_dev);
1565 sprintf(pg_result, "OK: Clearing counters.\n");
1566 return count;
1567 }
1568
1569 if (!strcmp(name, "flows")) {
1570 len = num_arg(&user_buffer[i], 10, &value);
1571 if (len < 0)
1572 return len;
1573
1574 i += len;
1575 if (value > MAX_CFLOWS)
1576 value = MAX_CFLOWS;
1577
1578 pkt_dev->cflows = value;
1579 sprintf(pg_result, "OK: flows=%u", pkt_dev->cflows);
1580 return count;
1581 }
1582 #ifdef CONFIG_XFRM
1583 if (!strcmp(name, "spi")) {
1584 len = num_arg(&user_buffer[i], 10, &value);
1585 if (len < 0)
1586 return len;
1587
1588 i += len;
1589 pkt_dev->spi = value;
1590 sprintf(pg_result, "OK: spi=%u", pkt_dev->spi);
1591 return count;
1592 }
1593 #endif
1594 if (!strcmp(name, "flowlen")) {
1595 len = num_arg(&user_buffer[i], 10, &value);
1596 if (len < 0)
1597 return len;
1598
1599 i += len;
1600 pkt_dev->lflow = value;
1601 sprintf(pg_result, "OK: flowlen=%u", pkt_dev->lflow);
1602 return count;
1603 }
1604
1605 if (!strcmp(name, "queue_map_min")) {
1606 len = num_arg(&user_buffer[i], 5, &value);
1607 if (len < 0)
1608 return len;
1609
1610 i += len;
1611 pkt_dev->queue_map_min = value;
1612 sprintf(pg_result, "OK: queue_map_min=%u", pkt_dev->queue_map_min);
1613 return count;
1614 }
1615
1616 if (!strcmp(name, "queue_map_max")) {
1617 len = num_arg(&user_buffer[i], 5, &value);
1618 if (len < 0)
1619 return len;
1620
1621 i += len;
1622 pkt_dev->queue_map_max = value;
1623 sprintf(pg_result, "OK: queue_map_max=%u", pkt_dev->queue_map_max);
1624 return count;
1625 }
1626
1627 if (!strcmp(name, "mpls")) {
1628 unsigned int n, cnt;
1629
1630 len = get_labels(&user_buffer[i], pkt_dev);
1631 if (len < 0)
1632 return len;
1633 i += len;
1634 cnt = sprintf(pg_result, "OK: mpls=");
1635 for (n = 0; n < pkt_dev->nr_labels; n++)
1636 cnt += sprintf(pg_result + cnt,
1637 "%08x%s", ntohl(pkt_dev->labels[n]),
1638 n == pkt_dev->nr_labels-1 ? "" : ",");
1639
1640 if (pkt_dev->nr_labels && pkt_dev->vlan_id != 0xffff) {
1641 pkt_dev->vlan_id = 0xffff;
1642 pkt_dev->svlan_id = 0xffff;
1643
1644 if (debug)
1645 pr_debug("VLAN/SVLAN auto turned off\n");
1646 }
1647 return count;
1648 }
1649
1650 if (!strcmp(name, "vlan_id")) {
1651 len = num_arg(&user_buffer[i], 4, &value);
1652 if (len < 0)
1653 return len;
1654
1655 i += len;
1656 if (value <= 4095) {
1657 pkt_dev->vlan_id = value;
1658
1659 if (debug)
1660 pr_debug("VLAN turned on\n");
1661
1662 if (debug && pkt_dev->nr_labels)
1663 pr_debug("MPLS auto turned off\n");
1664
1665 pkt_dev->nr_labels = 0;
1666 sprintf(pg_result, "OK: vlan_id=%u", pkt_dev->vlan_id);
1667 } else {
1668 pkt_dev->vlan_id = 0xffff;
1669 pkt_dev->svlan_id = 0xffff;
1670
1671 if (debug)
1672 pr_debug("VLAN/SVLAN turned off\n");
1673 }
1674 return count;
1675 }
1676
1677 if (!strcmp(name, "vlan_p")) {
1678 len = num_arg(&user_buffer[i], 1, &value);
1679 if (len < 0)
1680 return len;
1681
1682 i += len;
1683 if ((value <= 7) && (pkt_dev->vlan_id != 0xffff)) {
1684 pkt_dev->vlan_p = value;
1685 sprintf(pg_result, "OK: vlan_p=%u", pkt_dev->vlan_p);
1686 } else {
1687 sprintf(pg_result, "ERROR: vlan_p must be 0-7");
1688 }
1689 return count;
1690 }
1691
1692 if (!strcmp(name, "vlan_cfi")) {
1693 len = num_arg(&user_buffer[i], 1, &value);
1694 if (len < 0)
1695 return len;
1696
1697 i += len;
1698 if ((value <= 1) && (pkt_dev->vlan_id != 0xffff)) {
1699 pkt_dev->vlan_cfi = value;
1700 sprintf(pg_result, "OK: vlan_cfi=%u", pkt_dev->vlan_cfi);
1701 } else {
1702 sprintf(pg_result, "ERROR: vlan_cfi must be 0-1");
1703 }
1704 return count;
1705 }
1706
1707 if (!strcmp(name, "svlan_id")) {
1708 len = num_arg(&user_buffer[i], 4, &value);
1709 if (len < 0)
1710 return len;
1711
1712 i += len;
1713 if ((value <= 4095) && ((pkt_dev->vlan_id != 0xffff))) {
1714 pkt_dev->svlan_id = value;
1715
1716 if (debug)
1717 pr_debug("SVLAN turned on\n");
1718
1719 if (debug && pkt_dev->nr_labels)
1720 pr_debug("MPLS auto turned off\n");
1721
1722 pkt_dev->nr_labels = 0;
1723 sprintf(pg_result, "OK: svlan_id=%u", pkt_dev->svlan_id);
1724 } else {
1725 pkt_dev->vlan_id = 0xffff;
1726 pkt_dev->svlan_id = 0xffff;
1727
1728 if (debug)
1729 pr_debug("VLAN/SVLAN turned off\n");
1730 }
1731 return count;
1732 }
1733
1734 if (!strcmp(name, "svlan_p")) {
1735 len = num_arg(&user_buffer[i], 1, &value);
1736 if (len < 0)
1737 return len;
1738
1739 i += len;
1740 if ((value <= 7) && (pkt_dev->svlan_id != 0xffff)) {
1741 pkt_dev->svlan_p = value;
1742 sprintf(pg_result, "OK: svlan_p=%u", pkt_dev->svlan_p);
1743 } else {
1744 sprintf(pg_result, "ERROR: svlan_p must be 0-7");
1745 }
1746 return count;
1747 }
1748
1749 if (!strcmp(name, "svlan_cfi")) {
1750 len = num_arg(&user_buffer[i], 1, &value);
1751 if (len < 0)
1752 return len;
1753
1754 i += len;
1755 if ((value <= 1) && (pkt_dev->svlan_id != 0xffff)) {
1756 pkt_dev->svlan_cfi = value;
1757 sprintf(pg_result, "OK: svlan_cfi=%u", pkt_dev->svlan_cfi);
1758 } else {
1759 sprintf(pg_result, "ERROR: svlan_cfi must be 0-1");
1760 }
1761 return count;
1762 }
1763
1764 if (!strcmp(name, "tos")) {
1765 __u32 tmp_value = 0;
1766 len = hex32_arg(&user_buffer[i], 2, &tmp_value);
1767 if (len < 0)
1768 return len;
1769
1770 i += len;
1771 if (len == 2) {
1772 pkt_dev->tos = tmp_value;
1773 sprintf(pg_result, "OK: tos=0x%02x", pkt_dev->tos);
1774 } else {
1775 sprintf(pg_result, "ERROR: tos must be 00-ff");
1776 }
1777 return count;
1778 }
1779
1780 if (!strcmp(name, "traffic_class")) {
1781 __u32 tmp_value = 0;
1782 len = hex32_arg(&user_buffer[i], 2, &tmp_value);
1783 if (len < 0)
1784 return len;
1785
1786 i += len;
1787 if (len == 2) {
1788 pkt_dev->traffic_class = tmp_value;
1789 sprintf(pg_result, "OK: traffic_class=0x%02x", pkt_dev->traffic_class);
1790 } else {
1791 sprintf(pg_result, "ERROR: traffic_class must be 00-ff");
1792 }
1793 return count;
1794 }
1795
1796 if (!strcmp(name, "skb_priority")) {
1797 len = num_arg(&user_buffer[i], 9, &value);
1798 if (len < 0)
1799 return len;
1800
1801 i += len;
1802 pkt_dev->skb_priority = value;
1803 sprintf(pg_result, "OK: skb_priority=%i",
1804 pkt_dev->skb_priority);
1805 return count;
1806 }
1807
1808 sprintf(pkt_dev->result, "No such parameter \"%s\"", name);
1809 return -EINVAL;
1810 }
1811
1812 static int pktgen_if_open(struct inode *inode, struct file *file)
1813 {
1814 return single_open(file, pktgen_if_show, pde_data(inode));
1815 }
1816
1817 static const struct proc_ops pktgen_if_proc_ops = {
1818 .proc_open = pktgen_if_open,
1819 .proc_read = seq_read,
1820 .proc_lseek = seq_lseek,
1821 .proc_write = pktgen_if_write,
1822 .proc_release = single_release,
1823 };
1824
1825 static int pktgen_thread_show(struct seq_file *seq, void *v)
1826 {
1827 struct pktgen_thread *t = seq->private;
1828 const struct pktgen_dev *pkt_dev;
1829
1830 BUG_ON(!t);
1831
1832 seq_puts(seq, "Running: ");
1833
1834 rcu_read_lock();
1835 list_for_each_entry_rcu(pkt_dev, &t->if_list, list)
1836 if (pkt_dev->running)
1837 seq_printf(seq, "%s ", pkt_dev->odevname);
1838
1839 seq_puts(seq, "\nStopped: ");
1840
1841 list_for_each_entry_rcu(pkt_dev, &t->if_list, list)
1842 if (!pkt_dev->running)
1843 seq_printf(seq, "%s ", pkt_dev->odevname);
1844
1845 if (t->result[0])
1846 seq_printf(seq, "\nResult: %s\n", t->result);
1847 else
1848 seq_puts(seq, "\nResult: NA\n");
1849
1850 rcu_read_unlock();
1851
1852 return 0;
1853 }
1854
1855 static ssize_t pktgen_thread_write(struct file *file,
1856 const char __user * user_buffer,
1857 size_t count, loff_t * offset)
1858 {
1859 struct seq_file *seq = file->private_data;
1860 struct pktgen_thread *t = seq->private;
1861 int i, max, len, ret;
1862 char name[40];
1863 char *pg_result;
1864
1865 if (count < 1) {
1866
1867 return -EINVAL;
1868 }
1869
1870 max = count;
1871 len = count_trail_chars(user_buffer, max);
1872 if (len < 0)
1873 return len;
1874
1875 i = len;
1876
1877
1878
1879 len = strn_len(&user_buffer[i], sizeof(name) - 1);
1880 if (len < 0)
1881 return len;
1882
1883 memset(name, 0, sizeof(name));
1884 if (copy_from_user(name, &user_buffer[i], len))
1885 return -EFAULT;
1886 i += len;
1887
1888 max = count - i;
1889 len = count_trail_chars(&user_buffer[i], max);
1890 if (len < 0)
1891 return len;
1892
1893 i += len;
1894
1895 if (debug)
1896 pr_debug("t=%s, count=%lu\n", name, (unsigned long)count);
1897
1898 if (!t) {
1899 pr_err("ERROR: No thread\n");
1900 ret = -EINVAL;
1901 goto out;
1902 }
1903
1904 pg_result = &(t->result[0]);
1905
1906 if (!strcmp(name, "add_device")) {
1907 char f[32];
1908 memset(f, 0, 32);
1909 len = strn_len(&user_buffer[i], sizeof(f) - 1);
1910 if (len < 0) {
1911 ret = len;
1912 goto out;
1913 }
1914 if (copy_from_user(f, &user_buffer[i], len))
1915 return -EFAULT;
1916 i += len;
1917 mutex_lock(&pktgen_thread_lock);
1918 ret = pktgen_add_device(t, f);
1919 mutex_unlock(&pktgen_thread_lock);
1920 if (!ret) {
1921 ret = count;
1922 sprintf(pg_result, "OK: add_device=%s", f);
1923 } else
1924 sprintf(pg_result, "ERROR: can not add device %s", f);
1925 goto out;
1926 }
1927
1928 if (!strcmp(name, "rem_device_all")) {
1929 mutex_lock(&pktgen_thread_lock);
1930 t->control |= T_REMDEVALL;
1931 mutex_unlock(&pktgen_thread_lock);
1932 schedule_timeout_interruptible(msecs_to_jiffies(125));
1933 ret = count;
1934 sprintf(pg_result, "OK: rem_device_all");
1935 goto out;
1936 }
1937
1938 if (!strcmp(name, "max_before_softirq")) {
1939 sprintf(pg_result, "OK: Note! max_before_softirq is obsoleted -- Do not use");
1940 ret = count;
1941 goto out;
1942 }
1943
1944 ret = -EINVAL;
1945 out:
1946 return ret;
1947 }
1948
1949 static int pktgen_thread_open(struct inode *inode, struct file *file)
1950 {
1951 return single_open(file, pktgen_thread_show, pde_data(inode));
1952 }
1953
1954 static const struct proc_ops pktgen_thread_proc_ops = {
1955 .proc_open = pktgen_thread_open,
1956 .proc_read = seq_read,
1957 .proc_lseek = seq_lseek,
1958 .proc_write = pktgen_thread_write,
1959 .proc_release = single_release,
1960 };
1961
1962
1963 static struct pktgen_dev *__pktgen_NN_threads(const struct pktgen_net *pn,
1964 const char *ifname, int remove)
1965 {
1966 struct pktgen_thread *t;
1967 struct pktgen_dev *pkt_dev = NULL;
1968 bool exact = (remove == FIND);
1969
1970 list_for_each_entry(t, &pn->pktgen_threads, th_list) {
1971 pkt_dev = pktgen_find_dev(t, ifname, exact);
1972 if (pkt_dev) {
1973 if (remove) {
1974 pkt_dev->removal_mark = 1;
1975 t->control |= T_REMDEV;
1976 }
1977 break;
1978 }
1979 }
1980 return pkt_dev;
1981 }
1982
1983
1984
1985
1986 static void pktgen_mark_device(const struct pktgen_net *pn, const char *ifname)
1987 {
1988 struct pktgen_dev *pkt_dev = NULL;
1989 const int max_tries = 10, msec_per_try = 125;
1990 int i = 0;
1991
1992 mutex_lock(&pktgen_thread_lock);
1993 pr_debug("%s: marking %s for removal\n", __func__, ifname);
1994
1995 while (1) {
1996
1997 pkt_dev = __pktgen_NN_threads(pn, ifname, REMOVE);
1998 if (pkt_dev == NULL)
1999 break;
2000
2001 mutex_unlock(&pktgen_thread_lock);
2002 pr_debug("%s: waiting for %s to disappear....\n",
2003 __func__, ifname);
2004 schedule_timeout_interruptible(msecs_to_jiffies(msec_per_try));
2005 mutex_lock(&pktgen_thread_lock);
2006
2007 if (++i >= max_tries) {
2008 pr_err("%s: timed out after waiting %d msec for device %s to be removed\n",
2009 __func__, msec_per_try * i, ifname);
2010 break;
2011 }
2012
2013 }
2014
2015 mutex_unlock(&pktgen_thread_lock);
2016 }
2017
2018 static void pktgen_change_name(const struct pktgen_net *pn, struct net_device *dev)
2019 {
2020 struct pktgen_thread *t;
2021
2022 mutex_lock(&pktgen_thread_lock);
2023
2024 list_for_each_entry(t, &pn->pktgen_threads, th_list) {
2025 struct pktgen_dev *pkt_dev;
2026
2027 if_lock(t);
2028 list_for_each_entry(pkt_dev, &t->if_list, list) {
2029 if (pkt_dev->odev != dev)
2030 continue;
2031
2032 proc_remove(pkt_dev->entry);
2033
2034 pkt_dev->entry = proc_create_data(dev->name, 0600,
2035 pn->proc_dir,
2036 &pktgen_if_proc_ops,
2037 pkt_dev);
2038 if (!pkt_dev->entry)
2039 pr_err("can't move proc entry for '%s'\n",
2040 dev->name);
2041 break;
2042 }
2043 if_unlock(t);
2044 }
2045 mutex_unlock(&pktgen_thread_lock);
2046 }
2047
2048 static int pktgen_device_event(struct notifier_block *unused,
2049 unsigned long event, void *ptr)
2050 {
2051 struct net_device *dev = netdev_notifier_info_to_dev(ptr);
2052 struct pktgen_net *pn = net_generic(dev_net(dev), pg_net_id);
2053
2054 if (pn->pktgen_exiting)
2055 return NOTIFY_DONE;
2056
2057
2058
2059
2060
2061 switch (event) {
2062 case NETDEV_CHANGENAME:
2063 pktgen_change_name(pn, dev);
2064 break;
2065
2066 case NETDEV_UNREGISTER:
2067 pktgen_mark_device(pn, dev->name);
2068 break;
2069 }
2070
2071 return NOTIFY_DONE;
2072 }
2073
2074 static struct net_device *pktgen_dev_get_by_name(const struct pktgen_net *pn,
2075 struct pktgen_dev *pkt_dev,
2076 const char *ifname)
2077 {
2078 char b[IFNAMSIZ+5];
2079 int i;
2080
2081 for (i = 0; ifname[i] != '@'; i++) {
2082 if (i == IFNAMSIZ)
2083 break;
2084
2085 b[i] = ifname[i];
2086 }
2087 b[i] = 0;
2088
2089 return dev_get_by_name(pn->net, b);
2090 }
2091
2092
2093
2094
2095 static int pktgen_setup_dev(const struct pktgen_net *pn,
2096 struct pktgen_dev *pkt_dev, const char *ifname)
2097 {
2098 struct net_device *odev;
2099 int err;
2100
2101
2102 if (pkt_dev->odev) {
2103 netdev_put(pkt_dev->odev, &pkt_dev->dev_tracker);
2104 pkt_dev->odev = NULL;
2105 }
2106
2107 odev = pktgen_dev_get_by_name(pn, pkt_dev, ifname);
2108 if (!odev) {
2109 pr_err("no such netdevice: \"%s\"\n", ifname);
2110 return -ENODEV;
2111 }
2112
2113 if (odev->type != ARPHRD_ETHER && odev->type != ARPHRD_LOOPBACK) {
2114 pr_err("not an ethernet or loopback device: \"%s\"\n", ifname);
2115 err = -EINVAL;
2116 } else if (!netif_running(odev)) {
2117 pr_err("device is down: \"%s\"\n", ifname);
2118 err = -ENETDOWN;
2119 } else {
2120 pkt_dev->odev = odev;
2121 netdev_tracker_alloc(odev, &pkt_dev->dev_tracker, GFP_KERNEL);
2122 return 0;
2123 }
2124
2125 dev_put(odev);
2126 return err;
2127 }
2128
2129
2130
2131
2132 static void pktgen_setup_inject(struct pktgen_dev *pkt_dev)
2133 {
2134 int ntxq;
2135
2136 if (!pkt_dev->odev) {
2137 pr_err("ERROR: pkt_dev->odev == NULL in setup_inject\n");
2138 sprintf(pkt_dev->result,
2139 "ERROR: pkt_dev->odev == NULL in setup_inject.\n");
2140 return;
2141 }
2142
2143
2144 ntxq = pkt_dev->odev->real_num_tx_queues;
2145
2146 if (ntxq <= pkt_dev->queue_map_min) {
2147 pr_warn("WARNING: Requested queue_map_min (zero-based) (%d) exceeds valid range [0 - %d] for (%d) queues on %s, resetting\n",
2148 pkt_dev->queue_map_min, (ntxq ?: 1) - 1, ntxq,
2149 pkt_dev->odevname);
2150 pkt_dev->queue_map_min = (ntxq ?: 1) - 1;
2151 }
2152 if (pkt_dev->queue_map_max >= ntxq) {
2153 pr_warn("WARNING: Requested queue_map_max (zero-based) (%d) exceeds valid range [0 - %d] for (%d) queues on %s, resetting\n",
2154 pkt_dev->queue_map_max, (ntxq ?: 1) - 1, ntxq,
2155 pkt_dev->odevname);
2156 pkt_dev->queue_map_max = (ntxq ?: 1) - 1;
2157 }
2158
2159
2160
2161 if (is_zero_ether_addr(pkt_dev->src_mac))
2162 ether_addr_copy(&(pkt_dev->hh[6]), pkt_dev->odev->dev_addr);
2163
2164
2165 ether_addr_copy(&(pkt_dev->hh[0]), pkt_dev->dst_mac);
2166
2167 if (pkt_dev->flags & F_IPV6) {
2168 int i, set = 0, err = 1;
2169 struct inet6_dev *idev;
2170
2171 if (pkt_dev->min_pkt_size == 0) {
2172 pkt_dev->min_pkt_size = 14 + sizeof(struct ipv6hdr)
2173 + sizeof(struct udphdr)
2174 + sizeof(struct pktgen_hdr)
2175 + pkt_dev->pkt_overhead;
2176 }
2177
2178 for (i = 0; i < sizeof(struct in6_addr); i++)
2179 if (pkt_dev->cur_in6_saddr.s6_addr[i]) {
2180 set = 1;
2181 break;
2182 }
2183
2184 if (!set) {
2185
2186
2187
2188
2189
2190
2191
2192 rcu_read_lock();
2193 idev = __in6_dev_get(pkt_dev->odev);
2194 if (idev) {
2195 struct inet6_ifaddr *ifp;
2196
2197 read_lock_bh(&idev->lock);
2198 list_for_each_entry(ifp, &idev->addr_list, if_list) {
2199 if ((ifp->scope & IFA_LINK) &&
2200 !(ifp->flags & IFA_F_TENTATIVE)) {
2201 pkt_dev->cur_in6_saddr = ifp->addr;
2202 err = 0;
2203 break;
2204 }
2205 }
2206 read_unlock_bh(&idev->lock);
2207 }
2208 rcu_read_unlock();
2209 if (err)
2210 pr_err("ERROR: IPv6 link address not available\n");
2211 }
2212 } else {
2213 if (pkt_dev->min_pkt_size == 0) {
2214 pkt_dev->min_pkt_size = 14 + sizeof(struct iphdr)
2215 + sizeof(struct udphdr)
2216 + sizeof(struct pktgen_hdr)
2217 + pkt_dev->pkt_overhead;
2218 }
2219
2220 pkt_dev->saddr_min = 0;
2221 pkt_dev->saddr_max = 0;
2222 if (strlen(pkt_dev->src_min) == 0) {
2223
2224 struct in_device *in_dev;
2225
2226 rcu_read_lock();
2227 in_dev = __in_dev_get_rcu(pkt_dev->odev);
2228 if (in_dev) {
2229 const struct in_ifaddr *ifa;
2230
2231 ifa = rcu_dereference(in_dev->ifa_list);
2232 if (ifa) {
2233 pkt_dev->saddr_min = ifa->ifa_address;
2234 pkt_dev->saddr_max = pkt_dev->saddr_min;
2235 }
2236 }
2237 rcu_read_unlock();
2238 } else {
2239 pkt_dev->saddr_min = in_aton(pkt_dev->src_min);
2240 pkt_dev->saddr_max = in_aton(pkt_dev->src_max);
2241 }
2242
2243 pkt_dev->daddr_min = in_aton(pkt_dev->dst_min);
2244 pkt_dev->daddr_max = in_aton(pkt_dev->dst_max);
2245 }
2246
2247 pkt_dev->cur_pkt_size = pkt_dev->min_pkt_size;
2248 if (pkt_dev->min_pkt_size > pkt_dev->max_pkt_size)
2249 pkt_dev->max_pkt_size = pkt_dev->min_pkt_size;
2250
2251 pkt_dev->cur_dst_mac_offset = 0;
2252 pkt_dev->cur_src_mac_offset = 0;
2253 pkt_dev->cur_saddr = pkt_dev->saddr_min;
2254 pkt_dev->cur_daddr = pkt_dev->daddr_min;
2255 pkt_dev->cur_udp_dst = pkt_dev->udp_dst_min;
2256 pkt_dev->cur_udp_src = pkt_dev->udp_src_min;
2257 pkt_dev->nflows = 0;
2258 }
2259
2260
2261 static void spin(struct pktgen_dev *pkt_dev, ktime_t spin_until)
2262 {
2263 ktime_t start_time, end_time;
2264 s64 remaining;
2265 struct hrtimer_sleeper t;
2266
2267 hrtimer_init_sleeper_on_stack(&t, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
2268 hrtimer_set_expires(&t.timer, spin_until);
2269
2270 remaining = ktime_to_ns(hrtimer_expires_remaining(&t.timer));
2271 if (remaining <= 0)
2272 goto out;
2273
2274 start_time = ktime_get();
2275 if (remaining < 100000) {
2276
2277 do {
2278 end_time = ktime_get();
2279 } while (ktime_compare(end_time, spin_until) < 0);
2280 } else {
2281 do {
2282 set_current_state(TASK_INTERRUPTIBLE);
2283 hrtimer_sleeper_start_expires(&t, HRTIMER_MODE_ABS);
2284
2285 if (likely(t.task))
2286 schedule();
2287
2288 hrtimer_cancel(&t.timer);
2289 } while (t.task && pkt_dev->running && !signal_pending(current));
2290 __set_current_state(TASK_RUNNING);
2291 end_time = ktime_get();
2292 }
2293
2294 pkt_dev->idle_acc += ktime_to_ns(ktime_sub(end_time, start_time));
2295 out:
2296 pkt_dev->next_tx = ktime_add_ns(spin_until, pkt_dev->delay);
2297 destroy_hrtimer_on_stack(&t.timer);
2298 }
2299
2300 static inline void set_pkt_overhead(struct pktgen_dev *pkt_dev)
2301 {
2302 pkt_dev->pkt_overhead = 0;
2303 pkt_dev->pkt_overhead += pkt_dev->nr_labels*sizeof(u32);
2304 pkt_dev->pkt_overhead += VLAN_TAG_SIZE(pkt_dev);
2305 pkt_dev->pkt_overhead += SVLAN_TAG_SIZE(pkt_dev);
2306 }
2307
2308 static inline int f_seen(const struct pktgen_dev *pkt_dev, int flow)
2309 {
2310 return !!(pkt_dev->flows[flow].flags & F_INIT);
2311 }
2312
2313 static inline int f_pick(struct pktgen_dev *pkt_dev)
2314 {
2315 int flow = pkt_dev->curfl;
2316
2317 if (pkt_dev->flags & F_FLOW_SEQ) {
2318 if (pkt_dev->flows[flow].count >= pkt_dev->lflow) {
2319
2320 pkt_dev->flows[flow].count = 0;
2321 pkt_dev->flows[flow].flags = 0;
2322 pkt_dev->curfl += 1;
2323 if (pkt_dev->curfl >= pkt_dev->cflows)
2324 pkt_dev->curfl = 0;
2325 }
2326 } else {
2327 flow = prandom_u32() % pkt_dev->cflows;
2328 pkt_dev->curfl = flow;
2329
2330 if (pkt_dev->flows[flow].count > pkt_dev->lflow) {
2331 pkt_dev->flows[flow].count = 0;
2332 pkt_dev->flows[flow].flags = 0;
2333 }
2334 }
2335
2336 return pkt_dev->curfl;
2337 }
2338
2339
2340 #ifdef CONFIG_XFRM
2341
2342
2343
2344 #define DUMMY_MARK 0
2345 static void get_ipsec_sa(struct pktgen_dev *pkt_dev, int flow)
2346 {
2347 struct xfrm_state *x = pkt_dev->flows[flow].x;
2348 struct pktgen_net *pn = net_generic(dev_net(pkt_dev->odev), pg_net_id);
2349 if (!x) {
2350
2351 if (pkt_dev->spi) {
2352
2353
2354
2355 x = xfrm_state_lookup_byspi(pn->net, htonl(pkt_dev->spi), AF_INET);
2356 } else {
2357
2358 x = xfrm_stateonly_find(pn->net, DUMMY_MARK, 0,
2359 (xfrm_address_t *)&pkt_dev->cur_daddr,
2360 (xfrm_address_t *)&pkt_dev->cur_saddr,
2361 AF_INET,
2362 pkt_dev->ipsmode,
2363 pkt_dev->ipsproto, 0);
2364 }
2365 if (x) {
2366 pkt_dev->flows[flow].x = x;
2367 set_pkt_overhead(pkt_dev);
2368 pkt_dev->pkt_overhead += x->props.header_len;
2369 }
2370
2371 }
2372 }
2373 #endif
2374 static void set_cur_queue_map(struct pktgen_dev *pkt_dev)
2375 {
2376
2377 if (pkt_dev->flags & F_QUEUE_MAP_CPU)
2378 pkt_dev->cur_queue_map = smp_processor_id();
2379
2380 else if (pkt_dev->queue_map_min <= pkt_dev->queue_map_max) {
2381 __u16 t;
2382 if (pkt_dev->flags & F_QUEUE_MAP_RND) {
2383 t = prandom_u32() %
2384 (pkt_dev->queue_map_max -
2385 pkt_dev->queue_map_min + 1)
2386 + pkt_dev->queue_map_min;
2387 } else {
2388 t = pkt_dev->cur_queue_map + 1;
2389 if (t > pkt_dev->queue_map_max)
2390 t = pkt_dev->queue_map_min;
2391 }
2392 pkt_dev->cur_queue_map = t;
2393 }
2394 pkt_dev->cur_queue_map = pkt_dev->cur_queue_map % pkt_dev->odev->real_num_tx_queues;
2395 }
2396
2397
2398
2399
2400 static void mod_cur_headers(struct pktgen_dev *pkt_dev)
2401 {
2402 __u32 imn;
2403 __u32 imx;
2404 int flow = 0;
2405
2406 if (pkt_dev->cflows)
2407 flow = f_pick(pkt_dev);
2408
2409
2410 if (pkt_dev->src_mac_count > 1) {
2411 __u32 mc;
2412 __u32 tmp;
2413
2414 if (pkt_dev->flags & F_MACSRC_RND)
2415 mc = prandom_u32() % pkt_dev->src_mac_count;
2416 else {
2417 mc = pkt_dev->cur_src_mac_offset++;
2418 if (pkt_dev->cur_src_mac_offset >=
2419 pkt_dev->src_mac_count)
2420 pkt_dev->cur_src_mac_offset = 0;
2421 }
2422
2423 tmp = pkt_dev->src_mac[5] + (mc & 0xFF);
2424 pkt_dev->hh[11] = tmp;
2425 tmp = (pkt_dev->src_mac[4] + ((mc >> 8) & 0xFF) + (tmp >> 8));
2426 pkt_dev->hh[10] = tmp;
2427 tmp = (pkt_dev->src_mac[3] + ((mc >> 16) & 0xFF) + (tmp >> 8));
2428 pkt_dev->hh[9] = tmp;
2429 tmp = (pkt_dev->src_mac[2] + ((mc >> 24) & 0xFF) + (tmp >> 8));
2430 pkt_dev->hh[8] = tmp;
2431 tmp = (pkt_dev->src_mac[1] + (tmp >> 8));
2432 pkt_dev->hh[7] = tmp;
2433 }
2434
2435
2436 if (pkt_dev->dst_mac_count > 1) {
2437 __u32 mc;
2438 __u32 tmp;
2439
2440 if (pkt_dev->flags & F_MACDST_RND)
2441 mc = prandom_u32() % pkt_dev->dst_mac_count;
2442
2443 else {
2444 mc = pkt_dev->cur_dst_mac_offset++;
2445 if (pkt_dev->cur_dst_mac_offset >=
2446 pkt_dev->dst_mac_count) {
2447 pkt_dev->cur_dst_mac_offset = 0;
2448 }
2449 }
2450
2451 tmp = pkt_dev->dst_mac[5] + (mc & 0xFF);
2452 pkt_dev->hh[5] = tmp;
2453 tmp = (pkt_dev->dst_mac[4] + ((mc >> 8) & 0xFF) + (tmp >> 8));
2454 pkt_dev->hh[4] = tmp;
2455 tmp = (pkt_dev->dst_mac[3] + ((mc >> 16) & 0xFF) + (tmp >> 8));
2456 pkt_dev->hh[3] = tmp;
2457 tmp = (pkt_dev->dst_mac[2] + ((mc >> 24) & 0xFF) + (tmp >> 8));
2458 pkt_dev->hh[2] = tmp;
2459 tmp = (pkt_dev->dst_mac[1] + (tmp >> 8));
2460 pkt_dev->hh[1] = tmp;
2461 }
2462
2463 if (pkt_dev->flags & F_MPLS_RND) {
2464 unsigned int i;
2465 for (i = 0; i < pkt_dev->nr_labels; i++)
2466 if (pkt_dev->labels[i] & MPLS_STACK_BOTTOM)
2467 pkt_dev->labels[i] = MPLS_STACK_BOTTOM |
2468 ((__force __be32)prandom_u32() &
2469 htonl(0x000fffff));
2470 }
2471
2472 if ((pkt_dev->flags & F_VID_RND) && (pkt_dev->vlan_id != 0xffff)) {
2473 pkt_dev->vlan_id = prandom_u32() & (4096 - 1);
2474 }
2475
2476 if ((pkt_dev->flags & F_SVID_RND) && (pkt_dev->svlan_id != 0xffff)) {
2477 pkt_dev->svlan_id = prandom_u32() & (4096 - 1);
2478 }
2479
2480 if (pkt_dev->udp_src_min < pkt_dev->udp_src_max) {
2481 if (pkt_dev->flags & F_UDPSRC_RND)
2482 pkt_dev->cur_udp_src = prandom_u32() %
2483 (pkt_dev->udp_src_max - pkt_dev->udp_src_min)
2484 + pkt_dev->udp_src_min;
2485
2486 else {
2487 pkt_dev->cur_udp_src++;
2488 if (pkt_dev->cur_udp_src >= pkt_dev->udp_src_max)
2489 pkt_dev->cur_udp_src = pkt_dev->udp_src_min;
2490 }
2491 }
2492
2493 if (pkt_dev->udp_dst_min < pkt_dev->udp_dst_max) {
2494 if (pkt_dev->flags & F_UDPDST_RND) {
2495 pkt_dev->cur_udp_dst = prandom_u32() %
2496 (pkt_dev->udp_dst_max - pkt_dev->udp_dst_min)
2497 + pkt_dev->udp_dst_min;
2498 } else {
2499 pkt_dev->cur_udp_dst++;
2500 if (pkt_dev->cur_udp_dst >= pkt_dev->udp_dst_max)
2501 pkt_dev->cur_udp_dst = pkt_dev->udp_dst_min;
2502 }
2503 }
2504
2505 if (!(pkt_dev->flags & F_IPV6)) {
2506
2507 imn = ntohl(pkt_dev->saddr_min);
2508 imx = ntohl(pkt_dev->saddr_max);
2509 if (imn < imx) {
2510 __u32 t;
2511 if (pkt_dev->flags & F_IPSRC_RND)
2512 t = prandom_u32() % (imx - imn) + imn;
2513 else {
2514 t = ntohl(pkt_dev->cur_saddr);
2515 t++;
2516 if (t > imx)
2517 t = imn;
2518
2519 }
2520 pkt_dev->cur_saddr = htonl(t);
2521 }
2522
2523 if (pkt_dev->cflows && f_seen(pkt_dev, flow)) {
2524 pkt_dev->cur_daddr = pkt_dev->flows[flow].cur_daddr;
2525 } else {
2526 imn = ntohl(pkt_dev->daddr_min);
2527 imx = ntohl(pkt_dev->daddr_max);
2528 if (imn < imx) {
2529 __u32 t;
2530 __be32 s;
2531 if (pkt_dev->flags & F_IPDST_RND) {
2532
2533 do {
2534 t = prandom_u32() %
2535 (imx - imn) + imn;
2536 s = htonl(t);
2537 } while (ipv4_is_loopback(s) ||
2538 ipv4_is_multicast(s) ||
2539 ipv4_is_lbcast(s) ||
2540 ipv4_is_zeronet(s) ||
2541 ipv4_is_local_multicast(s));
2542 pkt_dev->cur_daddr = s;
2543 } else {
2544 t = ntohl(pkt_dev->cur_daddr);
2545 t++;
2546 if (t > imx) {
2547 t = imn;
2548 }
2549 pkt_dev->cur_daddr = htonl(t);
2550 }
2551 }
2552 if (pkt_dev->cflows) {
2553 pkt_dev->flows[flow].flags |= F_INIT;
2554 pkt_dev->flows[flow].cur_daddr =
2555 pkt_dev->cur_daddr;
2556 #ifdef CONFIG_XFRM
2557 if (pkt_dev->flags & F_IPSEC)
2558 get_ipsec_sa(pkt_dev, flow);
2559 #endif
2560 pkt_dev->nflows++;
2561 }
2562 }
2563 } else {
2564
2565 if (!ipv6_addr_any(&pkt_dev->min_in6_daddr)) {
2566 int i;
2567
2568
2569
2570 for (i = 0; i < 4; i++) {
2571 pkt_dev->cur_in6_daddr.s6_addr32[i] =
2572 (((__force __be32)prandom_u32() |
2573 pkt_dev->min_in6_daddr.s6_addr32[i]) &
2574 pkt_dev->max_in6_daddr.s6_addr32[i]);
2575 }
2576 }
2577 }
2578
2579 if (pkt_dev->min_pkt_size < pkt_dev->max_pkt_size) {
2580 __u32 t;
2581 if (pkt_dev->flags & F_TXSIZE_RND) {
2582 t = prandom_u32() %
2583 (pkt_dev->max_pkt_size - pkt_dev->min_pkt_size)
2584 + pkt_dev->min_pkt_size;
2585 } else {
2586 t = pkt_dev->cur_pkt_size + 1;
2587 if (t > pkt_dev->max_pkt_size)
2588 t = pkt_dev->min_pkt_size;
2589 }
2590 pkt_dev->cur_pkt_size = t;
2591 } else if (pkt_dev->n_imix_entries > 0) {
2592 struct imix_pkt *entry;
2593 __u32 t = prandom_u32() % IMIX_PRECISION;
2594 __u8 entry_index = pkt_dev->imix_distribution[t];
2595
2596 entry = &pkt_dev->imix_entries[entry_index];
2597 entry->count_so_far++;
2598 pkt_dev->cur_pkt_size = entry->size;
2599 }
2600
2601 set_cur_queue_map(pkt_dev);
2602
2603 pkt_dev->flows[flow].count++;
2604 }
2605
2606 static void fill_imix_distribution(struct pktgen_dev *pkt_dev)
2607 {
2608 int cumulative_probabilites[MAX_IMIX_ENTRIES];
2609 int j = 0;
2610 __u64 cumulative_prob = 0;
2611 __u64 total_weight = 0;
2612 int i = 0;
2613
2614 for (i = 0; i < pkt_dev->n_imix_entries; i++)
2615 total_weight += pkt_dev->imix_entries[i].weight;
2616
2617
2618 for (i = 0; i < pkt_dev->n_imix_entries - 1; i++) {
2619 cumulative_prob += div64_u64(pkt_dev->imix_entries[i].weight *
2620 IMIX_PRECISION,
2621 total_weight);
2622 cumulative_probabilites[i] = cumulative_prob;
2623 }
2624 cumulative_probabilites[pkt_dev->n_imix_entries - 1] = 100;
2625
2626 for (i = 0; i < IMIX_PRECISION; i++) {
2627 if (i == cumulative_probabilites[j])
2628 j++;
2629 pkt_dev->imix_distribution[i] = j;
2630 }
2631 }
2632
2633 #ifdef CONFIG_XFRM
2634 static u32 pktgen_dst_metrics[RTAX_MAX + 1] = {
2635
2636 [RTAX_HOPLIMIT] = 0x5,
2637 };
2638
2639 static int pktgen_output_ipsec(struct sk_buff *skb, struct pktgen_dev *pkt_dev)
2640 {
2641 struct xfrm_state *x = pkt_dev->flows[pkt_dev->curfl].x;
2642 int err = 0;
2643 struct net *net = dev_net(pkt_dev->odev);
2644
2645 if (!x)
2646 return 0;
2647
2648
2649 if ((x->props.mode != XFRM_MODE_TRANSPORT) && (pkt_dev->spi == 0))
2650 return 0;
2651
2652
2653
2654
2655 if ((x->props.mode == XFRM_MODE_TUNNEL) && (pkt_dev->spi != 0))
2656 skb->_skb_refdst = (unsigned long)&pkt_dev->xdst.u.dst | SKB_DST_NOREF;
2657
2658 rcu_read_lock_bh();
2659 err = pktgen_xfrm_outer_mode_output(x, skb);
2660 rcu_read_unlock_bh();
2661 if (err) {
2662 XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTSTATEMODEERROR);
2663 goto error;
2664 }
2665 err = x->type->output(x, skb);
2666 if (err) {
2667 XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTSTATEPROTOERROR);
2668 goto error;
2669 }
2670 spin_lock_bh(&x->lock);
2671 x->curlft.bytes += skb->len;
2672 x->curlft.packets++;
2673 spin_unlock_bh(&x->lock);
2674 error:
2675 return err;
2676 }
2677
2678 static void free_SAs(struct pktgen_dev *pkt_dev)
2679 {
2680 if (pkt_dev->cflows) {
2681
2682 int i;
2683 for (i = 0; i < pkt_dev->cflows; i++) {
2684 struct xfrm_state *x = pkt_dev->flows[i].x;
2685 if (x) {
2686 xfrm_state_put(x);
2687 pkt_dev->flows[i].x = NULL;
2688 }
2689 }
2690 }
2691 }
2692
2693 static int process_ipsec(struct pktgen_dev *pkt_dev,
2694 struct sk_buff *skb, __be16 protocol)
2695 {
2696 if (pkt_dev->flags & F_IPSEC) {
2697 struct xfrm_state *x = pkt_dev->flows[pkt_dev->curfl].x;
2698 int nhead = 0;
2699 if (x) {
2700 struct ethhdr *eth;
2701 struct iphdr *iph;
2702 int ret;
2703
2704 nhead = x->props.header_len - skb_headroom(skb);
2705 if (nhead > 0) {
2706 ret = pskb_expand_head(skb, nhead, 0, GFP_ATOMIC);
2707 if (ret < 0) {
2708 pr_err("Error expanding ipsec packet %d\n",
2709 ret);
2710 goto err;
2711 }
2712 }
2713
2714
2715 skb_pull(skb, ETH_HLEN);
2716 ret = pktgen_output_ipsec(skb, pkt_dev);
2717 if (ret) {
2718 pr_err("Error creating ipsec packet %d\n", ret);
2719 goto err;
2720 }
2721
2722 eth = skb_push(skb, ETH_HLEN);
2723 memcpy(eth, pkt_dev->hh, 2 * ETH_ALEN);
2724 eth->h_proto = protocol;
2725
2726
2727 iph = ip_hdr(skb);
2728 iph->tot_len = htons(skb->len - ETH_HLEN);
2729 ip_send_check(iph);
2730 }
2731 }
2732 return 1;
2733 err:
2734 kfree_skb(skb);
2735 return 0;
2736 }
2737 #endif
2738
2739 static void mpls_push(__be32 *mpls, struct pktgen_dev *pkt_dev)
2740 {
2741 unsigned int i;
2742 for (i = 0; i < pkt_dev->nr_labels; i++)
2743 *mpls++ = pkt_dev->labels[i] & ~MPLS_STACK_BOTTOM;
2744
2745 mpls--;
2746 *mpls |= MPLS_STACK_BOTTOM;
2747 }
2748
2749 static inline __be16 build_tci(unsigned int id, unsigned int cfi,
2750 unsigned int prio)
2751 {
2752 return htons(id | (cfi << 12) | (prio << 13));
2753 }
2754
2755 static void pktgen_finalize_skb(struct pktgen_dev *pkt_dev, struct sk_buff *skb,
2756 int datalen)
2757 {
2758 struct timespec64 timestamp;
2759 struct pktgen_hdr *pgh;
2760
2761 pgh = skb_put(skb, sizeof(*pgh));
2762 datalen -= sizeof(*pgh);
2763
2764 if (pkt_dev->nfrags <= 0) {
2765 skb_put_zero(skb, datalen);
2766 } else {
2767 int frags = pkt_dev->nfrags;
2768 int i, len;
2769 int frag_len;
2770
2771
2772 if (frags > MAX_SKB_FRAGS)
2773 frags = MAX_SKB_FRAGS;
2774 len = datalen - frags * PAGE_SIZE;
2775 if (len > 0) {
2776 skb_put_zero(skb, len);
2777 datalen = frags * PAGE_SIZE;
2778 }
2779
2780 i = 0;
2781 frag_len = (datalen/frags) < PAGE_SIZE ?
2782 (datalen/frags) : PAGE_SIZE;
2783 while (datalen > 0) {
2784 if (unlikely(!pkt_dev->page)) {
2785 int node = numa_node_id();
2786
2787 if (pkt_dev->node >= 0 && (pkt_dev->flags & F_NODE))
2788 node = pkt_dev->node;
2789 pkt_dev->page = alloc_pages_node(node, GFP_KERNEL | __GFP_ZERO, 0);
2790 if (!pkt_dev->page)
2791 break;
2792 }
2793 get_page(pkt_dev->page);
2794 skb_frag_set_page(skb, i, pkt_dev->page);
2795 skb_frag_off_set(&skb_shinfo(skb)->frags[i], 0);
2796
2797 if (i == (frags - 1))
2798 skb_frag_size_set(&skb_shinfo(skb)->frags[i],
2799 (datalen < PAGE_SIZE ? datalen : PAGE_SIZE));
2800 else
2801 skb_frag_size_set(&skb_shinfo(skb)->frags[i], frag_len);
2802 datalen -= skb_frag_size(&skb_shinfo(skb)->frags[i]);
2803 skb->len += skb_frag_size(&skb_shinfo(skb)->frags[i]);
2804 skb->data_len += skb_frag_size(&skb_shinfo(skb)->frags[i]);
2805 i++;
2806 skb_shinfo(skb)->nr_frags = i;
2807 }
2808 }
2809
2810
2811
2812
2813 pgh->pgh_magic = htonl(PKTGEN_MAGIC);
2814 pgh->seq_num = htonl(pkt_dev->seq_num);
2815
2816 if (pkt_dev->flags & F_NO_TIMESTAMP) {
2817 pgh->tv_sec = 0;
2818 pgh->tv_usec = 0;
2819 } else {
2820
2821
2822
2823
2824
2825
2826
2827
2828 ktime_get_real_ts64(×tamp);
2829 pgh->tv_sec = htonl(timestamp.tv_sec);
2830 pgh->tv_usec = htonl(timestamp.tv_nsec / NSEC_PER_USEC);
2831 }
2832 }
2833
2834 static struct sk_buff *pktgen_alloc_skb(struct net_device *dev,
2835 struct pktgen_dev *pkt_dev)
2836 {
2837 unsigned int extralen = LL_RESERVED_SPACE(dev);
2838 struct sk_buff *skb = NULL;
2839 unsigned int size;
2840
2841 size = pkt_dev->cur_pkt_size + 64 + extralen + pkt_dev->pkt_overhead;
2842 if (pkt_dev->flags & F_NODE) {
2843 int node = pkt_dev->node >= 0 ? pkt_dev->node : numa_node_id();
2844
2845 skb = __alloc_skb(NET_SKB_PAD + size, GFP_NOWAIT, 0, node);
2846 if (likely(skb)) {
2847 skb_reserve(skb, NET_SKB_PAD);
2848 skb->dev = dev;
2849 }
2850 } else {
2851 skb = __netdev_alloc_skb(dev, size, GFP_NOWAIT);
2852 }
2853
2854
2855 if (likely(skb))
2856 skb_reserve(skb, extralen - 16);
2857
2858 return skb;
2859 }
2860
2861 static struct sk_buff *fill_packet_ipv4(struct net_device *odev,
2862 struct pktgen_dev *pkt_dev)
2863 {
2864 struct sk_buff *skb = NULL;
2865 __u8 *eth;
2866 struct udphdr *udph;
2867 int datalen, iplen;
2868 struct iphdr *iph;
2869 __be16 protocol = htons(ETH_P_IP);
2870 __be32 *mpls;
2871 __be16 *vlan_tci = NULL;
2872 __be16 *vlan_encapsulated_proto = NULL;
2873 __be16 *svlan_tci = NULL;
2874 __be16 *svlan_encapsulated_proto = NULL;
2875 u16 queue_map;
2876
2877 if (pkt_dev->nr_labels)
2878 protocol = htons(ETH_P_MPLS_UC);
2879
2880 if (pkt_dev->vlan_id != 0xffff)
2881 protocol = htons(ETH_P_8021Q);
2882
2883
2884
2885
2886 mod_cur_headers(pkt_dev);
2887 queue_map = pkt_dev->cur_queue_map;
2888
2889 skb = pktgen_alloc_skb(odev, pkt_dev);
2890 if (!skb) {
2891 sprintf(pkt_dev->result, "No memory");
2892 return NULL;
2893 }
2894
2895 prefetchw(skb->data);
2896 skb_reserve(skb, 16);
2897
2898
2899 eth = skb_push(skb, 14);
2900 mpls = skb_put(skb, pkt_dev->nr_labels * sizeof(__u32));
2901 if (pkt_dev->nr_labels)
2902 mpls_push(mpls, pkt_dev);
2903
2904 if (pkt_dev->vlan_id != 0xffff) {
2905 if (pkt_dev->svlan_id != 0xffff) {
2906 svlan_tci = skb_put(skb, sizeof(__be16));
2907 *svlan_tci = build_tci(pkt_dev->svlan_id,
2908 pkt_dev->svlan_cfi,
2909 pkt_dev->svlan_p);
2910 svlan_encapsulated_proto = skb_put(skb,
2911 sizeof(__be16));
2912 *svlan_encapsulated_proto = htons(ETH_P_8021Q);
2913 }
2914 vlan_tci = skb_put(skb, sizeof(__be16));
2915 *vlan_tci = build_tci(pkt_dev->vlan_id,
2916 pkt_dev->vlan_cfi,
2917 pkt_dev->vlan_p);
2918 vlan_encapsulated_proto = skb_put(skb, sizeof(__be16));
2919 *vlan_encapsulated_proto = htons(ETH_P_IP);
2920 }
2921
2922 skb_reset_mac_header(skb);
2923 skb_set_network_header(skb, skb->len);
2924 iph = skb_put(skb, sizeof(struct iphdr));
2925
2926 skb_set_transport_header(skb, skb->len);
2927 udph = skb_put(skb, sizeof(struct udphdr));
2928 skb_set_queue_mapping(skb, queue_map);
2929 skb->priority = pkt_dev->skb_priority;
2930
2931 memcpy(eth, pkt_dev->hh, 12);
2932 *(__be16 *) & eth[12] = protocol;
2933
2934
2935 datalen = pkt_dev->cur_pkt_size - 14 - 20 - 8 -
2936 pkt_dev->pkt_overhead;
2937 if (datalen < 0 || datalen < sizeof(struct pktgen_hdr))
2938 datalen = sizeof(struct pktgen_hdr);
2939
2940 udph->source = htons(pkt_dev->cur_udp_src);
2941 udph->dest = htons(pkt_dev->cur_udp_dst);
2942 udph->len = htons(datalen + 8);
2943 udph->check = 0;
2944
2945 iph->ihl = 5;
2946 iph->version = 4;
2947 iph->ttl = 32;
2948 iph->tos = pkt_dev->tos;
2949 iph->protocol = IPPROTO_UDP;
2950 iph->saddr = pkt_dev->cur_saddr;
2951 iph->daddr = pkt_dev->cur_daddr;
2952 iph->id = htons(pkt_dev->ip_id);
2953 pkt_dev->ip_id++;
2954 iph->frag_off = 0;
2955 iplen = 20 + 8 + datalen;
2956 iph->tot_len = htons(iplen);
2957 ip_send_check(iph);
2958 skb->protocol = protocol;
2959 skb->dev = odev;
2960 skb->pkt_type = PACKET_HOST;
2961
2962 pktgen_finalize_skb(pkt_dev, skb, datalen);
2963
2964 if (!(pkt_dev->flags & F_UDPCSUM)) {
2965 skb->ip_summed = CHECKSUM_NONE;
2966 } else if (odev->features & (NETIF_F_HW_CSUM | NETIF_F_IP_CSUM)) {
2967 skb->ip_summed = CHECKSUM_PARTIAL;
2968 skb->csum = 0;
2969 udp4_hwcsum(skb, iph->saddr, iph->daddr);
2970 } else {
2971 __wsum csum = skb_checksum(skb, skb_transport_offset(skb), datalen + 8, 0);
2972
2973
2974 udph->check = csum_tcpudp_magic(iph->saddr, iph->daddr,
2975 datalen + 8, IPPROTO_UDP, csum);
2976
2977 if (udph->check == 0)
2978 udph->check = CSUM_MANGLED_0;
2979 }
2980
2981 #ifdef CONFIG_XFRM
2982 if (!process_ipsec(pkt_dev, skb, protocol))
2983 return NULL;
2984 #endif
2985
2986 return skb;
2987 }
2988
2989 static struct sk_buff *fill_packet_ipv6(struct net_device *odev,
2990 struct pktgen_dev *pkt_dev)
2991 {
2992 struct sk_buff *skb = NULL;
2993 __u8 *eth;
2994 struct udphdr *udph;
2995 int datalen, udplen;
2996 struct ipv6hdr *iph;
2997 __be16 protocol = htons(ETH_P_IPV6);
2998 __be32 *mpls;
2999 __be16 *vlan_tci = NULL;
3000 __be16 *vlan_encapsulated_proto = NULL;
3001 __be16 *svlan_tci = NULL;
3002 __be16 *svlan_encapsulated_proto = NULL;
3003 u16 queue_map;
3004
3005 if (pkt_dev->nr_labels)
3006 protocol = htons(ETH_P_MPLS_UC);
3007
3008 if (pkt_dev->vlan_id != 0xffff)
3009 protocol = htons(ETH_P_8021Q);
3010
3011
3012
3013
3014 mod_cur_headers(pkt_dev);
3015 queue_map = pkt_dev->cur_queue_map;
3016
3017 skb = pktgen_alloc_skb(odev, pkt_dev);
3018 if (!skb) {
3019 sprintf(pkt_dev->result, "No memory");
3020 return NULL;
3021 }
3022
3023 prefetchw(skb->data);
3024 skb_reserve(skb, 16);
3025
3026
3027 eth = skb_push(skb, 14);
3028 mpls = skb_put(skb, pkt_dev->nr_labels * sizeof(__u32));
3029 if (pkt_dev->nr_labels)
3030 mpls_push(mpls, pkt_dev);
3031
3032 if (pkt_dev->vlan_id != 0xffff) {
3033 if (pkt_dev->svlan_id != 0xffff) {
3034 svlan_tci = skb_put(skb, sizeof(__be16));
3035 *svlan_tci = build_tci(pkt_dev->svlan_id,
3036 pkt_dev->svlan_cfi,
3037 pkt_dev->svlan_p);
3038 svlan_encapsulated_proto = skb_put(skb,
3039 sizeof(__be16));
3040 *svlan_encapsulated_proto = htons(ETH_P_8021Q);
3041 }
3042 vlan_tci = skb_put(skb, sizeof(__be16));
3043 *vlan_tci = build_tci(pkt_dev->vlan_id,
3044 pkt_dev->vlan_cfi,
3045 pkt_dev->vlan_p);
3046 vlan_encapsulated_proto = skb_put(skb, sizeof(__be16));
3047 *vlan_encapsulated_proto = htons(ETH_P_IPV6);
3048 }
3049
3050 skb_reset_mac_header(skb);
3051 skb_set_network_header(skb, skb->len);
3052 iph = skb_put(skb, sizeof(struct ipv6hdr));
3053
3054 skb_set_transport_header(skb, skb->len);
3055 udph = skb_put(skb, sizeof(struct udphdr));
3056 skb_set_queue_mapping(skb, queue_map);
3057 skb->priority = pkt_dev->skb_priority;
3058
3059 memcpy(eth, pkt_dev->hh, 12);
3060 *(__be16 *) ð[12] = protocol;
3061
3062
3063 datalen = pkt_dev->cur_pkt_size - 14 -
3064 sizeof(struct ipv6hdr) - sizeof(struct udphdr) -
3065 pkt_dev->pkt_overhead;
3066
3067 if (datalen < 0 || datalen < sizeof(struct pktgen_hdr)) {
3068 datalen = sizeof(struct pktgen_hdr);
3069 net_info_ratelimited("increased datalen to %d\n", datalen);
3070 }
3071
3072 udplen = datalen + sizeof(struct udphdr);
3073 udph->source = htons(pkt_dev->cur_udp_src);
3074 udph->dest = htons(pkt_dev->cur_udp_dst);
3075 udph->len = htons(udplen);
3076 udph->check = 0;
3077
3078 *(__be32 *) iph = htonl(0x60000000);
3079
3080 if (pkt_dev->traffic_class) {
3081
3082 *(__be32 *)iph |= htonl(0x60000000 | (pkt_dev->traffic_class << 20));
3083 }
3084
3085 iph->hop_limit = 32;
3086
3087 iph->payload_len = htons(udplen);
3088 iph->nexthdr = IPPROTO_UDP;
3089
3090 iph->daddr = pkt_dev->cur_in6_daddr;
3091 iph->saddr = pkt_dev->cur_in6_saddr;
3092
3093 skb->protocol = protocol;
3094 skb->dev = odev;
3095 skb->pkt_type = PACKET_HOST;
3096
3097 pktgen_finalize_skb(pkt_dev, skb, datalen);
3098
3099 if (!(pkt_dev->flags & F_UDPCSUM)) {
3100 skb->ip_summed = CHECKSUM_NONE;
3101 } else if (odev->features & (NETIF_F_HW_CSUM | NETIF_F_IPV6_CSUM)) {
3102 skb->ip_summed = CHECKSUM_PARTIAL;
3103 skb->csum_start = skb_transport_header(skb) - skb->head;
3104 skb->csum_offset = offsetof(struct udphdr, check);
3105 udph->check = ~csum_ipv6_magic(&iph->saddr, &iph->daddr, udplen, IPPROTO_UDP, 0);
3106 } else {
3107 __wsum csum = skb_checksum(skb, skb_transport_offset(skb), udplen, 0);
3108
3109
3110 udph->check = csum_ipv6_magic(&iph->saddr, &iph->daddr, udplen, IPPROTO_UDP, csum);
3111
3112 if (udph->check == 0)
3113 udph->check = CSUM_MANGLED_0;
3114 }
3115
3116 return skb;
3117 }
3118
3119 static struct sk_buff *fill_packet(struct net_device *odev,
3120 struct pktgen_dev *pkt_dev)
3121 {
3122 if (pkt_dev->flags & F_IPV6)
3123 return fill_packet_ipv6(odev, pkt_dev);
3124 else
3125 return fill_packet_ipv4(odev, pkt_dev);
3126 }
3127
3128 static void pktgen_clear_counters(struct pktgen_dev *pkt_dev)
3129 {
3130 pkt_dev->seq_num = 1;
3131 pkt_dev->idle_acc = 0;
3132 pkt_dev->sofar = 0;
3133 pkt_dev->tx_bytes = 0;
3134 pkt_dev->errors = 0;
3135 }
3136
3137
3138
3139 static void pktgen_run(struct pktgen_thread *t)
3140 {
3141 struct pktgen_dev *pkt_dev;
3142 int started = 0;
3143
3144 func_enter();
3145
3146 rcu_read_lock();
3147 list_for_each_entry_rcu(pkt_dev, &t->if_list, list) {
3148
3149
3150
3151
3152 pktgen_setup_inject(pkt_dev);
3153
3154 if (pkt_dev->odev) {
3155 pktgen_clear_counters(pkt_dev);
3156 pkt_dev->skb = NULL;
3157 pkt_dev->started_at = pkt_dev->next_tx = ktime_get();
3158
3159 set_pkt_overhead(pkt_dev);
3160
3161 strcpy(pkt_dev->result, "Starting");
3162 pkt_dev->running = 1;
3163 started++;
3164 } else
3165 strcpy(pkt_dev->result, "Error starting");
3166 }
3167 rcu_read_unlock();
3168 if (started)
3169 t->control &= ~(T_STOP);
3170 }
3171
3172 static void pktgen_handle_all_threads(struct pktgen_net *pn, u32 flags)
3173 {
3174 struct pktgen_thread *t;
3175
3176 mutex_lock(&pktgen_thread_lock);
3177
3178 list_for_each_entry(t, &pn->pktgen_threads, th_list)
3179 t->control |= (flags);
3180
3181 mutex_unlock(&pktgen_thread_lock);
3182 }
3183
3184 static void pktgen_stop_all_threads(struct pktgen_net *pn)
3185 {
3186 func_enter();
3187
3188 pktgen_handle_all_threads(pn, T_STOP);
3189 }
3190
3191 static int thread_is_running(const struct pktgen_thread *t)
3192 {
3193 const struct pktgen_dev *pkt_dev;
3194
3195 rcu_read_lock();
3196 list_for_each_entry_rcu(pkt_dev, &t->if_list, list)
3197 if (pkt_dev->running) {
3198 rcu_read_unlock();
3199 return 1;
3200 }
3201 rcu_read_unlock();
3202 return 0;
3203 }
3204
3205 static int pktgen_wait_thread_run(struct pktgen_thread *t)
3206 {
3207 while (thread_is_running(t)) {
3208
3209
3210
3211
3212
3213 mutex_unlock(&pktgen_thread_lock);
3214 msleep_interruptible(100);
3215 mutex_lock(&pktgen_thread_lock);
3216
3217 if (signal_pending(current))
3218 goto signal;
3219 }
3220 return 1;
3221 signal:
3222 return 0;
3223 }
3224
3225 static int pktgen_wait_all_threads_run(struct pktgen_net *pn)
3226 {
3227 struct pktgen_thread *t;
3228 int sig = 1;
3229
3230
3231 if (!try_module_get(THIS_MODULE))
3232 return sig;
3233
3234 mutex_lock(&pktgen_thread_lock);
3235
3236 list_for_each_entry(t, &pn->pktgen_threads, th_list) {
3237 sig = pktgen_wait_thread_run(t);
3238 if (sig == 0)
3239 break;
3240 }
3241
3242 if (sig == 0)
3243 list_for_each_entry(t, &pn->pktgen_threads, th_list)
3244 t->control |= (T_STOP);
3245
3246 mutex_unlock(&pktgen_thread_lock);
3247 module_put(THIS_MODULE);
3248 return sig;
3249 }
3250
3251 static void pktgen_run_all_threads(struct pktgen_net *pn)
3252 {
3253 func_enter();
3254
3255 pktgen_handle_all_threads(pn, T_RUN);
3256
3257
3258 schedule_timeout_interruptible(msecs_to_jiffies(125));
3259
3260 pktgen_wait_all_threads_run(pn);
3261 }
3262
3263 static void pktgen_reset_all_threads(struct pktgen_net *pn)
3264 {
3265 func_enter();
3266
3267 pktgen_handle_all_threads(pn, T_REMDEVALL);
3268
3269
3270 schedule_timeout_interruptible(msecs_to_jiffies(125));
3271
3272 pktgen_wait_all_threads_run(pn);
3273 }
3274
3275 static void show_results(struct pktgen_dev *pkt_dev, int nr_frags)
3276 {
3277 __u64 bps, mbps, pps;
3278 char *p = pkt_dev->result;
3279 ktime_t elapsed = ktime_sub(pkt_dev->stopped_at,
3280 pkt_dev->started_at);
3281 ktime_t idle = ns_to_ktime(pkt_dev->idle_acc);
3282
3283 p += sprintf(p, "OK: %llu(c%llu+d%llu) usec, %llu (%dbyte,%dfrags)\n",
3284 (unsigned long long)ktime_to_us(elapsed),
3285 (unsigned long long)ktime_to_us(ktime_sub(elapsed, idle)),
3286 (unsigned long long)ktime_to_us(idle),
3287 (unsigned long long)pkt_dev->sofar,
3288 pkt_dev->cur_pkt_size, nr_frags);
3289
3290 pps = div64_u64(pkt_dev->sofar * NSEC_PER_SEC,
3291 ktime_to_ns(elapsed));
3292
3293 if (pkt_dev->n_imix_entries > 0) {
3294 int i;
3295 struct imix_pkt *entry;
3296
3297 bps = 0;
3298 for (i = 0; i < pkt_dev->n_imix_entries; i++) {
3299 entry = &pkt_dev->imix_entries[i];
3300 bps += entry->size * entry->count_so_far;
3301 }
3302 bps = div64_u64(bps * 8 * NSEC_PER_SEC, ktime_to_ns(elapsed));
3303 } else {
3304 bps = pps * 8 * pkt_dev->cur_pkt_size;
3305 }
3306
3307 mbps = bps;
3308 do_div(mbps, 1000000);
3309 p += sprintf(p, " %llupps %lluMb/sec (%llubps) errors: %llu",
3310 (unsigned long long)pps,
3311 (unsigned long long)mbps,
3312 (unsigned long long)bps,
3313 (unsigned long long)pkt_dev->errors);
3314 }
3315
3316
3317 static int pktgen_stop_device(struct pktgen_dev *pkt_dev)
3318 {
3319 int nr_frags = pkt_dev->skb ? skb_shinfo(pkt_dev->skb)->nr_frags : -1;
3320
3321 if (!pkt_dev->running) {
3322 pr_warn("interface: %s is already stopped\n",
3323 pkt_dev->odevname);
3324 return -EINVAL;
3325 }
3326
3327 pkt_dev->running = 0;
3328 kfree_skb(pkt_dev->skb);
3329 pkt_dev->skb = NULL;
3330 pkt_dev->stopped_at = ktime_get();
3331
3332 show_results(pkt_dev, nr_frags);
3333
3334 return 0;
3335 }
3336
3337 static struct pktgen_dev *next_to_run(struct pktgen_thread *t)
3338 {
3339 struct pktgen_dev *pkt_dev, *best = NULL;
3340
3341 rcu_read_lock();
3342 list_for_each_entry_rcu(pkt_dev, &t->if_list, list) {
3343 if (!pkt_dev->running)
3344 continue;
3345 if (best == NULL)
3346 best = pkt_dev;
3347 else if (ktime_compare(pkt_dev->next_tx, best->next_tx) < 0)
3348 best = pkt_dev;
3349 }
3350 rcu_read_unlock();
3351
3352 return best;
3353 }
3354
3355 static void pktgen_stop(struct pktgen_thread *t)
3356 {
3357 struct pktgen_dev *pkt_dev;
3358
3359 func_enter();
3360
3361 rcu_read_lock();
3362
3363 list_for_each_entry_rcu(pkt_dev, &t->if_list, list) {
3364 pktgen_stop_device(pkt_dev);
3365 }
3366
3367 rcu_read_unlock();
3368 }
3369
3370
3371
3372
3373
3374 static void pktgen_rem_one_if(struct pktgen_thread *t)
3375 {
3376 struct list_head *q, *n;
3377 struct pktgen_dev *cur;
3378
3379 func_enter();
3380
3381 list_for_each_safe(q, n, &t->if_list) {
3382 cur = list_entry(q, struct pktgen_dev, list);
3383
3384 if (!cur->removal_mark)
3385 continue;
3386
3387 kfree_skb(cur->skb);
3388 cur->skb = NULL;
3389
3390 pktgen_remove_device(t, cur);
3391
3392 break;
3393 }
3394 }
3395
3396 static void pktgen_rem_all_ifs(struct pktgen_thread *t)
3397 {
3398 struct list_head *q, *n;
3399 struct pktgen_dev *cur;
3400
3401 func_enter();
3402
3403
3404
3405 list_for_each_safe(q, n, &t->if_list) {
3406 cur = list_entry(q, struct pktgen_dev, list);
3407
3408 kfree_skb(cur->skb);
3409 cur->skb = NULL;
3410
3411 pktgen_remove_device(t, cur);
3412 }
3413 }
3414
3415 static void pktgen_rem_thread(struct pktgen_thread *t)
3416 {
3417
3418 remove_proc_entry(t->tsk->comm, t->net->proc_dir);
3419 }
3420
3421 static void pktgen_resched(struct pktgen_dev *pkt_dev)
3422 {
3423 ktime_t idle_start = ktime_get();
3424 schedule();
3425 pkt_dev->idle_acc += ktime_to_ns(ktime_sub(ktime_get(), idle_start));
3426 }
3427
3428 static void pktgen_wait_for_skb(struct pktgen_dev *pkt_dev)
3429 {
3430 ktime_t idle_start = ktime_get();
3431
3432 while (refcount_read(&(pkt_dev->skb->users)) != 1) {
3433 if (signal_pending(current))
3434 break;
3435
3436 if (need_resched())
3437 pktgen_resched(pkt_dev);
3438 else
3439 cpu_relax();
3440 }
3441 pkt_dev->idle_acc += ktime_to_ns(ktime_sub(ktime_get(), idle_start));
3442 }
3443
3444 static void pktgen_xmit(struct pktgen_dev *pkt_dev)
3445 {
3446 unsigned int burst = READ_ONCE(pkt_dev->burst);
3447 struct net_device *odev = pkt_dev->odev;
3448 struct netdev_queue *txq;
3449 struct sk_buff *skb;
3450 int ret;
3451
3452
3453 if (unlikely(!netif_running(odev) || !netif_carrier_ok(odev))) {
3454 pktgen_stop_device(pkt_dev);
3455 return;
3456 }
3457
3458
3459
3460
3461 if (unlikely(pkt_dev->delay == ULLONG_MAX)) {
3462 pkt_dev->next_tx = ktime_add_ns(ktime_get(), ULONG_MAX);
3463 return;
3464 }
3465
3466
3467 if (!pkt_dev->skb || (pkt_dev->last_ok &&
3468 ++pkt_dev->clone_count >= pkt_dev->clone_skb)) {
3469
3470 kfree_skb(pkt_dev->skb);
3471
3472 pkt_dev->skb = fill_packet(odev, pkt_dev);
3473 if (pkt_dev->skb == NULL) {
3474 pr_err("ERROR: couldn't allocate skb in fill_packet\n");
3475 schedule();
3476 pkt_dev->clone_count--;
3477 return;
3478 }
3479 pkt_dev->last_pkt_size = pkt_dev->skb->len;
3480 pkt_dev->clone_count = 0;
3481 }
3482
3483 if (pkt_dev->delay && pkt_dev->last_ok)
3484 spin(pkt_dev, pkt_dev->next_tx);
3485
3486 if (pkt_dev->xmit_mode == M_NETIF_RECEIVE) {
3487 skb = pkt_dev->skb;
3488 skb->protocol = eth_type_trans(skb, skb->dev);
3489 refcount_add(burst, &skb->users);
3490 local_bh_disable();
3491 do {
3492 ret = netif_receive_skb(skb);
3493 if (ret == NET_RX_DROP)
3494 pkt_dev->errors++;
3495 pkt_dev->sofar++;
3496 pkt_dev->seq_num++;
3497 if (refcount_read(&skb->users) != burst) {
3498
3499
3500
3501 WARN_ON(refcount_sub_and_test(burst - 1, &skb->users));
3502
3503
3504
3505 break;
3506 }
3507
3508
3509
3510 skb_reset_redirect(skb);
3511 } while (--burst > 0);
3512 goto out;
3513 } else if (pkt_dev->xmit_mode == M_QUEUE_XMIT) {
3514 local_bh_disable();
3515 refcount_inc(&pkt_dev->skb->users);
3516
3517 ret = dev_queue_xmit(pkt_dev->skb);
3518 switch (ret) {
3519 case NET_XMIT_SUCCESS:
3520 pkt_dev->sofar++;
3521 pkt_dev->seq_num++;
3522 pkt_dev->tx_bytes += pkt_dev->last_pkt_size;
3523 break;
3524 case NET_XMIT_DROP:
3525 case NET_XMIT_CN:
3526
3527
3528
3529
3530 case NETDEV_TX_BUSY:
3531
3532
3533
3534
3535
3536 default:
3537 pkt_dev->errors++;
3538 net_info_ratelimited("%s xmit error: %d\n",
3539 pkt_dev->odevname, ret);
3540 break;
3541 }
3542 goto out;
3543 }
3544
3545 txq = skb_get_tx_queue(odev, pkt_dev->skb);
3546
3547 local_bh_disable();
3548
3549 HARD_TX_LOCK(odev, txq, smp_processor_id());
3550
3551 if (unlikely(netif_xmit_frozen_or_drv_stopped(txq))) {
3552 pkt_dev->last_ok = 0;
3553 goto unlock;
3554 }
3555 refcount_add(burst, &pkt_dev->skb->users);
3556
3557 xmit_more:
3558 ret = netdev_start_xmit(pkt_dev->skb, odev, txq, --burst > 0);
3559
3560 switch (ret) {
3561 case NETDEV_TX_OK:
3562 pkt_dev->last_ok = 1;
3563 pkt_dev->sofar++;
3564 pkt_dev->seq_num++;
3565 pkt_dev->tx_bytes += pkt_dev->last_pkt_size;
3566 if (burst > 0 && !netif_xmit_frozen_or_drv_stopped(txq))
3567 goto xmit_more;
3568 break;
3569 case NET_XMIT_DROP:
3570 case NET_XMIT_CN:
3571
3572 pkt_dev->errors++;
3573 break;
3574 default:
3575 net_info_ratelimited("%s xmit error: %d\n",
3576 pkt_dev->odevname, ret);
3577 pkt_dev->errors++;
3578 fallthrough;
3579 case NETDEV_TX_BUSY:
3580
3581 refcount_dec(&(pkt_dev->skb->users));
3582 pkt_dev->last_ok = 0;
3583 }
3584 if (unlikely(burst))
3585 WARN_ON(refcount_sub_and_test(burst, &pkt_dev->skb->users));
3586 unlock:
3587 HARD_TX_UNLOCK(odev, txq);
3588
3589 out:
3590 local_bh_enable();
3591
3592
3593 if ((pkt_dev->count != 0) && (pkt_dev->sofar >= pkt_dev->count)) {
3594 pktgen_wait_for_skb(pkt_dev);
3595
3596
3597 pktgen_stop_device(pkt_dev);
3598 }
3599 }
3600
3601
3602
3603
3604
3605 static int pktgen_thread_worker(void *arg)
3606 {
3607 struct pktgen_thread *t = arg;
3608 struct pktgen_dev *pkt_dev = NULL;
3609 int cpu = t->cpu;
3610
3611 WARN_ON(smp_processor_id() != cpu);
3612
3613 init_waitqueue_head(&t->queue);
3614 complete(&t->start_done);
3615
3616 pr_debug("starting pktgen/%d: pid=%d\n", cpu, task_pid_nr(current));
3617
3618 set_freezable();
3619
3620 while (!kthread_should_stop()) {
3621 pkt_dev = next_to_run(t);
3622
3623 if (unlikely(!pkt_dev && t->control == 0)) {
3624 if (t->net->pktgen_exiting)
3625 break;
3626 wait_event_interruptible_timeout(t->queue,
3627 t->control != 0,
3628 HZ/10);
3629 try_to_freeze();
3630 continue;
3631 }
3632
3633 if (likely(pkt_dev)) {
3634 pktgen_xmit(pkt_dev);
3635
3636 if (need_resched())
3637 pktgen_resched(pkt_dev);
3638 else
3639 cpu_relax();
3640 }
3641
3642 if (t->control & T_STOP) {
3643 pktgen_stop(t);
3644 t->control &= ~(T_STOP);
3645 }
3646
3647 if (t->control & T_RUN) {
3648 pktgen_run(t);
3649 t->control &= ~(T_RUN);
3650 }
3651
3652 if (t->control & T_REMDEVALL) {
3653 pktgen_rem_all_ifs(t);
3654 t->control &= ~(T_REMDEVALL);
3655 }
3656
3657 if (t->control & T_REMDEV) {
3658 pktgen_rem_one_if(t);
3659 t->control &= ~(T_REMDEV);
3660 }
3661
3662 try_to_freeze();
3663 }
3664
3665 pr_debug("%s stopping all device\n", t->tsk->comm);
3666 pktgen_stop(t);
3667
3668 pr_debug("%s removing all device\n", t->tsk->comm);
3669 pktgen_rem_all_ifs(t);
3670
3671 pr_debug("%s removing thread\n", t->tsk->comm);
3672 pktgen_rem_thread(t);
3673
3674 return 0;
3675 }
3676
3677 static struct pktgen_dev *pktgen_find_dev(struct pktgen_thread *t,
3678 const char *ifname, bool exact)
3679 {
3680 struct pktgen_dev *p, *pkt_dev = NULL;
3681 size_t len = strlen(ifname);
3682
3683 rcu_read_lock();
3684 list_for_each_entry_rcu(p, &t->if_list, list)
3685 if (strncmp(p->odevname, ifname, len) == 0) {
3686 if (p->odevname[len]) {
3687 if (exact || p->odevname[len] != '@')
3688 continue;
3689 }
3690 pkt_dev = p;
3691 break;
3692 }
3693
3694 rcu_read_unlock();
3695 pr_debug("find_dev(%s) returning %p\n", ifname, pkt_dev);
3696 return pkt_dev;
3697 }
3698
3699
3700
3701
3702
3703 static int add_dev_to_thread(struct pktgen_thread *t,
3704 struct pktgen_dev *pkt_dev)
3705 {
3706 int rv = 0;
3707
3708
3709
3710
3711
3712
3713
3714 if_lock(t);
3715
3716 if (pkt_dev->pg_thread) {
3717 pr_err("ERROR: already assigned to a thread\n");
3718 rv = -EBUSY;
3719 goto out;
3720 }
3721
3722 pkt_dev->running = 0;
3723 pkt_dev->pg_thread = t;
3724 list_add_rcu(&pkt_dev->list, &t->if_list);
3725
3726 out:
3727 if_unlock(t);
3728 return rv;
3729 }
3730
3731
3732
3733 static int pktgen_add_device(struct pktgen_thread *t, const char *ifname)
3734 {
3735 struct pktgen_dev *pkt_dev;
3736 int err;
3737 int node = cpu_to_node(t->cpu);
3738
3739
3740
3741 pkt_dev = __pktgen_NN_threads(t->net, ifname, FIND);
3742 if (pkt_dev) {
3743 pr_err("ERROR: interface already used\n");
3744 return -EBUSY;
3745 }
3746
3747 pkt_dev = kzalloc_node(sizeof(struct pktgen_dev), GFP_KERNEL, node);
3748 if (!pkt_dev)
3749 return -ENOMEM;
3750
3751 strcpy(pkt_dev->odevname, ifname);
3752 pkt_dev->flows = vzalloc_node(array_size(MAX_CFLOWS,
3753 sizeof(struct flow_state)),
3754 node);
3755 if (pkt_dev->flows == NULL) {
3756 kfree(pkt_dev);
3757 return -ENOMEM;
3758 }
3759
3760 pkt_dev->removal_mark = 0;
3761 pkt_dev->nfrags = 0;
3762 pkt_dev->delay = pg_delay_d;
3763 pkt_dev->count = pg_count_d;
3764 pkt_dev->sofar = 0;
3765 pkt_dev->udp_src_min = 9;
3766 pkt_dev->udp_src_max = 9;
3767 pkt_dev->udp_dst_min = 9;
3768 pkt_dev->udp_dst_max = 9;
3769 pkt_dev->vlan_p = 0;
3770 pkt_dev->vlan_cfi = 0;
3771 pkt_dev->vlan_id = 0xffff;
3772 pkt_dev->svlan_p = 0;
3773 pkt_dev->svlan_cfi = 0;
3774 pkt_dev->svlan_id = 0xffff;
3775 pkt_dev->burst = 1;
3776 pkt_dev->node = NUMA_NO_NODE;
3777
3778 err = pktgen_setup_dev(t->net, pkt_dev, ifname);
3779 if (err)
3780 goto out1;
3781 if (pkt_dev->odev->priv_flags & IFF_TX_SKB_SHARING)
3782 pkt_dev->clone_skb = pg_clone_skb_d;
3783
3784 pkt_dev->entry = proc_create_data(ifname, 0600, t->net->proc_dir,
3785 &pktgen_if_proc_ops, pkt_dev);
3786 if (!pkt_dev->entry) {
3787 pr_err("cannot create %s/%s procfs entry\n",
3788 PG_PROC_DIR, ifname);
3789 err = -EINVAL;
3790 goto out2;
3791 }
3792 #ifdef CONFIG_XFRM
3793 pkt_dev->ipsmode = XFRM_MODE_TRANSPORT;
3794 pkt_dev->ipsproto = IPPROTO_ESP;
3795
3796
3797
3798
3799
3800
3801 pkt_dev->dstops.family = AF_INET;
3802 pkt_dev->xdst.u.dst.dev = pkt_dev->odev;
3803 dst_init_metrics(&pkt_dev->xdst.u.dst, pktgen_dst_metrics, false);
3804 pkt_dev->xdst.child = &pkt_dev->xdst.u.dst;
3805 pkt_dev->xdst.u.dst.ops = &pkt_dev->dstops;
3806 #endif
3807
3808 return add_dev_to_thread(t, pkt_dev);
3809 out2:
3810 netdev_put(pkt_dev->odev, &pkt_dev->dev_tracker);
3811 out1:
3812 #ifdef CONFIG_XFRM
3813 free_SAs(pkt_dev);
3814 #endif
3815 vfree(pkt_dev->flows);
3816 kfree(pkt_dev);
3817 return err;
3818 }
3819
3820 static int __net_init pktgen_create_thread(int cpu, struct pktgen_net *pn)
3821 {
3822 struct pktgen_thread *t;
3823 struct proc_dir_entry *pe;
3824 struct task_struct *p;
3825
3826 t = kzalloc_node(sizeof(struct pktgen_thread), GFP_KERNEL,
3827 cpu_to_node(cpu));
3828 if (!t) {
3829 pr_err("ERROR: out of memory, can't create new thread\n");
3830 return -ENOMEM;
3831 }
3832
3833 mutex_init(&t->if_lock);
3834 t->cpu = cpu;
3835
3836 INIT_LIST_HEAD(&t->if_list);
3837
3838 list_add_tail(&t->th_list, &pn->pktgen_threads);
3839 init_completion(&t->start_done);
3840
3841 p = kthread_create_on_node(pktgen_thread_worker,
3842 t,
3843 cpu_to_node(cpu),
3844 "kpktgend_%d", cpu);
3845 if (IS_ERR(p)) {
3846 pr_err("kthread_create_on_node() failed for cpu %d\n", t->cpu);
3847 list_del(&t->th_list);
3848 kfree(t);
3849 return PTR_ERR(p);
3850 }
3851 kthread_bind(p, cpu);
3852 t->tsk = p;
3853
3854 pe = proc_create_data(t->tsk->comm, 0600, pn->proc_dir,
3855 &pktgen_thread_proc_ops, t);
3856 if (!pe) {
3857 pr_err("cannot create %s/%s procfs entry\n",
3858 PG_PROC_DIR, t->tsk->comm);
3859 kthread_stop(p);
3860 list_del(&t->th_list);
3861 kfree(t);
3862 return -EINVAL;
3863 }
3864
3865 t->net = pn;
3866 get_task_struct(p);
3867 wake_up_process(p);
3868 wait_for_completion(&t->start_done);
3869
3870 return 0;
3871 }
3872
3873
3874
3875
3876 static void _rem_dev_from_if_list(struct pktgen_thread *t,
3877 struct pktgen_dev *pkt_dev)
3878 {
3879 struct list_head *q, *n;
3880 struct pktgen_dev *p;
3881
3882 if_lock(t);
3883 list_for_each_safe(q, n, &t->if_list) {
3884 p = list_entry(q, struct pktgen_dev, list);
3885 if (p == pkt_dev)
3886 list_del_rcu(&p->list);
3887 }
3888 if_unlock(t);
3889 }
3890
3891 static int pktgen_remove_device(struct pktgen_thread *t,
3892 struct pktgen_dev *pkt_dev)
3893 {
3894 pr_debug("remove_device pkt_dev=%p\n", pkt_dev);
3895
3896 if (pkt_dev->running) {
3897 pr_warn("WARNING: trying to remove a running interface, stopping it now\n");
3898 pktgen_stop_device(pkt_dev);
3899 }
3900
3901
3902
3903 if (pkt_dev->odev) {
3904 netdev_put(pkt_dev->odev, &pkt_dev->dev_tracker);
3905 pkt_dev->odev = NULL;
3906 }
3907
3908
3909
3910
3911 proc_remove(pkt_dev->entry);
3912
3913
3914 _rem_dev_from_if_list(t, pkt_dev);
3915
3916 #ifdef CONFIG_XFRM
3917 free_SAs(pkt_dev);
3918 #endif
3919 vfree(pkt_dev->flows);
3920 if (pkt_dev->page)
3921 put_page(pkt_dev->page);
3922 kfree_rcu(pkt_dev, rcu);
3923 return 0;
3924 }
3925
3926 static int __net_init pg_net_init(struct net *net)
3927 {
3928 struct pktgen_net *pn = net_generic(net, pg_net_id);
3929 struct proc_dir_entry *pe;
3930 int cpu, ret = 0;
3931
3932 pn->net = net;
3933 INIT_LIST_HEAD(&pn->pktgen_threads);
3934 pn->pktgen_exiting = false;
3935 pn->proc_dir = proc_mkdir(PG_PROC_DIR, pn->net->proc_net);
3936 if (!pn->proc_dir) {
3937 pr_warn("cannot create /proc/net/%s\n", PG_PROC_DIR);
3938 return -ENODEV;
3939 }
3940 pe = proc_create(PGCTRL, 0600, pn->proc_dir, &pktgen_proc_ops);
3941 if (pe == NULL) {
3942 pr_err("cannot create %s procfs entry\n", PGCTRL);
3943 ret = -EINVAL;
3944 goto remove;
3945 }
3946
3947 for_each_online_cpu(cpu) {
3948 int err;
3949
3950 err = pktgen_create_thread(cpu, pn);
3951 if (err)
3952 pr_warn("Cannot create thread for cpu %d (%d)\n",
3953 cpu, err);
3954 }
3955
3956 if (list_empty(&pn->pktgen_threads)) {
3957 pr_err("Initialization failed for all threads\n");
3958 ret = -ENODEV;
3959 goto remove_entry;
3960 }
3961
3962 return 0;
3963
3964 remove_entry:
3965 remove_proc_entry(PGCTRL, pn->proc_dir);
3966 remove:
3967 remove_proc_entry(PG_PROC_DIR, pn->net->proc_net);
3968 return ret;
3969 }
3970
3971 static void __net_exit pg_net_exit(struct net *net)
3972 {
3973 struct pktgen_net *pn = net_generic(net, pg_net_id);
3974 struct pktgen_thread *t;
3975 struct list_head *q, *n;
3976 LIST_HEAD(list);
3977
3978
3979 pn->pktgen_exiting = true;
3980
3981 mutex_lock(&pktgen_thread_lock);
3982 list_splice_init(&pn->pktgen_threads, &list);
3983 mutex_unlock(&pktgen_thread_lock);
3984
3985 list_for_each_safe(q, n, &list) {
3986 t = list_entry(q, struct pktgen_thread, th_list);
3987 list_del(&t->th_list);
3988 kthread_stop(t->tsk);
3989 put_task_struct(t->tsk);
3990 kfree(t);
3991 }
3992
3993 remove_proc_entry(PGCTRL, pn->proc_dir);
3994 remove_proc_entry(PG_PROC_DIR, pn->net->proc_net);
3995 }
3996
3997 static struct pernet_operations pg_net_ops = {
3998 .init = pg_net_init,
3999 .exit = pg_net_exit,
4000 .id = &pg_net_id,
4001 .size = sizeof(struct pktgen_net),
4002 };
4003
4004 static int __init pg_init(void)
4005 {
4006 int ret = 0;
4007
4008 pr_info("%s", version);
4009 ret = register_pernet_subsys(&pg_net_ops);
4010 if (ret)
4011 return ret;
4012 ret = register_netdevice_notifier(&pktgen_notifier_block);
4013 if (ret)
4014 unregister_pernet_subsys(&pg_net_ops);
4015
4016 return ret;
4017 }
4018
4019 static void __exit pg_cleanup(void)
4020 {
4021 unregister_netdevice_notifier(&pktgen_notifier_block);
4022 unregister_pernet_subsys(&pg_net_ops);
4023
4024 }
4025
4026 module_init(pg_init);
4027 module_exit(pg_cleanup);
4028
4029 MODULE_AUTHOR("Robert Olsson <robert.olsson@its.uu.se>");
4030 MODULE_DESCRIPTION("Packet Generator tool");
4031 MODULE_LICENSE("GPL");
4032 MODULE_VERSION(VERSION);
4033 module_param(pg_count_d, int, 0);
4034 MODULE_PARM_DESC(pg_count_d, "Default number of packets to inject");
4035 module_param(pg_delay_d, int, 0);
4036 MODULE_PARM_DESC(pg_delay_d, "Default delay between packets (nanoseconds)");
4037 module_param(pg_clone_skb_d, int, 0);
4038 MODULE_PARM_DESC(pg_clone_skb_d, "Default number of copies of the same packet");
4039 module_param(debug, int, 0);
4040 MODULE_PARM_DESC(debug, "Enable debugging of pktgen module");