diff options
Diffstat (limited to 'net/core/pktgen.c')
| -rw-r--r-- | net/core/pktgen.c | 42 |
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); |
| 423 | static int pktgen_device_event(struct notifier_block *, unsigned long, void *); | 423 | static int pktgen_device_event(struct notifier_block *, unsigned long, void *); |
| 424 | static void pktgen_run_all_threads(void); | 424 | static void pktgen_run_all_threads(void); |
| 425 | static void pktgen_reset_all_threads(void); | ||
| 425 | static void pktgen_stop_all_threads_ifs(void); | 426 | static void pktgen_stop_all_threads_ifs(void); |
| 426 | static int pktgen_stop_device(struct pktgen_dev *pkt_dev); | 427 | static int pktgen_stop_device(struct pktgen_dev *pkt_dev); |
| 427 | static void pktgen_stop(struct pktgen_thread *t); | 428 | static 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 | ||
| 3176 | static 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 | |||
| 3172 | static void show_results(struct pktgen_dev *pkt_dev, int nr_frags) | 3194 | static 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 | ||
| 3332 | static __inline__ void pktgen_xmit(struct pktgen_dev *pkt_dev) | 3354 | static __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++; |
