aboutsummaryrefslogtreecommitdiffstats
path: root/net/core/pktgen.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/core/pktgen.c')
-rw-r--r--net/core/pktgen.c42
1 files changed, 32 insertions, 10 deletions
diff --git a/net/core/pktgen.c b/net/core/pktgen.c
index 8997e912aaaf..65498483325a 100644
--- a/net/core/pktgen.c
+++ b/net/core/pktgen.c
@@ -422,6 +422,7 @@ static struct pktgen_dev *pktgen_find_dev(struct pktgen_thread *t,
422 const char *ifname); 422 const char *ifname);
423static int pktgen_device_event(struct notifier_block *, unsigned long, void *); 423static int pktgen_device_event(struct notifier_block *, unsigned long, void *);
424static void pktgen_run_all_threads(void); 424static void pktgen_run_all_threads(void);
425static void pktgen_reset_all_threads(void);
425static void pktgen_stop_all_threads_ifs(void); 426static void pktgen_stop_all_threads_ifs(void);
426static int pktgen_stop_device(struct pktgen_dev *pkt_dev); 427static int pktgen_stop_device(struct pktgen_dev *pkt_dev);
427static void pktgen_stop(struct pktgen_thread *t); 428static void pktgen_stop(struct pktgen_thread *t);
@@ -480,6 +481,9 @@ static ssize_t pgctrl_write(struct file *file, const char __user * buf,
480 else if (!strcmp(data, "start")) 481 else if (!strcmp(data, "start"))
481 pktgen_run_all_threads(); 482 pktgen_run_all_threads();
482 483
484 else if (!strcmp(data, "reset"))
485 pktgen_reset_all_threads();
486
483 else 487 else
484 printk(KERN_WARNING "pktgen: Unknown command: %s\n", data); 488 printk(KERN_WARNING "pktgen: Unknown command: %s\n", data);
485 489
@@ -509,7 +513,6 @@ static int pktgen_if_show(struct seq_file *seq, void *v)
509 __u64 sa; 513 __u64 sa;
510 __u64 stopped; 514 __u64 stopped;
511 __u64 now = getCurUs(); 515 __u64 now = getCurUs();
512 DECLARE_MAC_BUF(mac);
513 516
514 seq_printf(seq, 517 seq_printf(seq,
515 "Params: count %llu min_pkt_size: %u max_pkt_size: %u\n", 518 "Params: count %llu min_pkt_size: %u max_pkt_size: %u\n",
@@ -554,12 +557,12 @@ static int pktgen_if_show(struct seq_file *seq, void *v)
554 557
555 seq_puts(seq, " src_mac: "); 558 seq_puts(seq, " src_mac: ");
556 559
557 seq_printf(seq, "%s ", 560 seq_printf(seq, "%pM ",
558 print_mac(mac, is_zero_ether_addr(pkt_dev->src_mac) ? 561 is_zero_ether_addr(pkt_dev->src_mac) ?
559 pkt_dev->odev->dev_addr : pkt_dev->src_mac)); 562 pkt_dev->odev->dev_addr : pkt_dev->src_mac);
560 563
561 seq_printf(seq, "dst_mac: "); 564 seq_printf(seq, "dst_mac: ");
562 seq_printf(seq, "%s\n", print_mac(mac, pkt_dev->dst_mac)); 565 seq_printf(seq, "%pM\n", pkt_dev->dst_mac);
563 566
564 seq_printf(seq, 567 seq_printf(seq,
565 " udp_src_min: %d udp_src_max: %d udp_dst_min: %d udp_dst_max: %d\n", 568 " udp_src_min: %d udp_src_max: %d udp_dst_min: %d udp_dst_max: %d\n",
@@ -2162,7 +2165,8 @@ static void get_ipsec_sa(struct pktgen_dev *pkt_dev, int flow)
2162 struct xfrm_state *x = pkt_dev->flows[flow].x; 2165 struct xfrm_state *x = pkt_dev->flows[flow].x;
2163 if (!x) { 2166 if (!x) {
2164 /*slow path: we dont already have xfrm_state*/ 2167 /*slow path: we dont already have xfrm_state*/
2165 x = xfrm_stateonly_find((xfrm_address_t *)&pkt_dev->cur_daddr, 2168 x = xfrm_stateonly_find(&init_net,
2169 (xfrm_address_t *)&pkt_dev->cur_daddr,
2166 (xfrm_address_t *)&pkt_dev->cur_saddr, 2170 (xfrm_address_t *)&pkt_dev->cur_saddr,
2167 AF_INET, 2171 AF_INET,
2168 pkt_dev->ipsmode, 2172 pkt_dev->ipsmode,
@@ -3169,6 +3173,24 @@ static void pktgen_run_all_threads(void)
3169 pktgen_wait_all_threads_run(); 3173 pktgen_wait_all_threads_run();
3170} 3174}
3171 3175
3176static void pktgen_reset_all_threads(void)
3177{
3178 struct pktgen_thread *t;
3179
3180 pr_debug("pktgen: entering pktgen_reset_all_threads.\n");
3181
3182 mutex_lock(&pktgen_thread_lock);
3183
3184 list_for_each_entry(t, &pktgen_threads, th_list)
3185 t->control |= (T_REMDEVALL);
3186
3187 mutex_unlock(&pktgen_thread_lock);
3188
3189 schedule_timeout_interruptible(msecs_to_jiffies(125)); /* Propagate thread->control */
3190
3191 pktgen_wait_all_threads_run();
3192}
3193
3172static void show_results(struct pktgen_dev *pkt_dev, int nr_frags) 3194static void show_results(struct pktgen_dev *pkt_dev, int nr_frags)
3173{ 3195{
3174 __u64 total_us, bps, mbps, pps, idle; 3196 __u64 total_us, bps, mbps, pps, idle;
@@ -3331,14 +3353,14 @@ static void pktgen_rem_thread(struct pktgen_thread *t)
3331 3353
3332static __inline__ void pktgen_xmit(struct pktgen_dev *pkt_dev) 3354static __inline__ void pktgen_xmit(struct pktgen_dev *pkt_dev)
3333{ 3355{
3334 struct net_device *odev = NULL; 3356 struct net_device *odev = pkt_dev->odev;
3357 int (*xmit)(struct sk_buff *, struct net_device *)
3358 = odev->netdev_ops->ndo_start_xmit;
3335 struct netdev_queue *txq; 3359 struct netdev_queue *txq;
3336 __u64 idle_start = 0; 3360 __u64 idle_start = 0;
3337 u16 queue_map; 3361 u16 queue_map;
3338 int ret; 3362 int ret;
3339 3363
3340 odev = pkt_dev->odev;
3341
3342 if (pkt_dev->delay_us || pkt_dev->delay_ns) { 3364 if (pkt_dev->delay_us || pkt_dev->delay_ns) {
3343 u64 now; 3365 u64 now;
3344 3366
@@ -3419,7 +3441,7 @@ static __inline__ void pktgen_xmit(struct pktgen_dev *pkt_dev)
3419 3441
3420 atomic_inc(&(pkt_dev->skb->users)); 3442 atomic_inc(&(pkt_dev->skb->users));
3421 retry_now: 3443 retry_now:
3422 ret = odev->hard_start_xmit(pkt_dev->skb, odev); 3444 ret = (*xmit)(pkt_dev->skb, odev);
3423 if (likely(ret == NETDEV_TX_OK)) { 3445 if (likely(ret == NETDEV_TX_OK)) {
3424 pkt_dev->last_ok = 1; 3446 pkt_dev->last_ok = 1;
3425 pkt_dev->sofar++; 3447 pkt_dev->sofar++;