diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-05-20 16:43:21 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-05-20 16:43:21 -0400 |
commit | 06f4e926d256d902dd9a53dcb400fd74974ce087 (patch) | |
tree | 0b438b67f5f0eff6fd617bc497a9dace6164a488 /net/core/pktgen.c | |
parent | 8e7bfcbab3825d1b404d615cb1b54f44ff81f981 (diff) | |
parent | d93515611bbc70c2fe4db232e5feb448ed8e4cc9 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6: (1446 commits)
macvlan: fix panic if lowerdev in a bond
tg3: Add braces around 5906 workaround.
tg3: Fix NETIF_F_LOOPBACK error
macvlan: remove one synchronize_rcu() call
networking: NET_CLS_ROUTE4 depends on INET
irda: Fix error propagation in ircomm_lmp_connect_response()
irda: Kill set but unused variable 'bytes' in irlan_check_command_param()
irda: Kill set but unused variable 'clen' in ircomm_connect_indication()
rxrpc: Fix set but unused variable 'usage' in rxrpc_get_transport()
be2net: Kill set but unused variable 'req' in lancer_fw_download()
irda: Kill set but unused vars 'saddr' and 'daddr' in irlan_provider_connect_indication()
atl1c: atl1c_resume() is only used when CONFIG_PM_SLEEP is defined.
rxrpc: Fix set but unused variable 'usage' in rxrpc_get_peer().
rxrpc: Kill set but unused variable 'local' in rxrpc_UDP_error_handler()
rxrpc: Kill set but unused variable 'sp' in rxrpc_process_connection()
rxrpc: Kill set but unused variable 'sp' in rxrpc_rotate_tx_window()
pkt_sched: Kill set but unused variable 'protocol' in tc_classify()
isdn: capi: Use pr_debug() instead of ifdefs.
tg3: Update version to 3.119
tg3: Apply rx_discards fix to 5719/5720
...
Fix up trivial conflicts in arch/x86/Kconfig and net/mac80211/agg-tx.c
as per Davem.
Diffstat (limited to 'net/core/pktgen.c')
-rw-r--r-- | net/core/pktgen.c | 199 |
1 files changed, 30 insertions, 169 deletions
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 6ed9e27d8202..67870e9fd097 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
@@ -450,7 +450,6 @@ static void pktgen_stop(struct pktgen_thread *t); | |||
450 | static void pktgen_clear_counters(struct pktgen_dev *pkt_dev); | 450 | static void pktgen_clear_counters(struct pktgen_dev *pkt_dev); |
451 | 451 | ||
452 | static unsigned int scan_ip6(const char *s, char ip[16]); | 452 | static unsigned int scan_ip6(const char *s, char ip[16]); |
453 | static unsigned int fmt_ip6(char *s, const char ip[16]); | ||
454 | 453 | ||
455 | /* Module parameters, defaults. */ | 454 | /* Module parameters, defaults. */ |
456 | static int pg_count_d __read_mostly = 1000; | 455 | static int pg_count_d __read_mostly = 1000; |
@@ -557,21 +556,13 @@ static int pktgen_if_show(struct seq_file *seq, void *v) | |||
557 | pkt_dev->skb_priority); | 556 | pkt_dev->skb_priority); |
558 | 557 | ||
559 | if (pkt_dev->flags & F_IPV6) { | 558 | if (pkt_dev->flags & F_IPV6) { |
560 | char b1[128], b2[128], b3[128]; | ||
561 | fmt_ip6(b1, pkt_dev->in6_saddr.s6_addr); | ||
562 | fmt_ip6(b2, pkt_dev->min_in6_saddr.s6_addr); | ||
563 | fmt_ip6(b3, pkt_dev->max_in6_saddr.s6_addr); | ||
564 | seq_printf(seq, | 559 | seq_printf(seq, |
565 | " saddr: %s min_saddr: %s max_saddr: %s\n", b1, | 560 | " saddr: %pI6c min_saddr: %pI6c max_saddr: %pI6c\n" |
566 | b2, b3); | 561 | " daddr: %pI6c min_daddr: %pI6c max_daddr: %pI6c\n", |
567 | 562 | &pkt_dev->in6_saddr, | |
568 | fmt_ip6(b1, pkt_dev->in6_daddr.s6_addr); | 563 | &pkt_dev->min_in6_saddr, &pkt_dev->max_in6_saddr, |
569 | fmt_ip6(b2, pkt_dev->min_in6_daddr.s6_addr); | 564 | &pkt_dev->in6_daddr, |
570 | fmt_ip6(b3, pkt_dev->max_in6_daddr.s6_addr); | 565 | &pkt_dev->min_in6_daddr, &pkt_dev->max_in6_daddr); |
571 | seq_printf(seq, | ||
572 | " daddr: %s min_daddr: %s max_daddr: %s\n", b1, | ||
573 | b2, b3); | ||
574 | |||
575 | } else { | 566 | } else { |
576 | seq_printf(seq, | 567 | seq_printf(seq, |
577 | " dst_min: %s dst_max: %s\n", | 568 | " dst_min: %s dst_max: %s\n", |
@@ -707,10 +698,9 @@ static int pktgen_if_show(struct seq_file *seq, void *v) | |||
707 | pkt_dev->cur_src_mac_offset); | 698 | pkt_dev->cur_src_mac_offset); |
708 | 699 | ||
709 | if (pkt_dev->flags & F_IPV6) { | 700 | if (pkt_dev->flags & F_IPV6) { |
710 | char b1[128], b2[128]; | 701 | seq_printf(seq, " cur_saddr: %pI6c cur_daddr: %pI6c\n", |
711 | fmt_ip6(b1, pkt_dev->cur_in6_daddr.s6_addr); | 702 | &pkt_dev->cur_in6_saddr, |
712 | fmt_ip6(b2, pkt_dev->cur_in6_saddr.s6_addr); | 703 | &pkt_dev->cur_in6_daddr); |
713 | seq_printf(seq, " cur_saddr: %s cur_daddr: %s\n", b2, b1); | ||
714 | } else | 704 | } else |
715 | seq_printf(seq, " cur_saddr: 0x%x cur_daddr: 0x%x\n", | 705 | seq_printf(seq, " cur_saddr: 0x%x cur_daddr: 0x%x\n", |
716 | pkt_dev->cur_saddr, pkt_dev->cur_daddr); | 706 | pkt_dev->cur_saddr, pkt_dev->cur_daddr); |
@@ -1310,7 +1300,7 @@ static ssize_t pktgen_if_write(struct file *file, | |||
1310 | buf[len] = 0; | 1300 | buf[len] = 0; |
1311 | 1301 | ||
1312 | scan_ip6(buf, pkt_dev->in6_daddr.s6_addr); | 1302 | scan_ip6(buf, pkt_dev->in6_daddr.s6_addr); |
1313 | fmt_ip6(buf, pkt_dev->in6_daddr.s6_addr); | 1303 | snprintf(buf, sizeof(buf), "%pI6c", &pkt_dev->in6_daddr); |
1314 | 1304 | ||
1315 | ipv6_addr_copy(&pkt_dev->cur_in6_daddr, &pkt_dev->in6_daddr); | 1305 | ipv6_addr_copy(&pkt_dev->cur_in6_daddr, &pkt_dev->in6_daddr); |
1316 | 1306 | ||
@@ -1333,7 +1323,7 @@ static ssize_t pktgen_if_write(struct file *file, | |||
1333 | buf[len] = 0; | 1323 | buf[len] = 0; |
1334 | 1324 | ||
1335 | scan_ip6(buf, pkt_dev->min_in6_daddr.s6_addr); | 1325 | scan_ip6(buf, pkt_dev->min_in6_daddr.s6_addr); |
1336 | fmt_ip6(buf, pkt_dev->min_in6_daddr.s6_addr); | 1326 | snprintf(buf, sizeof(buf), "%pI6c", &pkt_dev->min_in6_daddr); |
1337 | 1327 | ||
1338 | ipv6_addr_copy(&pkt_dev->cur_in6_daddr, | 1328 | ipv6_addr_copy(&pkt_dev->cur_in6_daddr, |
1339 | &pkt_dev->min_in6_daddr); | 1329 | &pkt_dev->min_in6_daddr); |
@@ -1356,7 +1346,7 @@ static ssize_t pktgen_if_write(struct file *file, | |||
1356 | buf[len] = 0; | 1346 | buf[len] = 0; |
1357 | 1347 | ||
1358 | scan_ip6(buf, pkt_dev->max_in6_daddr.s6_addr); | 1348 | scan_ip6(buf, pkt_dev->max_in6_daddr.s6_addr); |
1359 | fmt_ip6(buf, pkt_dev->max_in6_daddr.s6_addr); | 1349 | snprintf(buf, sizeof(buf), "%pI6c", &pkt_dev->max_in6_daddr); |
1360 | 1350 | ||
1361 | if (debug) | 1351 | if (debug) |
1362 | printk(KERN_DEBUG "pktgen: dst6_max set to: %s\n", buf); | 1352 | printk(KERN_DEBUG "pktgen: dst6_max set to: %s\n", buf); |
@@ -1377,7 +1367,7 @@ static ssize_t pktgen_if_write(struct file *file, | |||
1377 | buf[len] = 0; | 1367 | buf[len] = 0; |
1378 | 1368 | ||
1379 | scan_ip6(buf, pkt_dev->in6_saddr.s6_addr); | 1369 | scan_ip6(buf, pkt_dev->in6_saddr.s6_addr); |
1380 | fmt_ip6(buf, pkt_dev->in6_saddr.s6_addr); | 1370 | snprintf(buf, sizeof(buf), "%pI6c", &pkt_dev->in6_saddr); |
1381 | 1371 | ||
1382 | ipv6_addr_copy(&pkt_dev->cur_in6_saddr, &pkt_dev->in6_saddr); | 1372 | ipv6_addr_copy(&pkt_dev->cur_in6_saddr, &pkt_dev->in6_saddr); |
1383 | 1373 | ||
@@ -1431,11 +1421,6 @@ static ssize_t pktgen_if_write(struct file *file, | |||
1431 | return count; | 1421 | return count; |
1432 | } | 1422 | } |
1433 | if (!strcmp(name, "dst_mac")) { | 1423 | if (!strcmp(name, "dst_mac")) { |
1434 | char *v = valstr; | ||
1435 | unsigned char old_dmac[ETH_ALEN]; | ||
1436 | unsigned char *m = pkt_dev->dst_mac; | ||
1437 | memcpy(old_dmac, pkt_dev->dst_mac, ETH_ALEN); | ||
1438 | |||
1439 | len = strn_len(&user_buffer[i], sizeof(valstr) - 1); | 1424 | len = strn_len(&user_buffer[i], sizeof(valstr) - 1); |
1440 | if (len < 0) | 1425 | if (len < 0) |
1441 | return len; | 1426 | return len; |
@@ -1443,35 +1428,16 @@ static ssize_t pktgen_if_write(struct file *file, | |||
1443 | memset(valstr, 0, sizeof(valstr)); | 1428 | memset(valstr, 0, sizeof(valstr)); |
1444 | if (copy_from_user(valstr, &user_buffer[i], len)) | 1429 | if (copy_from_user(valstr, &user_buffer[i], len)) |
1445 | return -EFAULT; | 1430 | return -EFAULT; |
1446 | i += len; | ||
1447 | |||
1448 | for (*m = 0; *v && m < pkt_dev->dst_mac + 6; v++) { | ||
1449 | int value; | ||
1450 | |||
1451 | value = hex_to_bin(*v); | ||
1452 | if (value >= 0) | ||
1453 | *m = *m * 16 + value; | ||
1454 | |||
1455 | if (*v == ':') { | ||
1456 | m++; | ||
1457 | *m = 0; | ||
1458 | } | ||
1459 | } | ||
1460 | 1431 | ||
1432 | if (!mac_pton(valstr, pkt_dev->dst_mac)) | ||
1433 | return -EINVAL; | ||
1461 | /* Set up Dest MAC */ | 1434 | /* Set up Dest MAC */ |
1462 | if (compare_ether_addr(old_dmac, pkt_dev->dst_mac)) | 1435 | memcpy(&pkt_dev->hh[0], pkt_dev->dst_mac, ETH_ALEN); |
1463 | memcpy(&(pkt_dev->hh[0]), pkt_dev->dst_mac, ETH_ALEN); | ||
1464 | 1436 | ||
1465 | sprintf(pg_result, "OK: dstmac"); | 1437 | sprintf(pg_result, "OK: dstmac %pM", pkt_dev->dst_mac); |
1466 | return count; | 1438 | return count; |
1467 | } | 1439 | } |
1468 | if (!strcmp(name, "src_mac")) { | 1440 | if (!strcmp(name, "src_mac")) { |
1469 | char *v = valstr; | ||
1470 | unsigned char old_smac[ETH_ALEN]; | ||
1471 | unsigned char *m = pkt_dev->src_mac; | ||
1472 | |||
1473 | memcpy(old_smac, pkt_dev->src_mac, ETH_ALEN); | ||
1474 | |||
1475 | len = strn_len(&user_buffer[i], sizeof(valstr) - 1); | 1441 | len = strn_len(&user_buffer[i], sizeof(valstr) - 1); |
1476 | if (len < 0) | 1442 | if (len < 0) |
1477 | return len; | 1443 | return len; |
@@ -1479,26 +1445,13 @@ static ssize_t pktgen_if_write(struct file *file, | |||
1479 | memset(valstr, 0, sizeof(valstr)); | 1445 | memset(valstr, 0, sizeof(valstr)); |
1480 | if (copy_from_user(valstr, &user_buffer[i], len)) | 1446 | if (copy_from_user(valstr, &user_buffer[i], len)) |
1481 | return -EFAULT; | 1447 | return -EFAULT; |
1482 | i += len; | ||
1483 | |||
1484 | for (*m = 0; *v && m < pkt_dev->src_mac + 6; v++) { | ||
1485 | int value; | ||
1486 | |||
1487 | value = hex_to_bin(*v); | ||
1488 | if (value >= 0) | ||
1489 | *m = *m * 16 + value; | ||
1490 | |||
1491 | if (*v == ':') { | ||
1492 | m++; | ||
1493 | *m = 0; | ||
1494 | } | ||
1495 | } | ||
1496 | 1448 | ||
1449 | if (!mac_pton(valstr, pkt_dev->src_mac)) | ||
1450 | return -EINVAL; | ||
1497 | /* Set up Src MAC */ | 1451 | /* Set up Src MAC */ |
1498 | if (compare_ether_addr(old_smac, pkt_dev->src_mac)) | 1452 | memcpy(&pkt_dev->hh[6], pkt_dev->src_mac, ETH_ALEN); |
1499 | memcpy(&(pkt_dev->hh[6]), pkt_dev->src_mac, ETH_ALEN); | ||
1500 | 1453 | ||
1501 | sprintf(pg_result, "OK: srcmac"); | 1454 | sprintf(pg_result, "OK: srcmac %pM", pkt_dev->src_mac); |
1502 | return count; | 1455 | return count; |
1503 | } | 1456 | } |
1504 | 1457 | ||
@@ -2515,7 +2468,6 @@ static int pktgen_output_ipsec(struct sk_buff *skb, struct pktgen_dev *pkt_dev) | |||
2515 | { | 2468 | { |
2516 | struct xfrm_state *x = pkt_dev->flows[pkt_dev->curfl].x; | 2469 | struct xfrm_state *x = pkt_dev->flows[pkt_dev->curfl].x; |
2517 | int err = 0; | 2470 | int err = 0; |
2518 | struct iphdr *iph; | ||
2519 | 2471 | ||
2520 | if (!x) | 2472 | if (!x) |
2521 | return 0; | 2473 | return 0; |
@@ -2525,7 +2477,6 @@ static int pktgen_output_ipsec(struct sk_buff *skb, struct pktgen_dev *pkt_dev) | |||
2525 | return 0; | 2477 | return 0; |
2526 | 2478 | ||
2527 | spin_lock(&x->lock); | 2479 | spin_lock(&x->lock); |
2528 | iph = ip_hdr(skb); | ||
2529 | 2480 | ||
2530 | err = x->outer_mode->output(x, skb); | 2481 | err = x->outer_mode->output(x, skb); |
2531 | if (err) | 2482 | if (err) |
@@ -2625,6 +2576,7 @@ static void pktgen_finalize_skb(struct pktgen_dev *pkt_dev, struct sk_buff *skb, | |||
2625 | } else { | 2576 | } else { |
2626 | int frags = pkt_dev->nfrags; | 2577 | int frags = pkt_dev->nfrags; |
2627 | int i, len; | 2578 | int i, len; |
2579 | int frag_len; | ||
2628 | 2580 | ||
2629 | 2581 | ||
2630 | if (frags > MAX_SKB_FRAGS) | 2582 | if (frags > MAX_SKB_FRAGS) |
@@ -2636,6 +2588,8 @@ static void pktgen_finalize_skb(struct pktgen_dev *pkt_dev, struct sk_buff *skb, | |||
2636 | } | 2588 | } |
2637 | 2589 | ||
2638 | i = 0; | 2590 | i = 0; |
2591 | frag_len = (datalen/frags) < PAGE_SIZE ? | ||
2592 | (datalen/frags) : PAGE_SIZE; | ||
2639 | while (datalen > 0) { | 2593 | while (datalen > 0) { |
2640 | if (unlikely(!pkt_dev->page)) { | 2594 | if (unlikely(!pkt_dev->page)) { |
2641 | int node = numa_node_id(); | 2595 | int node = numa_node_id(); |
@@ -2649,38 +2603,18 @@ static void pktgen_finalize_skb(struct pktgen_dev *pkt_dev, struct sk_buff *skb, | |||
2649 | skb_shinfo(skb)->frags[i].page = pkt_dev->page; | 2603 | skb_shinfo(skb)->frags[i].page = pkt_dev->page; |
2650 | get_page(pkt_dev->page); | 2604 | get_page(pkt_dev->page); |
2651 | skb_shinfo(skb)->frags[i].page_offset = 0; | 2605 | skb_shinfo(skb)->frags[i].page_offset = 0; |
2652 | skb_shinfo(skb)->frags[i].size = | 2606 | /*last fragment, fill rest of data*/ |
2653 | (datalen < PAGE_SIZE ? datalen : PAGE_SIZE); | 2607 | if (i == (frags - 1)) |
2608 | skb_shinfo(skb)->frags[i].size = | ||
2609 | (datalen < PAGE_SIZE ? datalen : PAGE_SIZE); | ||
2610 | else | ||
2611 | skb_shinfo(skb)->frags[i].size = frag_len; | ||
2654 | datalen -= skb_shinfo(skb)->frags[i].size; | 2612 | datalen -= skb_shinfo(skb)->frags[i].size; |
2655 | skb->len += skb_shinfo(skb)->frags[i].size; | 2613 | skb->len += skb_shinfo(skb)->frags[i].size; |
2656 | skb->data_len += skb_shinfo(skb)->frags[i].size; | 2614 | skb->data_len += skb_shinfo(skb)->frags[i].size; |
2657 | i++; | 2615 | i++; |
2658 | skb_shinfo(skb)->nr_frags = i; | 2616 | skb_shinfo(skb)->nr_frags = i; |
2659 | } | 2617 | } |
2660 | |||
2661 | while (i < frags) { | ||
2662 | int rem; | ||
2663 | |||
2664 | if (i == 0) | ||
2665 | break; | ||
2666 | |||
2667 | rem = skb_shinfo(skb)->frags[i - 1].size / 2; | ||
2668 | if (rem == 0) | ||
2669 | break; | ||
2670 | |||
2671 | skb_shinfo(skb)->frags[i - 1].size -= rem; | ||
2672 | |||
2673 | skb_shinfo(skb)->frags[i] = | ||
2674 | skb_shinfo(skb)->frags[i - 1]; | ||
2675 | get_page(skb_shinfo(skb)->frags[i].page); | ||
2676 | skb_shinfo(skb)->frags[i].page = | ||
2677 | skb_shinfo(skb)->frags[i - 1].page; | ||
2678 | skb_shinfo(skb)->frags[i].page_offset += | ||
2679 | skb_shinfo(skb)->frags[i - 1].size; | ||
2680 | skb_shinfo(skb)->frags[i].size = rem; | ||
2681 | i++; | ||
2682 | skb_shinfo(skb)->nr_frags = i; | ||
2683 | } | ||
2684 | } | 2618 | } |
2685 | 2619 | ||
2686 | /* Stamp the time, and sequence number, | 2620 | /* Stamp the time, and sequence number, |
@@ -2918,79 +2852,6 @@ static unsigned int scan_ip6(const char *s, char ip[16]) | |||
2918 | return len; | 2852 | return len; |
2919 | } | 2853 | } |
2920 | 2854 | ||
2921 | static char tohex(char hexdigit) | ||
2922 | { | ||
2923 | return hexdigit > 9 ? hexdigit + 'a' - 10 : hexdigit + '0'; | ||
2924 | } | ||
2925 | |||
2926 | static int fmt_xlong(char *s, unsigned int i) | ||
2927 | { | ||
2928 | char *bak = s; | ||
2929 | *s = tohex((i >> 12) & 0xf); | ||
2930 | if (s != bak || *s != '0') | ||
2931 | ++s; | ||
2932 | *s = tohex((i >> 8) & 0xf); | ||
2933 | if (s != bak || *s != '0') | ||
2934 | ++s; | ||
2935 | *s = tohex((i >> 4) & 0xf); | ||
2936 | if (s != bak || *s != '0') | ||
2937 | ++s; | ||
2938 | *s = tohex(i & 0xf); | ||
2939 | return s - bak + 1; | ||
2940 | } | ||
2941 | |||
2942 | static unsigned int fmt_ip6(char *s, const char ip[16]) | ||
2943 | { | ||
2944 | unsigned int len; | ||
2945 | unsigned int i; | ||
2946 | unsigned int temp; | ||
2947 | unsigned int compressing; | ||
2948 | int j; | ||
2949 | |||
2950 | len = 0; | ||
2951 | compressing = 0; | ||
2952 | for (j = 0; j < 16; j += 2) { | ||
2953 | |||
2954 | #ifdef V4MAPPEDPREFIX | ||
2955 | if (j == 12 && !memcmp(ip, V4mappedprefix, 12)) { | ||
2956 | inet_ntoa_r(*(struct in_addr *)(ip + 12), s); | ||
2957 | temp = strlen(s); | ||
2958 | return len + temp; | ||
2959 | } | ||
2960 | #endif | ||
2961 | temp = ((unsigned long)(unsigned char)ip[j] << 8) + | ||
2962 | (unsigned long)(unsigned char)ip[j + 1]; | ||
2963 | if (temp == 0) { | ||
2964 | if (!compressing) { | ||
2965 | compressing = 1; | ||
2966 | if (j == 0) { | ||
2967 | *s++ = ':'; | ||
2968 | ++len; | ||
2969 | } | ||
2970 | } | ||
2971 | } else { | ||
2972 | if (compressing) { | ||
2973 | compressing = 0; | ||
2974 | *s++ = ':'; | ||
2975 | ++len; | ||
2976 | } | ||
2977 | i = fmt_xlong(s, temp); | ||
2978 | len += i; | ||
2979 | s += i; | ||
2980 | if (j < 14) { | ||
2981 | *s++ = ':'; | ||
2982 | ++len; | ||
2983 | } | ||
2984 | } | ||
2985 | } | ||
2986 | if (compressing) { | ||
2987 | *s++ = ':'; | ||
2988 | ++len; | ||
2989 | } | ||
2990 | *s = 0; | ||
2991 | return len; | ||
2992 | } | ||
2993 | |||
2994 | static struct sk_buff *fill_packet_ipv6(struct net_device *odev, | 2855 | static struct sk_buff *fill_packet_ipv6(struct net_device *odev, |
2995 | struct pktgen_dev *pkt_dev) | 2856 | struct pktgen_dev *pkt_dev) |
2996 | { | 2857 | { |