xref: /linux/net/core/pktgen.c (revision 367b8112fe2ea5c39a7bb4d263dcdd9b612fae18)
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>
9  * Jens Låås <jens.laas@data.slu.se>
10  *
11  * This program is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU General Public License
13  * as published by the Free Software Foundation; either version
14  * 2 of the License, or (at your option) any later version.
15  *
16  *
17  * A tool for loading the network with preconfigurated packets.
18  * The tool is implemented as a linux module.  Parameters are output
19  * device, delay (to hard_xmit), number of packets, and whether
20  * to use multiple SKBs or just the same one.
21  * pktgen uses the installed interface's output routine.
22  *
23  * Additional hacking by:
24  *
25  * Jens.Laas@data.slu.se
26  * Improved by ANK. 010120.
27  * Improved by ANK even more. 010212.
28  * MAC address typo fixed. 010417 --ro
29  * Integrated.  020301 --DaveM
30  * Added multiskb option 020301 --DaveM
31  * Scaling of results. 020417--sigurdur@linpro.no
32  * Significant re-work of the module:
33  *   *  Convert to threaded model to more efficiently be able to transmit
34  *       and receive on multiple interfaces at once.
35  *   *  Converted many counters to __u64 to allow longer runs.
36  *   *  Allow configuration of ranges, like min/max IP address, MACs,
37  *       and UDP-ports, for both source and destination, and can
38  *       set to use a random distribution or sequentially walk the range.
39  *   *  Can now change most values after starting.
40  *   *  Place 12-byte packet in UDP payload with magic number,
41  *       sequence number, and timestamp.
42  *   *  Add receiver code that detects dropped pkts, re-ordered pkts, and
43  *       latencies (with micro-second) precision.
44  *   *  Add IOCTL interface to easily get counters & configuration.
45  *   --Ben Greear <greearb@candelatech.com>
46  *
47  * Renamed multiskb to clone_skb and cleaned up sending core for two distinct
48  * skb modes. A clone_skb=0 mode for Ben "ranges" work and a clone_skb != 0
49  * as a "fastpath" with a configurable number of clones after alloc's.
50  * clone_skb=0 means all packets are allocated this also means ranges time
51  * stamps etc can be used. clone_skb=100 means 1 malloc is followed by 100
52  * clones.
53  *
54  * Also moved to /proc/net/pktgen/
55  * --ro
56  *
57  * Sept 10:  Fixed threading/locking.  Lots of bone-headed and more clever
58  *    mistakes.  Also merged in DaveM's patch in the -pre6 patch.
59  * --Ben Greear <greearb@candelatech.com>
60  *
61  * Integrated to 2.5.x 021029 --Lucio Maciel (luciomaciel@zipmail.com.br)
62  *
63  *
64  * 021124 Finished major redesign and rewrite for new functionality.
65  * See Documentation/networking/pktgen.txt for how to use this.
66  *
67  * The new operation:
68  * For each CPU one thread/process is created at start. This process checks
69  * for running devices in the if_list and sends packets until count is 0 it
70  * also the thread checks the thread->control which is used for inter-process
71  * communication. controlling process "posts" operations to the threads this
72  * way. The if_lock should be possible to remove when add/rem_device is merged
73  * into this too.
74  *
75  * By design there should only be *one* "controlling" process. In practice
76  * multiple write accesses gives unpredictable result. Understood by "write"
77  * to /proc gives result code thats should be read be the "writer".
78  * For practical use this should be no problem.
79  *
80  * Note when adding devices to a specific CPU there good idea to also assign
81  * /proc/irq/XX/smp_affinity so TX-interrupts gets bound to the same CPU.
82  * --ro
83  *
84  * Fix refcount off by one if first packet fails, potential null deref,
85  * memleak 030710- KJP
86  *
87  * First "ranges" functionality for ipv6 030726 --ro
88  *
89  * Included flow support. 030802 ANK.
90  *
91  * Fixed unaligned access on IA-64 Grant Grundler <grundler@parisc-linux.org>
92  *
93  * Remove if fix from added Harald Welte <laforge@netfilter.org> 040419
94  * ia64 compilation fix from  Aron Griffis <aron@hp.com> 040604
95  *
96  * New xmit() return, do_div and misc clean up by Stephen Hemminger
97  * <shemminger@osdl.org> 040923
98  *
99  * Randy Dunlap fixed u64 printk compiler waring
100  *
101  * Remove FCS from BW calculation.  Lennert Buytenhek <buytenh@wantstofly.org>
102  * New time handling. Lennert Buytenhek <buytenh@wantstofly.org> 041213
103  *
104  * Corrections from Nikolai Malykh (nmalykh@bilim.com)
105  * Removed unused flags F_SET_SRCMAC & F_SET_SRCIP 041230
106  *
107  * interruptible_sleep_on_timeout() replaced Nishanth Aravamudan <nacc@us.ibm.com>
108  * 050103
109  *
110  * MPLS support by Steven Whitehouse <steve@chygwyn.com>
111  *
112  * 802.1Q/Q-in-Q support by Francesco Fondelli (FF) <francesco.fondelli@gmail.com>
113  *
114  * Fixed src_mac command to set source mac of packet to value specified in
115  * command by Adit Ranadive <adit.262@gmail.com>
116  *
117  */
118 #include <linux/sys.h>
119 #include <linux/types.h>
120 #include <linux/module.h>
121 #include <linux/moduleparam.h>
122 #include <linux/kernel.h>
123 #include <linux/mutex.h>
124 #include <linux/sched.h>
125 #include <linux/slab.h>
126 #include <linux/vmalloc.h>
127 #include <linux/unistd.h>
128 #include <linux/string.h>
129 #include <linux/ptrace.h>
130 #include <linux/errno.h>
131 #include <linux/ioport.h>
132 #include <linux/interrupt.h>
133 #include <linux/capability.h>
134 #include <linux/freezer.h>
135 #include <linux/delay.h>
136 #include <linux/timer.h>
137 #include <linux/list.h>
138 #include <linux/init.h>
139 #include <linux/skbuff.h>
140 #include <linux/netdevice.h>
141 #include <linux/inet.h>
142 #include <linux/inetdevice.h>
143 #include <linux/rtnetlink.h>
144 #include <linux/if_arp.h>
145 #include <linux/if_vlan.h>
146 #include <linux/in.h>
147 #include <linux/ip.h>
148 #include <linux/ipv6.h>
149 #include <linux/udp.h>
150 #include <linux/proc_fs.h>
151 #include <linux/seq_file.h>
152 #include <linux/wait.h>
153 #include <linux/etherdevice.h>
154 #include <linux/kthread.h>
155 #include <net/net_namespace.h>
156 #include <net/checksum.h>
157 #include <net/ipv6.h>
158 #include <net/addrconf.h>
159 #ifdef CONFIG_XFRM
160 #include <net/xfrm.h>
161 #endif
162 #include <asm/byteorder.h>
163 #include <linux/rcupdate.h>
164 #include <linux/bitops.h>
165 #include <asm/io.h>
166 #include <asm/dma.h>
167 #include <asm/uaccess.h>
168 #include <asm/div64.h>		/* do_div */
169 #include <asm/timex.h>
170 
171 #define VERSION  "pktgen v2.70: Packet Generator for packet performance testing.\n"
172 
173 #define IP_NAME_SZ 32
174 #define MAX_MPLS_LABELS 16 /* This is the max label stack depth */
175 #define MPLS_STACK_BOTTOM htonl(0x00000100)
176 
177 /* Device flag bits */
178 #define F_IPSRC_RND   (1<<0)	/* IP-Src Random  */
179 #define F_IPDST_RND   (1<<1)	/* IP-Dst Random  */
180 #define F_UDPSRC_RND  (1<<2)	/* UDP-Src Random */
181 #define F_UDPDST_RND  (1<<3)	/* UDP-Dst Random */
182 #define F_MACSRC_RND  (1<<4)	/* MAC-Src Random */
183 #define F_MACDST_RND  (1<<5)	/* MAC-Dst Random */
184 #define F_TXSIZE_RND  (1<<6)	/* Transmit size is random */
185 #define F_IPV6        (1<<7)	/* Interface in IPV6 Mode */
186 #define F_MPLS_RND    (1<<8)	/* Random MPLS labels */
187 #define F_VID_RND     (1<<9)	/* Random VLAN ID */
188 #define F_SVID_RND    (1<<10)	/* Random SVLAN ID */
189 #define F_FLOW_SEQ    (1<<11)	/* Sequential flows */
190 #define F_IPSEC_ON    (1<<12)	/* ipsec on for flows */
191 #define F_QUEUE_MAP_RND (1<<13)	/* queue map Random */
192 #define F_QUEUE_MAP_CPU (1<<14)	/* queue map mirrors smp_processor_id() */
193 
194 /* Thread control flag bits */
195 #define T_TERMINATE   (1<<0)
196 #define T_STOP        (1<<1)	/* Stop run */
197 #define T_RUN         (1<<2)	/* Start run */
198 #define T_REMDEVALL   (1<<3)	/* Remove all devs */
199 #define T_REMDEV      (1<<4)	/* Remove one dev */
200 
201 /* If lock -- can be removed after some work */
202 #define   if_lock(t)           spin_lock(&(t->if_lock));
203 #define   if_unlock(t)           spin_unlock(&(t->if_lock));
204 
205 /* Used to help with determining the pkts on receive */
206 #define PKTGEN_MAGIC 0xbe9be955
207 #define PG_PROC_DIR "pktgen"
208 #define PGCTRL	    "pgctrl"
209 static struct proc_dir_entry *pg_proc_dir = NULL;
210 
211 #define MAX_CFLOWS  65536
212 
213 #define VLAN_TAG_SIZE(x) ((x)->vlan_id == 0xffff ? 0 : 4)
214 #define SVLAN_TAG_SIZE(x) ((x)->svlan_id == 0xffff ? 0 : 4)
215 
216 struct flow_state {
217 	__be32 cur_daddr;
218 	int count;
219 #ifdef CONFIG_XFRM
220 	struct xfrm_state *x;
221 #endif
222 	__u32 flags;
223 };
224 
225 /* flow flag bits */
226 #define F_INIT   (1<<0)		/* flow has been initialized */
227 
228 struct pktgen_dev {
229 	/*
230 	 * Try to keep frequent/infrequent used vars. separated.
231 	 */
232 	struct proc_dir_entry *entry;	/* proc file */
233 	struct pktgen_thread *pg_thread;/* the owner */
234 	struct list_head list;		/* Used for chaining in the thread's run-queue */
235 
236 	int running;		/* if this changes to false, the test will stop */
237 
238 	/* If min != max, then we will either do a linear iteration, or
239 	 * we will do a random selection from within the range.
240 	 */
241 	__u32 flags;
242 	int removal_mark;	/* non-zero => the device is marked for
243 				 * removal by worker thread */
244 
245 	int min_pkt_size;	/* = ETH_ZLEN; */
246 	int max_pkt_size;	/* = ETH_ZLEN; */
247 	int pkt_overhead;	/* overhead for MPLS, VLANs, IPSEC etc */
248 	int nfrags;
249 	__u32 delay_us;		/* Default delay */
250 	__u32 delay_ns;
251 	__u64 count;		/* Default No packets to send */
252 	__u64 sofar;		/* How many pkts we've sent so far */
253 	__u64 tx_bytes;		/* How many bytes we've transmitted */
254 	__u64 errors;		/* Errors when trying to transmit, pkts will be re-sent */
255 
256 	/* runtime counters relating to clone_skb */
257 	__u64 next_tx_us;	/* timestamp of when to tx next */
258 	__u32 next_tx_ns;
259 
260 	__u64 allocated_skbs;
261 	__u32 clone_count;
262 	int last_ok;		/* Was last skb sent?
263 				 * Or a failed transmit of some sort?  This will keep
264 				 * sequence numbers in order, for example.
265 				 */
266 	__u64 started_at;	/* micro-seconds */
267 	__u64 stopped_at;	/* micro-seconds */
268 	__u64 idle_acc;		/* micro-seconds */
269 	__u32 seq_num;
270 
271 	int clone_skb;		/* Use multiple SKBs during packet gen.  If this number
272 				 * is greater than 1, then that many copies of the same
273 				 * packet will be sent before a new packet is allocated.
274 				 * For instance, if you want to send 1024 identical packets
275 				 * before creating a new packet, set clone_skb to 1024.
276 				 */
277 
278 	char dst_min[IP_NAME_SZ];	/* IP, ie 1.2.3.4 */
279 	char dst_max[IP_NAME_SZ];	/* IP, ie 1.2.3.4 */
280 	char src_min[IP_NAME_SZ];	/* IP, ie 1.2.3.4 */
281 	char src_max[IP_NAME_SZ];	/* IP, ie 1.2.3.4 */
282 
283 	struct in6_addr in6_saddr;
284 	struct in6_addr in6_daddr;
285 	struct in6_addr cur_in6_daddr;
286 	struct in6_addr cur_in6_saddr;
287 	/* For ranges */
288 	struct in6_addr min_in6_daddr;
289 	struct in6_addr max_in6_daddr;
290 	struct in6_addr min_in6_saddr;
291 	struct in6_addr max_in6_saddr;
292 
293 	/* If we're doing ranges, random or incremental, then this
294 	 * defines the min/max for those ranges.
295 	 */
296 	__be32 saddr_min;	/* inclusive, source IP address */
297 	__be32 saddr_max;	/* exclusive, source IP address */
298 	__be32 daddr_min;	/* inclusive, dest IP address */
299 	__be32 daddr_max;	/* exclusive, dest IP address */
300 
301 	__u16 udp_src_min;	/* inclusive, source UDP port */
302 	__u16 udp_src_max;	/* exclusive, source UDP port */
303 	__u16 udp_dst_min;	/* inclusive, dest UDP port */
304 	__u16 udp_dst_max;	/* exclusive, dest UDP port */
305 
306 	/* DSCP + ECN */
307 	__u8 tos;            /* six most significant bits of (former) IPv4 TOS are for dscp codepoint */
308 	__u8 traffic_class;  /* ditto for the (former) Traffic Class in IPv6 (see RFC 3260, sec. 4) */
309 
310 	/* MPLS */
311 	unsigned nr_labels;	/* Depth of stack, 0 = no MPLS */
312 	__be32 labels[MAX_MPLS_LABELS];
313 
314 	/* VLAN/SVLAN (802.1Q/Q-in-Q) */
315 	__u8  vlan_p;
316 	__u8  vlan_cfi;
317 	__u16 vlan_id;  /* 0xffff means no vlan tag */
318 
319 	__u8  svlan_p;
320 	__u8  svlan_cfi;
321 	__u16 svlan_id; /* 0xffff means no svlan tag */
322 
323 	__u32 src_mac_count;	/* How many MACs to iterate through */
324 	__u32 dst_mac_count;	/* How many MACs to iterate through */
325 
326 	unsigned char dst_mac[ETH_ALEN];
327 	unsigned char src_mac[ETH_ALEN];
328 
329 	__u32 cur_dst_mac_offset;
330 	__u32 cur_src_mac_offset;
331 	__be32 cur_saddr;
332 	__be32 cur_daddr;
333 	__u16 cur_udp_dst;
334 	__u16 cur_udp_src;
335 	__u16 cur_queue_map;
336 	__u32 cur_pkt_size;
337 
338 	__u8 hh[14];
339 	/* = {
340 	   0x00, 0x80, 0xC8, 0x79, 0xB3, 0xCB,
341 
342 	   We fill in SRC address later
343 	   0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
344 	   0x08, 0x00
345 	   };
346 	 */
347 	__u16 pad;		/* pad out the hh struct to an even 16 bytes */
348 
349 	struct sk_buff *skb;	/* skb we are to transmit next, mainly used for when we
350 				 * are transmitting the same one multiple times
351 				 */
352 	struct net_device *odev;	/* The out-going device.  Note that the device should
353 					 * have it's pg_info pointer pointing back to this
354 					 * device.  This will be set when the user specifies
355 					 * the out-going device name (not when the inject is
356 					 * started as it used to do.)
357 					 */
358 	struct flow_state *flows;
359 	unsigned cflows;	/* Concurrent flows (config) */
360 	unsigned lflow;		/* Flow length  (config) */
361 	unsigned nflows;	/* accumulated flows (stats) */
362 	unsigned curfl;		/* current sequenced flow (state)*/
363 
364 	u16 queue_map_min;
365 	u16 queue_map_max;
366 
367 #ifdef CONFIG_XFRM
368 	__u8	ipsmode;		/* IPSEC mode (config) */
369 	__u8	ipsproto;		/* IPSEC type (config) */
370 #endif
371 	char result[512];
372 };
373 
374 struct pktgen_hdr {
375 	__be32 pgh_magic;
376 	__be32 seq_num;
377 	__be32 tv_sec;
378 	__be32 tv_usec;
379 };
380 
381 struct pktgen_thread {
382 	spinlock_t if_lock;
383 	struct list_head if_list;	/* All device here */
384 	struct list_head th_list;
385 	struct task_struct *tsk;
386 	char result[512];
387 
388 	/* Field for thread to receive "posted" events terminate, stop ifs etc. */
389 
390 	u32 control;
391 	int cpu;
392 
393 	wait_queue_head_t queue;
394 	struct completion start_done;
395 };
396 
397 #define REMOVE 1
398 #define FIND   0
399 
400 /** Convert to micro-seconds */
401 static inline __u64 tv_to_us(const struct timeval *tv)
402 {
403 	__u64 us = tv->tv_usec;
404 	us += (__u64) tv->tv_sec * (__u64) 1000000;
405 	return us;
406 }
407 
408 static __u64 getCurUs(void)
409 {
410 	struct timeval tv;
411 	do_gettimeofday(&tv);
412 	return tv_to_us(&tv);
413 }
414 
415 /* old include end */
416 
417 static char version[] __initdata = VERSION;
418 
419 static int pktgen_remove_device(struct pktgen_thread *t, struct pktgen_dev *i);
420 static int pktgen_add_device(struct pktgen_thread *t, const char *ifname);
421 static struct pktgen_dev *pktgen_find_dev(struct pktgen_thread *t,
422 					  const char *ifname);
423 static int pktgen_device_event(struct notifier_block *, unsigned long, void *);
424 static void pktgen_run_all_threads(void);
425 static void pktgen_stop_all_threads_ifs(void);
426 static int pktgen_stop_device(struct pktgen_dev *pkt_dev);
427 static void pktgen_stop(struct pktgen_thread *t);
428 static void pktgen_clear_counters(struct pktgen_dev *pkt_dev);
429 
430 static unsigned int scan_ip6(const char *s, char ip[16]);
431 static unsigned int fmt_ip6(char *s, const char ip[16]);
432 
433 /* Module parameters, defaults. */
434 static int pg_count_d = 1000;	/* 1000 pkts by default */
435 static int pg_delay_d;
436 static int pg_clone_skb_d;
437 static int debug;
438 
439 static DEFINE_MUTEX(pktgen_thread_lock);
440 static LIST_HEAD(pktgen_threads);
441 
442 static struct notifier_block pktgen_notifier_block = {
443 	.notifier_call = pktgen_device_event,
444 };
445 
446 /*
447  * /proc handling functions
448  *
449  */
450 
451 static int pgctrl_show(struct seq_file *seq, void *v)
452 {
453 	seq_puts(seq, VERSION);
454 	return 0;
455 }
456 
457 static ssize_t pgctrl_write(struct file *file, const char __user * buf,
458 			    size_t count, loff_t * ppos)
459 {
460 	int err = 0;
461 	char data[128];
462 
463 	if (!capable(CAP_NET_ADMIN)) {
464 		err = -EPERM;
465 		goto out;
466 	}
467 
468 	if (count > sizeof(data))
469 		count = sizeof(data);
470 
471 	if (copy_from_user(data, buf, count)) {
472 		err = -EFAULT;
473 		goto out;
474 	}
475 	data[count - 1] = 0;	/* Make string */
476 
477 	if (!strcmp(data, "stop"))
478 		pktgen_stop_all_threads_ifs();
479 
480 	else if (!strcmp(data, "start"))
481 		pktgen_run_all_threads();
482 
483 	else
484 		printk(KERN_WARNING "pktgen: Unknown command: %s\n", data);
485 
486 	err = count;
487 
488 out:
489 	return err;
490 }
491 
492 static int pgctrl_open(struct inode *inode, struct file *file)
493 {
494 	return single_open(file, pgctrl_show, PDE(inode)->data);
495 }
496 
497 static const struct file_operations pktgen_fops = {
498 	.owner   = THIS_MODULE,
499 	.open    = pgctrl_open,
500 	.read    = seq_read,
501 	.llseek  = seq_lseek,
502 	.write   = pgctrl_write,
503 	.release = single_release,
504 };
505 
506 static int pktgen_if_show(struct seq_file *seq, void *v)
507 {
508 	struct pktgen_dev *pkt_dev = seq->private;
509 	__u64 sa;
510 	__u64 stopped;
511 	__u64 now = getCurUs();
512 	DECLARE_MAC_BUF(mac);
513 
514 	seq_printf(seq,
515 		   "Params: count %llu  min_pkt_size: %u  max_pkt_size: %u\n",
516 		   (unsigned long long)pkt_dev->count, pkt_dev->min_pkt_size,
517 		   pkt_dev->max_pkt_size);
518 
519 	seq_printf(seq,
520 		   "     frags: %d  delay: %u  clone_skb: %d  ifname: %s\n",
521 		   pkt_dev->nfrags,
522 		   1000 * pkt_dev->delay_us + pkt_dev->delay_ns,
523 		   pkt_dev->clone_skb, pkt_dev->odev->name);
524 
525 	seq_printf(seq, "     flows: %u flowlen: %u\n", pkt_dev->cflows,
526 		   pkt_dev->lflow);
527 
528 	seq_printf(seq,
529 		   "     queue_map_min: %u  queue_map_max: %u\n",
530 		   pkt_dev->queue_map_min,
531 		   pkt_dev->queue_map_max);
532 
533 	if (pkt_dev->flags & F_IPV6) {
534 		char b1[128], b2[128], b3[128];
535 		fmt_ip6(b1, pkt_dev->in6_saddr.s6_addr);
536 		fmt_ip6(b2, pkt_dev->min_in6_saddr.s6_addr);
537 		fmt_ip6(b3, pkt_dev->max_in6_saddr.s6_addr);
538 		seq_printf(seq,
539 			   "     saddr: %s  min_saddr: %s  max_saddr: %s\n", b1,
540 			   b2, b3);
541 
542 		fmt_ip6(b1, pkt_dev->in6_daddr.s6_addr);
543 		fmt_ip6(b2, pkt_dev->min_in6_daddr.s6_addr);
544 		fmt_ip6(b3, pkt_dev->max_in6_daddr.s6_addr);
545 		seq_printf(seq,
546 			   "     daddr: %s  min_daddr: %s  max_daddr: %s\n", b1,
547 			   b2, b3);
548 
549 	} else
550 		seq_printf(seq,
551 			   "     dst_min: %s  dst_max: %s\n     src_min: %s  src_max: %s\n",
552 			   pkt_dev->dst_min, pkt_dev->dst_max, pkt_dev->src_min,
553 			   pkt_dev->src_max);
554 
555 	seq_puts(seq, "     src_mac: ");
556 
557 	seq_printf(seq, "%s ",
558 		   print_mac(mac, is_zero_ether_addr(pkt_dev->src_mac) ?
559 			     pkt_dev->odev->dev_addr : pkt_dev->src_mac));
560 
561 	seq_printf(seq, "dst_mac: ");
562 	seq_printf(seq, "%s\n", print_mac(mac, pkt_dev->dst_mac));
563 
564 	seq_printf(seq,
565 		   "     udp_src_min: %d  udp_src_max: %d  udp_dst_min: %d  udp_dst_max: %d\n",
566 		   pkt_dev->udp_src_min, pkt_dev->udp_src_max,
567 		   pkt_dev->udp_dst_min, pkt_dev->udp_dst_max);
568 
569 	seq_printf(seq,
570 		   "     src_mac_count: %d  dst_mac_count: %d\n",
571 		   pkt_dev->src_mac_count, pkt_dev->dst_mac_count);
572 
573 	if (pkt_dev->nr_labels) {
574 		unsigned i;
575 		seq_printf(seq, "     mpls: ");
576 		for (i = 0; i < pkt_dev->nr_labels; i++)
577 			seq_printf(seq, "%08x%s", ntohl(pkt_dev->labels[i]),
578 				   i == pkt_dev->nr_labels-1 ? "\n" : ", ");
579 	}
580 
581 	if (pkt_dev->vlan_id != 0xffff) {
582 		seq_printf(seq, "     vlan_id: %u  vlan_p: %u  vlan_cfi: %u\n",
583 			   pkt_dev->vlan_id, pkt_dev->vlan_p, pkt_dev->vlan_cfi);
584 	}
585 
586 	if (pkt_dev->svlan_id != 0xffff) {
587 		seq_printf(seq, "     svlan_id: %u  vlan_p: %u  vlan_cfi: %u\n",
588 			   pkt_dev->svlan_id, pkt_dev->svlan_p, pkt_dev->svlan_cfi);
589 	}
590 
591 	if (pkt_dev->tos) {
592 		seq_printf(seq, "     tos: 0x%02x\n", pkt_dev->tos);
593 	}
594 
595 	if (pkt_dev->traffic_class) {
596 		seq_printf(seq, "     traffic_class: 0x%02x\n", pkt_dev->traffic_class);
597 	}
598 
599 	seq_printf(seq, "     Flags: ");
600 
601 	if (pkt_dev->flags & F_IPV6)
602 		seq_printf(seq, "IPV6  ");
603 
604 	if (pkt_dev->flags & F_IPSRC_RND)
605 		seq_printf(seq, "IPSRC_RND  ");
606 
607 	if (pkt_dev->flags & F_IPDST_RND)
608 		seq_printf(seq, "IPDST_RND  ");
609 
610 	if (pkt_dev->flags & F_TXSIZE_RND)
611 		seq_printf(seq, "TXSIZE_RND  ");
612 
613 	if (pkt_dev->flags & F_UDPSRC_RND)
614 		seq_printf(seq, "UDPSRC_RND  ");
615 
616 	if (pkt_dev->flags & F_UDPDST_RND)
617 		seq_printf(seq, "UDPDST_RND  ");
618 
619 	if (pkt_dev->flags & F_MPLS_RND)
620 		seq_printf(seq,  "MPLS_RND  ");
621 
622 	if (pkt_dev->flags & F_QUEUE_MAP_RND)
623 		seq_printf(seq,  "QUEUE_MAP_RND  ");
624 
625 	if (pkt_dev->flags & F_QUEUE_MAP_CPU)
626 		seq_printf(seq,  "QUEUE_MAP_CPU  ");
627 
628 	if (pkt_dev->cflows) {
629 		if (pkt_dev->flags & F_FLOW_SEQ)
630 			seq_printf(seq,  "FLOW_SEQ  "); /*in sequence flows*/
631 		else
632 			seq_printf(seq,  "FLOW_RND  ");
633 	}
634 
635 #ifdef CONFIG_XFRM
636 	if (pkt_dev->flags & F_IPSEC_ON)
637 		seq_printf(seq,  "IPSEC  ");
638 #endif
639 
640 	if (pkt_dev->flags & F_MACSRC_RND)
641 		seq_printf(seq, "MACSRC_RND  ");
642 
643 	if (pkt_dev->flags & F_MACDST_RND)
644 		seq_printf(seq, "MACDST_RND  ");
645 
646 	if (pkt_dev->flags & F_VID_RND)
647 		seq_printf(seq, "VID_RND  ");
648 
649 	if (pkt_dev->flags & F_SVID_RND)
650 		seq_printf(seq, "SVID_RND  ");
651 
652 	seq_puts(seq, "\n");
653 
654 	sa = pkt_dev->started_at;
655 	stopped = pkt_dev->stopped_at;
656 	if (pkt_dev->running)
657 		stopped = now;	/* not really stopped, more like last-running-at */
658 
659 	seq_printf(seq,
660 		   "Current:\n     pkts-sofar: %llu  errors: %llu\n     started: %lluus  stopped: %lluus idle: %lluus\n",
661 		   (unsigned long long)pkt_dev->sofar,
662 		   (unsigned long long)pkt_dev->errors, (unsigned long long)sa,
663 		   (unsigned long long)stopped,
664 		   (unsigned long long)pkt_dev->idle_acc);
665 
666 	seq_printf(seq,
667 		   "     seq_num: %d  cur_dst_mac_offset: %d  cur_src_mac_offset: %d\n",
668 		   pkt_dev->seq_num, pkt_dev->cur_dst_mac_offset,
669 		   pkt_dev->cur_src_mac_offset);
670 
671 	if (pkt_dev->flags & F_IPV6) {
672 		char b1[128], b2[128];
673 		fmt_ip6(b1, pkt_dev->cur_in6_daddr.s6_addr);
674 		fmt_ip6(b2, pkt_dev->cur_in6_saddr.s6_addr);
675 		seq_printf(seq, "     cur_saddr: %s  cur_daddr: %s\n", b2, b1);
676 	} else
677 		seq_printf(seq, "     cur_saddr: 0x%x  cur_daddr: 0x%x\n",
678 			   pkt_dev->cur_saddr, pkt_dev->cur_daddr);
679 
680 	seq_printf(seq, "     cur_udp_dst: %d  cur_udp_src: %d\n",
681 		   pkt_dev->cur_udp_dst, pkt_dev->cur_udp_src);
682 
683 	seq_printf(seq, "     cur_queue_map: %u\n", pkt_dev->cur_queue_map);
684 
685 	seq_printf(seq, "     flows: %u\n", pkt_dev->nflows);
686 
687 	if (pkt_dev->result[0])
688 		seq_printf(seq, "Result: %s\n", pkt_dev->result);
689 	else
690 		seq_printf(seq, "Result: Idle\n");
691 
692 	return 0;
693 }
694 
695 
696 static int hex32_arg(const char __user *user_buffer, unsigned long maxlen, __u32 *num)
697 {
698 	int i = 0;
699 	*num = 0;
700 
701 	for (; i < maxlen; i++) {
702 		char c;
703 		*num <<= 4;
704 		if (get_user(c, &user_buffer[i]))
705 			return -EFAULT;
706 		if ((c >= '0') && (c <= '9'))
707 			*num |= c - '0';
708 		else if ((c >= 'a') && (c <= 'f'))
709 			*num |= c - 'a' + 10;
710 		else if ((c >= 'A') && (c <= 'F'))
711 			*num |= c - 'A' + 10;
712 		else
713 			break;
714 	}
715 	return i;
716 }
717 
718 static int count_trail_chars(const char __user * user_buffer,
719 			     unsigned int maxlen)
720 {
721 	int i;
722 
723 	for (i = 0; i < maxlen; i++) {
724 		char c;
725 		if (get_user(c, &user_buffer[i]))
726 			return -EFAULT;
727 		switch (c) {
728 		case '\"':
729 		case '\n':
730 		case '\r':
731 		case '\t':
732 		case ' ':
733 		case '=':
734 			break;
735 		default:
736 			goto done;
737 		}
738 	}
739 done:
740 	return i;
741 }
742 
743 static unsigned long num_arg(const char __user * user_buffer,
744 			     unsigned long maxlen, unsigned long *num)
745 {
746 	int i = 0;
747 	*num = 0;
748 
749 	for (; i < maxlen; i++) {
750 		char c;
751 		if (get_user(c, &user_buffer[i]))
752 			return -EFAULT;
753 		if ((c >= '0') && (c <= '9')) {
754 			*num *= 10;
755 			*num += c - '0';
756 		} else
757 			break;
758 	}
759 	return i;
760 }
761 
762 static int strn_len(const char __user * user_buffer, unsigned int maxlen)
763 {
764 	int i = 0;
765 
766 	for (; i < maxlen; i++) {
767 		char c;
768 		if (get_user(c, &user_buffer[i]))
769 			return -EFAULT;
770 		switch (c) {
771 		case '\"':
772 		case '\n':
773 		case '\r':
774 		case '\t':
775 		case ' ':
776 			goto done_str;
777 			break;
778 		default:
779 			break;
780 		}
781 	}
782 done_str:
783 	return i;
784 }
785 
786 static ssize_t get_labels(const char __user *buffer, struct pktgen_dev *pkt_dev)
787 {
788 	unsigned n = 0;
789 	char c;
790 	ssize_t i = 0;
791 	int len;
792 
793 	pkt_dev->nr_labels = 0;
794 	do {
795 		__u32 tmp;
796 		len = hex32_arg(&buffer[i], 8, &tmp);
797 		if (len <= 0)
798 			return len;
799 		pkt_dev->labels[n] = htonl(tmp);
800 		if (pkt_dev->labels[n] & MPLS_STACK_BOTTOM)
801 			pkt_dev->flags |= F_MPLS_RND;
802 		i += len;
803 		if (get_user(c, &buffer[i]))
804 			return -EFAULT;
805 		i++;
806 		n++;
807 		if (n >= MAX_MPLS_LABELS)
808 			return -E2BIG;
809 	} while (c == ',');
810 
811 	pkt_dev->nr_labels = n;
812 	return i;
813 }
814 
815 static ssize_t pktgen_if_write(struct file *file,
816 			       const char __user * user_buffer, size_t count,
817 			       loff_t * offset)
818 {
819 	struct seq_file *seq = (struct seq_file *)file->private_data;
820 	struct pktgen_dev *pkt_dev = seq->private;
821 	int i = 0, max, len;
822 	char name[16], valstr[32];
823 	unsigned long value = 0;
824 	char *pg_result = NULL;
825 	int tmp = 0;
826 	char buf[128];
827 
828 	pg_result = &(pkt_dev->result[0]);
829 
830 	if (count < 1) {
831 		printk(KERN_WARNING "pktgen: wrong command format\n");
832 		return -EINVAL;
833 	}
834 
835 	max = count - i;
836 	tmp = count_trail_chars(&user_buffer[i], max);
837 	if (tmp < 0) {
838 		printk(KERN_WARNING "pktgen: illegal format\n");
839 		return tmp;
840 	}
841 	i += tmp;
842 
843 	/* Read variable name */
844 
845 	len = strn_len(&user_buffer[i], sizeof(name) - 1);
846 	if (len < 0) {
847 		return len;
848 	}
849 	memset(name, 0, sizeof(name));
850 	if (copy_from_user(name, &user_buffer[i], len))
851 		return -EFAULT;
852 	i += len;
853 
854 	max = count - i;
855 	len = count_trail_chars(&user_buffer[i], max);
856 	if (len < 0)
857 		return len;
858 
859 	i += len;
860 
861 	if (debug) {
862 		char tb[count + 1];
863 		if (copy_from_user(tb, user_buffer, count))
864 			return -EFAULT;
865 		tb[count] = 0;
866 		printk(KERN_DEBUG "pktgen: %s,%lu  buffer -:%s:-\n", name,
867 		       (unsigned long)count, tb);
868 	}
869 
870 	if (!strcmp(name, "min_pkt_size")) {
871 		len = num_arg(&user_buffer[i], 10, &value);
872 		if (len < 0) {
873 			return len;
874 		}
875 		i += len;
876 		if (value < 14 + 20 + 8)
877 			value = 14 + 20 + 8;
878 		if (value != pkt_dev->min_pkt_size) {
879 			pkt_dev->min_pkt_size = value;
880 			pkt_dev->cur_pkt_size = value;
881 		}
882 		sprintf(pg_result, "OK: min_pkt_size=%u",
883 			pkt_dev->min_pkt_size);
884 		return count;
885 	}
886 
887 	if (!strcmp(name, "max_pkt_size")) {
888 		len = num_arg(&user_buffer[i], 10, &value);
889 		if (len < 0) {
890 			return len;
891 		}
892 		i += len;
893 		if (value < 14 + 20 + 8)
894 			value = 14 + 20 + 8;
895 		if (value != pkt_dev->max_pkt_size) {
896 			pkt_dev->max_pkt_size = value;
897 			pkt_dev->cur_pkt_size = value;
898 		}
899 		sprintf(pg_result, "OK: max_pkt_size=%u",
900 			pkt_dev->max_pkt_size);
901 		return count;
902 	}
903 
904 	/* Shortcut for min = max */
905 
906 	if (!strcmp(name, "pkt_size")) {
907 		len = num_arg(&user_buffer[i], 10, &value);
908 		if (len < 0) {
909 			return len;
910 		}
911 		i += len;
912 		if (value < 14 + 20 + 8)
913 			value = 14 + 20 + 8;
914 		if (value != pkt_dev->min_pkt_size) {
915 			pkt_dev->min_pkt_size = value;
916 			pkt_dev->max_pkt_size = value;
917 			pkt_dev->cur_pkt_size = value;
918 		}
919 		sprintf(pg_result, "OK: pkt_size=%u", pkt_dev->min_pkt_size);
920 		return count;
921 	}
922 
923 	if (!strcmp(name, "debug")) {
924 		len = num_arg(&user_buffer[i], 10, &value);
925 		if (len < 0) {
926 			return len;
927 		}
928 		i += len;
929 		debug = value;
930 		sprintf(pg_result, "OK: debug=%u", debug);
931 		return count;
932 	}
933 
934 	if (!strcmp(name, "frags")) {
935 		len = num_arg(&user_buffer[i], 10, &value);
936 		if (len < 0) {
937 			return len;
938 		}
939 		i += len;
940 		pkt_dev->nfrags = value;
941 		sprintf(pg_result, "OK: frags=%u", pkt_dev->nfrags);
942 		return count;
943 	}
944 	if (!strcmp(name, "delay")) {
945 		len = num_arg(&user_buffer[i], 10, &value);
946 		if (len < 0) {
947 			return len;
948 		}
949 		i += len;
950 		if (value == 0x7FFFFFFF) {
951 			pkt_dev->delay_us = 0x7FFFFFFF;
952 			pkt_dev->delay_ns = 0;
953 		} else {
954 			pkt_dev->delay_us = value / 1000;
955 			pkt_dev->delay_ns = value % 1000;
956 		}
957 		sprintf(pg_result, "OK: delay=%u",
958 			1000 * pkt_dev->delay_us + pkt_dev->delay_ns);
959 		return count;
960 	}
961 	if (!strcmp(name, "udp_src_min")) {
962 		len = num_arg(&user_buffer[i], 10, &value);
963 		if (len < 0) {
964 			return len;
965 		}
966 		i += len;
967 		if (value != pkt_dev->udp_src_min) {
968 			pkt_dev->udp_src_min = value;
969 			pkt_dev->cur_udp_src = value;
970 		}
971 		sprintf(pg_result, "OK: udp_src_min=%u", pkt_dev->udp_src_min);
972 		return count;
973 	}
974 	if (!strcmp(name, "udp_dst_min")) {
975 		len = num_arg(&user_buffer[i], 10, &value);
976 		if (len < 0) {
977 			return len;
978 		}
979 		i += len;
980 		if (value != pkt_dev->udp_dst_min) {
981 			pkt_dev->udp_dst_min = value;
982 			pkt_dev->cur_udp_dst = value;
983 		}
984 		sprintf(pg_result, "OK: udp_dst_min=%u", pkt_dev->udp_dst_min);
985 		return count;
986 	}
987 	if (!strcmp(name, "udp_src_max")) {
988 		len = num_arg(&user_buffer[i], 10, &value);
989 		if (len < 0) {
990 			return len;
991 		}
992 		i += len;
993 		if (value != pkt_dev->udp_src_max) {
994 			pkt_dev->udp_src_max = value;
995 			pkt_dev->cur_udp_src = value;
996 		}
997 		sprintf(pg_result, "OK: udp_src_max=%u", pkt_dev->udp_src_max);
998 		return count;
999 	}
1000 	if (!strcmp(name, "udp_dst_max")) {
1001 		len = num_arg(&user_buffer[i], 10, &value);
1002 		if (len < 0) {
1003 			return len;
1004 		}
1005 		i += len;
1006 		if (value != pkt_dev->udp_dst_max) {
1007 			pkt_dev->udp_dst_max = value;
1008 			pkt_dev->cur_udp_dst = value;
1009 		}
1010 		sprintf(pg_result, "OK: udp_dst_max=%u", pkt_dev->udp_dst_max);
1011 		return count;
1012 	}
1013 	if (!strcmp(name, "clone_skb")) {
1014 		len = num_arg(&user_buffer[i], 10, &value);
1015 		if (len < 0) {
1016 			return len;
1017 		}
1018 		i += len;
1019 		pkt_dev->clone_skb = value;
1020 
1021 		sprintf(pg_result, "OK: clone_skb=%d", pkt_dev->clone_skb);
1022 		return count;
1023 	}
1024 	if (!strcmp(name, "count")) {
1025 		len = num_arg(&user_buffer[i], 10, &value);
1026 		if (len < 0) {
1027 			return len;
1028 		}
1029 		i += len;
1030 		pkt_dev->count = value;
1031 		sprintf(pg_result, "OK: count=%llu",
1032 			(unsigned long long)pkt_dev->count);
1033 		return count;
1034 	}
1035 	if (!strcmp(name, "src_mac_count")) {
1036 		len = num_arg(&user_buffer[i], 10, &value);
1037 		if (len < 0) {
1038 			return len;
1039 		}
1040 		i += len;
1041 		if (pkt_dev->src_mac_count != value) {
1042 			pkt_dev->src_mac_count = value;
1043 			pkt_dev->cur_src_mac_offset = 0;
1044 		}
1045 		sprintf(pg_result, "OK: src_mac_count=%d",
1046 			pkt_dev->src_mac_count);
1047 		return count;
1048 	}
1049 	if (!strcmp(name, "dst_mac_count")) {
1050 		len = num_arg(&user_buffer[i], 10, &value);
1051 		if (len < 0) {
1052 			return len;
1053 		}
1054 		i += len;
1055 		if (pkt_dev->dst_mac_count != value) {
1056 			pkt_dev->dst_mac_count = value;
1057 			pkt_dev->cur_dst_mac_offset = 0;
1058 		}
1059 		sprintf(pg_result, "OK: dst_mac_count=%d",
1060 			pkt_dev->dst_mac_count);
1061 		return count;
1062 	}
1063 	if (!strcmp(name, "flag")) {
1064 		char f[32];
1065 		memset(f, 0, 32);
1066 		len = strn_len(&user_buffer[i], sizeof(f) - 1);
1067 		if (len < 0) {
1068 			return len;
1069 		}
1070 		if (copy_from_user(f, &user_buffer[i], len))
1071 			return -EFAULT;
1072 		i += len;
1073 		if (strcmp(f, "IPSRC_RND") == 0)
1074 			pkt_dev->flags |= F_IPSRC_RND;
1075 
1076 		else if (strcmp(f, "!IPSRC_RND") == 0)
1077 			pkt_dev->flags &= ~F_IPSRC_RND;
1078 
1079 		else if (strcmp(f, "TXSIZE_RND") == 0)
1080 			pkt_dev->flags |= F_TXSIZE_RND;
1081 
1082 		else if (strcmp(f, "!TXSIZE_RND") == 0)
1083 			pkt_dev->flags &= ~F_TXSIZE_RND;
1084 
1085 		else if (strcmp(f, "IPDST_RND") == 0)
1086 			pkt_dev->flags |= F_IPDST_RND;
1087 
1088 		else if (strcmp(f, "!IPDST_RND") == 0)
1089 			pkt_dev->flags &= ~F_IPDST_RND;
1090 
1091 		else if (strcmp(f, "UDPSRC_RND") == 0)
1092 			pkt_dev->flags |= F_UDPSRC_RND;
1093 
1094 		else if (strcmp(f, "!UDPSRC_RND") == 0)
1095 			pkt_dev->flags &= ~F_UDPSRC_RND;
1096 
1097 		else if (strcmp(f, "UDPDST_RND") == 0)
1098 			pkt_dev->flags |= F_UDPDST_RND;
1099 
1100 		else if (strcmp(f, "!UDPDST_RND") == 0)
1101 			pkt_dev->flags &= ~F_UDPDST_RND;
1102 
1103 		else if (strcmp(f, "MACSRC_RND") == 0)
1104 			pkt_dev->flags |= F_MACSRC_RND;
1105 
1106 		else if (strcmp(f, "!MACSRC_RND") == 0)
1107 			pkt_dev->flags &= ~F_MACSRC_RND;
1108 
1109 		else if (strcmp(f, "MACDST_RND") == 0)
1110 			pkt_dev->flags |= F_MACDST_RND;
1111 
1112 		else if (strcmp(f, "!MACDST_RND") == 0)
1113 			pkt_dev->flags &= ~F_MACDST_RND;
1114 
1115 		else if (strcmp(f, "MPLS_RND") == 0)
1116 			pkt_dev->flags |= F_MPLS_RND;
1117 
1118 		else if (strcmp(f, "!MPLS_RND") == 0)
1119 			pkt_dev->flags &= ~F_MPLS_RND;
1120 
1121 		else if (strcmp(f, "VID_RND") == 0)
1122 			pkt_dev->flags |= F_VID_RND;
1123 
1124 		else if (strcmp(f, "!VID_RND") == 0)
1125 			pkt_dev->flags &= ~F_VID_RND;
1126 
1127 		else if (strcmp(f, "SVID_RND") == 0)
1128 			pkt_dev->flags |= F_SVID_RND;
1129 
1130 		else if (strcmp(f, "!SVID_RND") == 0)
1131 			pkt_dev->flags &= ~F_SVID_RND;
1132 
1133 		else if (strcmp(f, "FLOW_SEQ") == 0)
1134 			pkt_dev->flags |= F_FLOW_SEQ;
1135 
1136 		else if (strcmp(f, "QUEUE_MAP_RND") == 0)
1137 			pkt_dev->flags |= F_QUEUE_MAP_RND;
1138 
1139 		else if (strcmp(f, "!QUEUE_MAP_RND") == 0)
1140 			pkt_dev->flags &= ~F_QUEUE_MAP_RND;
1141 
1142 		else if (strcmp(f, "QUEUE_MAP_CPU") == 0)
1143 			pkt_dev->flags |= F_QUEUE_MAP_CPU;
1144 
1145 		else if (strcmp(f, "!QUEUE_MAP_CPU") == 0)
1146 			pkt_dev->flags &= ~F_QUEUE_MAP_CPU;
1147 #ifdef CONFIG_XFRM
1148 		else if (strcmp(f, "IPSEC") == 0)
1149 			pkt_dev->flags |= F_IPSEC_ON;
1150 #endif
1151 
1152 		else if (strcmp(f, "!IPV6") == 0)
1153 			pkt_dev->flags &= ~F_IPV6;
1154 
1155 		else {
1156 			sprintf(pg_result,
1157 				"Flag -:%s:- unknown\nAvailable flags, (prepend ! to un-set flag):\n%s",
1158 				f,
1159 				"IPSRC_RND, IPDST_RND, UDPSRC_RND, UDPDST_RND, "
1160 				"MACSRC_RND, MACDST_RND, TXSIZE_RND, IPV6, MPLS_RND, VID_RND, SVID_RND, FLOW_SEQ, IPSEC\n");
1161 			return count;
1162 		}
1163 		sprintf(pg_result, "OK: flags=0x%x", pkt_dev->flags);
1164 		return count;
1165 	}
1166 	if (!strcmp(name, "dst_min") || !strcmp(name, "dst")) {
1167 		len = strn_len(&user_buffer[i], sizeof(pkt_dev->dst_min) - 1);
1168 		if (len < 0) {
1169 			return len;
1170 		}
1171 
1172 		if (copy_from_user(buf, &user_buffer[i], len))
1173 			return -EFAULT;
1174 		buf[len] = 0;
1175 		if (strcmp(buf, pkt_dev->dst_min) != 0) {
1176 			memset(pkt_dev->dst_min, 0, sizeof(pkt_dev->dst_min));
1177 			strncpy(pkt_dev->dst_min, buf, len);
1178 			pkt_dev->daddr_min = in_aton(pkt_dev->dst_min);
1179 			pkt_dev->cur_daddr = pkt_dev->daddr_min;
1180 		}
1181 		if (debug)
1182 			printk(KERN_DEBUG "pktgen: dst_min set to: %s\n",
1183 			       pkt_dev->dst_min);
1184 		i += len;
1185 		sprintf(pg_result, "OK: dst_min=%s", pkt_dev->dst_min);
1186 		return count;
1187 	}
1188 	if (!strcmp(name, "dst_max")) {
1189 		len = strn_len(&user_buffer[i], sizeof(pkt_dev->dst_max) - 1);
1190 		if (len < 0) {
1191 			return len;
1192 		}
1193 
1194 		if (copy_from_user(buf, &user_buffer[i], len))
1195 			return -EFAULT;
1196 
1197 		buf[len] = 0;
1198 		if (strcmp(buf, pkt_dev->dst_max) != 0) {
1199 			memset(pkt_dev->dst_max, 0, sizeof(pkt_dev->dst_max));
1200 			strncpy(pkt_dev->dst_max, buf, len);
1201 			pkt_dev->daddr_max = in_aton(pkt_dev->dst_max);
1202 			pkt_dev->cur_daddr = pkt_dev->daddr_max;
1203 		}
1204 		if (debug)
1205 			printk(KERN_DEBUG "pktgen: dst_max set to: %s\n",
1206 			       pkt_dev->dst_max);
1207 		i += len;
1208 		sprintf(pg_result, "OK: dst_max=%s", pkt_dev->dst_max);
1209 		return count;
1210 	}
1211 	if (!strcmp(name, "dst6")) {
1212 		len = strn_len(&user_buffer[i], sizeof(buf) - 1);
1213 		if (len < 0)
1214 			return len;
1215 
1216 		pkt_dev->flags |= F_IPV6;
1217 
1218 		if (copy_from_user(buf, &user_buffer[i], len))
1219 			return -EFAULT;
1220 		buf[len] = 0;
1221 
1222 		scan_ip6(buf, pkt_dev->in6_daddr.s6_addr);
1223 		fmt_ip6(buf, pkt_dev->in6_daddr.s6_addr);
1224 
1225 		ipv6_addr_copy(&pkt_dev->cur_in6_daddr, &pkt_dev->in6_daddr);
1226 
1227 		if (debug)
1228 			printk(KERN_DEBUG "pktgen: dst6 set to: %s\n", buf);
1229 
1230 		i += len;
1231 		sprintf(pg_result, "OK: dst6=%s", buf);
1232 		return count;
1233 	}
1234 	if (!strcmp(name, "dst6_min")) {
1235 		len = strn_len(&user_buffer[i], sizeof(buf) - 1);
1236 		if (len < 0)
1237 			return len;
1238 
1239 		pkt_dev->flags |= F_IPV6;
1240 
1241 		if (copy_from_user(buf, &user_buffer[i], len))
1242 			return -EFAULT;
1243 		buf[len] = 0;
1244 
1245 		scan_ip6(buf, pkt_dev->min_in6_daddr.s6_addr);
1246 		fmt_ip6(buf, pkt_dev->min_in6_daddr.s6_addr);
1247 
1248 		ipv6_addr_copy(&pkt_dev->cur_in6_daddr,
1249 			       &pkt_dev->min_in6_daddr);
1250 		if (debug)
1251 			printk(KERN_DEBUG "pktgen: dst6_min set to: %s\n", buf);
1252 
1253 		i += len;
1254 		sprintf(pg_result, "OK: dst6_min=%s", buf);
1255 		return count;
1256 	}
1257 	if (!strcmp(name, "dst6_max")) {
1258 		len = strn_len(&user_buffer[i], sizeof(buf) - 1);
1259 		if (len < 0)
1260 			return len;
1261 
1262 		pkt_dev->flags |= F_IPV6;
1263 
1264 		if (copy_from_user(buf, &user_buffer[i], len))
1265 			return -EFAULT;
1266 		buf[len] = 0;
1267 
1268 		scan_ip6(buf, pkt_dev->max_in6_daddr.s6_addr);
1269 		fmt_ip6(buf, pkt_dev->max_in6_daddr.s6_addr);
1270 
1271 		if (debug)
1272 			printk(KERN_DEBUG "pktgen: dst6_max set to: %s\n", buf);
1273 
1274 		i += len;
1275 		sprintf(pg_result, "OK: dst6_max=%s", buf);
1276 		return count;
1277 	}
1278 	if (!strcmp(name, "src6")) {
1279 		len = strn_len(&user_buffer[i], sizeof(buf) - 1);
1280 		if (len < 0)
1281 			return len;
1282 
1283 		pkt_dev->flags |= F_IPV6;
1284 
1285 		if (copy_from_user(buf, &user_buffer[i], len))
1286 			return -EFAULT;
1287 		buf[len] = 0;
1288 
1289 		scan_ip6(buf, pkt_dev->in6_saddr.s6_addr);
1290 		fmt_ip6(buf, pkt_dev->in6_saddr.s6_addr);
1291 
1292 		ipv6_addr_copy(&pkt_dev->cur_in6_saddr, &pkt_dev->in6_saddr);
1293 
1294 		if (debug)
1295 			printk(KERN_DEBUG "pktgen: src6 set to: %s\n", buf);
1296 
1297 		i += len;
1298 		sprintf(pg_result, "OK: src6=%s", buf);
1299 		return count;
1300 	}
1301 	if (!strcmp(name, "src_min")) {
1302 		len = strn_len(&user_buffer[i], sizeof(pkt_dev->src_min) - 1);
1303 		if (len < 0) {
1304 			return len;
1305 		}
1306 		if (copy_from_user(buf, &user_buffer[i], len))
1307 			return -EFAULT;
1308 		buf[len] = 0;
1309 		if (strcmp(buf, pkt_dev->src_min) != 0) {
1310 			memset(pkt_dev->src_min, 0, sizeof(pkt_dev->src_min));
1311 			strncpy(pkt_dev->src_min, buf, len);
1312 			pkt_dev->saddr_min = in_aton(pkt_dev->src_min);
1313 			pkt_dev->cur_saddr = pkt_dev->saddr_min;
1314 		}
1315 		if (debug)
1316 			printk(KERN_DEBUG "pktgen: src_min set to: %s\n",
1317 			       pkt_dev->src_min);
1318 		i += len;
1319 		sprintf(pg_result, "OK: src_min=%s", pkt_dev->src_min);
1320 		return count;
1321 	}
1322 	if (!strcmp(name, "src_max")) {
1323 		len = strn_len(&user_buffer[i], sizeof(pkt_dev->src_max) - 1);
1324 		if (len < 0) {
1325 			return len;
1326 		}
1327 		if (copy_from_user(buf, &user_buffer[i], len))
1328 			return -EFAULT;
1329 		buf[len] = 0;
1330 		if (strcmp(buf, pkt_dev->src_max) != 0) {
1331 			memset(pkt_dev->src_max, 0, sizeof(pkt_dev->src_max));
1332 			strncpy(pkt_dev->src_max, buf, len);
1333 			pkt_dev->saddr_max = in_aton(pkt_dev->src_max);
1334 			pkt_dev->cur_saddr = pkt_dev->saddr_max;
1335 		}
1336 		if (debug)
1337 			printk(KERN_DEBUG "pktgen: src_max set to: %s\n",
1338 			       pkt_dev->src_max);
1339 		i += len;
1340 		sprintf(pg_result, "OK: src_max=%s", pkt_dev->src_max);
1341 		return count;
1342 	}
1343 	if (!strcmp(name, "dst_mac")) {
1344 		char *v = valstr;
1345 		unsigned char old_dmac[ETH_ALEN];
1346 		unsigned char *m = pkt_dev->dst_mac;
1347 		memcpy(old_dmac, pkt_dev->dst_mac, ETH_ALEN);
1348 
1349 		len = strn_len(&user_buffer[i], sizeof(valstr) - 1);
1350 		if (len < 0) {
1351 			return len;
1352 		}
1353 		memset(valstr, 0, sizeof(valstr));
1354 		if (copy_from_user(valstr, &user_buffer[i], len))
1355 			return -EFAULT;
1356 		i += len;
1357 
1358 		for (*m = 0; *v && m < pkt_dev->dst_mac + 6; v++) {
1359 			if (*v >= '0' && *v <= '9') {
1360 				*m *= 16;
1361 				*m += *v - '0';
1362 			}
1363 			if (*v >= 'A' && *v <= 'F') {
1364 				*m *= 16;
1365 				*m += *v - 'A' + 10;
1366 			}
1367 			if (*v >= 'a' && *v <= 'f') {
1368 				*m *= 16;
1369 				*m += *v - 'a' + 10;
1370 			}
1371 			if (*v == ':') {
1372 				m++;
1373 				*m = 0;
1374 			}
1375 		}
1376 
1377 		/* Set up Dest MAC */
1378 		if (compare_ether_addr(old_dmac, pkt_dev->dst_mac))
1379 			memcpy(&(pkt_dev->hh[0]), pkt_dev->dst_mac, ETH_ALEN);
1380 
1381 		sprintf(pg_result, "OK: dstmac");
1382 		return count;
1383 	}
1384 	if (!strcmp(name, "src_mac")) {
1385 		char *v = valstr;
1386 		unsigned char old_smac[ETH_ALEN];
1387 		unsigned char *m = pkt_dev->src_mac;
1388 
1389 		memcpy(old_smac, pkt_dev->src_mac, ETH_ALEN);
1390 
1391 		len = strn_len(&user_buffer[i], sizeof(valstr) - 1);
1392 		if (len < 0) {
1393 			return len;
1394 		}
1395 		memset(valstr, 0, sizeof(valstr));
1396 		if (copy_from_user(valstr, &user_buffer[i], len))
1397 			return -EFAULT;
1398 		i += len;
1399 
1400 		for (*m = 0; *v && m < pkt_dev->src_mac + 6; v++) {
1401 			if (*v >= '0' && *v <= '9') {
1402 				*m *= 16;
1403 				*m += *v - '0';
1404 			}
1405 			if (*v >= 'A' && *v <= 'F') {
1406 				*m *= 16;
1407 				*m += *v - 'A' + 10;
1408 			}
1409 			if (*v >= 'a' && *v <= 'f') {
1410 				*m *= 16;
1411 				*m += *v - 'a' + 10;
1412 			}
1413 			if (*v == ':') {
1414 				m++;
1415 				*m = 0;
1416 			}
1417 		}
1418 
1419 		/* Set up Src MAC */
1420 		if (compare_ether_addr(old_smac, pkt_dev->src_mac))
1421 			memcpy(&(pkt_dev->hh[6]), pkt_dev->src_mac, ETH_ALEN);
1422 
1423 		sprintf(pg_result, "OK: srcmac");
1424 		return count;
1425 	}
1426 
1427 	if (!strcmp(name, "clear_counters")) {
1428 		pktgen_clear_counters(pkt_dev);
1429 		sprintf(pg_result, "OK: Clearing counters.\n");
1430 		return count;
1431 	}
1432 
1433 	if (!strcmp(name, "flows")) {
1434 		len = num_arg(&user_buffer[i], 10, &value);
1435 		if (len < 0) {
1436 			return len;
1437 		}
1438 		i += len;
1439 		if (value > MAX_CFLOWS)
1440 			value = MAX_CFLOWS;
1441 
1442 		pkt_dev->cflows = value;
1443 		sprintf(pg_result, "OK: flows=%u", pkt_dev->cflows);
1444 		return count;
1445 	}
1446 
1447 	if (!strcmp(name, "flowlen")) {
1448 		len = num_arg(&user_buffer[i], 10, &value);
1449 		if (len < 0) {
1450 			return len;
1451 		}
1452 		i += len;
1453 		pkt_dev->lflow = value;
1454 		sprintf(pg_result, "OK: flowlen=%u", pkt_dev->lflow);
1455 		return count;
1456 	}
1457 
1458 	if (!strcmp(name, "queue_map_min")) {
1459 		len = num_arg(&user_buffer[i], 5, &value);
1460 		if (len < 0) {
1461 			return len;
1462 		}
1463 		i += len;
1464 		pkt_dev->queue_map_min = value;
1465 		sprintf(pg_result, "OK: queue_map_min=%u", pkt_dev->queue_map_min);
1466 		return count;
1467 	}
1468 
1469 	if (!strcmp(name, "queue_map_max")) {
1470 		len = num_arg(&user_buffer[i], 5, &value);
1471 		if (len < 0) {
1472 			return len;
1473 		}
1474 		i += len;
1475 		pkt_dev->queue_map_max = value;
1476 		sprintf(pg_result, "OK: queue_map_max=%u", pkt_dev->queue_map_max);
1477 		return count;
1478 	}
1479 
1480 	if (!strcmp(name, "mpls")) {
1481 		unsigned n, cnt;
1482 
1483 		len = get_labels(&user_buffer[i], pkt_dev);
1484 		if (len < 0)
1485 			return len;
1486 		i += len;
1487 		cnt = sprintf(pg_result, "OK: mpls=");
1488 		for (n = 0; n < pkt_dev->nr_labels; n++)
1489 			cnt += sprintf(pg_result + cnt,
1490 				       "%08x%s", ntohl(pkt_dev->labels[n]),
1491 				       n == pkt_dev->nr_labels-1 ? "" : ",");
1492 
1493 		if (pkt_dev->nr_labels && pkt_dev->vlan_id != 0xffff) {
1494 			pkt_dev->vlan_id = 0xffff; /* turn off VLAN/SVLAN */
1495 			pkt_dev->svlan_id = 0xffff;
1496 
1497 			if (debug)
1498 				printk(KERN_DEBUG "pktgen: VLAN/SVLAN auto turned off\n");
1499 		}
1500 		return count;
1501 	}
1502 
1503 	if (!strcmp(name, "vlan_id")) {
1504 		len = num_arg(&user_buffer[i], 4, &value);
1505 		if (len < 0) {
1506 			return len;
1507 		}
1508 		i += len;
1509 		if (value <= 4095) {
1510 			pkt_dev->vlan_id = value;  /* turn on VLAN */
1511 
1512 			if (debug)
1513 				printk(KERN_DEBUG "pktgen: VLAN turned on\n");
1514 
1515 			if (debug && pkt_dev->nr_labels)
1516 				printk(KERN_DEBUG "pktgen: MPLS auto turned off\n");
1517 
1518 			pkt_dev->nr_labels = 0;    /* turn off MPLS */
1519 			sprintf(pg_result, "OK: vlan_id=%u", pkt_dev->vlan_id);
1520 		} else {
1521 			pkt_dev->vlan_id = 0xffff; /* turn off VLAN/SVLAN */
1522 			pkt_dev->svlan_id = 0xffff;
1523 
1524 			if (debug)
1525 				printk(KERN_DEBUG "pktgen: VLAN/SVLAN turned off\n");
1526 		}
1527 		return count;
1528 	}
1529 
1530 	if (!strcmp(name, "vlan_p")) {
1531 		len = num_arg(&user_buffer[i], 1, &value);
1532 		if (len < 0) {
1533 			return len;
1534 		}
1535 		i += len;
1536 		if ((value <= 7) && (pkt_dev->vlan_id != 0xffff)) {
1537 			pkt_dev->vlan_p = value;
1538 			sprintf(pg_result, "OK: vlan_p=%u", pkt_dev->vlan_p);
1539 		} else {
1540 			sprintf(pg_result, "ERROR: vlan_p must be 0-7");
1541 		}
1542 		return count;
1543 	}
1544 
1545 	if (!strcmp(name, "vlan_cfi")) {
1546 		len = num_arg(&user_buffer[i], 1, &value);
1547 		if (len < 0) {
1548 			return len;
1549 		}
1550 		i += len;
1551 		if ((value <= 1) && (pkt_dev->vlan_id != 0xffff)) {
1552 			pkt_dev->vlan_cfi = value;
1553 			sprintf(pg_result, "OK: vlan_cfi=%u", pkt_dev->vlan_cfi);
1554 		} else {
1555 			sprintf(pg_result, "ERROR: vlan_cfi must be 0-1");
1556 		}
1557 		return count;
1558 	}
1559 
1560 	if (!strcmp(name, "svlan_id")) {
1561 		len = num_arg(&user_buffer[i], 4, &value);
1562 		if (len < 0) {
1563 			return len;
1564 		}
1565 		i += len;
1566 		if ((value <= 4095) && ((pkt_dev->vlan_id != 0xffff))) {
1567 			pkt_dev->svlan_id = value;  /* turn on SVLAN */
1568 
1569 			if (debug)
1570 				printk(KERN_DEBUG "pktgen: SVLAN turned on\n");
1571 
1572 			if (debug && pkt_dev->nr_labels)
1573 				printk(KERN_DEBUG "pktgen: MPLS auto turned off\n");
1574 
1575 			pkt_dev->nr_labels = 0;    /* turn off MPLS */
1576 			sprintf(pg_result, "OK: svlan_id=%u", pkt_dev->svlan_id);
1577 		} else {
1578 			pkt_dev->vlan_id = 0xffff; /* turn off VLAN/SVLAN */
1579 			pkt_dev->svlan_id = 0xffff;
1580 
1581 			if (debug)
1582 				printk(KERN_DEBUG "pktgen: VLAN/SVLAN turned off\n");
1583 		}
1584 		return count;
1585 	}
1586 
1587 	if (!strcmp(name, "svlan_p")) {
1588 		len = num_arg(&user_buffer[i], 1, &value);
1589 		if (len < 0) {
1590 			return len;
1591 		}
1592 		i += len;
1593 		if ((value <= 7) && (pkt_dev->svlan_id != 0xffff)) {
1594 			pkt_dev->svlan_p = value;
1595 			sprintf(pg_result, "OK: svlan_p=%u", pkt_dev->svlan_p);
1596 		} else {
1597 			sprintf(pg_result, "ERROR: svlan_p must be 0-7");
1598 		}
1599 		return count;
1600 	}
1601 
1602 	if (!strcmp(name, "svlan_cfi")) {
1603 		len = num_arg(&user_buffer[i], 1, &value);
1604 		if (len < 0) {
1605 			return len;
1606 		}
1607 		i += len;
1608 		if ((value <= 1) && (pkt_dev->svlan_id != 0xffff)) {
1609 			pkt_dev->svlan_cfi = value;
1610 			sprintf(pg_result, "OK: svlan_cfi=%u", pkt_dev->svlan_cfi);
1611 		} else {
1612 			sprintf(pg_result, "ERROR: svlan_cfi must be 0-1");
1613 		}
1614 		return count;
1615 	}
1616 
1617 	if (!strcmp(name, "tos")) {
1618 		__u32 tmp_value = 0;
1619 		len = hex32_arg(&user_buffer[i], 2, &tmp_value);
1620 		if (len < 0) {
1621 			return len;
1622 		}
1623 		i += len;
1624 		if (len == 2) {
1625 			pkt_dev->tos = tmp_value;
1626 			sprintf(pg_result, "OK: tos=0x%02x", pkt_dev->tos);
1627 		} else {
1628 			sprintf(pg_result, "ERROR: tos must be 00-ff");
1629 		}
1630 		return count;
1631 	}
1632 
1633 	if (!strcmp(name, "traffic_class")) {
1634 		__u32 tmp_value = 0;
1635 		len = hex32_arg(&user_buffer[i], 2, &tmp_value);
1636 		if (len < 0) {
1637 			return len;
1638 		}
1639 		i += len;
1640 		if (len == 2) {
1641 			pkt_dev->traffic_class = tmp_value;
1642 			sprintf(pg_result, "OK: traffic_class=0x%02x", pkt_dev->traffic_class);
1643 		} else {
1644 			sprintf(pg_result, "ERROR: traffic_class must be 00-ff");
1645 		}
1646 		return count;
1647 	}
1648 
1649 	sprintf(pkt_dev->result, "No such parameter \"%s\"", name);
1650 	return -EINVAL;
1651 }
1652 
1653 static int pktgen_if_open(struct inode *inode, struct file *file)
1654 {
1655 	return single_open(file, pktgen_if_show, PDE(inode)->data);
1656 }
1657 
1658 static const struct file_operations pktgen_if_fops = {
1659 	.owner   = THIS_MODULE,
1660 	.open    = pktgen_if_open,
1661 	.read    = seq_read,
1662 	.llseek  = seq_lseek,
1663 	.write   = pktgen_if_write,
1664 	.release = single_release,
1665 };
1666 
1667 static int pktgen_thread_show(struct seq_file *seq, void *v)
1668 {
1669 	struct pktgen_thread *t = seq->private;
1670 	struct pktgen_dev *pkt_dev;
1671 
1672 	BUG_ON(!t);
1673 
1674 	seq_printf(seq, "Running: ");
1675 
1676 	if_lock(t);
1677 	list_for_each_entry(pkt_dev, &t->if_list, list)
1678 		if (pkt_dev->running)
1679 			seq_printf(seq, "%s ", pkt_dev->odev->name);
1680 
1681 	seq_printf(seq, "\nStopped: ");
1682 
1683 	list_for_each_entry(pkt_dev, &t->if_list, list)
1684 		if (!pkt_dev->running)
1685 			seq_printf(seq, "%s ", pkt_dev->odev->name);
1686 
1687 	if (t->result[0])
1688 		seq_printf(seq, "\nResult: %s\n", t->result);
1689 	else
1690 		seq_printf(seq, "\nResult: NA\n");
1691 
1692 	if_unlock(t);
1693 
1694 	return 0;
1695 }
1696 
1697 static ssize_t pktgen_thread_write(struct file *file,
1698 				   const char __user * user_buffer,
1699 				   size_t count, loff_t * offset)
1700 {
1701 	struct seq_file *seq = (struct seq_file *)file->private_data;
1702 	struct pktgen_thread *t = seq->private;
1703 	int i = 0, max, len, ret;
1704 	char name[40];
1705 	char *pg_result;
1706 
1707 	if (count < 1) {
1708 		//      sprintf(pg_result, "Wrong command format");
1709 		return -EINVAL;
1710 	}
1711 
1712 	max = count - i;
1713 	len = count_trail_chars(&user_buffer[i], max);
1714 	if (len < 0)
1715 		return len;
1716 
1717 	i += len;
1718 
1719 	/* Read variable name */
1720 
1721 	len = strn_len(&user_buffer[i], sizeof(name) - 1);
1722 	if (len < 0)
1723 		return len;
1724 
1725 	memset(name, 0, sizeof(name));
1726 	if (copy_from_user(name, &user_buffer[i], len))
1727 		return -EFAULT;
1728 	i += len;
1729 
1730 	max = count - i;
1731 	len = count_trail_chars(&user_buffer[i], max);
1732 	if (len < 0)
1733 		return len;
1734 
1735 	i += len;
1736 
1737 	if (debug)
1738 		printk(KERN_DEBUG "pktgen: t=%s, count=%lu\n",
1739 		       name, (unsigned long)count);
1740 
1741 	if (!t) {
1742 		printk(KERN_ERR "pktgen: ERROR: No thread\n");
1743 		ret = -EINVAL;
1744 		goto out;
1745 	}
1746 
1747 	pg_result = &(t->result[0]);
1748 
1749 	if (!strcmp(name, "add_device")) {
1750 		char f[32];
1751 		memset(f, 0, 32);
1752 		len = strn_len(&user_buffer[i], sizeof(f) - 1);
1753 		if (len < 0) {
1754 			ret = len;
1755 			goto out;
1756 		}
1757 		if (copy_from_user(f, &user_buffer[i], len))
1758 			return -EFAULT;
1759 		i += len;
1760 		mutex_lock(&pktgen_thread_lock);
1761 		pktgen_add_device(t, f);
1762 		mutex_unlock(&pktgen_thread_lock);
1763 		ret = count;
1764 		sprintf(pg_result, "OK: add_device=%s", f);
1765 		goto out;
1766 	}
1767 
1768 	if (!strcmp(name, "rem_device_all")) {
1769 		mutex_lock(&pktgen_thread_lock);
1770 		t->control |= T_REMDEVALL;
1771 		mutex_unlock(&pktgen_thread_lock);
1772 		schedule_timeout_interruptible(msecs_to_jiffies(125));	/* Propagate thread->control  */
1773 		ret = count;
1774 		sprintf(pg_result, "OK: rem_device_all");
1775 		goto out;
1776 	}
1777 
1778 	if (!strcmp(name, "max_before_softirq")) {
1779 		sprintf(pg_result, "OK: Note! max_before_softirq is obsoleted -- Do not use");
1780 		ret = count;
1781 		goto out;
1782 	}
1783 
1784 	ret = -EINVAL;
1785 out:
1786 	return ret;
1787 }
1788 
1789 static int pktgen_thread_open(struct inode *inode, struct file *file)
1790 {
1791 	return single_open(file, pktgen_thread_show, PDE(inode)->data);
1792 }
1793 
1794 static const struct file_operations pktgen_thread_fops = {
1795 	.owner   = THIS_MODULE,
1796 	.open    = pktgen_thread_open,
1797 	.read    = seq_read,
1798 	.llseek  = seq_lseek,
1799 	.write   = pktgen_thread_write,
1800 	.release = single_release,
1801 };
1802 
1803 /* Think find or remove for NN */
1804 static struct pktgen_dev *__pktgen_NN_threads(const char *ifname, int remove)
1805 {
1806 	struct pktgen_thread *t;
1807 	struct pktgen_dev *pkt_dev = NULL;
1808 
1809 	list_for_each_entry(t, &pktgen_threads, th_list) {
1810 		pkt_dev = pktgen_find_dev(t, ifname);
1811 		if (pkt_dev) {
1812 			if (remove) {
1813 				if_lock(t);
1814 				pkt_dev->removal_mark = 1;
1815 				t->control |= T_REMDEV;
1816 				if_unlock(t);
1817 			}
1818 			break;
1819 		}
1820 	}
1821 	return pkt_dev;
1822 }
1823 
1824 /*
1825  * mark a device for removal
1826  */
1827 static void pktgen_mark_device(const char *ifname)
1828 {
1829 	struct pktgen_dev *pkt_dev = NULL;
1830 	const int max_tries = 10, msec_per_try = 125;
1831 	int i = 0;
1832 
1833 	mutex_lock(&pktgen_thread_lock);
1834 	pr_debug("pktgen: pktgen_mark_device marking %s for removal\n", ifname);
1835 
1836 	while (1) {
1837 
1838 		pkt_dev = __pktgen_NN_threads(ifname, REMOVE);
1839 		if (pkt_dev == NULL)
1840 			break;	/* success */
1841 
1842 		mutex_unlock(&pktgen_thread_lock);
1843 		pr_debug("pktgen: pktgen_mark_device waiting for %s "
1844 				"to disappear....\n", ifname);
1845 		schedule_timeout_interruptible(msecs_to_jiffies(msec_per_try));
1846 		mutex_lock(&pktgen_thread_lock);
1847 
1848 		if (++i >= max_tries) {
1849 			printk(KERN_ERR "pktgen_mark_device: timed out after "
1850 			       "waiting %d msec for device %s to be removed\n",
1851 			       msec_per_try * i, ifname);
1852 			break;
1853 		}
1854 
1855 	}
1856 
1857 	mutex_unlock(&pktgen_thread_lock);
1858 }
1859 
1860 static void pktgen_change_name(struct net_device *dev)
1861 {
1862 	struct pktgen_thread *t;
1863 
1864 	list_for_each_entry(t, &pktgen_threads, th_list) {
1865 		struct pktgen_dev *pkt_dev;
1866 
1867 		list_for_each_entry(pkt_dev, &t->if_list, list) {
1868 			if (pkt_dev->odev != dev)
1869 				continue;
1870 
1871 			remove_proc_entry(pkt_dev->entry->name, pg_proc_dir);
1872 
1873 			pkt_dev->entry = create_proc_entry(dev->name, 0600,
1874 							   pg_proc_dir);
1875 			if (!pkt_dev->entry)
1876 				printk(KERN_ERR "pktgen: can't move proc "
1877 				       " entry for '%s'\n", dev->name);
1878 			break;
1879 		}
1880 	}
1881 }
1882 
1883 static int pktgen_device_event(struct notifier_block *unused,
1884 			       unsigned long event, void *ptr)
1885 {
1886 	struct net_device *dev = ptr;
1887 
1888 	if (!net_eq(dev_net(dev), &init_net))
1889 		return NOTIFY_DONE;
1890 
1891 	/* It is OK that we do not hold the group lock right now,
1892 	 * as we run under the RTNL lock.
1893 	 */
1894 
1895 	switch (event) {
1896 	case NETDEV_CHANGENAME:
1897 		pktgen_change_name(dev);
1898 		break;
1899 
1900 	case NETDEV_UNREGISTER:
1901 		pktgen_mark_device(dev->name);
1902 		break;
1903 	}
1904 
1905 	return NOTIFY_DONE;
1906 }
1907 
1908 static struct net_device *pktgen_dev_get_by_name(struct pktgen_dev *pkt_dev, const char *ifname)
1909 {
1910 	char b[IFNAMSIZ+5];
1911 	int i = 0;
1912 
1913 	for(i=0; ifname[i] != '@'; i++) {
1914 		if(i == IFNAMSIZ)
1915 			break;
1916 
1917 		b[i] = ifname[i];
1918 	}
1919 	b[i] = 0;
1920 
1921 	return dev_get_by_name(&init_net, b);
1922 }
1923 
1924 
1925 /* Associate pktgen_dev with a device. */
1926 
1927 static int pktgen_setup_dev(struct pktgen_dev *pkt_dev, const char *ifname)
1928 {
1929 	struct net_device *odev;
1930 	int err;
1931 
1932 	/* Clean old setups */
1933 	if (pkt_dev->odev) {
1934 		dev_put(pkt_dev->odev);
1935 		pkt_dev->odev = NULL;
1936 	}
1937 
1938 	odev = pktgen_dev_get_by_name(pkt_dev, ifname);
1939 	if (!odev) {
1940 		printk(KERN_ERR "pktgen: no such netdevice: \"%s\"\n", ifname);
1941 		return -ENODEV;
1942 	}
1943 
1944 	if (odev->type != ARPHRD_ETHER) {
1945 		printk(KERN_ERR "pktgen: not an ethernet device: \"%s\"\n", ifname);
1946 		err = -EINVAL;
1947 	} else if (!netif_running(odev)) {
1948 		printk(KERN_ERR "pktgen: device is down: \"%s\"\n", ifname);
1949 		err = -ENETDOWN;
1950 	} else {
1951 		pkt_dev->odev = odev;
1952 		return 0;
1953 	}
1954 
1955 	dev_put(odev);
1956 	return err;
1957 }
1958 
1959 /* Read pkt_dev from the interface and set up internal pktgen_dev
1960  * structure to have the right information to create/send packets
1961  */
1962 static void pktgen_setup_inject(struct pktgen_dev *pkt_dev)
1963 {
1964 	int ntxq;
1965 
1966 	if (!pkt_dev->odev) {
1967 		printk(KERN_ERR "pktgen: ERROR: pkt_dev->odev == NULL in "
1968 		       "setup_inject.\n");
1969 		sprintf(pkt_dev->result,
1970 			"ERROR: pkt_dev->odev == NULL in setup_inject.\n");
1971 		return;
1972 	}
1973 
1974 	/* make sure that we don't pick a non-existing transmit queue */
1975 	ntxq = pkt_dev->odev->real_num_tx_queues;
1976 	if (ntxq > num_online_cpus() && (pkt_dev->flags & F_QUEUE_MAP_CPU)) {
1977 		printk(KERN_WARNING "pktgen: WARNING: QUEUE_MAP_CPU "
1978 		       "disabled because CPU count (%d) exceeds number "
1979 		       "of tx queues (%d) on %s\n", num_online_cpus(), ntxq,
1980 		       pkt_dev->odev->name);
1981 		pkt_dev->flags &= ~F_QUEUE_MAP_CPU;
1982 	}
1983 	if (ntxq <= pkt_dev->queue_map_min) {
1984 		printk(KERN_WARNING "pktgen: WARNING: Requested "
1985 		       "queue_map_min (zero-based) (%d) exceeds valid range "
1986 		       "[0 - %d] for (%d) queues on %s, resetting\n",
1987 		       pkt_dev->queue_map_min, (ntxq ?: 1)- 1, ntxq,
1988 		       pkt_dev->odev->name);
1989 		pkt_dev->queue_map_min = ntxq - 1;
1990 	}
1991 	if (pkt_dev->queue_map_max >= ntxq) {
1992 		printk(KERN_WARNING "pktgen: WARNING: Requested "
1993 		       "queue_map_max (zero-based) (%d) exceeds valid range "
1994 		       "[0 - %d] for (%d) queues on %s, resetting\n",
1995 		       pkt_dev->queue_map_max, (ntxq ?: 1)- 1, ntxq,
1996 		       pkt_dev->odev->name);
1997 		pkt_dev->queue_map_max = ntxq - 1;
1998 	}
1999 
2000 	/* Default to the interface's mac if not explicitly set. */
2001 
2002 	if (is_zero_ether_addr(pkt_dev->src_mac))
2003 		memcpy(&(pkt_dev->hh[6]), pkt_dev->odev->dev_addr, ETH_ALEN);
2004 
2005 	/* Set up Dest MAC */
2006 	memcpy(&(pkt_dev->hh[0]), pkt_dev->dst_mac, ETH_ALEN);
2007 
2008 	/* Set up pkt size */
2009 	pkt_dev->cur_pkt_size = pkt_dev->min_pkt_size;
2010 
2011 	if (pkt_dev->flags & F_IPV6) {
2012 		/*
2013 		 * Skip this automatic address setting until locks or functions
2014 		 * gets exported
2015 		 */
2016 
2017 #ifdef NOTNOW
2018 		int i, set = 0, err = 1;
2019 		struct inet6_dev *idev;
2020 
2021 		for (i = 0; i < IN6_ADDR_HSIZE; i++)
2022 			if (pkt_dev->cur_in6_saddr.s6_addr[i]) {
2023 				set = 1;
2024 				break;
2025 			}
2026 
2027 		if (!set) {
2028 
2029 			/*
2030 			 * Use linklevel address if unconfigured.
2031 			 *
2032 			 * use ipv6_get_lladdr if/when it's get exported
2033 			 */
2034 
2035 			rcu_read_lock();
2036 			if ((idev = __in6_dev_get(pkt_dev->odev)) != NULL) {
2037 				struct inet6_ifaddr *ifp;
2038 
2039 				read_lock_bh(&idev->lock);
2040 				for (ifp = idev->addr_list; ifp;
2041 				     ifp = ifp->if_next) {
2042 					if (ifp->scope == IFA_LINK
2043 					    && !(ifp->
2044 						 flags & IFA_F_TENTATIVE)) {
2045 						ipv6_addr_copy(&pkt_dev->
2046 							       cur_in6_saddr,
2047 							       &ifp->addr);
2048 						err = 0;
2049 						break;
2050 					}
2051 				}
2052 				read_unlock_bh(&idev->lock);
2053 			}
2054 			rcu_read_unlock();
2055 			if (err)
2056 				printk(KERN_ERR "pktgen: ERROR: IPv6 link "
2057 				       "address not availble.\n");
2058 		}
2059 #endif
2060 	} else {
2061 		pkt_dev->saddr_min = 0;
2062 		pkt_dev->saddr_max = 0;
2063 		if (strlen(pkt_dev->src_min) == 0) {
2064 
2065 			struct in_device *in_dev;
2066 
2067 			rcu_read_lock();
2068 			in_dev = __in_dev_get_rcu(pkt_dev->odev);
2069 			if (in_dev) {
2070 				if (in_dev->ifa_list) {
2071 					pkt_dev->saddr_min =
2072 					    in_dev->ifa_list->ifa_address;
2073 					pkt_dev->saddr_max = pkt_dev->saddr_min;
2074 				}
2075 			}
2076 			rcu_read_unlock();
2077 		} else {
2078 			pkt_dev->saddr_min = in_aton(pkt_dev->src_min);
2079 			pkt_dev->saddr_max = in_aton(pkt_dev->src_max);
2080 		}
2081 
2082 		pkt_dev->daddr_min = in_aton(pkt_dev->dst_min);
2083 		pkt_dev->daddr_max = in_aton(pkt_dev->dst_max);
2084 	}
2085 	/* Initialize current values. */
2086 	pkt_dev->cur_dst_mac_offset = 0;
2087 	pkt_dev->cur_src_mac_offset = 0;
2088 	pkt_dev->cur_saddr = pkt_dev->saddr_min;
2089 	pkt_dev->cur_daddr = pkt_dev->daddr_min;
2090 	pkt_dev->cur_udp_dst = pkt_dev->udp_dst_min;
2091 	pkt_dev->cur_udp_src = pkt_dev->udp_src_min;
2092 	pkt_dev->nflows = 0;
2093 }
2094 
2095 static void spin(struct pktgen_dev *pkt_dev, __u64 spin_until_us)
2096 {
2097 	__u64 start;
2098 	__u64 now;
2099 
2100 	start = now = getCurUs();
2101 	while (now < spin_until_us) {
2102 		/* TODO: optimize sleeping behavior */
2103 		if (spin_until_us - now > jiffies_to_usecs(1) + 1)
2104 			schedule_timeout_interruptible(1);
2105 		else if (spin_until_us - now > 100) {
2106 			if (!pkt_dev->running)
2107 				return;
2108 			if (need_resched())
2109 				schedule();
2110 		}
2111 
2112 		now = getCurUs();
2113 	}
2114 
2115 	pkt_dev->idle_acc += now - start;
2116 }
2117 
2118 static inline void set_pkt_overhead(struct pktgen_dev *pkt_dev)
2119 {
2120 	pkt_dev->pkt_overhead = 0;
2121 	pkt_dev->pkt_overhead += pkt_dev->nr_labels*sizeof(u32);
2122 	pkt_dev->pkt_overhead += VLAN_TAG_SIZE(pkt_dev);
2123 	pkt_dev->pkt_overhead += SVLAN_TAG_SIZE(pkt_dev);
2124 }
2125 
2126 static inline int f_seen(struct pktgen_dev *pkt_dev, int flow)
2127 {
2128 
2129 	if (pkt_dev->flows[flow].flags & F_INIT)
2130 		return 1;
2131 	else
2132 		return 0;
2133 }
2134 
2135 static inline int f_pick(struct pktgen_dev *pkt_dev)
2136 {
2137 	int flow = pkt_dev->curfl;
2138 
2139 	if (pkt_dev->flags & F_FLOW_SEQ) {
2140 		if (pkt_dev->flows[flow].count >= pkt_dev->lflow) {
2141 			/* reset time */
2142 			pkt_dev->flows[flow].count = 0;
2143 			pkt_dev->flows[flow].flags = 0;
2144 			pkt_dev->curfl += 1;
2145 			if (pkt_dev->curfl >= pkt_dev->cflows)
2146 				pkt_dev->curfl = 0; /*reset */
2147 		}
2148 	} else {
2149 		flow = random32() % pkt_dev->cflows;
2150 		pkt_dev->curfl = flow;
2151 
2152 		if (pkt_dev->flows[flow].count > pkt_dev->lflow) {
2153 			pkt_dev->flows[flow].count = 0;
2154 			pkt_dev->flows[flow].flags = 0;
2155 		}
2156 	}
2157 
2158 	return pkt_dev->curfl;
2159 }
2160 
2161 
2162 #ifdef CONFIG_XFRM
2163 /* If there was already an IPSEC SA, we keep it as is, else
2164  * we go look for it ...
2165 */
2166 static void get_ipsec_sa(struct pktgen_dev *pkt_dev, int flow)
2167 {
2168 	struct xfrm_state *x = pkt_dev->flows[flow].x;
2169 	if (!x) {
2170 		/*slow path: we dont already have xfrm_state*/
2171 		x = xfrm_stateonly_find((xfrm_address_t *)&pkt_dev->cur_daddr,
2172 					(xfrm_address_t *)&pkt_dev->cur_saddr,
2173 					AF_INET,
2174 					pkt_dev->ipsmode,
2175 					pkt_dev->ipsproto, 0);
2176 		if (x) {
2177 			pkt_dev->flows[flow].x = x;
2178 			set_pkt_overhead(pkt_dev);
2179 			pkt_dev->pkt_overhead+=x->props.header_len;
2180 		}
2181 
2182 	}
2183 }
2184 #endif
2185 static void set_cur_queue_map(struct pktgen_dev *pkt_dev)
2186 {
2187 
2188 	if (pkt_dev->flags & F_QUEUE_MAP_CPU)
2189 		pkt_dev->cur_queue_map = smp_processor_id();
2190 
2191 	else if (pkt_dev->queue_map_min < pkt_dev->queue_map_max) {
2192 		__u16 t;
2193 		if (pkt_dev->flags & F_QUEUE_MAP_RND) {
2194 			t = random32() %
2195 				(pkt_dev->queue_map_max -
2196 				 pkt_dev->queue_map_min + 1)
2197 				+ pkt_dev->queue_map_min;
2198 		} else {
2199 			t = pkt_dev->cur_queue_map + 1;
2200 			if (t > pkt_dev->queue_map_max)
2201 				t = pkt_dev->queue_map_min;
2202 		}
2203 		pkt_dev->cur_queue_map = t;
2204 	}
2205 }
2206 
2207 /* Increment/randomize headers according to flags and current values
2208  * for IP src/dest, UDP src/dst port, MAC-Addr src/dst
2209  */
2210 static void mod_cur_headers(struct pktgen_dev *pkt_dev)
2211 {
2212 	__u32 imn;
2213 	__u32 imx;
2214 	int flow = 0;
2215 
2216 	if (pkt_dev->cflows)
2217 		flow = f_pick(pkt_dev);
2218 
2219 	/*  Deal with source MAC */
2220 	if (pkt_dev->src_mac_count > 1) {
2221 		__u32 mc;
2222 		__u32 tmp;
2223 
2224 		if (pkt_dev->flags & F_MACSRC_RND)
2225 			mc = random32() % pkt_dev->src_mac_count;
2226 		else {
2227 			mc = pkt_dev->cur_src_mac_offset++;
2228 			if (pkt_dev->cur_src_mac_offset >=
2229 			    pkt_dev->src_mac_count)
2230 				pkt_dev->cur_src_mac_offset = 0;
2231 		}
2232 
2233 		tmp = pkt_dev->src_mac[5] + (mc & 0xFF);
2234 		pkt_dev->hh[11] = tmp;
2235 		tmp = (pkt_dev->src_mac[4] + ((mc >> 8) & 0xFF) + (tmp >> 8));
2236 		pkt_dev->hh[10] = tmp;
2237 		tmp = (pkt_dev->src_mac[3] + ((mc >> 16) & 0xFF) + (tmp >> 8));
2238 		pkt_dev->hh[9] = tmp;
2239 		tmp = (pkt_dev->src_mac[2] + ((mc >> 24) & 0xFF) + (tmp >> 8));
2240 		pkt_dev->hh[8] = tmp;
2241 		tmp = (pkt_dev->src_mac[1] + (tmp >> 8));
2242 		pkt_dev->hh[7] = tmp;
2243 	}
2244 
2245 	/*  Deal with Destination MAC */
2246 	if (pkt_dev->dst_mac_count > 1) {
2247 		__u32 mc;
2248 		__u32 tmp;
2249 
2250 		if (pkt_dev->flags & F_MACDST_RND)
2251 			mc = random32() % pkt_dev->dst_mac_count;
2252 
2253 		else {
2254 			mc = pkt_dev->cur_dst_mac_offset++;
2255 			if (pkt_dev->cur_dst_mac_offset >=
2256 			    pkt_dev->dst_mac_count) {
2257 				pkt_dev->cur_dst_mac_offset = 0;
2258 			}
2259 		}
2260 
2261 		tmp = pkt_dev->dst_mac[5] + (mc & 0xFF);
2262 		pkt_dev->hh[5] = tmp;
2263 		tmp = (pkt_dev->dst_mac[4] + ((mc >> 8) & 0xFF) + (tmp >> 8));
2264 		pkt_dev->hh[4] = tmp;
2265 		tmp = (pkt_dev->dst_mac[3] + ((mc >> 16) & 0xFF) + (tmp >> 8));
2266 		pkt_dev->hh[3] = tmp;
2267 		tmp = (pkt_dev->dst_mac[2] + ((mc >> 24) & 0xFF) + (tmp >> 8));
2268 		pkt_dev->hh[2] = tmp;
2269 		tmp = (pkt_dev->dst_mac[1] + (tmp >> 8));
2270 		pkt_dev->hh[1] = tmp;
2271 	}
2272 
2273 	if (pkt_dev->flags & F_MPLS_RND) {
2274 		unsigned i;
2275 		for (i = 0; i < pkt_dev->nr_labels; i++)
2276 			if (pkt_dev->labels[i] & MPLS_STACK_BOTTOM)
2277 				pkt_dev->labels[i] = MPLS_STACK_BOTTOM |
2278 					     ((__force __be32)random32() &
2279 						      htonl(0x000fffff));
2280 	}
2281 
2282 	if ((pkt_dev->flags & F_VID_RND) && (pkt_dev->vlan_id != 0xffff)) {
2283 		pkt_dev->vlan_id = random32() & (4096-1);
2284 	}
2285 
2286 	if ((pkt_dev->flags & F_SVID_RND) && (pkt_dev->svlan_id != 0xffff)) {
2287 		pkt_dev->svlan_id = random32() & (4096 - 1);
2288 	}
2289 
2290 	if (pkt_dev->udp_src_min < pkt_dev->udp_src_max) {
2291 		if (pkt_dev->flags & F_UDPSRC_RND)
2292 			pkt_dev->cur_udp_src = random32() %
2293 				(pkt_dev->udp_src_max - pkt_dev->udp_src_min)
2294 				+ pkt_dev->udp_src_min;
2295 
2296 		else {
2297 			pkt_dev->cur_udp_src++;
2298 			if (pkt_dev->cur_udp_src >= pkt_dev->udp_src_max)
2299 				pkt_dev->cur_udp_src = pkt_dev->udp_src_min;
2300 		}
2301 	}
2302 
2303 	if (pkt_dev->udp_dst_min < pkt_dev->udp_dst_max) {
2304 		if (pkt_dev->flags & F_UDPDST_RND) {
2305 			pkt_dev->cur_udp_dst = random32() %
2306 				(pkt_dev->udp_dst_max - pkt_dev->udp_dst_min)
2307 				+ pkt_dev->udp_dst_min;
2308 		} else {
2309 			pkt_dev->cur_udp_dst++;
2310 			if (pkt_dev->cur_udp_dst >= pkt_dev->udp_dst_max)
2311 				pkt_dev->cur_udp_dst = pkt_dev->udp_dst_min;
2312 		}
2313 	}
2314 
2315 	if (!(pkt_dev->flags & F_IPV6)) {
2316 
2317 		if ((imn = ntohl(pkt_dev->saddr_min)) < (imx =
2318 							 ntohl(pkt_dev->
2319 							       saddr_max))) {
2320 			__u32 t;
2321 			if (pkt_dev->flags & F_IPSRC_RND)
2322 				t = random32() % (imx - imn) + imn;
2323 			else {
2324 				t = ntohl(pkt_dev->cur_saddr);
2325 				t++;
2326 				if (t > imx) {
2327 					t = imn;
2328 				}
2329 			}
2330 			pkt_dev->cur_saddr = htonl(t);
2331 		}
2332 
2333 		if (pkt_dev->cflows && f_seen(pkt_dev, flow)) {
2334 			pkt_dev->cur_daddr = pkt_dev->flows[flow].cur_daddr;
2335 		} else {
2336 			imn = ntohl(pkt_dev->daddr_min);
2337 			imx = ntohl(pkt_dev->daddr_max);
2338 			if (imn < imx) {
2339 				__u32 t;
2340 				__be32 s;
2341 				if (pkt_dev->flags & F_IPDST_RND) {
2342 
2343 					t = random32() % (imx - imn) + imn;
2344 					s = htonl(t);
2345 
2346 					while (ipv4_is_loopback(s) ||
2347 					       ipv4_is_multicast(s) ||
2348 					       ipv4_is_lbcast(s) ||
2349 					       ipv4_is_zeronet(s) ||
2350 					       ipv4_is_local_multicast(s)) {
2351 						t = random32() % (imx - imn) + imn;
2352 						s = htonl(t);
2353 					}
2354 					pkt_dev->cur_daddr = s;
2355 				} else {
2356 					t = ntohl(pkt_dev->cur_daddr);
2357 					t++;
2358 					if (t > imx) {
2359 						t = imn;
2360 					}
2361 					pkt_dev->cur_daddr = htonl(t);
2362 				}
2363 			}
2364 			if (pkt_dev->cflows) {
2365 				pkt_dev->flows[flow].flags |= F_INIT;
2366 				pkt_dev->flows[flow].cur_daddr =
2367 				    pkt_dev->cur_daddr;
2368 #ifdef CONFIG_XFRM
2369 				if (pkt_dev->flags & F_IPSEC_ON)
2370 					get_ipsec_sa(pkt_dev, flow);
2371 #endif
2372 				pkt_dev->nflows++;
2373 			}
2374 		}
2375 	} else {		/* IPV6 * */
2376 
2377 		if (pkt_dev->min_in6_daddr.s6_addr32[0] == 0 &&
2378 		    pkt_dev->min_in6_daddr.s6_addr32[1] == 0 &&
2379 		    pkt_dev->min_in6_daddr.s6_addr32[2] == 0 &&
2380 		    pkt_dev->min_in6_daddr.s6_addr32[3] == 0) ;
2381 		else {
2382 			int i;
2383 
2384 			/* Only random destinations yet */
2385 
2386 			for (i = 0; i < 4; i++) {
2387 				pkt_dev->cur_in6_daddr.s6_addr32[i] =
2388 				    (((__force __be32)random32() |
2389 				      pkt_dev->min_in6_daddr.s6_addr32[i]) &
2390 				     pkt_dev->max_in6_daddr.s6_addr32[i]);
2391 			}
2392 		}
2393 	}
2394 
2395 	if (pkt_dev->min_pkt_size < pkt_dev->max_pkt_size) {
2396 		__u32 t;
2397 		if (pkt_dev->flags & F_TXSIZE_RND) {
2398 			t = random32() %
2399 				(pkt_dev->max_pkt_size - pkt_dev->min_pkt_size)
2400 				+ pkt_dev->min_pkt_size;
2401 		} else {
2402 			t = pkt_dev->cur_pkt_size + 1;
2403 			if (t > pkt_dev->max_pkt_size)
2404 				t = pkt_dev->min_pkt_size;
2405 		}
2406 		pkt_dev->cur_pkt_size = t;
2407 	}
2408 
2409 	set_cur_queue_map(pkt_dev);
2410 
2411 	pkt_dev->flows[flow].count++;
2412 }
2413 
2414 
2415 #ifdef CONFIG_XFRM
2416 static int pktgen_output_ipsec(struct sk_buff *skb, struct pktgen_dev *pkt_dev)
2417 {
2418 	struct xfrm_state *x = pkt_dev->flows[pkt_dev->curfl].x;
2419 	int err = 0;
2420 	struct iphdr *iph;
2421 
2422 	if (!x)
2423 		return 0;
2424 	/* XXX: we dont support tunnel mode for now until
2425 	 * we resolve the dst issue */
2426 	if (x->props.mode != XFRM_MODE_TRANSPORT)
2427 		return 0;
2428 
2429 	spin_lock(&x->lock);
2430 	iph = ip_hdr(skb);
2431 
2432 	err = x->outer_mode->output(x, skb);
2433 	if (err)
2434 		goto error;
2435 	err = x->type->output(x, skb);
2436 	if (err)
2437 		goto error;
2438 
2439 	x->curlft.bytes +=skb->len;
2440 	x->curlft.packets++;
2441 error:
2442 	spin_unlock(&x->lock);
2443 	return err;
2444 }
2445 
2446 static inline void free_SAs(struct pktgen_dev *pkt_dev)
2447 {
2448 	if (pkt_dev->cflows) {
2449 		/* let go of the SAs if we have them */
2450 		int i = 0;
2451 		for (;  i < pkt_dev->nflows; i++){
2452 			struct xfrm_state *x = pkt_dev->flows[i].x;
2453 			if (x) {
2454 				xfrm_state_put(x);
2455 				pkt_dev->flows[i].x = NULL;
2456 			}
2457 		}
2458 	}
2459 }
2460 
2461 static inline int process_ipsec(struct pktgen_dev *pkt_dev,
2462 			      struct sk_buff *skb, __be16 protocol)
2463 {
2464 	if (pkt_dev->flags & F_IPSEC_ON) {
2465 		struct xfrm_state *x = pkt_dev->flows[pkt_dev->curfl].x;
2466 		int nhead = 0;
2467 		if (x) {
2468 			int ret;
2469 			__u8 *eth;
2470 			nhead = x->props.header_len - skb_headroom(skb);
2471 			if (nhead >0) {
2472 				ret = pskb_expand_head(skb, nhead, 0, GFP_ATOMIC);
2473 				if (ret < 0) {
2474 					printk(KERN_ERR "Error expanding "
2475 					       "ipsec packet %d\n",ret);
2476 					goto err;
2477 				}
2478 			}
2479 
2480 			/* ipsec is not expecting ll header */
2481 			skb_pull(skb, ETH_HLEN);
2482 			ret = pktgen_output_ipsec(skb, pkt_dev);
2483 			if (ret) {
2484 				printk(KERN_ERR "Error creating ipsec "
2485 				       "packet %d\n",ret);
2486 				goto err;
2487 			}
2488 			/* restore ll */
2489 			eth = (__u8 *) skb_push(skb, ETH_HLEN);
2490 			memcpy(eth, pkt_dev->hh, 12);
2491 			*(u16 *) & eth[12] = protocol;
2492 		}
2493 	}
2494 	return 1;
2495 err:
2496 	kfree_skb(skb);
2497 	return 0;
2498 }
2499 #endif
2500 
2501 static void mpls_push(__be32 *mpls, struct pktgen_dev *pkt_dev)
2502 {
2503 	unsigned i;
2504 	for (i = 0; i < pkt_dev->nr_labels; i++) {
2505 		*mpls++ = pkt_dev->labels[i] & ~MPLS_STACK_BOTTOM;
2506 	}
2507 	mpls--;
2508 	*mpls |= MPLS_STACK_BOTTOM;
2509 }
2510 
2511 static inline __be16 build_tci(unsigned int id, unsigned int cfi,
2512 			       unsigned int prio)
2513 {
2514 	return htons(id | (cfi << 12) | (prio << 13));
2515 }
2516 
2517 static struct sk_buff *fill_packet_ipv4(struct net_device *odev,
2518 					struct pktgen_dev *pkt_dev)
2519 {
2520 	struct sk_buff *skb = NULL;
2521 	__u8 *eth;
2522 	struct udphdr *udph;
2523 	int datalen, iplen;
2524 	struct iphdr *iph;
2525 	struct pktgen_hdr *pgh = NULL;
2526 	__be16 protocol = htons(ETH_P_IP);
2527 	__be32 *mpls;
2528 	__be16 *vlan_tci = NULL;                 /* Encapsulates priority and VLAN ID */
2529 	__be16 *vlan_encapsulated_proto = NULL;  /* packet type ID field (or len) for VLAN tag */
2530 	__be16 *svlan_tci = NULL;                /* Encapsulates priority and SVLAN ID */
2531 	__be16 *svlan_encapsulated_proto = NULL; /* packet type ID field (or len) for SVLAN tag */
2532 	u16 queue_map;
2533 
2534 	if (pkt_dev->nr_labels)
2535 		protocol = htons(ETH_P_MPLS_UC);
2536 
2537 	if (pkt_dev->vlan_id != 0xffff)
2538 		protocol = htons(ETH_P_8021Q);
2539 
2540 	/* Update any of the values, used when we're incrementing various
2541 	 * fields.
2542 	 */
2543 	queue_map = pkt_dev->cur_queue_map;
2544 	mod_cur_headers(pkt_dev);
2545 
2546 	datalen = (odev->hard_header_len + 16) & ~0xf;
2547 	skb = alloc_skb(pkt_dev->cur_pkt_size + 64 + datalen +
2548 			pkt_dev->pkt_overhead, GFP_ATOMIC);
2549 	if (!skb) {
2550 		sprintf(pkt_dev->result, "No memory");
2551 		return NULL;
2552 	}
2553 
2554 	skb_reserve(skb, datalen);
2555 
2556 	/*  Reserve for ethernet and IP header  */
2557 	eth = (__u8 *) skb_push(skb, 14);
2558 	mpls = (__be32 *)skb_put(skb, pkt_dev->nr_labels*sizeof(__u32));
2559 	if (pkt_dev->nr_labels)
2560 		mpls_push(mpls, pkt_dev);
2561 
2562 	if (pkt_dev->vlan_id != 0xffff) {
2563 		if (pkt_dev->svlan_id != 0xffff) {
2564 			svlan_tci = (__be16 *)skb_put(skb, sizeof(__be16));
2565 			*svlan_tci = build_tci(pkt_dev->svlan_id,
2566 					       pkt_dev->svlan_cfi,
2567 					       pkt_dev->svlan_p);
2568 			svlan_encapsulated_proto = (__be16 *)skb_put(skb, sizeof(__be16));
2569 			*svlan_encapsulated_proto = htons(ETH_P_8021Q);
2570 		}
2571 		vlan_tci = (__be16 *)skb_put(skb, sizeof(__be16));
2572 		*vlan_tci = build_tci(pkt_dev->vlan_id,
2573 				      pkt_dev->vlan_cfi,
2574 				      pkt_dev->vlan_p);
2575 		vlan_encapsulated_proto = (__be16 *)skb_put(skb, sizeof(__be16));
2576 		*vlan_encapsulated_proto = htons(ETH_P_IP);
2577 	}
2578 
2579 	skb->network_header = skb->tail;
2580 	skb->transport_header = skb->network_header + sizeof(struct iphdr);
2581 	skb_put(skb, sizeof(struct iphdr) + sizeof(struct udphdr));
2582 	skb_set_queue_mapping(skb, queue_map);
2583 	iph = ip_hdr(skb);
2584 	udph = udp_hdr(skb);
2585 
2586 	memcpy(eth, pkt_dev->hh, 12);
2587 	*(__be16 *) & eth[12] = protocol;
2588 
2589 	/* Eth + IPh + UDPh + mpls */
2590 	datalen = pkt_dev->cur_pkt_size - 14 - 20 - 8 -
2591 		  pkt_dev->pkt_overhead;
2592 	if (datalen < sizeof(struct pktgen_hdr))
2593 		datalen = sizeof(struct pktgen_hdr);
2594 
2595 	udph->source = htons(pkt_dev->cur_udp_src);
2596 	udph->dest = htons(pkt_dev->cur_udp_dst);
2597 	udph->len = htons(datalen + 8);	/* DATA + udphdr */
2598 	udph->check = 0;	/* No checksum */
2599 
2600 	iph->ihl = 5;
2601 	iph->version = 4;
2602 	iph->ttl = 32;
2603 	iph->tos = pkt_dev->tos;
2604 	iph->protocol = IPPROTO_UDP;	/* UDP */
2605 	iph->saddr = pkt_dev->cur_saddr;
2606 	iph->daddr = pkt_dev->cur_daddr;
2607 	iph->frag_off = 0;
2608 	iplen = 20 + 8 + datalen;
2609 	iph->tot_len = htons(iplen);
2610 	iph->check = 0;
2611 	iph->check = ip_fast_csum((void *)iph, iph->ihl);
2612 	skb->protocol = protocol;
2613 	skb->mac_header = (skb->network_header - ETH_HLEN -
2614 			   pkt_dev->pkt_overhead);
2615 	skb->dev = odev;
2616 	skb->pkt_type = PACKET_HOST;
2617 
2618 	if (pkt_dev->nfrags <= 0)
2619 		pgh = (struct pktgen_hdr *)skb_put(skb, datalen);
2620 	else {
2621 		int frags = pkt_dev->nfrags;
2622 		int i;
2623 
2624 		pgh = (struct pktgen_hdr *)(((char *)(udph)) + 8);
2625 
2626 		if (frags > MAX_SKB_FRAGS)
2627 			frags = MAX_SKB_FRAGS;
2628 		if (datalen > frags * PAGE_SIZE) {
2629 			skb_put(skb, datalen - frags * PAGE_SIZE);
2630 			datalen = frags * PAGE_SIZE;
2631 		}
2632 
2633 		i = 0;
2634 		while (datalen > 0) {
2635 			struct page *page = alloc_pages(GFP_KERNEL, 0);
2636 			skb_shinfo(skb)->frags[i].page = page;
2637 			skb_shinfo(skb)->frags[i].page_offset = 0;
2638 			skb_shinfo(skb)->frags[i].size =
2639 			    (datalen < PAGE_SIZE ? datalen : PAGE_SIZE);
2640 			datalen -= skb_shinfo(skb)->frags[i].size;
2641 			skb->len += skb_shinfo(skb)->frags[i].size;
2642 			skb->data_len += skb_shinfo(skb)->frags[i].size;
2643 			i++;
2644 			skb_shinfo(skb)->nr_frags = i;
2645 		}
2646 
2647 		while (i < frags) {
2648 			int rem;
2649 
2650 			if (i == 0)
2651 				break;
2652 
2653 			rem = skb_shinfo(skb)->frags[i - 1].size / 2;
2654 			if (rem == 0)
2655 				break;
2656 
2657 			skb_shinfo(skb)->frags[i - 1].size -= rem;
2658 
2659 			skb_shinfo(skb)->frags[i] =
2660 			    skb_shinfo(skb)->frags[i - 1];
2661 			get_page(skb_shinfo(skb)->frags[i].page);
2662 			skb_shinfo(skb)->frags[i].page =
2663 			    skb_shinfo(skb)->frags[i - 1].page;
2664 			skb_shinfo(skb)->frags[i].page_offset +=
2665 			    skb_shinfo(skb)->frags[i - 1].size;
2666 			skb_shinfo(skb)->frags[i].size = rem;
2667 			i++;
2668 			skb_shinfo(skb)->nr_frags = i;
2669 		}
2670 	}
2671 
2672 	/* Stamp the time, and sequence number, convert them to network byte order */
2673 
2674 	if (pgh) {
2675 		struct timeval timestamp;
2676 
2677 		pgh->pgh_magic = htonl(PKTGEN_MAGIC);
2678 		pgh->seq_num = htonl(pkt_dev->seq_num);
2679 
2680 		do_gettimeofday(&timestamp);
2681 		pgh->tv_sec = htonl(timestamp.tv_sec);
2682 		pgh->tv_usec = htonl(timestamp.tv_usec);
2683 	}
2684 
2685 #ifdef CONFIG_XFRM
2686 	if (!process_ipsec(pkt_dev, skb, protocol))
2687 		return NULL;
2688 #endif
2689 
2690 	return skb;
2691 }
2692 
2693 /*
2694  * scan_ip6, fmt_ip taken from dietlibc-0.21
2695  * Author Felix von Leitner <felix-dietlibc@fefe.de>
2696  *
2697  * Slightly modified for kernel.
2698  * Should be candidate for net/ipv4/utils.c
2699  * --ro
2700  */
2701 
2702 static unsigned int scan_ip6(const char *s, char ip[16])
2703 {
2704 	unsigned int i;
2705 	unsigned int len = 0;
2706 	unsigned long u;
2707 	char suffix[16];
2708 	unsigned int prefixlen = 0;
2709 	unsigned int suffixlen = 0;
2710 	__be32 tmp;
2711 	char *pos;
2712 
2713 	for (i = 0; i < 16; i++)
2714 		ip[i] = 0;
2715 
2716 	for (;;) {
2717 		if (*s == ':') {
2718 			len++;
2719 			if (s[1] == ':') {	/* Found "::", skip to part 2 */
2720 				s += 2;
2721 				len++;
2722 				break;
2723 			}
2724 			s++;
2725 		}
2726 
2727 		u = simple_strtoul(s, &pos, 16);
2728 		i = pos - s;
2729 		if (!i)
2730 			return 0;
2731 		if (prefixlen == 12 && s[i] == '.') {
2732 
2733 			/* the last 4 bytes may be written as IPv4 address */
2734 
2735 			tmp = in_aton(s);
2736 			memcpy((struct in_addr *)(ip + 12), &tmp, sizeof(tmp));
2737 			return i + len;
2738 		}
2739 		ip[prefixlen++] = (u >> 8);
2740 		ip[prefixlen++] = (u & 255);
2741 		s += i;
2742 		len += i;
2743 		if (prefixlen == 16)
2744 			return len;
2745 	}
2746 
2747 /* part 2, after "::" */
2748 	for (;;) {
2749 		if (*s == ':') {
2750 			if (suffixlen == 0)
2751 				break;
2752 			s++;
2753 			len++;
2754 		} else if (suffixlen != 0)
2755 			break;
2756 
2757 		u = simple_strtol(s, &pos, 16);
2758 		i = pos - s;
2759 		if (!i) {
2760 			if (*s)
2761 				len--;
2762 			break;
2763 		}
2764 		if (suffixlen + prefixlen <= 12 && s[i] == '.') {
2765 			tmp = in_aton(s);
2766 			memcpy((struct in_addr *)(suffix + suffixlen), &tmp,
2767 			       sizeof(tmp));
2768 			suffixlen += 4;
2769 			len += strlen(s);
2770 			break;
2771 		}
2772 		suffix[suffixlen++] = (u >> 8);
2773 		suffix[suffixlen++] = (u & 255);
2774 		s += i;
2775 		len += i;
2776 		if (prefixlen + suffixlen == 16)
2777 			break;
2778 	}
2779 	for (i = 0; i < suffixlen; i++)
2780 		ip[16 - suffixlen + i] = suffix[i];
2781 	return len;
2782 }
2783 
2784 static char tohex(char hexdigit)
2785 {
2786 	return hexdigit > 9 ? hexdigit + 'a' - 10 : hexdigit + '0';
2787 }
2788 
2789 static int fmt_xlong(char *s, unsigned int i)
2790 {
2791 	char *bak = s;
2792 	*s = tohex((i >> 12) & 0xf);
2793 	if (s != bak || *s != '0')
2794 		++s;
2795 	*s = tohex((i >> 8) & 0xf);
2796 	if (s != bak || *s != '0')
2797 		++s;
2798 	*s = tohex((i >> 4) & 0xf);
2799 	if (s != bak || *s != '0')
2800 		++s;
2801 	*s = tohex(i & 0xf);
2802 	return s - bak + 1;
2803 }
2804 
2805 static unsigned int fmt_ip6(char *s, const char ip[16])
2806 {
2807 	unsigned int len;
2808 	unsigned int i;
2809 	unsigned int temp;
2810 	unsigned int compressing;
2811 	int j;
2812 
2813 	len = 0;
2814 	compressing = 0;
2815 	for (j = 0; j < 16; j += 2) {
2816 
2817 #ifdef V4MAPPEDPREFIX
2818 		if (j == 12 && !memcmp(ip, V4mappedprefix, 12)) {
2819 			inet_ntoa_r(*(struct in_addr *)(ip + 12), s);
2820 			temp = strlen(s);
2821 			return len + temp;
2822 		}
2823 #endif
2824 		temp = ((unsigned long)(unsigned char)ip[j] << 8) +
2825 		    (unsigned long)(unsigned char)ip[j + 1];
2826 		if (temp == 0) {
2827 			if (!compressing) {
2828 				compressing = 1;
2829 				if (j == 0) {
2830 					*s++ = ':';
2831 					++len;
2832 				}
2833 			}
2834 		} else {
2835 			if (compressing) {
2836 				compressing = 0;
2837 				*s++ = ':';
2838 				++len;
2839 			}
2840 			i = fmt_xlong(s, temp);
2841 			len += i;
2842 			s += i;
2843 			if (j < 14) {
2844 				*s++ = ':';
2845 				++len;
2846 			}
2847 		}
2848 	}
2849 	if (compressing) {
2850 		*s++ = ':';
2851 		++len;
2852 	}
2853 	*s = 0;
2854 	return len;
2855 }
2856 
2857 static struct sk_buff *fill_packet_ipv6(struct net_device *odev,
2858 					struct pktgen_dev *pkt_dev)
2859 {
2860 	struct sk_buff *skb = NULL;
2861 	__u8 *eth;
2862 	struct udphdr *udph;
2863 	int datalen;
2864 	struct ipv6hdr *iph;
2865 	struct pktgen_hdr *pgh = NULL;
2866 	__be16 protocol = htons(ETH_P_IPV6);
2867 	__be32 *mpls;
2868 	__be16 *vlan_tci = NULL;                 /* Encapsulates priority and VLAN ID */
2869 	__be16 *vlan_encapsulated_proto = NULL;  /* packet type ID field (or len) for VLAN tag */
2870 	__be16 *svlan_tci = NULL;                /* Encapsulates priority and SVLAN ID */
2871 	__be16 *svlan_encapsulated_proto = NULL; /* packet type ID field (or len) for SVLAN tag */
2872 	u16 queue_map;
2873 
2874 	if (pkt_dev->nr_labels)
2875 		protocol = htons(ETH_P_MPLS_UC);
2876 
2877 	if (pkt_dev->vlan_id != 0xffff)
2878 		protocol = htons(ETH_P_8021Q);
2879 
2880 	/* Update any of the values, used when we're incrementing various
2881 	 * fields.
2882 	 */
2883 	queue_map = pkt_dev->cur_queue_map;
2884 	mod_cur_headers(pkt_dev);
2885 
2886 	skb = alloc_skb(pkt_dev->cur_pkt_size + 64 + 16 +
2887 			pkt_dev->pkt_overhead, GFP_ATOMIC);
2888 	if (!skb) {
2889 		sprintf(pkt_dev->result, "No memory");
2890 		return NULL;
2891 	}
2892 
2893 	skb_reserve(skb, 16);
2894 
2895 	/*  Reserve for ethernet and IP header  */
2896 	eth = (__u8 *) skb_push(skb, 14);
2897 	mpls = (__be32 *)skb_put(skb, pkt_dev->nr_labels*sizeof(__u32));
2898 	if (pkt_dev->nr_labels)
2899 		mpls_push(mpls, pkt_dev);
2900 
2901 	if (pkt_dev->vlan_id != 0xffff) {
2902 		if (pkt_dev->svlan_id != 0xffff) {
2903 			svlan_tci = (__be16 *)skb_put(skb, sizeof(__be16));
2904 			*svlan_tci = build_tci(pkt_dev->svlan_id,
2905 					       pkt_dev->svlan_cfi,
2906 					       pkt_dev->svlan_p);
2907 			svlan_encapsulated_proto = (__be16 *)skb_put(skb, sizeof(__be16));
2908 			*svlan_encapsulated_proto = htons(ETH_P_8021Q);
2909 		}
2910 		vlan_tci = (__be16 *)skb_put(skb, sizeof(__be16));
2911 		*vlan_tci = build_tci(pkt_dev->vlan_id,
2912 				      pkt_dev->vlan_cfi,
2913 				      pkt_dev->vlan_p);
2914 		vlan_encapsulated_proto = (__be16 *)skb_put(skb, sizeof(__be16));
2915 		*vlan_encapsulated_proto = htons(ETH_P_IPV6);
2916 	}
2917 
2918 	skb->network_header = skb->tail;
2919 	skb->transport_header = skb->network_header + sizeof(struct ipv6hdr);
2920 	skb_put(skb, sizeof(struct ipv6hdr) + sizeof(struct udphdr));
2921 	skb_set_queue_mapping(skb, queue_map);
2922 	iph = ipv6_hdr(skb);
2923 	udph = udp_hdr(skb);
2924 
2925 	memcpy(eth, pkt_dev->hh, 12);
2926 	*(__be16 *) & eth[12] = protocol;
2927 
2928 	/* Eth + IPh + UDPh + mpls */
2929 	datalen = pkt_dev->cur_pkt_size - 14 -
2930 		  sizeof(struct ipv6hdr) - sizeof(struct udphdr) -
2931 		  pkt_dev->pkt_overhead;
2932 
2933 	if (datalen < sizeof(struct pktgen_hdr)) {
2934 		datalen = sizeof(struct pktgen_hdr);
2935 		if (net_ratelimit())
2936 			printk(KERN_INFO "pktgen: increased datalen to %d\n",
2937 			       datalen);
2938 	}
2939 
2940 	udph->source = htons(pkt_dev->cur_udp_src);
2941 	udph->dest = htons(pkt_dev->cur_udp_dst);
2942 	udph->len = htons(datalen + sizeof(struct udphdr));
2943 	udph->check = 0;	/* No checksum */
2944 
2945 	*(__be32 *) iph = htonl(0x60000000);	/* Version + flow */
2946 
2947 	if (pkt_dev->traffic_class) {
2948 		/* Version + traffic class + flow (0) */
2949 		*(__be32 *)iph |= htonl(0x60000000 | (pkt_dev->traffic_class << 20));
2950 	}
2951 
2952 	iph->hop_limit = 32;
2953 
2954 	iph->payload_len = htons(sizeof(struct udphdr) + datalen);
2955 	iph->nexthdr = IPPROTO_UDP;
2956 
2957 	ipv6_addr_copy(&iph->daddr, &pkt_dev->cur_in6_daddr);
2958 	ipv6_addr_copy(&iph->saddr, &pkt_dev->cur_in6_saddr);
2959 
2960 	skb->mac_header = (skb->network_header - ETH_HLEN -
2961 			   pkt_dev->pkt_overhead);
2962 	skb->protocol = protocol;
2963 	skb->dev = odev;
2964 	skb->pkt_type = PACKET_HOST;
2965 
2966 	if (pkt_dev->nfrags <= 0)
2967 		pgh = (struct pktgen_hdr *)skb_put(skb, datalen);
2968 	else {
2969 		int frags = pkt_dev->nfrags;
2970 		int i;
2971 
2972 		pgh = (struct pktgen_hdr *)(((char *)(udph)) + 8);
2973 
2974 		if (frags > MAX_SKB_FRAGS)
2975 			frags = MAX_SKB_FRAGS;
2976 		if (datalen > frags * PAGE_SIZE) {
2977 			skb_put(skb, datalen - frags * PAGE_SIZE);
2978 			datalen = frags * PAGE_SIZE;
2979 		}
2980 
2981 		i = 0;
2982 		while (datalen > 0) {
2983 			struct page *page = alloc_pages(GFP_KERNEL, 0);
2984 			skb_shinfo(skb)->frags[i].page = page;
2985 			skb_shinfo(skb)->frags[i].page_offset = 0;
2986 			skb_shinfo(skb)->frags[i].size =
2987 			    (datalen < PAGE_SIZE ? datalen : PAGE_SIZE);
2988 			datalen -= skb_shinfo(skb)->frags[i].size;
2989 			skb->len += skb_shinfo(skb)->frags[i].size;
2990 			skb->data_len += skb_shinfo(skb)->frags[i].size;
2991 			i++;
2992 			skb_shinfo(skb)->nr_frags = i;
2993 		}
2994 
2995 		while (i < frags) {
2996 			int rem;
2997 
2998 			if (i == 0)
2999 				break;
3000 
3001 			rem = skb_shinfo(skb)->frags[i - 1].size / 2;
3002 			if (rem == 0)
3003 				break;
3004 
3005 			skb_shinfo(skb)->frags[i - 1].size -= rem;
3006 
3007 			skb_shinfo(skb)->frags[i] =
3008 			    skb_shinfo(skb)->frags[i - 1];
3009 			get_page(skb_shinfo(skb)->frags[i].page);
3010 			skb_shinfo(skb)->frags[i].page =
3011 			    skb_shinfo(skb)->frags[i - 1].page;
3012 			skb_shinfo(skb)->frags[i].page_offset +=
3013 			    skb_shinfo(skb)->frags[i - 1].size;
3014 			skb_shinfo(skb)->frags[i].size = rem;
3015 			i++;
3016 			skb_shinfo(skb)->nr_frags = i;
3017 		}
3018 	}
3019 
3020 	/* Stamp the time, and sequence number, convert them to network byte order */
3021 	/* should we update cloned packets too ? */
3022 	if (pgh) {
3023 		struct timeval timestamp;
3024 
3025 		pgh->pgh_magic = htonl(PKTGEN_MAGIC);
3026 		pgh->seq_num = htonl(pkt_dev->seq_num);
3027 
3028 		do_gettimeofday(&timestamp);
3029 		pgh->tv_sec = htonl(timestamp.tv_sec);
3030 		pgh->tv_usec = htonl(timestamp.tv_usec);
3031 	}
3032 	/* pkt_dev->seq_num++; FF: you really mean this? */
3033 
3034 	return skb;
3035 }
3036 
3037 static inline struct sk_buff *fill_packet(struct net_device *odev,
3038 					  struct pktgen_dev *pkt_dev)
3039 {
3040 	if (pkt_dev->flags & F_IPV6)
3041 		return fill_packet_ipv6(odev, pkt_dev);
3042 	else
3043 		return fill_packet_ipv4(odev, pkt_dev);
3044 }
3045 
3046 static void pktgen_clear_counters(struct pktgen_dev *pkt_dev)
3047 {
3048 	pkt_dev->seq_num = 1;
3049 	pkt_dev->idle_acc = 0;
3050 	pkt_dev->sofar = 0;
3051 	pkt_dev->tx_bytes = 0;
3052 	pkt_dev->errors = 0;
3053 }
3054 
3055 /* Set up structure for sending pkts, clear counters */
3056 
3057 static void pktgen_run(struct pktgen_thread *t)
3058 {
3059 	struct pktgen_dev *pkt_dev;
3060 	int started = 0;
3061 
3062 	pr_debug("pktgen: entering pktgen_run. %p\n", t);
3063 
3064 	if_lock(t);
3065 	list_for_each_entry(pkt_dev, &t->if_list, list) {
3066 
3067 		/*
3068 		 * setup odev and create initial packet.
3069 		 */
3070 		pktgen_setup_inject(pkt_dev);
3071 
3072 		if (pkt_dev->odev) {
3073 			pktgen_clear_counters(pkt_dev);
3074 			pkt_dev->running = 1;	/* Cranke yeself! */
3075 			pkt_dev->skb = NULL;
3076 			pkt_dev->started_at = getCurUs();
3077 			pkt_dev->next_tx_us = getCurUs();	/* Transmit immediately */
3078 			pkt_dev->next_tx_ns = 0;
3079 			set_pkt_overhead(pkt_dev);
3080 
3081 			strcpy(pkt_dev->result, "Starting");
3082 			started++;
3083 		} else
3084 			strcpy(pkt_dev->result, "Error starting");
3085 	}
3086 	if_unlock(t);
3087 	if (started)
3088 		t->control &= ~(T_STOP);
3089 }
3090 
3091 static void pktgen_stop_all_threads_ifs(void)
3092 {
3093 	struct pktgen_thread *t;
3094 
3095 	pr_debug("pktgen: entering pktgen_stop_all_threads_ifs.\n");
3096 
3097 	mutex_lock(&pktgen_thread_lock);
3098 
3099 	list_for_each_entry(t, &pktgen_threads, th_list)
3100 		t->control |= T_STOP;
3101 
3102 	mutex_unlock(&pktgen_thread_lock);
3103 }
3104 
3105 static int thread_is_running(struct pktgen_thread *t)
3106 {
3107 	struct pktgen_dev *pkt_dev;
3108 	int res = 0;
3109 
3110 	list_for_each_entry(pkt_dev, &t->if_list, list)
3111 		if (pkt_dev->running) {
3112 			res = 1;
3113 			break;
3114 		}
3115 	return res;
3116 }
3117 
3118 static int pktgen_wait_thread_run(struct pktgen_thread *t)
3119 {
3120 	if_lock(t);
3121 
3122 	while (thread_is_running(t)) {
3123 
3124 		if_unlock(t);
3125 
3126 		msleep_interruptible(100);
3127 
3128 		if (signal_pending(current))
3129 			goto signal;
3130 		if_lock(t);
3131 	}
3132 	if_unlock(t);
3133 	return 1;
3134 signal:
3135 	return 0;
3136 }
3137 
3138 static int pktgen_wait_all_threads_run(void)
3139 {
3140 	struct pktgen_thread *t;
3141 	int sig = 1;
3142 
3143 	mutex_lock(&pktgen_thread_lock);
3144 
3145 	list_for_each_entry(t, &pktgen_threads, th_list) {
3146 		sig = pktgen_wait_thread_run(t);
3147 		if (sig == 0)
3148 			break;
3149 	}
3150 
3151 	if (sig == 0)
3152 		list_for_each_entry(t, &pktgen_threads, th_list)
3153 			t->control |= (T_STOP);
3154 
3155 	mutex_unlock(&pktgen_thread_lock);
3156 	return sig;
3157 }
3158 
3159 static void pktgen_run_all_threads(void)
3160 {
3161 	struct pktgen_thread *t;
3162 
3163 	pr_debug("pktgen: entering pktgen_run_all_threads.\n");
3164 
3165 	mutex_lock(&pktgen_thread_lock);
3166 
3167 	list_for_each_entry(t, &pktgen_threads, th_list)
3168 		t->control |= (T_RUN);
3169 
3170 	mutex_unlock(&pktgen_thread_lock);
3171 
3172 	schedule_timeout_interruptible(msecs_to_jiffies(125));	/* Propagate thread->control  */
3173 
3174 	pktgen_wait_all_threads_run();
3175 }
3176 
3177 static void show_results(struct pktgen_dev *pkt_dev, int nr_frags)
3178 {
3179 	__u64 total_us, bps, mbps, pps, idle;
3180 	char *p = pkt_dev->result;
3181 
3182 	total_us = pkt_dev->stopped_at - pkt_dev->started_at;
3183 
3184 	idle = pkt_dev->idle_acc;
3185 
3186 	p += sprintf(p, "OK: %llu(c%llu+d%llu) usec, %llu (%dbyte,%dfrags)\n",
3187 		     (unsigned long long)total_us,
3188 		     (unsigned long long)(total_us - idle),
3189 		     (unsigned long long)idle,
3190 		     (unsigned long long)pkt_dev->sofar,
3191 		     pkt_dev->cur_pkt_size, nr_frags);
3192 
3193 	pps = pkt_dev->sofar * USEC_PER_SEC;
3194 
3195 	while ((total_us >> 32) != 0) {
3196 		pps >>= 1;
3197 		total_us >>= 1;
3198 	}
3199 
3200 	do_div(pps, total_us);
3201 
3202 	bps = pps * 8 * pkt_dev->cur_pkt_size;
3203 
3204 	mbps = bps;
3205 	do_div(mbps, 1000000);
3206 	p += sprintf(p, "  %llupps %lluMb/sec (%llubps) errors: %llu",
3207 		     (unsigned long long)pps,
3208 		     (unsigned long long)mbps,
3209 		     (unsigned long long)bps,
3210 		     (unsigned long long)pkt_dev->errors);
3211 }
3212 
3213 /* Set stopped-at timer, remove from running list, do counters & statistics */
3214 
3215 static int pktgen_stop_device(struct pktgen_dev *pkt_dev)
3216 {
3217 	int nr_frags = pkt_dev->skb ? skb_shinfo(pkt_dev->skb)->nr_frags : -1;
3218 
3219 	if (!pkt_dev->running) {
3220 		printk(KERN_WARNING "pktgen: interface: %s is already "
3221 		       "stopped\n", pkt_dev->odev->name);
3222 		return -EINVAL;
3223 	}
3224 
3225 	pkt_dev->stopped_at = getCurUs();
3226 	pkt_dev->running = 0;
3227 
3228 	show_results(pkt_dev, nr_frags);
3229 
3230 	return 0;
3231 }
3232 
3233 static struct pktgen_dev *next_to_run(struct pktgen_thread *t)
3234 {
3235 	struct pktgen_dev *pkt_dev, *best = NULL;
3236 
3237 	if_lock(t);
3238 
3239 	list_for_each_entry(pkt_dev, &t->if_list, list) {
3240 		if (!pkt_dev->running)
3241 			continue;
3242 		if (best == NULL)
3243 			best = pkt_dev;
3244 		else if (pkt_dev->next_tx_us < best->next_tx_us)
3245 			best = pkt_dev;
3246 	}
3247 	if_unlock(t);
3248 	return best;
3249 }
3250 
3251 static void pktgen_stop(struct pktgen_thread *t)
3252 {
3253 	struct pktgen_dev *pkt_dev;
3254 
3255 	pr_debug("pktgen: entering pktgen_stop\n");
3256 
3257 	if_lock(t);
3258 
3259 	list_for_each_entry(pkt_dev, &t->if_list, list) {
3260 		pktgen_stop_device(pkt_dev);
3261 		if (pkt_dev->skb)
3262 			kfree_skb(pkt_dev->skb);
3263 
3264 		pkt_dev->skb = NULL;
3265 	}
3266 
3267 	if_unlock(t);
3268 }
3269 
3270 /*
3271  * one of our devices needs to be removed - find it
3272  * and remove it
3273  */
3274 static void pktgen_rem_one_if(struct pktgen_thread *t)
3275 {
3276 	struct list_head *q, *n;
3277 	struct pktgen_dev *cur;
3278 
3279 	pr_debug("pktgen: entering pktgen_rem_one_if\n");
3280 
3281 	if_lock(t);
3282 
3283 	list_for_each_safe(q, n, &t->if_list) {
3284 		cur = list_entry(q, struct pktgen_dev, list);
3285 
3286 		if (!cur->removal_mark)
3287 			continue;
3288 
3289 		if (cur->skb)
3290 			kfree_skb(cur->skb);
3291 		cur->skb = NULL;
3292 
3293 		pktgen_remove_device(t, cur);
3294 
3295 		break;
3296 	}
3297 
3298 	if_unlock(t);
3299 }
3300 
3301 static void pktgen_rem_all_ifs(struct pktgen_thread *t)
3302 {
3303 	struct list_head *q, *n;
3304 	struct pktgen_dev *cur;
3305 
3306 	/* Remove all devices, free mem */
3307 
3308 	pr_debug("pktgen: entering pktgen_rem_all_ifs\n");
3309 	if_lock(t);
3310 
3311 	list_for_each_safe(q, n, &t->if_list) {
3312 		cur = list_entry(q, struct pktgen_dev, list);
3313 
3314 		if (cur->skb)
3315 			kfree_skb(cur->skb);
3316 		cur->skb = NULL;
3317 
3318 		pktgen_remove_device(t, cur);
3319 	}
3320 
3321 	if_unlock(t);
3322 }
3323 
3324 static void pktgen_rem_thread(struct pktgen_thread *t)
3325 {
3326 	/* Remove from the thread list */
3327 
3328 	remove_proc_entry(t->tsk->comm, pg_proc_dir);
3329 
3330 	mutex_lock(&pktgen_thread_lock);
3331 
3332 	list_del(&t->th_list);
3333 
3334 	mutex_unlock(&pktgen_thread_lock);
3335 }
3336 
3337 static __inline__ void pktgen_xmit(struct pktgen_dev *pkt_dev)
3338 {
3339 	struct net_device *odev = NULL;
3340 	struct netdev_queue *txq;
3341 	__u64 idle_start = 0;
3342 	u16 queue_map;
3343 	int ret;
3344 
3345 	odev = pkt_dev->odev;
3346 
3347 	if (pkt_dev->delay_us || pkt_dev->delay_ns) {
3348 		u64 now;
3349 
3350 		now = getCurUs();
3351 		if (now < pkt_dev->next_tx_us)
3352 			spin(pkt_dev, pkt_dev->next_tx_us);
3353 
3354 		/* This is max DELAY, this has special meaning of
3355 		 * "never transmit"
3356 		 */
3357 		if (pkt_dev->delay_us == 0x7FFFFFFF) {
3358 			pkt_dev->next_tx_us = getCurUs() + pkt_dev->delay_us;
3359 			pkt_dev->next_tx_ns = pkt_dev->delay_ns;
3360 			goto out;
3361 		}
3362 	}
3363 
3364 	if (!pkt_dev->skb) {
3365 		set_cur_queue_map(pkt_dev);
3366 		queue_map = pkt_dev->cur_queue_map;
3367 	} else {
3368 		queue_map = skb_get_queue_mapping(pkt_dev->skb);
3369 	}
3370 
3371 	txq = netdev_get_tx_queue(odev, queue_map);
3372 	if (netif_tx_queue_stopped(txq) ||
3373 	    netif_tx_queue_frozen(txq) ||
3374 	    need_resched()) {
3375 		idle_start = getCurUs();
3376 
3377 		if (!netif_running(odev)) {
3378 			pktgen_stop_device(pkt_dev);
3379 			if (pkt_dev->skb)
3380 				kfree_skb(pkt_dev->skb);
3381 			pkt_dev->skb = NULL;
3382 			goto out;
3383 		}
3384 		if (need_resched())
3385 			schedule();
3386 
3387 		pkt_dev->idle_acc += getCurUs() - idle_start;
3388 
3389 		if (netif_tx_queue_stopped(txq) ||
3390 		    netif_tx_queue_frozen(txq)) {
3391 			pkt_dev->next_tx_us = getCurUs();	/* TODO */
3392 			pkt_dev->next_tx_ns = 0;
3393 			goto out;	/* Try the next interface */
3394 		}
3395 	}
3396 
3397 	if (pkt_dev->last_ok || !pkt_dev->skb) {
3398 		if ((++pkt_dev->clone_count >= pkt_dev->clone_skb)
3399 		    || (!pkt_dev->skb)) {
3400 			/* build a new pkt */
3401 			if (pkt_dev->skb)
3402 				kfree_skb(pkt_dev->skb);
3403 
3404 			pkt_dev->skb = fill_packet(odev, pkt_dev);
3405 			if (pkt_dev->skb == NULL) {
3406 				printk(KERN_ERR "pktgen: ERROR: couldn't "
3407 				       "allocate skb in fill_packet.\n");
3408 				schedule();
3409 				pkt_dev->clone_count--;	/* back out increment, OOM */
3410 				goto out;
3411 			}
3412 			pkt_dev->allocated_skbs++;
3413 			pkt_dev->clone_count = 0;	/* reset counter */
3414 		}
3415 	}
3416 
3417 	/* fill_packet() might have changed the queue */
3418 	queue_map = skb_get_queue_mapping(pkt_dev->skb);
3419 	txq = netdev_get_tx_queue(odev, queue_map);
3420 
3421 	__netif_tx_lock_bh(txq);
3422 	if (!netif_tx_queue_stopped(txq) &&
3423 	    !netif_tx_queue_frozen(txq)) {
3424 
3425 		atomic_inc(&(pkt_dev->skb->users));
3426 	      retry_now:
3427 		ret = odev->hard_start_xmit(pkt_dev->skb, odev);
3428 		if (likely(ret == NETDEV_TX_OK)) {
3429 			pkt_dev->last_ok = 1;
3430 			pkt_dev->sofar++;
3431 			pkt_dev->seq_num++;
3432 			pkt_dev->tx_bytes += pkt_dev->cur_pkt_size;
3433 
3434 		} else if (ret == NETDEV_TX_LOCKED
3435 			   && (odev->features & NETIF_F_LLTX)) {
3436 			cpu_relax();
3437 			goto retry_now;
3438 		} else {	/* Retry it next time */
3439 
3440 			atomic_dec(&(pkt_dev->skb->users));
3441 
3442 			if (debug && net_ratelimit())
3443 				printk(KERN_INFO "pktgen: Hard xmit error\n");
3444 
3445 			pkt_dev->errors++;
3446 			pkt_dev->last_ok = 0;
3447 		}
3448 
3449 		pkt_dev->next_tx_us = getCurUs();
3450 		pkt_dev->next_tx_ns = 0;
3451 
3452 		pkt_dev->next_tx_us += pkt_dev->delay_us;
3453 		pkt_dev->next_tx_ns += pkt_dev->delay_ns;
3454 
3455 		if (pkt_dev->next_tx_ns > 1000) {
3456 			pkt_dev->next_tx_us++;
3457 			pkt_dev->next_tx_ns -= 1000;
3458 		}
3459 	}
3460 
3461 	else {			/* Retry it next time */
3462 		pkt_dev->last_ok = 0;
3463 		pkt_dev->next_tx_us = getCurUs();	/* TODO */
3464 		pkt_dev->next_tx_ns = 0;
3465 	}
3466 
3467 	__netif_tx_unlock_bh(txq);
3468 
3469 	/* If pkt_dev->count is zero, then run forever */
3470 	if ((pkt_dev->count != 0) && (pkt_dev->sofar >= pkt_dev->count)) {
3471 		if (atomic_read(&(pkt_dev->skb->users)) != 1) {
3472 			idle_start = getCurUs();
3473 			while (atomic_read(&(pkt_dev->skb->users)) != 1) {
3474 				if (signal_pending(current)) {
3475 					break;
3476 				}
3477 				schedule();
3478 			}
3479 			pkt_dev->idle_acc += getCurUs() - idle_start;
3480 		}
3481 
3482 		/* Done with this */
3483 		pktgen_stop_device(pkt_dev);
3484 		if (pkt_dev->skb)
3485 			kfree_skb(pkt_dev->skb);
3486 		pkt_dev->skb = NULL;
3487 	}
3488 out:;
3489 }
3490 
3491 /*
3492  * Main loop of the thread goes here
3493  */
3494 
3495 static int pktgen_thread_worker(void *arg)
3496 {
3497 	DEFINE_WAIT(wait);
3498 	struct pktgen_thread *t = arg;
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 
3507 	pr_debug("pktgen: starting pktgen/%d:  pid=%d\n", cpu, task_pid_nr(current));
3508 
3509 	set_current_state(TASK_INTERRUPTIBLE);
3510 
3511 	set_freezable();
3512 
3513 	while (!kthread_should_stop()) {
3514 		pkt_dev = next_to_run(t);
3515 
3516 		if (!pkt_dev &&
3517 		    (t->control & (T_STOP | T_RUN | T_REMDEVALL | T_REMDEV))
3518 		    == 0) {
3519 			prepare_to_wait(&(t->queue), &wait,
3520 					TASK_INTERRUPTIBLE);
3521 			schedule_timeout(HZ / 10);
3522 			finish_wait(&(t->queue), &wait);
3523 		}
3524 
3525 		__set_current_state(TASK_RUNNING);
3526 
3527 		if (pkt_dev)
3528 			pktgen_xmit(pkt_dev);
3529 
3530 		if (t->control & T_STOP) {
3531 			pktgen_stop(t);
3532 			t->control &= ~(T_STOP);
3533 		}
3534 
3535 		if (t->control & T_RUN) {
3536 			pktgen_run(t);
3537 			t->control &= ~(T_RUN);
3538 		}
3539 
3540 		if (t->control & T_REMDEVALL) {
3541 			pktgen_rem_all_ifs(t);
3542 			t->control &= ~(T_REMDEVALL);
3543 		}
3544 
3545 		if (t->control & T_REMDEV) {
3546 			pktgen_rem_one_if(t);
3547 			t->control &= ~(T_REMDEV);
3548 		}
3549 
3550 		try_to_freeze();
3551 
3552 		set_current_state(TASK_INTERRUPTIBLE);
3553 	}
3554 
3555 	pr_debug("pktgen: %s stopping all device\n", t->tsk->comm);
3556 	pktgen_stop(t);
3557 
3558 	pr_debug("pktgen: %s removing all device\n", t->tsk->comm);
3559 	pktgen_rem_all_ifs(t);
3560 
3561 	pr_debug("pktgen: %s removing thread.\n", t->tsk->comm);
3562 	pktgen_rem_thread(t);
3563 
3564 	return 0;
3565 }
3566 
3567 static struct pktgen_dev *pktgen_find_dev(struct pktgen_thread *t,
3568 					  const char *ifname)
3569 {
3570 	struct pktgen_dev *p, *pkt_dev = NULL;
3571 	if_lock(t);
3572 
3573 	list_for_each_entry(p, &t->if_list, list)
3574 		if (strncmp(p->odev->name, ifname, IFNAMSIZ) == 0) {
3575 			pkt_dev = p;
3576 			break;
3577 		}
3578 
3579 	if_unlock(t);
3580 	pr_debug("pktgen: find_dev(%s) returning %p\n", ifname, pkt_dev);
3581 	return pkt_dev;
3582 }
3583 
3584 /*
3585  * Adds a dev at front of if_list.
3586  */
3587 
3588 static int add_dev_to_thread(struct pktgen_thread *t,
3589 			     struct pktgen_dev *pkt_dev)
3590 {
3591 	int rv = 0;
3592 
3593 	if_lock(t);
3594 
3595 	if (pkt_dev->pg_thread) {
3596 		printk(KERN_ERR "pktgen: ERROR: already assigned "
3597 		       "to a thread.\n");
3598 		rv = -EBUSY;
3599 		goto out;
3600 	}
3601 
3602 	list_add(&pkt_dev->list, &t->if_list);
3603 	pkt_dev->pg_thread = t;
3604 	pkt_dev->running = 0;
3605 
3606 out:
3607 	if_unlock(t);
3608 	return rv;
3609 }
3610 
3611 /* Called under thread lock */
3612 
3613 static int pktgen_add_device(struct pktgen_thread *t, const char *ifname)
3614 {
3615 	struct pktgen_dev *pkt_dev;
3616 	int err;
3617 
3618 	/* We don't allow a device to be on several threads */
3619 
3620 	pkt_dev = __pktgen_NN_threads(ifname, FIND);
3621 	if (pkt_dev) {
3622 		printk(KERN_ERR "pktgen: ERROR: interface already used.\n");
3623 		return -EBUSY;
3624 	}
3625 
3626 	pkt_dev = kzalloc(sizeof(struct pktgen_dev), GFP_KERNEL);
3627 	if (!pkt_dev)
3628 		return -ENOMEM;
3629 
3630 	pkt_dev->flows = vmalloc(MAX_CFLOWS * sizeof(struct flow_state));
3631 	if (pkt_dev->flows == NULL) {
3632 		kfree(pkt_dev);
3633 		return -ENOMEM;
3634 	}
3635 	memset(pkt_dev->flows, 0, MAX_CFLOWS * sizeof(struct flow_state));
3636 
3637 	pkt_dev->removal_mark = 0;
3638 	pkt_dev->min_pkt_size = ETH_ZLEN;
3639 	pkt_dev->max_pkt_size = ETH_ZLEN;
3640 	pkt_dev->nfrags = 0;
3641 	pkt_dev->clone_skb = pg_clone_skb_d;
3642 	pkt_dev->delay_us = pg_delay_d / 1000;
3643 	pkt_dev->delay_ns = pg_delay_d % 1000;
3644 	pkt_dev->count = pg_count_d;
3645 	pkt_dev->sofar = 0;
3646 	pkt_dev->udp_src_min = 9;	/* sink port */
3647 	pkt_dev->udp_src_max = 9;
3648 	pkt_dev->udp_dst_min = 9;
3649 	pkt_dev->udp_dst_max = 9;
3650 
3651 	pkt_dev->vlan_p = 0;
3652 	pkt_dev->vlan_cfi = 0;
3653 	pkt_dev->vlan_id = 0xffff;
3654 	pkt_dev->svlan_p = 0;
3655 	pkt_dev->svlan_cfi = 0;
3656 	pkt_dev->svlan_id = 0xffff;
3657 
3658 	err = pktgen_setup_dev(pkt_dev, ifname);
3659 	if (err)
3660 		goto out1;
3661 
3662 	pkt_dev->entry = proc_create_data(ifname, 0600, pg_proc_dir,
3663 					  &pktgen_if_fops, pkt_dev);
3664 	if (!pkt_dev->entry) {
3665 		printk(KERN_ERR "pktgen: cannot create %s/%s procfs entry.\n",
3666 		       PG_PROC_DIR, ifname);
3667 		err = -EINVAL;
3668 		goto out2;
3669 	}
3670 #ifdef CONFIG_XFRM
3671 	pkt_dev->ipsmode = XFRM_MODE_TRANSPORT;
3672 	pkt_dev->ipsproto = IPPROTO_ESP;
3673 #endif
3674 
3675 	return add_dev_to_thread(t, pkt_dev);
3676 out2:
3677 	dev_put(pkt_dev->odev);
3678 out1:
3679 #ifdef CONFIG_XFRM
3680 	free_SAs(pkt_dev);
3681 #endif
3682 	if (pkt_dev->flows)
3683 		vfree(pkt_dev->flows);
3684 	kfree(pkt_dev);
3685 	return err;
3686 }
3687 
3688 static int __init pktgen_create_thread(int cpu)
3689 {
3690 	struct pktgen_thread *t;
3691 	struct proc_dir_entry *pe;
3692 	struct task_struct *p;
3693 
3694 	t = kzalloc(sizeof(struct pktgen_thread), GFP_KERNEL);
3695 	if (!t) {
3696 		printk(KERN_ERR "pktgen: ERROR: out of memory, can't "
3697 		       "create new thread.\n");
3698 		return -ENOMEM;
3699 	}
3700 
3701 	spin_lock_init(&t->if_lock);
3702 	t->cpu = cpu;
3703 
3704 	INIT_LIST_HEAD(&t->if_list);
3705 
3706 	list_add_tail(&t->th_list, &pktgen_threads);
3707 	init_completion(&t->start_done);
3708 
3709 	p = kthread_create(pktgen_thread_worker, t, "kpktgend_%d", cpu);
3710 	if (IS_ERR(p)) {
3711 		printk(KERN_ERR "pktgen: kernel_thread() failed "
3712 		       "for cpu %d\n", t->cpu);
3713 		list_del(&t->th_list);
3714 		kfree(t);
3715 		return PTR_ERR(p);
3716 	}
3717 	kthread_bind(p, cpu);
3718 	t->tsk = p;
3719 
3720 	pe = proc_create_data(t->tsk->comm, 0600, pg_proc_dir,
3721 			      &pktgen_thread_fops, t);
3722 	if (!pe) {
3723 		printk(KERN_ERR "pktgen: cannot create %s/%s procfs entry.\n",
3724 		       PG_PROC_DIR, t->tsk->comm);
3725 		kthread_stop(p);
3726 		list_del(&t->th_list);
3727 		kfree(t);
3728 		return -EINVAL;
3729 	}
3730 
3731 	wake_up_process(p);
3732 	wait_for_completion(&t->start_done);
3733 
3734 	return 0;
3735 }
3736 
3737 /*
3738  * Removes a device from the thread if_list.
3739  */
3740 static void _rem_dev_from_if_list(struct pktgen_thread *t,
3741 				  struct pktgen_dev *pkt_dev)
3742 {
3743 	struct list_head *q, *n;
3744 	struct pktgen_dev *p;
3745 
3746 	list_for_each_safe(q, n, &t->if_list) {
3747 		p = list_entry(q, struct pktgen_dev, list);
3748 		if (p == pkt_dev)
3749 			list_del(&p->list);
3750 	}
3751 }
3752 
3753 static int pktgen_remove_device(struct pktgen_thread *t,
3754 				struct pktgen_dev *pkt_dev)
3755 {
3756 
3757 	pr_debug("pktgen: remove_device pkt_dev=%p\n", pkt_dev);
3758 
3759 	if (pkt_dev->running) {
3760 		printk(KERN_WARNING "pktgen: WARNING: trying to remove a "
3761 		       "running interface, stopping it now.\n");
3762 		pktgen_stop_device(pkt_dev);
3763 	}
3764 
3765 	/* Dis-associate from the interface */
3766 
3767 	if (pkt_dev->odev) {
3768 		dev_put(pkt_dev->odev);
3769 		pkt_dev->odev = NULL;
3770 	}
3771 
3772 	/* And update the thread if_list */
3773 
3774 	_rem_dev_from_if_list(t, pkt_dev);
3775 
3776 	if (pkt_dev->entry)
3777 		remove_proc_entry(pkt_dev->entry->name, pg_proc_dir);
3778 
3779 #ifdef CONFIG_XFRM
3780 	free_SAs(pkt_dev);
3781 #endif
3782 	if (pkt_dev->flows)
3783 		vfree(pkt_dev->flows);
3784 	kfree(pkt_dev);
3785 	return 0;
3786 }
3787 
3788 static int __init pg_init(void)
3789 {
3790 	int cpu;
3791 	struct proc_dir_entry *pe;
3792 
3793 	printk(KERN_INFO "%s", version);
3794 
3795 	pg_proc_dir = proc_mkdir(PG_PROC_DIR, init_net.proc_net);
3796 	if (!pg_proc_dir)
3797 		return -ENODEV;
3798 	pg_proc_dir->owner = THIS_MODULE;
3799 
3800 	pe = proc_create(PGCTRL, 0600, pg_proc_dir, &pktgen_fops);
3801 	if (pe == NULL) {
3802 		printk(KERN_ERR "pktgen: ERROR: cannot create %s "
3803 		       "procfs entry.\n", PGCTRL);
3804 		proc_net_remove(&init_net, PG_PROC_DIR);
3805 		return -EINVAL;
3806 	}
3807 
3808 	/* Register us to receive netdevice events */
3809 	register_netdevice_notifier(&pktgen_notifier_block);
3810 
3811 	for_each_online_cpu(cpu) {
3812 		int err;
3813 
3814 		err = pktgen_create_thread(cpu);
3815 		if (err)
3816 			printk(KERN_WARNING "pktgen: WARNING: Cannot create "
3817 			       "thread for cpu %d (%d)\n", cpu, err);
3818 	}
3819 
3820 	if (list_empty(&pktgen_threads)) {
3821 		printk(KERN_ERR "pktgen: ERROR: Initialization failed for "
3822 		       "all threads\n");
3823 		unregister_netdevice_notifier(&pktgen_notifier_block);
3824 		remove_proc_entry(PGCTRL, pg_proc_dir);
3825 		proc_net_remove(&init_net, PG_PROC_DIR);
3826 		return -ENODEV;
3827 	}
3828 
3829 	return 0;
3830 }
3831 
3832 static void __exit pg_cleanup(void)
3833 {
3834 	struct pktgen_thread *t;
3835 	struct list_head *q, *n;
3836 	wait_queue_head_t queue;
3837 	init_waitqueue_head(&queue);
3838 
3839 	/* Stop all interfaces & threads */
3840 
3841 	list_for_each_safe(q, n, &pktgen_threads) {
3842 		t = list_entry(q, struct pktgen_thread, th_list);
3843 		kthread_stop(t->tsk);
3844 		kfree(t);
3845 	}
3846 
3847 	/* Un-register us from receiving netdevice events */
3848 	unregister_netdevice_notifier(&pktgen_notifier_block);
3849 
3850 	/* Clean up proc file system */
3851 	remove_proc_entry(PGCTRL, pg_proc_dir);
3852 	proc_net_remove(&init_net, PG_PROC_DIR);
3853 }
3854 
3855 module_init(pg_init);
3856 module_exit(pg_cleanup);
3857 
3858 MODULE_AUTHOR("Robert Olsson <robert.olsson@its.uu.se");
3859 MODULE_DESCRIPTION("Packet Generator tool");
3860 MODULE_LICENSE("GPL");
3861 module_param(pg_count_d, int, 0);
3862 module_param(pg_delay_d, int, 0);
3863 module_param(pg_clone_skb_d, int, 0);
3864 module_param(debug, int, 0);
3865