pktgen.c (64e8ff5ef2a798cae2e3bede75644173aae98e08) | pktgen.c (63adc6fb8ac0dee0020d6ad73e0d44f4306e1e34) |
---|---|
1/* 2 * Authors: 3 * Copyright 2001, 2002 by Robert Olsson <robert.olsson@its.uu.se> 4 * Uppsala University and 5 * Swedish University of Agricultural Sciences 6 * 7 * Alexey Kuznetsov <kuznet@ms2.inr.ac.ru> 8 * Ben Greear <greearb@candelatech.com> --- 149 unchanged lines hidden (view full) --- 158#include <net/ipv6.h> 159#include <net/addrconf.h> 160#ifdef CONFIG_XFRM 161#include <net/xfrm.h> 162#endif 163#include <asm/byteorder.h> 164#include <linux/rcupdate.h> 165#include <linux/bitops.h> | 1/* 2 * Authors: 3 * Copyright 2001, 2002 by Robert Olsson <robert.olsson@its.uu.se> 4 * Uppsala University and 5 * Swedish University of Agricultural Sciences 6 * 7 * Alexey Kuznetsov <kuznet@ms2.inr.ac.ru> 8 * Ben Greear <greearb@candelatech.com> --- 149 unchanged lines hidden (view full) --- 158#include <net/ipv6.h> 159#include <net/addrconf.h> 160#ifdef CONFIG_XFRM 161#include <net/xfrm.h> 162#endif 163#include <asm/byteorder.h> 164#include <linux/rcupdate.h> 165#include <linux/bitops.h> |
166#include <asm/io.h> | 166#include <linux/io.h> 167#include <linux/timex.h> 168#include <linux/uaccess.h> |
167#include <asm/dma.h> | 169#include <asm/dma.h> |
168#include <asm/uaccess.h> | |
169#include <asm/div64.h> /* do_div */ | 170#include <asm/div64.h> /* do_div */ |
170#include <asm/timex.h> | |
171 | 171 |
172#define VERSION "pktgen v2.70: Packet Generator for packet performance testing.\n" | 172#define VERSION \ 173 "pktgen v2.70: Packet Generator for packet performance testing.\n" |
173 174#define IP_NAME_SZ 32 175#define MAX_MPLS_LABELS 16 /* This is the max label stack depth */ 176#define MPLS_STACK_BOTTOM htonl(0x00000100) 177 178/* Device flag bits */ 179#define F_IPSRC_RND (1<<0) /* IP-Src Random */ 180#define F_IPDST_RND (1<<1) /* IP-Dst Random */ --- 21 unchanged lines hidden (view full) --- 202/* If lock -- can be removed after some work */ 203#define if_lock(t) spin_lock(&(t->if_lock)); 204#define if_unlock(t) spin_unlock(&(t->if_lock)); 205 206/* Used to help with determining the pkts on receive */ 207#define PKTGEN_MAGIC 0xbe9be955 208#define PG_PROC_DIR "pktgen" 209#define PGCTRL "pgctrl" | 174 175#define IP_NAME_SZ 32 176#define MAX_MPLS_LABELS 16 /* This is the max label stack depth */ 177#define MPLS_STACK_BOTTOM htonl(0x00000100) 178 179/* Device flag bits */ 180#define F_IPSRC_RND (1<<0) /* IP-Src Random */ 181#define F_IPDST_RND (1<<1) /* IP-Dst Random */ --- 21 unchanged lines hidden (view full) --- 203/* If lock -- can be removed after some work */ 204#define if_lock(t) spin_lock(&(t->if_lock)); 205#define if_unlock(t) spin_unlock(&(t->if_lock)); 206 207/* Used to help with determining the pkts on receive */ 208#define PKTGEN_MAGIC 0xbe9be955 209#define PG_PROC_DIR "pktgen" 210#define PGCTRL "pgctrl" |
210static struct proc_dir_entry *pg_proc_dir = NULL; | 211static struct proc_dir_entry *pg_proc_dir; |
211 212#define MAX_CFLOWS 65536 213 214#define VLAN_TAG_SIZE(x) ((x)->vlan_id == 0xffff ? 0 : 4) 215#define SVLAN_TAG_SIZE(x) ((x)->svlan_id == 0xffff ? 0 : 4) 216 217struct flow_state { 218 __be32 cur_daddr; --- 8 unchanged lines hidden (view full) --- 227#define F_INIT (1<<0) /* flow has been initialized */ 228 229struct pktgen_dev { 230 /* 231 * Try to keep frequent/infrequent used vars. separated. 232 */ 233 struct proc_dir_entry *entry; /* proc file */ 234 struct pktgen_thread *pg_thread;/* the owner */ | 212 213#define MAX_CFLOWS 65536 214 215#define VLAN_TAG_SIZE(x) ((x)->vlan_id == 0xffff ? 0 : 4) 216#define SVLAN_TAG_SIZE(x) ((x)->svlan_id == 0xffff ? 0 : 4) 217 218struct flow_state { 219 __be32 cur_daddr; --- 8 unchanged lines hidden (view full) --- 228#define F_INIT (1<<0) /* flow has been initialized */ 229 230struct pktgen_dev { 231 /* 232 * Try to keep frequent/infrequent used vars. separated. 233 */ 234 struct proc_dir_entry *entry; /* proc file */ 235 struct pktgen_thread *pg_thread;/* the owner */ |
235 struct list_head list; /* Used for chaining in the thread's run-queue */ | 236 struct list_head list; /* chaining in the thread's run-queue */ |
236 | 237 |
237 int running; /* if this changes to false, the test will stop */ | 238 int running; /* if false, the test will stop */ |
238 239 /* If min != max, then we will either do a linear iteration, or 240 * we will do a random selection from within the range. 241 */ 242 __u32 flags; 243 int removal_mark; /* non-zero => the device is marked for 244 * removal by worker thread */ 245 246 int min_pkt_size; /* = ETH_ZLEN; */ 247 int max_pkt_size; /* = ETH_ZLEN; */ 248 int pkt_overhead; /* overhead for MPLS, VLANs, IPSEC etc */ 249 int nfrags; 250 u64 delay; /* nano-seconds */ 251 252 __u64 count; /* Default No packets to send */ 253 __u64 sofar; /* How many pkts we've sent so far */ 254 __u64 tx_bytes; /* How many bytes we've transmitted */ | 239 240 /* If min != max, then we will either do a linear iteration, or 241 * we will do a random selection from within the range. 242 */ 243 __u32 flags; 244 int removal_mark; /* non-zero => the device is marked for 245 * removal by worker thread */ 246 247 int min_pkt_size; /* = ETH_ZLEN; */ 248 int max_pkt_size; /* = ETH_ZLEN; */ 249 int pkt_overhead; /* overhead for MPLS, VLANs, IPSEC etc */ 250 int nfrags; 251 u64 delay; /* nano-seconds */ 252 253 __u64 count; /* Default No packets to send */ 254 __u64 sofar; /* How many pkts we've sent so far */ 255 __u64 tx_bytes; /* How many bytes we've transmitted */ |
255 __u64 errors; /* Errors when trying to transmit, pkts will be re-sent */ | 256 __u64 errors; /* Errors when trying to transmit, 257 pkts will be re-sent */ |
256 257 /* runtime counters relating to clone_skb */ 258 259 __u64 allocated_skbs; 260 __u32 clone_count; 261 int last_ok; /* Was last skb sent? | 258 259 /* runtime counters relating to clone_skb */ 260 261 __u64 allocated_skbs; 262 __u32 clone_count; 263 int last_ok; /* Was last skb sent? |
262 * Or a failed transmit of some sort? This will keep 263 * sequence numbers in order, for example. | 264 * Or a failed transmit of some sort? 265 * This will keep sequence numbers in order |
264 */ 265 ktime_t next_tx; 266 ktime_t started_at; 267 ktime_t stopped_at; 268 u64 idle_acc; /* nano-seconds */ 269 270 __u32 seq_num; 271 | 266 */ 267 ktime_t next_tx; 268 ktime_t started_at; 269 ktime_t stopped_at; 270 u64 idle_acc; /* nano-seconds */ 271 272 __u32 seq_num; 273 |
272 int clone_skb; /* Use multiple SKBs during packet gen. If this number 273 * is greater than 1, then that many copies of the same 274 * packet will be sent before a new packet is allocated. 275 * For instance, if you want to send 1024 identical packets 276 * before creating a new packet, set clone_skb to 1024. | 274 int clone_skb; /* 275 * Use multiple SKBs during packet gen. 276 * If this number is greater than 1, then 277 * that many copies of the same packet will be 278 * sent before a new packet is allocated. 279 * If you want to send 1024 identical packets 280 * before creating a new packet, 281 * set clone_skb to 1024. |
277 */ 278 279 char dst_min[IP_NAME_SZ]; /* IP, ie 1.2.3.4 */ 280 char dst_max[IP_NAME_SZ]; /* IP, ie 1.2.3.4 */ 281 char src_min[IP_NAME_SZ]; /* IP, ie 1.2.3.4 */ 282 char src_max[IP_NAME_SZ]; /* IP, ie 1.2.3.4 */ 283 284 struct in6_addr in6_saddr; --- 15 unchanged lines hidden (view full) --- 300 __be32 daddr_max; /* exclusive, dest IP address */ 301 302 __u16 udp_src_min; /* inclusive, source UDP port */ 303 __u16 udp_src_max; /* exclusive, source UDP port */ 304 __u16 udp_dst_min; /* inclusive, dest UDP port */ 305 __u16 udp_dst_max; /* exclusive, dest UDP port */ 306 307 /* DSCP + ECN */ | 282 */ 283 284 char dst_min[IP_NAME_SZ]; /* IP, ie 1.2.3.4 */ 285 char dst_max[IP_NAME_SZ]; /* IP, ie 1.2.3.4 */ 286 char src_min[IP_NAME_SZ]; /* IP, ie 1.2.3.4 */ 287 char src_max[IP_NAME_SZ]; /* IP, ie 1.2.3.4 */ 288 289 struct in6_addr in6_saddr; --- 15 unchanged lines hidden (view full) --- 305 __be32 daddr_max; /* exclusive, dest IP address */ 306 307 __u16 udp_src_min; /* inclusive, source UDP port */ 308 __u16 udp_src_max; /* exclusive, source UDP port */ 309 __u16 udp_dst_min; /* inclusive, dest UDP port */ 310 __u16 udp_dst_max; /* exclusive, dest UDP port */ 311 312 /* DSCP + ECN */ |
308 __u8 tos; /* six most significant bits of (former) IPv4 TOS are for dscp codepoint */ 309 __u8 traffic_class; /* ditto for the (former) Traffic Class in IPv6 (see RFC 3260, sec. 4) */ | 313 __u8 tos; /* six MSB of (former) IPv4 TOS 314 are for dscp codepoint */ 315 __u8 traffic_class; /* ditto for the (former) Traffic Class in IPv6 316 (see RFC 3260, sec. 4) */ |
310 311 /* MPLS */ 312 unsigned nr_labels; /* Depth of stack, 0 = no MPLS */ 313 __be32 labels[MAX_MPLS_LABELS]; 314 315 /* VLAN/SVLAN (802.1Q/Q-in-Q) */ 316 __u8 vlan_p; 317 __u8 vlan_cfi; --- 24 unchanged lines hidden (view full) --- 342 343 We fill in SRC address later 344 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 345 0x08, 0x00 346 }; 347 */ 348 __u16 pad; /* pad out the hh struct to an even 16 bytes */ 349 | 317 318 /* MPLS */ 319 unsigned nr_labels; /* Depth of stack, 0 = no MPLS */ 320 __be32 labels[MAX_MPLS_LABELS]; 321 322 /* VLAN/SVLAN (802.1Q/Q-in-Q) */ 323 __u8 vlan_p; 324 __u8 vlan_cfi; --- 24 unchanged lines hidden (view full) --- 349 350 We fill in SRC address later 351 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 352 0x08, 0x00 353 }; 354 */ 355 __u16 pad; /* pad out the hh struct to an even 16 bytes */ 356 |
350 struct sk_buff *skb; /* skb we are to transmit next, mainly used for when we | 357 struct sk_buff *skb; /* skb we are to transmit next, used for when we |
351 * are transmitting the same one multiple times 352 */ | 358 * are transmitting the same one multiple times 359 */ |
353 struct net_device *odev; /* The out-going device. Note that the device should 354 * have it's pg_info pointer pointing back to this 355 * device. This will be set when the user specifies 356 * the out-going device name (not when the inject is 357 * started as it used to do.) 358 */ | 360 struct net_device *odev; /* The out-going device. 361 * Note that the device should have it's 362 * pg_info pointer pointing back to this 363 * device. 364 * Set when the user specifies the out-going 365 * device name (not when the inject is 366 * started as it used to do.) 367 */ |
359 struct flow_state *flows; 360 unsigned cflows; /* Concurrent flows (config) */ 361 unsigned lflow; /* Flow length (config) */ 362 unsigned nflows; /* accumulated flows (stats) */ 363 unsigned curfl; /* current sequenced flow (state)*/ 364 365 u16 queue_map_min; 366 u16 queue_map_max; --- 8 unchanged lines hidden (view full) --- 375struct pktgen_hdr { 376 __be32 pgh_magic; 377 __be32 seq_num; 378 __be32 tv_sec; 379 __be32 tv_usec; 380}; 381 382struct pktgen_thread { | 368 struct flow_state *flows; 369 unsigned cflows; /* Concurrent flows (config) */ 370 unsigned lflow; /* Flow length (config) */ 371 unsigned nflows; /* accumulated flows (stats) */ 372 unsigned curfl; /* current sequenced flow (state)*/ 373 374 u16 queue_map_min; 375 u16 queue_map_max; --- 8 unchanged lines hidden (view full) --- 384struct pktgen_hdr { 385 __be32 pgh_magic; 386 __be32 seq_num; 387 __be32 tv_sec; 388 __be32 tv_usec; 389}; 390 391struct pktgen_thread { |
383 spinlock_t if_lock; | 392 spinlock_t if_lock; /* for list of devices */ |
384 struct list_head if_list; /* All device here */ 385 struct list_head th_list; 386 struct task_struct *tsk; 387 char result[512]; 388 | 393 struct list_head if_list; /* All device here */ 394 struct list_head th_list; 395 struct task_struct *tsk; 396 char result[512]; 397 |
389 /* Field for thread to receive "posted" events terminate, stop ifs etc. */ | 398 /* Field for thread to receive "posted" events terminate, 399 stop ifs etc. */ |
390 391 u32 control; 392 int cpu; 393 394 wait_queue_head_t queue; 395 struct completion start_done; 396}; 397 --- 50 unchanged lines hidden (view full) --- 448 */ 449 450static int pgctrl_show(struct seq_file *seq, void *v) 451{ 452 seq_puts(seq, VERSION); 453 return 0; 454} 455 | 400 401 u32 control; 402 int cpu; 403 404 wait_queue_head_t queue; 405 struct completion start_done; 406}; 407 --- 50 unchanged lines hidden (view full) --- 458 */ 459 460static int pgctrl_show(struct seq_file *seq, void *v) 461{ 462 seq_puts(seq, VERSION); 463 return 0; 464} 465 |
456static ssize_t pgctrl_write(struct file *file, const char __user * buf, 457 size_t count, loff_t * ppos) | 466static ssize_t pgctrl_write(struct file *file, const char __user *buf, 467 size_t count, loff_t *ppos) |
458{ 459 int err = 0; 460 char data[128]; 461 462 if (!capable(CAP_NET_ADMIN)) { 463 err = -EPERM; 464 goto out; 465 } --- 74 unchanged lines hidden (view full) --- 540 541 fmt_ip6(b1, pkt_dev->in6_daddr.s6_addr); 542 fmt_ip6(b2, pkt_dev->min_in6_daddr.s6_addr); 543 fmt_ip6(b3, pkt_dev->max_in6_daddr.s6_addr); 544 seq_printf(seq, 545 " daddr: %s min_daddr: %s max_daddr: %s\n", b1, 546 b2, b3); 547 | 468{ 469 int err = 0; 470 char data[128]; 471 472 if (!capable(CAP_NET_ADMIN)) { 473 err = -EPERM; 474 goto out; 475 } --- 74 unchanged lines hidden (view full) --- 550 551 fmt_ip6(b1, pkt_dev->in6_daddr.s6_addr); 552 fmt_ip6(b2, pkt_dev->min_in6_daddr.s6_addr); 553 fmt_ip6(b3, pkt_dev->max_in6_daddr.s6_addr); 554 seq_printf(seq, 555 " daddr: %s min_daddr: %s max_daddr: %s\n", b1, 556 b2, b3); 557 |
548 } else | 558 } else { |
549 seq_printf(seq, | 559 seq_printf(seq, |
550 " dst_min: %s dst_max: %s\n src_min: %s src_max: %s\n", 551 pkt_dev->dst_min, pkt_dev->dst_max, pkt_dev->src_min, 552 pkt_dev->src_max); | 560 " dst_min: %s dst_max: %s\n", 561 pkt_dev->dst_min, pkt_dev->dst_max); 562 seq_printf(seq, 563 " src_min: %s src_max: %s\n", 564 pkt_dev->src_min, pkt_dev->src_max); 565 } |
553 554 seq_puts(seq, " src_mac: "); 555 556 seq_printf(seq, "%pM ", 557 is_zero_ether_addr(pkt_dev->src_mac) ? 558 pkt_dev->odev->dev_addr : pkt_dev->src_mac); 559 560 seq_printf(seq, "dst_mac: "); 561 seq_printf(seq, "%pM\n", pkt_dev->dst_mac); 562 563 seq_printf(seq, | 566 567 seq_puts(seq, " src_mac: "); 568 569 seq_printf(seq, "%pM ", 570 is_zero_ether_addr(pkt_dev->src_mac) ? 571 pkt_dev->odev->dev_addr : pkt_dev->src_mac); 572 573 seq_printf(seq, "dst_mac: "); 574 seq_printf(seq, "%pM\n", pkt_dev->dst_mac); 575 576 seq_printf(seq, |
564 " udp_src_min: %d udp_src_max: %d udp_dst_min: %d udp_dst_max: %d\n", | 577 " udp_src_min: %d udp_src_max: %d" 578 " udp_dst_min: %d udp_dst_max: %d\n", |
565 pkt_dev->udp_src_min, pkt_dev->udp_src_max, 566 pkt_dev->udp_dst_min, pkt_dev->udp_dst_max); 567 568 seq_printf(seq, 569 " src_mac_count: %d dst_mac_count: %d\n", 570 pkt_dev->src_mac_count, pkt_dev->dst_mac_count); 571 572 if (pkt_dev->nr_labels) { 573 unsigned i; 574 seq_printf(seq, " mpls: "); 575 for (i = 0; i < pkt_dev->nr_labels; i++) 576 seq_printf(seq, "%08x%s", ntohl(pkt_dev->labels[i]), 577 i == pkt_dev->nr_labels-1 ? "\n" : ", "); 578 } 579 | 579 pkt_dev->udp_src_min, pkt_dev->udp_src_max, 580 pkt_dev->udp_dst_min, pkt_dev->udp_dst_max); 581 582 seq_printf(seq, 583 " src_mac_count: %d dst_mac_count: %d\n", 584 pkt_dev->src_mac_count, pkt_dev->dst_mac_count); 585 586 if (pkt_dev->nr_labels) { 587 unsigned i; 588 seq_printf(seq, " mpls: "); 589 for (i = 0; i < pkt_dev->nr_labels; i++) 590 seq_printf(seq, "%08x%s", ntohl(pkt_dev->labels[i]), 591 i == pkt_dev->nr_labels-1 ? "\n" : ", "); 592 } 593 |
580 if (pkt_dev->vlan_id != 0xffff) { | 594 if (pkt_dev->vlan_id != 0xffff) |
581 seq_printf(seq, " vlan_id: %u vlan_p: %u vlan_cfi: %u\n", | 595 seq_printf(seq, " vlan_id: %u vlan_p: %u vlan_cfi: %u\n", |
582 pkt_dev->vlan_id, pkt_dev->vlan_p, pkt_dev->vlan_cfi); 583 } | 596 pkt_dev->vlan_id, pkt_dev->vlan_p, 597 pkt_dev->vlan_cfi); |
584 | 598 |
585 if (pkt_dev->svlan_id != 0xffff) { | 599 if (pkt_dev->svlan_id != 0xffff) |
586 seq_printf(seq, " svlan_id: %u vlan_p: %u vlan_cfi: %u\n", | 600 seq_printf(seq, " svlan_id: %u vlan_p: %u vlan_cfi: %u\n", |
587 pkt_dev->svlan_id, pkt_dev->svlan_p, pkt_dev->svlan_cfi); 588 } | 601 pkt_dev->svlan_id, pkt_dev->svlan_p, 602 pkt_dev->svlan_cfi); |
589 | 603 |
590 if (pkt_dev->tos) { | 604 if (pkt_dev->tos) |
591 seq_printf(seq, " tos: 0x%02x\n", pkt_dev->tos); | 605 seq_printf(seq, " tos: 0x%02x\n", pkt_dev->tos); |
592 } | |
593 | 606 |
594 if (pkt_dev->traffic_class) { | 607 if (pkt_dev->traffic_class) |
595 seq_printf(seq, " traffic_class: 0x%02x\n", pkt_dev->traffic_class); | 608 seq_printf(seq, " traffic_class: 0x%02x\n", pkt_dev->traffic_class); |
596 } | |
597 598 seq_printf(seq, " Flags: "); 599 600 if (pkt_dev->flags & F_IPV6) 601 seq_printf(seq, "IPV6 "); 602 603 if (pkt_dev->flags & F_IPSRC_RND) 604 seq_printf(seq, "IPSRC_RND "); --- 86 unchanged lines hidden (view full) --- 691 seq_printf(seq, "Result: %s\n", pkt_dev->result); 692 else 693 seq_printf(seq, "Result: Idle\n"); 694 695 return 0; 696} 697 698 | 609 610 seq_printf(seq, " Flags: "); 611 612 if (pkt_dev->flags & F_IPV6) 613 seq_printf(seq, "IPV6 "); 614 615 if (pkt_dev->flags & F_IPSRC_RND) 616 seq_printf(seq, "IPSRC_RND "); --- 86 unchanged lines hidden (view full) --- 703 seq_printf(seq, "Result: %s\n", pkt_dev->result); 704 else 705 seq_printf(seq, "Result: Idle\n"); 706 707 return 0; 708} 709 710 |
699static int hex32_arg(const char __user *user_buffer, unsigned long maxlen, __u32 *num) | 711static int hex32_arg(const char __user *user_buffer, unsigned long maxlen, 712 __u32 *num) |
700{ 701 int i = 0; 702 *num = 0; 703 704 for (; i < maxlen; i++) { 705 char c; 706 *num <<= 4; 707 if (get_user(c, &user_buffer[i])) --- 133 unchanged lines hidden (view full) --- 841 printk(KERN_WARNING "pktgen: illegal format\n"); 842 return tmp; 843 } 844 i += tmp; 845 846 /* Read variable name */ 847 848 len = strn_len(&user_buffer[i], sizeof(name) - 1); | 713{ 714 int i = 0; 715 *num = 0; 716 717 for (; i < maxlen; i++) { 718 char c; 719 *num <<= 4; 720 if (get_user(c, &user_buffer[i])) --- 133 unchanged lines hidden (view full) --- 854 printk(KERN_WARNING "pktgen: illegal format\n"); 855 return tmp; 856 } 857 i += tmp; 858 859 /* Read variable name */ 860 861 len = strn_len(&user_buffer[i], sizeof(name) - 1); |
849 if (len < 0) { | 862 if (len < 0) |
850 return len; | 863 return len; |
851 } | 864 |
852 memset(name, 0, sizeof(name)); 853 if (copy_from_user(name, &user_buffer[i], len)) 854 return -EFAULT; 855 i += len; 856 857 max = count - i; 858 len = count_trail_chars(&user_buffer[i], max); 859 if (len < 0) --- 7 unchanged lines hidden (view full) --- 867 return -EFAULT; 868 tb[count] = 0; 869 printk(KERN_DEBUG "pktgen: %s,%lu buffer -:%s:-\n", name, 870 (unsigned long)count, tb); 871 } 872 873 if (!strcmp(name, "min_pkt_size")) { 874 len = num_arg(&user_buffer[i], 10, &value); | 865 memset(name, 0, sizeof(name)); 866 if (copy_from_user(name, &user_buffer[i], len)) 867 return -EFAULT; 868 i += len; 869 870 max = count - i; 871 len = count_trail_chars(&user_buffer[i], max); 872 if (len < 0) --- 7 unchanged lines hidden (view full) --- 880 return -EFAULT; 881 tb[count] = 0; 882 printk(KERN_DEBUG "pktgen: %s,%lu buffer -:%s:-\n", name, 883 (unsigned long)count, tb); 884 } 885 886 if (!strcmp(name, "min_pkt_size")) { 887 len = num_arg(&user_buffer[i], 10, &value); |
875 if (len < 0) { | 888 if (len < 0) |
876 return len; | 889 return len; |
877 } | 890 |
878 i += len; 879 if (value < 14 + 20 + 8) 880 value = 14 + 20 + 8; 881 if (value != pkt_dev->min_pkt_size) { 882 pkt_dev->min_pkt_size = value; 883 pkt_dev->cur_pkt_size = value; 884 } 885 sprintf(pg_result, "OK: min_pkt_size=%u", 886 pkt_dev->min_pkt_size); 887 return count; 888 } 889 890 if (!strcmp(name, "max_pkt_size")) { 891 len = num_arg(&user_buffer[i], 10, &value); | 891 i += len; 892 if (value < 14 + 20 + 8) 893 value = 14 + 20 + 8; 894 if (value != pkt_dev->min_pkt_size) { 895 pkt_dev->min_pkt_size = value; 896 pkt_dev->cur_pkt_size = value; 897 } 898 sprintf(pg_result, "OK: min_pkt_size=%u", 899 pkt_dev->min_pkt_size); 900 return count; 901 } 902 903 if (!strcmp(name, "max_pkt_size")) { 904 len = num_arg(&user_buffer[i], 10, &value); |
892 if (len < 0) { | 905 if (len < 0) |
893 return len; | 906 return len; |
894 } | 907 |
895 i += len; 896 if (value < 14 + 20 + 8) 897 value = 14 + 20 + 8; 898 if (value != pkt_dev->max_pkt_size) { 899 pkt_dev->max_pkt_size = value; 900 pkt_dev->cur_pkt_size = value; 901 } 902 sprintf(pg_result, "OK: max_pkt_size=%u", 903 pkt_dev->max_pkt_size); 904 return count; 905 } 906 907 /* Shortcut for min = max */ 908 909 if (!strcmp(name, "pkt_size")) { 910 len = num_arg(&user_buffer[i], 10, &value); | 908 i += len; 909 if (value < 14 + 20 + 8) 910 value = 14 + 20 + 8; 911 if (value != pkt_dev->max_pkt_size) { 912 pkt_dev->max_pkt_size = value; 913 pkt_dev->cur_pkt_size = value; 914 } 915 sprintf(pg_result, "OK: max_pkt_size=%u", 916 pkt_dev->max_pkt_size); 917 return count; 918 } 919 920 /* Shortcut for min = max */ 921 922 if (!strcmp(name, "pkt_size")) { 923 len = num_arg(&user_buffer[i], 10, &value); |
911 if (len < 0) { | 924 if (len < 0) |
912 return len; | 925 return len; |
913 } | 926 |
914 i += len; 915 if (value < 14 + 20 + 8) 916 value = 14 + 20 + 8; 917 if (value != pkt_dev->min_pkt_size) { 918 pkt_dev->min_pkt_size = value; 919 pkt_dev->max_pkt_size = value; 920 pkt_dev->cur_pkt_size = value; 921 } 922 sprintf(pg_result, "OK: pkt_size=%u", pkt_dev->min_pkt_size); 923 return count; 924 } 925 926 if (!strcmp(name, "debug")) { 927 len = num_arg(&user_buffer[i], 10, &value); | 927 i += len; 928 if (value < 14 + 20 + 8) 929 value = 14 + 20 + 8; 930 if (value != pkt_dev->min_pkt_size) { 931 pkt_dev->min_pkt_size = value; 932 pkt_dev->max_pkt_size = value; 933 pkt_dev->cur_pkt_size = value; 934 } 935 sprintf(pg_result, "OK: pkt_size=%u", pkt_dev->min_pkt_size); 936 return count; 937 } 938 939 if (!strcmp(name, "debug")) { 940 len = num_arg(&user_buffer[i], 10, &value); |
928 if (len < 0) { | 941 if (len < 0) |
929 return len; | 942 return len; |
930 } | 943 |
931 i += len; 932 debug = value; 933 sprintf(pg_result, "OK: debug=%u", debug); 934 return count; 935 } 936 937 if (!strcmp(name, "frags")) { 938 len = num_arg(&user_buffer[i], 10, &value); | 944 i += len; 945 debug = value; 946 sprintf(pg_result, "OK: debug=%u", debug); 947 return count; 948 } 949 950 if (!strcmp(name, "frags")) { 951 len = num_arg(&user_buffer[i], 10, &value); |
939 if (len < 0) { | 952 if (len < 0) |
940 return len; | 953 return len; |
941 } | 954 |
942 i += len; 943 pkt_dev->nfrags = value; 944 sprintf(pg_result, "OK: frags=%u", pkt_dev->nfrags); 945 return count; 946 } 947 if (!strcmp(name, "delay")) { 948 len = num_arg(&user_buffer[i], 10, &value); | 955 i += len; 956 pkt_dev->nfrags = value; 957 sprintf(pg_result, "OK: frags=%u", pkt_dev->nfrags); 958 return count; 959 } 960 if (!strcmp(name, "delay")) { 961 len = num_arg(&user_buffer[i], 10, &value); |
949 if (len < 0) { | 962 if (len < 0) |
950 return len; | 963 return len; |
951 } | 964 |
952 i += len; 953 if (value == 0x7FFFFFFF) 954 pkt_dev->delay = ULLONG_MAX; 955 else 956 pkt_dev->delay = (u64)value * NSEC_PER_USEC; 957 958 sprintf(pg_result, "OK: delay=%llu", 959 (unsigned long long) pkt_dev->delay); 960 return count; 961 } 962 if (!strcmp(name, "udp_src_min")) { 963 len = num_arg(&user_buffer[i], 10, &value); | 965 i += len; 966 if (value == 0x7FFFFFFF) 967 pkt_dev->delay = ULLONG_MAX; 968 else 969 pkt_dev->delay = (u64)value * NSEC_PER_USEC; 970 971 sprintf(pg_result, "OK: delay=%llu", 972 (unsigned long long) pkt_dev->delay); 973 return count; 974 } 975 if (!strcmp(name, "udp_src_min")) { 976 len = num_arg(&user_buffer[i], 10, &value); |
964 if (len < 0) { | 977 if (len < 0) |
965 return len; | 978 return len; |
966 } | 979 |
967 i += len; 968 if (value != pkt_dev->udp_src_min) { 969 pkt_dev->udp_src_min = value; 970 pkt_dev->cur_udp_src = value; 971 } 972 sprintf(pg_result, "OK: udp_src_min=%u", pkt_dev->udp_src_min); 973 return count; 974 } 975 if (!strcmp(name, "udp_dst_min")) { 976 len = num_arg(&user_buffer[i], 10, &value); | 980 i += len; 981 if (value != pkt_dev->udp_src_min) { 982 pkt_dev->udp_src_min = value; 983 pkt_dev->cur_udp_src = value; 984 } 985 sprintf(pg_result, "OK: udp_src_min=%u", pkt_dev->udp_src_min); 986 return count; 987 } 988 if (!strcmp(name, "udp_dst_min")) { 989 len = num_arg(&user_buffer[i], 10, &value); |
977 if (len < 0) { | 990 if (len < 0) |
978 return len; | 991 return len; |
979 } | 992 |
980 i += len; 981 if (value != pkt_dev->udp_dst_min) { 982 pkt_dev->udp_dst_min = value; 983 pkt_dev->cur_udp_dst = value; 984 } 985 sprintf(pg_result, "OK: udp_dst_min=%u", pkt_dev->udp_dst_min); 986 return count; 987 } 988 if (!strcmp(name, "udp_src_max")) { 989 len = num_arg(&user_buffer[i], 10, &value); | 993 i += len; 994 if (value != pkt_dev->udp_dst_min) { 995 pkt_dev->udp_dst_min = value; 996 pkt_dev->cur_udp_dst = value; 997 } 998 sprintf(pg_result, "OK: udp_dst_min=%u", pkt_dev->udp_dst_min); 999 return count; 1000 } 1001 if (!strcmp(name, "udp_src_max")) { 1002 len = num_arg(&user_buffer[i], 10, &value); |
990 if (len < 0) { | 1003 if (len < 0) |
991 return len; | 1004 return len; |
992 } | 1005 |
993 i += len; 994 if (value != pkt_dev->udp_src_max) { 995 pkt_dev->udp_src_max = value; 996 pkt_dev->cur_udp_src = value; 997 } 998 sprintf(pg_result, "OK: udp_src_max=%u", pkt_dev->udp_src_max); 999 return count; 1000 } 1001 if (!strcmp(name, "udp_dst_max")) { 1002 len = num_arg(&user_buffer[i], 10, &value); | 1006 i += len; 1007 if (value != pkt_dev->udp_src_max) { 1008 pkt_dev->udp_src_max = value; 1009 pkt_dev->cur_udp_src = value; 1010 } 1011 sprintf(pg_result, "OK: udp_src_max=%u", pkt_dev->udp_src_max); 1012 return count; 1013 } 1014 if (!strcmp(name, "udp_dst_max")) { 1015 len = num_arg(&user_buffer[i], 10, &value); |
1003 if (len < 0) { | 1016 if (len < 0) |
1004 return len; | 1017 return len; |
1005 } | 1018 |
1006 i += len; 1007 if (value != pkt_dev->udp_dst_max) { 1008 pkt_dev->udp_dst_max = value; 1009 pkt_dev->cur_udp_dst = value; 1010 } 1011 sprintf(pg_result, "OK: udp_dst_max=%u", pkt_dev->udp_dst_max); 1012 return count; 1013 } 1014 if (!strcmp(name, "clone_skb")) { 1015 len = num_arg(&user_buffer[i], 10, &value); | 1019 i += len; 1020 if (value != pkt_dev->udp_dst_max) { 1021 pkt_dev->udp_dst_max = value; 1022 pkt_dev->cur_udp_dst = value; 1023 } 1024 sprintf(pg_result, "OK: udp_dst_max=%u", pkt_dev->udp_dst_max); 1025 return count; 1026 } 1027 if (!strcmp(name, "clone_skb")) { 1028 len = num_arg(&user_buffer[i], 10, &value); |
1016 if (len < 0) { | 1029 if (len < 0) |
1017 return len; | 1030 return len; |
1018 } | 1031 |
1019 i += len; 1020 pkt_dev->clone_skb = value; 1021 1022 sprintf(pg_result, "OK: clone_skb=%d", pkt_dev->clone_skb); 1023 return count; 1024 } 1025 if (!strcmp(name, "count")) { 1026 len = num_arg(&user_buffer[i], 10, &value); | 1032 i += len; 1033 pkt_dev->clone_skb = value; 1034 1035 sprintf(pg_result, "OK: clone_skb=%d", pkt_dev->clone_skb); 1036 return count; 1037 } 1038 if (!strcmp(name, "count")) { 1039 len = num_arg(&user_buffer[i], 10, &value); |
1027 if (len < 0) { | 1040 if (len < 0) |
1028 return len; | 1041 return len; |
1029 } | 1042 |
1030 i += len; 1031 pkt_dev->count = value; 1032 sprintf(pg_result, "OK: count=%llu", 1033 (unsigned long long)pkt_dev->count); 1034 return count; 1035 } 1036 if (!strcmp(name, "src_mac_count")) { 1037 len = num_arg(&user_buffer[i], 10, &value); | 1043 i += len; 1044 pkt_dev->count = value; 1045 sprintf(pg_result, "OK: count=%llu", 1046 (unsigned long long)pkt_dev->count); 1047 return count; 1048 } 1049 if (!strcmp(name, "src_mac_count")) { 1050 len = num_arg(&user_buffer[i], 10, &value); |
1038 if (len < 0) { | 1051 if (len < 0) |
1039 return len; | 1052 return len; |
1040 } | 1053 |
1041 i += len; 1042 if (pkt_dev->src_mac_count != value) { 1043 pkt_dev->src_mac_count = value; 1044 pkt_dev->cur_src_mac_offset = 0; 1045 } 1046 sprintf(pg_result, "OK: src_mac_count=%d", 1047 pkt_dev->src_mac_count); 1048 return count; 1049 } 1050 if (!strcmp(name, "dst_mac_count")) { 1051 len = num_arg(&user_buffer[i], 10, &value); | 1054 i += len; 1055 if (pkt_dev->src_mac_count != value) { 1056 pkt_dev->src_mac_count = value; 1057 pkt_dev->cur_src_mac_offset = 0; 1058 } 1059 sprintf(pg_result, "OK: src_mac_count=%d", 1060 pkt_dev->src_mac_count); 1061 return count; 1062 } 1063 if (!strcmp(name, "dst_mac_count")) { 1064 len = num_arg(&user_buffer[i], 10, &value); |
1052 if (len < 0) { | 1065 if (len < 0) |
1053 return len; | 1066 return len; |
1054 } | 1067 |
1055 i += len; 1056 if (pkt_dev->dst_mac_count != value) { 1057 pkt_dev->dst_mac_count = value; 1058 pkt_dev->cur_dst_mac_offset = 0; 1059 } 1060 sprintf(pg_result, "OK: dst_mac_count=%d", 1061 pkt_dev->dst_mac_count); 1062 return count; 1063 } 1064 if (!strcmp(name, "flag")) { 1065 char f[32]; 1066 memset(f, 0, 32); 1067 len = strn_len(&user_buffer[i], sizeof(f) - 1); | 1068 i += len; 1069 if (pkt_dev->dst_mac_count != value) { 1070 pkt_dev->dst_mac_count = value; 1071 pkt_dev->cur_dst_mac_offset = 0; 1072 } 1073 sprintf(pg_result, "OK: dst_mac_count=%d", 1074 pkt_dev->dst_mac_count); 1075 return count; 1076 } 1077 if (!strcmp(name, "flag")) { 1078 char f[32]; 1079 memset(f, 0, 32); 1080 len = strn_len(&user_buffer[i], sizeof(f) - 1); |
1068 if (len < 0) { | 1081 if (len < 0) |
1069 return len; | 1082 return len; |
1070 } | 1083 |
1071 if (copy_from_user(f, &user_buffer[i], len)) 1072 return -EFAULT; 1073 i += len; 1074 if (strcmp(f, "IPSRC_RND") == 0) 1075 pkt_dev->flags |= F_IPSRC_RND; 1076 1077 else if (strcmp(f, "!IPSRC_RND") == 0) 1078 pkt_dev->flags &= ~F_IPSRC_RND; --- 82 unchanged lines hidden (view full) --- 1161 "MACSRC_RND, MACDST_RND, TXSIZE_RND, IPV6, MPLS_RND, VID_RND, SVID_RND, FLOW_SEQ, IPSEC\n"); 1162 return count; 1163 } 1164 sprintf(pg_result, "OK: flags=0x%x", pkt_dev->flags); 1165 return count; 1166 } 1167 if (!strcmp(name, "dst_min") || !strcmp(name, "dst")) { 1168 len = strn_len(&user_buffer[i], sizeof(pkt_dev->dst_min) - 1); | 1084 if (copy_from_user(f, &user_buffer[i], len)) 1085 return -EFAULT; 1086 i += len; 1087 if (strcmp(f, "IPSRC_RND") == 0) 1088 pkt_dev->flags |= F_IPSRC_RND; 1089 1090 else if (strcmp(f, "!IPSRC_RND") == 0) 1091 pkt_dev->flags &= ~F_IPSRC_RND; --- 82 unchanged lines hidden (view full) --- 1174 "MACSRC_RND, MACDST_RND, TXSIZE_RND, IPV6, MPLS_RND, VID_RND, SVID_RND, FLOW_SEQ, IPSEC\n"); 1175 return count; 1176 } 1177 sprintf(pg_result, "OK: flags=0x%x", pkt_dev->flags); 1178 return count; 1179 } 1180 if (!strcmp(name, "dst_min") || !strcmp(name, "dst")) { 1181 len = strn_len(&user_buffer[i], sizeof(pkt_dev->dst_min) - 1); |
1169 if (len < 0) { | 1182 if (len < 0) |
1170 return len; | 1183 return len; |
1171 } | |
1172 1173 if (copy_from_user(buf, &user_buffer[i], len)) 1174 return -EFAULT; 1175 buf[len] = 0; 1176 if (strcmp(buf, pkt_dev->dst_min) != 0) { 1177 memset(pkt_dev->dst_min, 0, sizeof(pkt_dev->dst_min)); 1178 strncpy(pkt_dev->dst_min, buf, len); 1179 pkt_dev->daddr_min = in_aton(pkt_dev->dst_min); 1180 pkt_dev->cur_daddr = pkt_dev->daddr_min; 1181 } 1182 if (debug) 1183 printk(KERN_DEBUG "pktgen: dst_min set to: %s\n", 1184 pkt_dev->dst_min); 1185 i += len; 1186 sprintf(pg_result, "OK: dst_min=%s", pkt_dev->dst_min); 1187 return count; 1188 } 1189 if (!strcmp(name, "dst_max")) { 1190 len = strn_len(&user_buffer[i], sizeof(pkt_dev->dst_max) - 1); | 1184 1185 if (copy_from_user(buf, &user_buffer[i], len)) 1186 return -EFAULT; 1187 buf[len] = 0; 1188 if (strcmp(buf, pkt_dev->dst_min) != 0) { 1189 memset(pkt_dev->dst_min, 0, sizeof(pkt_dev->dst_min)); 1190 strncpy(pkt_dev->dst_min, buf, len); 1191 pkt_dev->daddr_min = in_aton(pkt_dev->dst_min); 1192 pkt_dev->cur_daddr = pkt_dev->daddr_min; 1193 } 1194 if (debug) 1195 printk(KERN_DEBUG "pktgen: dst_min set to: %s\n", 1196 pkt_dev->dst_min); 1197 i += len; 1198 sprintf(pg_result, "OK: dst_min=%s", pkt_dev->dst_min); 1199 return count; 1200 } 1201 if (!strcmp(name, "dst_max")) { 1202 len = strn_len(&user_buffer[i], sizeof(pkt_dev->dst_max) - 1); |
1191 if (len < 0) { | 1203 if (len < 0) |
1192 return len; | 1204 return len; |
1193 } | |
1194 | 1205 |
1206 |
|
1195 if (copy_from_user(buf, &user_buffer[i], len)) 1196 return -EFAULT; 1197 1198 buf[len] = 0; 1199 if (strcmp(buf, pkt_dev->dst_max) != 0) { 1200 memset(pkt_dev->dst_max, 0, sizeof(pkt_dev->dst_max)); 1201 strncpy(pkt_dev->dst_max, buf, len); 1202 pkt_dev->daddr_max = in_aton(pkt_dev->dst_max); --- 93 unchanged lines hidden (view full) --- 1296 printk(KERN_DEBUG "pktgen: src6 set to: %s\n", buf); 1297 1298 i += len; 1299 sprintf(pg_result, "OK: src6=%s", buf); 1300 return count; 1301 } 1302 if (!strcmp(name, "src_min")) { 1303 len = strn_len(&user_buffer[i], sizeof(pkt_dev->src_min) - 1); | 1207 if (copy_from_user(buf, &user_buffer[i], len)) 1208 return -EFAULT; 1209 1210 buf[len] = 0; 1211 if (strcmp(buf, pkt_dev->dst_max) != 0) { 1212 memset(pkt_dev->dst_max, 0, sizeof(pkt_dev->dst_max)); 1213 strncpy(pkt_dev->dst_max, buf, len); 1214 pkt_dev->daddr_max = in_aton(pkt_dev->dst_max); --- 93 unchanged lines hidden (view full) --- 1308 printk(KERN_DEBUG "pktgen: src6 set to: %s\n", buf); 1309 1310 i += len; 1311 sprintf(pg_result, "OK: src6=%s", buf); 1312 return count; 1313 } 1314 if (!strcmp(name, "src_min")) { 1315 len = strn_len(&user_buffer[i], sizeof(pkt_dev->src_min) - 1); |
1304 if (len < 0) { | 1316 if (len < 0) |
1305 return len; | 1317 return len; |
1306 } | 1318 |
1307 if (copy_from_user(buf, &user_buffer[i], len)) 1308 return -EFAULT; 1309 buf[len] = 0; 1310 if (strcmp(buf, pkt_dev->src_min) != 0) { 1311 memset(pkt_dev->src_min, 0, sizeof(pkt_dev->src_min)); 1312 strncpy(pkt_dev->src_min, buf, len); 1313 pkt_dev->saddr_min = in_aton(pkt_dev->src_min); 1314 pkt_dev->cur_saddr = pkt_dev->saddr_min; 1315 } 1316 if (debug) 1317 printk(KERN_DEBUG "pktgen: src_min set to: %s\n", 1318 pkt_dev->src_min); 1319 i += len; 1320 sprintf(pg_result, "OK: src_min=%s", pkt_dev->src_min); 1321 return count; 1322 } 1323 if (!strcmp(name, "src_max")) { 1324 len = strn_len(&user_buffer[i], sizeof(pkt_dev->src_max) - 1); | 1319 if (copy_from_user(buf, &user_buffer[i], len)) 1320 return -EFAULT; 1321 buf[len] = 0; 1322 if (strcmp(buf, pkt_dev->src_min) != 0) { 1323 memset(pkt_dev->src_min, 0, sizeof(pkt_dev->src_min)); 1324 strncpy(pkt_dev->src_min, buf, len); 1325 pkt_dev->saddr_min = in_aton(pkt_dev->src_min); 1326 pkt_dev->cur_saddr = pkt_dev->saddr_min; 1327 } 1328 if (debug) 1329 printk(KERN_DEBUG "pktgen: src_min set to: %s\n", 1330 pkt_dev->src_min); 1331 i += len; 1332 sprintf(pg_result, "OK: src_min=%s", pkt_dev->src_min); 1333 return count; 1334 } 1335 if (!strcmp(name, "src_max")) { 1336 len = strn_len(&user_buffer[i], sizeof(pkt_dev->src_max) - 1); |
1325 if (len < 0) { | 1337 if (len < 0) |
1326 return len; | 1338 return len; |
1327 } | 1339 |
1328 if (copy_from_user(buf, &user_buffer[i], len)) 1329 return -EFAULT; 1330 buf[len] = 0; 1331 if (strcmp(buf, pkt_dev->src_max) != 0) { 1332 memset(pkt_dev->src_max, 0, sizeof(pkt_dev->src_max)); 1333 strncpy(pkt_dev->src_max, buf, len); 1334 pkt_dev->saddr_max = in_aton(pkt_dev->src_max); 1335 pkt_dev->cur_saddr = pkt_dev->saddr_max; --- 7 unchanged lines hidden (view full) --- 1343 } 1344 if (!strcmp(name, "dst_mac")) { 1345 char *v = valstr; 1346 unsigned char old_dmac[ETH_ALEN]; 1347 unsigned char *m = pkt_dev->dst_mac; 1348 memcpy(old_dmac, pkt_dev->dst_mac, ETH_ALEN); 1349 1350 len = strn_len(&user_buffer[i], sizeof(valstr) - 1); | 1340 if (copy_from_user(buf, &user_buffer[i], len)) 1341 return -EFAULT; 1342 buf[len] = 0; 1343 if (strcmp(buf, pkt_dev->src_max) != 0) { 1344 memset(pkt_dev->src_max, 0, sizeof(pkt_dev->src_max)); 1345 strncpy(pkt_dev->src_max, buf, len); 1346 pkt_dev->saddr_max = in_aton(pkt_dev->src_max); 1347 pkt_dev->cur_saddr = pkt_dev->saddr_max; --- 7 unchanged lines hidden (view full) --- 1355 } 1356 if (!strcmp(name, "dst_mac")) { 1357 char *v = valstr; 1358 unsigned char old_dmac[ETH_ALEN]; 1359 unsigned char *m = pkt_dev->dst_mac; 1360 memcpy(old_dmac, pkt_dev->dst_mac, ETH_ALEN); 1361 1362 len = strn_len(&user_buffer[i], sizeof(valstr) - 1); |
1351 if (len < 0) { | 1363 if (len < 0) |
1352 return len; | 1364 return len; |
1353 } | 1365 |
1354 memset(valstr, 0, sizeof(valstr)); 1355 if (copy_from_user(valstr, &user_buffer[i], len)) 1356 return -EFAULT; 1357 i += len; 1358 1359 for (*m = 0; *v && m < pkt_dev->dst_mac + 6; v++) { 1360 if (*v >= '0' && *v <= '9') { 1361 *m *= 16; --- 23 unchanged lines hidden (view full) --- 1385 if (!strcmp(name, "src_mac")) { 1386 char *v = valstr; 1387 unsigned char old_smac[ETH_ALEN]; 1388 unsigned char *m = pkt_dev->src_mac; 1389 1390 memcpy(old_smac, pkt_dev->src_mac, ETH_ALEN); 1391 1392 len = strn_len(&user_buffer[i], sizeof(valstr) - 1); | 1366 memset(valstr, 0, sizeof(valstr)); 1367 if (copy_from_user(valstr, &user_buffer[i], len)) 1368 return -EFAULT; 1369 i += len; 1370 1371 for (*m = 0; *v && m < pkt_dev->dst_mac + 6; v++) { 1372 if (*v >= '0' && *v <= '9') { 1373 *m *= 16; --- 23 unchanged lines hidden (view full) --- 1397 if (!strcmp(name, "src_mac")) { 1398 char *v = valstr; 1399 unsigned char old_smac[ETH_ALEN]; 1400 unsigned char *m = pkt_dev->src_mac; 1401 1402 memcpy(old_smac, pkt_dev->src_mac, ETH_ALEN); 1403 1404 len = strn_len(&user_buffer[i], sizeof(valstr) - 1); |
1393 if (len < 0) { | 1405 if (len < 0) |
1394 return len; | 1406 return len; |
1395 } | 1407 |
1396 memset(valstr, 0, sizeof(valstr)); 1397 if (copy_from_user(valstr, &user_buffer[i], len)) 1398 return -EFAULT; 1399 i += len; 1400 1401 for (*m = 0; *v && m < pkt_dev->src_mac + 6; v++) { 1402 if (*v >= '0' && *v <= '9') { 1403 *m *= 16; --- 24 unchanged lines hidden (view full) --- 1428 if (!strcmp(name, "clear_counters")) { 1429 pktgen_clear_counters(pkt_dev); 1430 sprintf(pg_result, "OK: Clearing counters.\n"); 1431 return count; 1432 } 1433 1434 if (!strcmp(name, "flows")) { 1435 len = num_arg(&user_buffer[i], 10, &value); | 1408 memset(valstr, 0, sizeof(valstr)); 1409 if (copy_from_user(valstr, &user_buffer[i], len)) 1410 return -EFAULT; 1411 i += len; 1412 1413 for (*m = 0; *v && m < pkt_dev->src_mac + 6; v++) { 1414 if (*v >= '0' && *v <= '9') { 1415 *m *= 16; --- 24 unchanged lines hidden (view full) --- 1440 if (!strcmp(name, "clear_counters")) { 1441 pktgen_clear_counters(pkt_dev); 1442 sprintf(pg_result, "OK: Clearing counters.\n"); 1443 return count; 1444 } 1445 1446 if (!strcmp(name, "flows")) { 1447 len = num_arg(&user_buffer[i], 10, &value); |
1436 if (len < 0) { | 1448 if (len < 0) |
1437 return len; | 1449 return len; |
1438 } | 1450 |
1439 i += len; 1440 if (value > MAX_CFLOWS) 1441 value = MAX_CFLOWS; 1442 1443 pkt_dev->cflows = value; 1444 sprintf(pg_result, "OK: flows=%u", pkt_dev->cflows); 1445 return count; 1446 } 1447 1448 if (!strcmp(name, "flowlen")) { 1449 len = num_arg(&user_buffer[i], 10, &value); | 1451 i += len; 1452 if (value > MAX_CFLOWS) 1453 value = MAX_CFLOWS; 1454 1455 pkt_dev->cflows = value; 1456 sprintf(pg_result, "OK: flows=%u", pkt_dev->cflows); 1457 return count; 1458 } 1459 1460 if (!strcmp(name, "flowlen")) { 1461 len = num_arg(&user_buffer[i], 10, &value); |
1450 if (len < 0) { | 1462 if (len < 0) |
1451 return len; | 1463 return len; |
1452 } | 1464 |
1453 i += len; 1454 pkt_dev->lflow = value; 1455 sprintf(pg_result, "OK: flowlen=%u", pkt_dev->lflow); 1456 return count; 1457 } 1458 1459 if (!strcmp(name, "queue_map_min")) { 1460 len = num_arg(&user_buffer[i], 5, &value); | 1465 i += len; 1466 pkt_dev->lflow = value; 1467 sprintf(pg_result, "OK: flowlen=%u", pkt_dev->lflow); 1468 return count; 1469 } 1470 1471 if (!strcmp(name, "queue_map_min")) { 1472 len = num_arg(&user_buffer[i], 5, &value); |
1461 if (len < 0) { | 1473 if (len < 0) |
1462 return len; | 1474 return len; |
1463 } | 1475 |
1464 i += len; 1465 pkt_dev->queue_map_min = value; 1466 sprintf(pg_result, "OK: queue_map_min=%u", pkt_dev->queue_map_min); 1467 return count; 1468 } 1469 1470 if (!strcmp(name, "queue_map_max")) { 1471 len = num_arg(&user_buffer[i], 5, &value); | 1476 i += len; 1477 pkt_dev->queue_map_min = value; 1478 sprintf(pg_result, "OK: queue_map_min=%u", pkt_dev->queue_map_min); 1479 return count; 1480 } 1481 1482 if (!strcmp(name, "queue_map_max")) { 1483 len = num_arg(&user_buffer[i], 5, &value); |
1472 if (len < 0) { | 1484 if (len < 0) |
1473 return len; | 1485 return len; |
1474 } | 1486 |
1475 i += len; 1476 pkt_dev->queue_map_max = value; 1477 sprintf(pg_result, "OK: queue_map_max=%u", pkt_dev->queue_map_max); 1478 return count; 1479 } 1480 1481 if (!strcmp(name, "mpls")) { 1482 unsigned n, cnt; --- 15 unchanged lines hidden (view full) --- 1498 if (debug) 1499 printk(KERN_DEBUG "pktgen: VLAN/SVLAN auto turned off\n"); 1500 } 1501 return count; 1502 } 1503 1504 if (!strcmp(name, "vlan_id")) { 1505 len = num_arg(&user_buffer[i], 4, &value); | 1487 i += len; 1488 pkt_dev->queue_map_max = value; 1489 sprintf(pg_result, "OK: queue_map_max=%u", pkt_dev->queue_map_max); 1490 return count; 1491 } 1492 1493 if (!strcmp(name, "mpls")) { 1494 unsigned n, cnt; --- 15 unchanged lines hidden (view full) --- 1510 if (debug) 1511 printk(KERN_DEBUG "pktgen: VLAN/SVLAN auto turned off\n"); 1512 } 1513 return count; 1514 } 1515 1516 if (!strcmp(name, "vlan_id")) { 1517 len = num_arg(&user_buffer[i], 4, &value); |
1506 if (len < 0) { | 1518 if (len < 0) |
1507 return len; | 1519 return len; |
1508 } | 1520 |
1509 i += len; 1510 if (value <= 4095) { 1511 pkt_dev->vlan_id = value; /* turn on VLAN */ 1512 1513 if (debug) 1514 printk(KERN_DEBUG "pktgen: VLAN turned on\n"); 1515 1516 if (debug && pkt_dev->nr_labels) --- 8 unchanged lines hidden (view full) --- 1525 if (debug) 1526 printk(KERN_DEBUG "pktgen: VLAN/SVLAN turned off\n"); 1527 } 1528 return count; 1529 } 1530 1531 if (!strcmp(name, "vlan_p")) { 1532 len = num_arg(&user_buffer[i], 1, &value); | 1521 i += len; 1522 if (value <= 4095) { 1523 pkt_dev->vlan_id = value; /* turn on VLAN */ 1524 1525 if (debug) 1526 printk(KERN_DEBUG "pktgen: VLAN turned on\n"); 1527 1528 if (debug && pkt_dev->nr_labels) --- 8 unchanged lines hidden (view full) --- 1537 if (debug) 1538 printk(KERN_DEBUG "pktgen: VLAN/SVLAN turned off\n"); 1539 } 1540 return count; 1541 } 1542 1543 if (!strcmp(name, "vlan_p")) { 1544 len = num_arg(&user_buffer[i], 1, &value); |
1533 if (len < 0) { | 1545 if (len < 0) |
1534 return len; | 1546 return len; |
1535 } | 1547 |
1536 i += len; 1537 if ((value <= 7) && (pkt_dev->vlan_id != 0xffff)) { 1538 pkt_dev->vlan_p = value; 1539 sprintf(pg_result, "OK: vlan_p=%u", pkt_dev->vlan_p); 1540 } else { 1541 sprintf(pg_result, "ERROR: vlan_p must be 0-7"); 1542 } 1543 return count; 1544 } 1545 1546 if (!strcmp(name, "vlan_cfi")) { 1547 len = num_arg(&user_buffer[i], 1, &value); | 1548 i += len; 1549 if ((value <= 7) && (pkt_dev->vlan_id != 0xffff)) { 1550 pkt_dev->vlan_p = value; 1551 sprintf(pg_result, "OK: vlan_p=%u", pkt_dev->vlan_p); 1552 } else { 1553 sprintf(pg_result, "ERROR: vlan_p must be 0-7"); 1554 } 1555 return count; 1556 } 1557 1558 if (!strcmp(name, "vlan_cfi")) { 1559 len = num_arg(&user_buffer[i], 1, &value); |
1548 if (len < 0) { | 1560 if (len < 0) |
1549 return len; | 1561 return len; |
1550 } | 1562 |
1551 i += len; 1552 if ((value <= 1) && (pkt_dev->vlan_id != 0xffff)) { 1553 pkt_dev->vlan_cfi = value; 1554 sprintf(pg_result, "OK: vlan_cfi=%u", pkt_dev->vlan_cfi); 1555 } else { 1556 sprintf(pg_result, "ERROR: vlan_cfi must be 0-1"); 1557 } 1558 return count; 1559 } 1560 1561 if (!strcmp(name, "svlan_id")) { 1562 len = num_arg(&user_buffer[i], 4, &value); | 1563 i += len; 1564 if ((value <= 1) && (pkt_dev->vlan_id != 0xffff)) { 1565 pkt_dev->vlan_cfi = value; 1566 sprintf(pg_result, "OK: vlan_cfi=%u", pkt_dev->vlan_cfi); 1567 } else { 1568 sprintf(pg_result, "ERROR: vlan_cfi must be 0-1"); 1569 } 1570 return count; 1571 } 1572 1573 if (!strcmp(name, "svlan_id")) { 1574 len = num_arg(&user_buffer[i], 4, &value); |
1563 if (len < 0) { | 1575 if (len < 0) |
1564 return len; | 1576 return len; |
1565 } | 1577 |
1566 i += len; 1567 if ((value <= 4095) && ((pkt_dev->vlan_id != 0xffff))) { 1568 pkt_dev->svlan_id = value; /* turn on SVLAN */ 1569 1570 if (debug) 1571 printk(KERN_DEBUG "pktgen: SVLAN turned on\n"); 1572 1573 if (debug && pkt_dev->nr_labels) --- 8 unchanged lines hidden (view full) --- 1582 if (debug) 1583 printk(KERN_DEBUG "pktgen: VLAN/SVLAN turned off\n"); 1584 } 1585 return count; 1586 } 1587 1588 if (!strcmp(name, "svlan_p")) { 1589 len = num_arg(&user_buffer[i], 1, &value); | 1578 i += len; 1579 if ((value <= 4095) && ((pkt_dev->vlan_id != 0xffff))) { 1580 pkt_dev->svlan_id = value; /* turn on SVLAN */ 1581 1582 if (debug) 1583 printk(KERN_DEBUG "pktgen: SVLAN turned on\n"); 1584 1585 if (debug && pkt_dev->nr_labels) --- 8 unchanged lines hidden (view full) --- 1594 if (debug) 1595 printk(KERN_DEBUG "pktgen: VLAN/SVLAN turned off\n"); 1596 } 1597 return count; 1598 } 1599 1600 if (!strcmp(name, "svlan_p")) { 1601 len = num_arg(&user_buffer[i], 1, &value); |
1590 if (len < 0) { | 1602 if (len < 0) |
1591 return len; | 1603 return len; |
1592 } | 1604 |
1593 i += len; 1594 if ((value <= 7) && (pkt_dev->svlan_id != 0xffff)) { 1595 pkt_dev->svlan_p = value; 1596 sprintf(pg_result, "OK: svlan_p=%u", pkt_dev->svlan_p); 1597 } else { 1598 sprintf(pg_result, "ERROR: svlan_p must be 0-7"); 1599 } 1600 return count; 1601 } 1602 1603 if (!strcmp(name, "svlan_cfi")) { 1604 len = num_arg(&user_buffer[i], 1, &value); | 1605 i += len; 1606 if ((value <= 7) && (pkt_dev->svlan_id != 0xffff)) { 1607 pkt_dev->svlan_p = value; 1608 sprintf(pg_result, "OK: svlan_p=%u", pkt_dev->svlan_p); 1609 } else { 1610 sprintf(pg_result, "ERROR: svlan_p must be 0-7"); 1611 } 1612 return count; 1613 } 1614 1615 if (!strcmp(name, "svlan_cfi")) { 1616 len = num_arg(&user_buffer[i], 1, &value); |
1605 if (len < 0) { | 1617 if (len < 0) |
1606 return len; | 1618 return len; |
1607 } | 1619 |
1608 i += len; 1609 if ((value <= 1) && (pkt_dev->svlan_id != 0xffff)) { 1610 pkt_dev->svlan_cfi = value; 1611 sprintf(pg_result, "OK: svlan_cfi=%u", pkt_dev->svlan_cfi); 1612 } else { 1613 sprintf(pg_result, "ERROR: svlan_cfi must be 0-1"); 1614 } 1615 return count; 1616 } 1617 1618 if (!strcmp(name, "tos")) { 1619 __u32 tmp_value = 0; 1620 len = hex32_arg(&user_buffer[i], 2, &tmp_value); | 1620 i += len; 1621 if ((value <= 1) && (pkt_dev->svlan_id != 0xffff)) { 1622 pkt_dev->svlan_cfi = value; 1623 sprintf(pg_result, "OK: svlan_cfi=%u", pkt_dev->svlan_cfi); 1624 } else { 1625 sprintf(pg_result, "ERROR: svlan_cfi must be 0-1"); 1626 } 1627 return count; 1628 } 1629 1630 if (!strcmp(name, "tos")) { 1631 __u32 tmp_value = 0; 1632 len = hex32_arg(&user_buffer[i], 2, &tmp_value); |
1621 if (len < 0) { | 1633 if (len < 0) |
1622 return len; | 1634 return len; |
1623 } | 1635 |
1624 i += len; 1625 if (len == 2) { 1626 pkt_dev->tos = tmp_value; 1627 sprintf(pg_result, "OK: tos=0x%02x", pkt_dev->tos); 1628 } else { 1629 sprintf(pg_result, "ERROR: tos must be 00-ff"); 1630 } 1631 return count; 1632 } 1633 1634 if (!strcmp(name, "traffic_class")) { 1635 __u32 tmp_value = 0; 1636 len = hex32_arg(&user_buffer[i], 2, &tmp_value); | 1636 i += len; 1637 if (len == 2) { 1638 pkt_dev->tos = tmp_value; 1639 sprintf(pg_result, "OK: tos=0x%02x", pkt_dev->tos); 1640 } else { 1641 sprintf(pg_result, "ERROR: tos must be 00-ff"); 1642 } 1643 return count; 1644 } 1645 1646 if (!strcmp(name, "traffic_class")) { 1647 __u32 tmp_value = 0; 1648 len = hex32_arg(&user_buffer[i], 2, &tmp_value); |
1637 if (len < 0) { | 1649 if (len < 0) |
1638 return len; | 1650 return len; |
1639 } | 1651 |
1640 i += len; 1641 if (len == 2) { 1642 pkt_dev->traffic_class = tmp_value; 1643 sprintf(pg_result, "OK: traffic_class=0x%02x", pkt_dev->traffic_class); 1644 } else { 1645 sprintf(pg_result, "ERROR: traffic_class must be 00-ff"); 1646 } 1647 return count; --- 253 unchanged lines hidden (view full) --- 1901 case NETDEV_UNREGISTER: 1902 pktgen_mark_device(dev->name); 1903 break; 1904 } 1905 1906 return NOTIFY_DONE; 1907} 1908 | 1652 i += len; 1653 if (len == 2) { 1654 pkt_dev->traffic_class = tmp_value; 1655 sprintf(pg_result, "OK: traffic_class=0x%02x", pkt_dev->traffic_class); 1656 } else { 1657 sprintf(pg_result, "ERROR: traffic_class must be 00-ff"); 1658 } 1659 return count; --- 253 unchanged lines hidden (view full) --- 1913 case NETDEV_UNREGISTER: 1914 pktgen_mark_device(dev->name); 1915 break; 1916 } 1917 1918 return NOTIFY_DONE; 1919} 1920 |
1909static struct net_device *pktgen_dev_get_by_name(struct pktgen_dev *pkt_dev, const char *ifname) | 1921static struct net_device *pktgen_dev_get_by_name(struct pktgen_dev *pkt_dev, 1922 const char *ifname) |
1910{ 1911 char b[IFNAMSIZ+5]; 1912 int i = 0; 1913 | 1923{ 1924 char b[IFNAMSIZ+5]; 1925 int i = 0; 1926 |
1914 for(i=0; ifname[i] != '@'; i++) { 1915 if(i == IFNAMSIZ) | 1927 for (i = 0; ifname[i] != '@'; i++) { 1928 if (i == IFNAMSIZ) |
1916 break; 1917 1918 b[i] = ifname[i]; 1919 } 1920 b[i] = 0; 1921 1922 return dev_get_by_name(&init_net, b); 1923} --- 50 unchanged lines hidden (view full) --- 1974 1975 /* make sure that we don't pick a non-existing transmit queue */ 1976 ntxq = pkt_dev->odev->real_num_tx_queues; 1977 1978 if (ntxq <= pkt_dev->queue_map_min) { 1979 printk(KERN_WARNING "pktgen: WARNING: Requested " 1980 "queue_map_min (zero-based) (%d) exceeds valid range " 1981 "[0 - %d] for (%d) queues on %s, resetting\n", | 1929 break; 1930 1931 b[i] = ifname[i]; 1932 } 1933 b[i] = 0; 1934 1935 return dev_get_by_name(&init_net, b); 1936} --- 50 unchanged lines hidden (view full) --- 1987 1988 /* make sure that we don't pick a non-existing transmit queue */ 1989 ntxq = pkt_dev->odev->real_num_tx_queues; 1990 1991 if (ntxq <= pkt_dev->queue_map_min) { 1992 printk(KERN_WARNING "pktgen: WARNING: Requested " 1993 "queue_map_min (zero-based) (%d) exceeds valid range " 1994 "[0 - %d] for (%d) queues on %s, resetting\n", |
1982 pkt_dev->queue_map_min, (ntxq ?: 1)- 1, ntxq, | 1995 pkt_dev->queue_map_min, (ntxq ?: 1) - 1, ntxq, |
1983 pkt_dev->odev->name); 1984 pkt_dev->queue_map_min = ntxq - 1; 1985 } 1986 if (pkt_dev->queue_map_max >= ntxq) { 1987 printk(KERN_WARNING "pktgen: WARNING: Requested " 1988 "queue_map_max (zero-based) (%d) exceeds valid range " 1989 "[0 - %d] for (%d) queues on %s, resetting\n", | 1996 pkt_dev->odev->name); 1997 pkt_dev->queue_map_min = ntxq - 1; 1998 } 1999 if (pkt_dev->queue_map_max >= ntxq) { 2000 printk(KERN_WARNING "pktgen: WARNING: Requested " 2001 "queue_map_max (zero-based) (%d) exceeds valid range " 2002 "[0 - %d] for (%d) queues on %s, resetting\n", |
1990 pkt_dev->queue_map_max, (ntxq ?: 1)- 1, ntxq, | 2003 pkt_dev->queue_map_max, (ntxq ?: 1) - 1, ntxq, |
1991 pkt_dev->odev->name); 1992 pkt_dev->queue_map_max = ntxq - 1; 1993 } 1994 1995 /* Default to the interface's mac if not explicitly set. */ 1996 1997 if (is_zero_ether_addr(pkt_dev->src_mac)) 1998 memcpy(&(pkt_dev->hh[6]), pkt_dev->odev->dev_addr, ETH_ALEN); --- 24 unchanged lines hidden (view full) --- 2023 2024 /* 2025 * Use linklevel address if unconfigured. 2026 * 2027 * use ipv6_get_lladdr if/when it's get exported 2028 */ 2029 2030 rcu_read_lock(); | 2004 pkt_dev->odev->name); 2005 pkt_dev->queue_map_max = ntxq - 1; 2006 } 2007 2008 /* Default to the interface's mac if not explicitly set. */ 2009 2010 if (is_zero_ether_addr(pkt_dev->src_mac)) 2011 memcpy(&(pkt_dev->hh[6]), pkt_dev->odev->dev_addr, ETH_ALEN); --- 24 unchanged lines hidden (view full) --- 2036 2037 /* 2038 * Use linklevel address if unconfigured. 2039 * 2040 * use ipv6_get_lladdr if/when it's get exported 2041 */ 2042 2043 rcu_read_lock(); |
2031 if ((idev = __in6_dev_get(pkt_dev->odev)) != NULL) { | 2044 idev = __in6_dev_get(pkt_dev->odev); 2045 if (idev) { |
2032 struct inet6_ifaddr *ifp; 2033 2034 read_lock_bh(&idev->lock); 2035 for (ifp = idev->addr_list; ifp; 2036 ifp = ifp->if_next) { 2037 if (ifp->scope == IFA_LINK 2038 && !(ifp-> 2039 flags & IFA_F_TENTATIVE)) { --- 136 unchanged lines hidden (view full) --- 2176 (xfrm_address_t *)&pkt_dev->cur_daddr, 2177 (xfrm_address_t *)&pkt_dev->cur_saddr, 2178 AF_INET, 2179 pkt_dev->ipsmode, 2180 pkt_dev->ipsproto, 0); 2181 if (x) { 2182 pkt_dev->flows[flow].x = x; 2183 set_pkt_overhead(pkt_dev); | 2046 struct inet6_ifaddr *ifp; 2047 2048 read_lock_bh(&idev->lock); 2049 for (ifp = idev->addr_list; ifp; 2050 ifp = ifp->if_next) { 2051 if (ifp->scope == IFA_LINK 2052 && !(ifp-> 2053 flags & IFA_F_TENTATIVE)) { --- 136 unchanged lines hidden (view full) --- 2190 (xfrm_address_t *)&pkt_dev->cur_daddr, 2191 (xfrm_address_t *)&pkt_dev->cur_saddr, 2192 AF_INET, 2193 pkt_dev->ipsmode, 2194 pkt_dev->ipsproto, 0); 2195 if (x) { 2196 pkt_dev->flows[flow].x = x; 2197 set_pkt_overhead(pkt_dev); |
2184 pkt_dev->pkt_overhead+=x->props.header_len; | 2198 pkt_dev->pkt_overhead += x->props.header_len; |
2185 } 2186 2187 } 2188} 2189#endif 2190static void set_cur_queue_map(struct pktgen_dev *pkt_dev) 2191{ 2192 --- 122 unchanged lines hidden (view full) --- 2315 pkt_dev->cur_udp_dst++; 2316 if (pkt_dev->cur_udp_dst >= pkt_dev->udp_dst_max) 2317 pkt_dev->cur_udp_dst = pkt_dev->udp_dst_min; 2318 } 2319 } 2320 2321 if (!(pkt_dev->flags & F_IPV6)) { 2322 | 2199 } 2200 2201 } 2202} 2203#endif 2204static void set_cur_queue_map(struct pktgen_dev *pkt_dev) 2205{ 2206 --- 122 unchanged lines hidden (view full) --- 2329 pkt_dev->cur_udp_dst++; 2330 if (pkt_dev->cur_udp_dst >= pkt_dev->udp_dst_max) 2331 pkt_dev->cur_udp_dst = pkt_dev->udp_dst_min; 2332 } 2333 } 2334 2335 if (!(pkt_dev->flags & F_IPV6)) { 2336 |
2323 if ((imn = ntohl(pkt_dev->saddr_min)) < (imx = 2324 ntohl(pkt_dev-> 2325 saddr_max))) { | 2337 imn = ntohl(pkt_dev->saddr_min); 2338 imx = ntohl(pkt_dev->saddr_max); 2339 if (imn < imx) { |
2326 __u32 t; 2327 if (pkt_dev->flags & F_IPSRC_RND) 2328 t = random32() % (imx - imn) + imn; 2329 else { 2330 t = ntohl(pkt_dev->cur_saddr); 2331 t++; | 2340 __u32 t; 2341 if (pkt_dev->flags & F_IPSRC_RND) 2342 t = random32() % (imx - imn) + imn; 2343 else { 2344 t = ntohl(pkt_dev->cur_saddr); 2345 t++; |
2332 if (t > imx) { | 2346 if (t > imx) |
2333 t = imn; | 2347 t = imn; |
2334 } | 2348 |
2335 } 2336 pkt_dev->cur_saddr = htonl(t); 2337 } 2338 2339 if (pkt_dev->cflows && f_seen(pkt_dev, flow)) { 2340 pkt_dev->cur_daddr = pkt_dev->flows[flow].cur_daddr; 2341 } else { 2342 imn = ntohl(pkt_dev->daddr_min); --- 94 unchanged lines hidden (view full) --- 2437 2438 err = x->outer_mode->output(x, skb); 2439 if (err) 2440 goto error; 2441 err = x->type->output(x, skb); 2442 if (err) 2443 goto error; 2444 | 2349 } 2350 pkt_dev->cur_saddr = htonl(t); 2351 } 2352 2353 if (pkt_dev->cflows && f_seen(pkt_dev, flow)) { 2354 pkt_dev->cur_daddr = pkt_dev->flows[flow].cur_daddr; 2355 } else { 2356 imn = ntohl(pkt_dev->daddr_min); --- 94 unchanged lines hidden (view full) --- 2451 2452 err = x->outer_mode->output(x, skb); 2453 if (err) 2454 goto error; 2455 err = x->type->output(x, skb); 2456 if (err) 2457 goto error; 2458 |
2445 x->curlft.bytes +=skb->len; | 2459 x->curlft.bytes += skb->len; |
2446 x->curlft.packets++; 2447error: 2448 spin_unlock(&x->lock); 2449 return err; 2450} 2451 2452static void free_SAs(struct pktgen_dev *pkt_dev) 2453{ --- 15 unchanged lines hidden (view full) --- 2469{ 2470 if (pkt_dev->flags & F_IPSEC_ON) { 2471 struct xfrm_state *x = pkt_dev->flows[pkt_dev->curfl].x; 2472 int nhead = 0; 2473 if (x) { 2474 int ret; 2475 __u8 *eth; 2476 nhead = x->props.header_len - skb_headroom(skb); | 2460 x->curlft.packets++; 2461error: 2462 spin_unlock(&x->lock); 2463 return err; 2464} 2465 2466static void free_SAs(struct pktgen_dev *pkt_dev) 2467{ --- 15 unchanged lines hidden (view full) --- 2483{ 2484 if (pkt_dev->flags & F_IPSEC_ON) { 2485 struct xfrm_state *x = pkt_dev->flows[pkt_dev->curfl].x; 2486 int nhead = 0; 2487 if (x) { 2488 int ret; 2489 __u8 *eth; 2490 nhead = x->props.header_len - skb_headroom(skb); |
2477 if (nhead >0) { | 2491 if (nhead > 0) { |
2478 ret = pskb_expand_head(skb, nhead, 0, GFP_ATOMIC); 2479 if (ret < 0) { 2480 printk(KERN_ERR "Error expanding " | 2492 ret = pskb_expand_head(skb, nhead, 0, GFP_ATOMIC); 2493 if (ret < 0) { 2494 printk(KERN_ERR "Error expanding " |
2481 "ipsec packet %d\n",ret); | 2495 "ipsec packet %d\n", ret); |
2482 goto err; 2483 } 2484 } 2485 2486 /* ipsec is not expecting ll header */ 2487 skb_pull(skb, ETH_HLEN); 2488 ret = pktgen_output_ipsec(skb, pkt_dev); 2489 if (ret) { 2490 printk(KERN_ERR "Error creating ipsec " | 2496 goto err; 2497 } 2498 } 2499 2500 /* ipsec is not expecting ll header */ 2501 skb_pull(skb, ETH_HLEN); 2502 ret = pktgen_output_ipsec(skb, pkt_dev); 2503 if (ret) { 2504 printk(KERN_ERR "Error creating ipsec " |
2491 "packet %d\n",ret); | 2505 "packet %d\n", ret); |
2492 goto err; 2493 } 2494 /* restore ll */ 2495 eth = (__u8 *) skb_push(skb, ETH_HLEN); 2496 memcpy(eth, pkt_dev->hh, 12); | 2506 goto err; 2507 } 2508 /* restore ll */ 2509 eth = (__u8 *) skb_push(skb, ETH_HLEN); 2510 memcpy(eth, pkt_dev->hh, 12); |
2497 *(u16 *) & eth[12] = protocol; | 2511 *(u16 *) ð[12] = protocol; |
2498 } 2499 } 2500 return 1; 2501err: 2502 kfree_skb(skb); 2503 return 0; 2504} 2505#endif 2506 2507static void mpls_push(__be32 *mpls, struct pktgen_dev *pkt_dev) 2508{ 2509 unsigned i; | 2512 } 2513 } 2514 return 1; 2515err: 2516 kfree_skb(skb); 2517 return 0; 2518} 2519#endif 2520 2521static void mpls_push(__be32 *mpls, struct pktgen_dev *pkt_dev) 2522{ 2523 unsigned i; |
2510 for (i = 0; i < pkt_dev->nr_labels; i++) { | 2524 for (i = 0; i < pkt_dev->nr_labels; i++) |
2511 *mpls++ = pkt_dev->labels[i] & ~MPLS_STACK_BOTTOM; | 2525 *mpls++ = pkt_dev->labels[i] & ~MPLS_STACK_BOTTOM; |
2512 } | 2526 |
2513 mpls--; 2514 *mpls |= MPLS_STACK_BOTTOM; 2515} 2516 2517static inline __be16 build_tci(unsigned int id, unsigned int cfi, 2518 unsigned int prio) 2519{ 2520 return htons(id | (cfi << 12) | (prio << 13)); --- 150 unchanged lines hidden (view full) --- 2671 skb_shinfo(skb)->frags[i].page_offset += 2672 skb_shinfo(skb)->frags[i - 1].size; 2673 skb_shinfo(skb)->frags[i].size = rem; 2674 i++; 2675 skb_shinfo(skb)->nr_frags = i; 2676 } 2677 } 2678 | 2527 mpls--; 2528 *mpls |= MPLS_STACK_BOTTOM; 2529} 2530 2531static inline __be16 build_tci(unsigned int id, unsigned int cfi, 2532 unsigned int prio) 2533{ 2534 return htons(id | (cfi << 12) | (prio << 13)); --- 150 unchanged lines hidden (view full) --- 2685 skb_shinfo(skb)->frags[i].page_offset += 2686 skb_shinfo(skb)->frags[i - 1].size; 2687 skb_shinfo(skb)->frags[i].size = rem; 2688 i++; 2689 skb_shinfo(skb)->nr_frags = i; 2690 } 2691 } 2692 |
2679 /* Stamp the time, and sequence number, convert them to network byte order */ 2680 | 2693 /* Stamp the time, and sequence number, 2694 * convert them to network byte order 2695 */ |
2681 if (pgh) { 2682 struct timeval timestamp; 2683 2684 pgh->pgh_magic = htonl(PKTGEN_MAGIC); 2685 pgh->seq_num = htonl(pkt_dev->seq_num); 2686 2687 do_gettimeofday(×tamp); 2688 pgh->tv_sec = htonl(timestamp.tv_sec); --- 237 unchanged lines hidden (view full) --- 2926 skb->network_header = skb->tail; 2927 skb->transport_header = skb->network_header + sizeof(struct ipv6hdr); 2928 skb_put(skb, sizeof(struct ipv6hdr) + sizeof(struct udphdr)); 2929 skb_set_queue_mapping(skb, queue_map); 2930 iph = ipv6_hdr(skb); 2931 udph = udp_hdr(skb); 2932 2933 memcpy(eth, pkt_dev->hh, 12); | 2696 if (pgh) { 2697 struct timeval timestamp; 2698 2699 pgh->pgh_magic = htonl(PKTGEN_MAGIC); 2700 pgh->seq_num = htonl(pkt_dev->seq_num); 2701 2702 do_gettimeofday(×tamp); 2703 pgh->tv_sec = htonl(timestamp.tv_sec); --- 237 unchanged lines hidden (view full) --- 2941 skb->network_header = skb->tail; 2942 skb->transport_header = skb->network_header + sizeof(struct ipv6hdr); 2943 skb_put(skb, sizeof(struct ipv6hdr) + sizeof(struct udphdr)); 2944 skb_set_queue_mapping(skb, queue_map); 2945 iph = ipv6_hdr(skb); 2946 udph = udp_hdr(skb); 2947 2948 memcpy(eth, pkt_dev->hh, 12); |
2934 *(__be16 *) & eth[12] = protocol; | 2949 *(__be16 *) ð[12] = protocol; |
2935 2936 /* Eth + IPh + UDPh + mpls */ 2937 datalen = pkt_dev->cur_pkt_size - 14 - 2938 sizeof(struct ipv6hdr) - sizeof(struct udphdr) - 2939 pkt_dev->pkt_overhead; 2940 2941 if (datalen < sizeof(struct pktgen_hdr)) { 2942 datalen = sizeof(struct pktgen_hdr); --- 77 unchanged lines hidden (view full) --- 3020 skb_shinfo(skb)->frags[i].page_offset += 3021 skb_shinfo(skb)->frags[i - 1].size; 3022 skb_shinfo(skb)->frags[i].size = rem; 3023 i++; 3024 skb_shinfo(skb)->nr_frags = i; 3025 } 3026 } 3027 | 2950 2951 /* Eth + IPh + UDPh + mpls */ 2952 datalen = pkt_dev->cur_pkt_size - 14 - 2953 sizeof(struct ipv6hdr) - sizeof(struct udphdr) - 2954 pkt_dev->pkt_overhead; 2955 2956 if (datalen < sizeof(struct pktgen_hdr)) { 2957 datalen = sizeof(struct pktgen_hdr); --- 77 unchanged lines hidden (view full) --- 3035 skb_shinfo(skb)->frags[i].page_offset += 3036 skb_shinfo(skb)->frags[i - 1].size; 3037 skb_shinfo(skb)->frags[i].size = rem; 3038 i++; 3039 skb_shinfo(skb)->nr_frags = i; 3040 } 3041 } 3042 |
3028 /* Stamp the time, and sequence number, convert them to network byte order */ 3029 /* should we update cloned packets too ? */ | 3043 /* Stamp the time, and sequence number, 3044 * convert them to network byte order 3045 * should we update cloned packets too ? 3046 */ |
3030 if (pgh) { 3031 struct timeval timestamp; 3032 3033 pgh->pgh_magic = htonl(PKTGEN_MAGIC); 3034 pgh->seq_num = htonl(pkt_dev->seq_num); 3035 3036 do_gettimeofday(×tamp); 3037 pgh->tv_sec = htonl(timestamp.tv_sec); --- 131 unchanged lines hidden (view full) --- 3169 3170 mutex_lock(&pktgen_thread_lock); 3171 3172 list_for_each_entry(t, &pktgen_threads, th_list) 3173 t->control |= (T_RUN); 3174 3175 mutex_unlock(&pktgen_thread_lock); 3176 | 3047 if (pgh) { 3048 struct timeval timestamp; 3049 3050 pgh->pgh_magic = htonl(PKTGEN_MAGIC); 3051 pgh->seq_num = htonl(pkt_dev->seq_num); 3052 3053 do_gettimeofday(×tamp); 3054 pgh->tv_sec = htonl(timestamp.tv_sec); --- 131 unchanged lines hidden (view full) --- 3186 3187 mutex_lock(&pktgen_thread_lock); 3188 3189 list_for_each_entry(t, &pktgen_threads, th_list) 3190 t->control |= (T_RUN); 3191 3192 mutex_unlock(&pktgen_thread_lock); 3193 |
3177 schedule_timeout_interruptible(msecs_to_jiffies(125)); /* Propagate thread->control */ | 3194 /* Propagate thread->control */ 3195 schedule_timeout_interruptible(msecs_to_jiffies(125)); |
3178 3179 pktgen_wait_all_threads_run(); 3180} 3181 3182static void pktgen_reset_all_threads(void) 3183{ 3184 struct pktgen_thread *t; 3185 3186 pr_debug("pktgen: entering pktgen_reset_all_threads.\n"); 3187 3188 mutex_lock(&pktgen_thread_lock); 3189 3190 list_for_each_entry(t, &pktgen_threads, th_list) 3191 t->control |= (T_REMDEVALL); 3192 3193 mutex_unlock(&pktgen_thread_lock); 3194 | 3196 3197 pktgen_wait_all_threads_run(); 3198} 3199 3200static void pktgen_reset_all_threads(void) 3201{ 3202 struct pktgen_thread *t; 3203 3204 pr_debug("pktgen: entering pktgen_reset_all_threads.\n"); 3205 3206 mutex_lock(&pktgen_thread_lock); 3207 3208 list_for_each_entry(t, &pktgen_threads, th_list) 3209 t->control |= (T_REMDEVALL); 3210 3211 mutex_unlock(&pktgen_thread_lock); 3212 |
3195 schedule_timeout_interruptible(msecs_to_jiffies(125)); /* Propagate thread->control */ | 3213 /* Propagate thread->control */ 3214 schedule_timeout_interruptible(msecs_to_jiffies(125)); |
3196 3197 pktgen_wait_all_threads_run(); 3198} 3199 3200static void show_results(struct pktgen_dev *pkt_dev, int nr_frags) 3201{ 3202 __u64 bps, mbps, pps; 3203 char *p = pkt_dev->result; --- 276 unchanged lines hidden (view full) --- 3480 struct pktgen_dev *pkt_dev = NULL; 3481 int cpu = t->cpu; 3482 3483 BUG_ON(smp_processor_id() != cpu); 3484 3485 init_waitqueue_head(&t->queue); 3486 complete(&t->start_done); 3487 | 3215 3216 pktgen_wait_all_threads_run(); 3217} 3218 3219static void show_results(struct pktgen_dev *pkt_dev, int nr_frags) 3220{ 3221 __u64 bps, mbps, pps; 3222 char *p = pkt_dev->result; --- 276 unchanged lines hidden (view full) --- 3499 struct pktgen_dev *pkt_dev = NULL; 3500 int cpu = t->cpu; 3501 3502 BUG_ON(smp_processor_id() != cpu); 3503 3504 init_waitqueue_head(&t->queue); 3505 complete(&t->start_done); 3506 |
3488 pr_debug("pktgen: starting pktgen/%d: pid=%d\n", cpu, task_pid_nr(current)); | 3507 pr_debug("pktgen: starting pktgen/%d: pid=%d\n", 3508 cpu, task_pid_nr(current)); |
3489 3490 set_current_state(TASK_INTERRUPTIBLE); 3491 3492 set_freezable(); 3493 3494 while (!kthread_should_stop()) { 3495 pkt_dev = next_to_run(t); 3496 --- 345 unchanged lines hidden --- | 3509 3510 set_current_state(TASK_INTERRUPTIBLE); 3511 3512 set_freezable(); 3513 3514 while (!kthread_should_stop()) { 3515 pkt_dev = next_to_run(t); 3516 --- 345 unchanged lines hidden --- |