diff options
Diffstat (limited to 'net/core/pktgen.c')
-rw-r--r-- | net/core/pktgen.c | 299 |
1 files changed, 145 insertions, 154 deletions
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 4b01496dc33d..b92a322872a8 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
@@ -164,14 +164,11 @@ | |||
164 | 164 | ||
165 | #define VERSION "pktgen v2.68: Packet Generator for packet performance testing.\n" | 165 | #define VERSION "pktgen v2.68: Packet Generator for packet performance testing.\n" |
166 | 166 | ||
167 | /* #define PG_DEBUG(a) a */ | ||
168 | #define PG_DEBUG(a) | ||
169 | |||
170 | /* The buckets are exponential in 'width' */ | 167 | /* The buckets are exponential in 'width' */ |
171 | #define LAT_BUCKETS_MAX 32 | 168 | #define LAT_BUCKETS_MAX 32 |
172 | #define IP_NAME_SZ 32 | 169 | #define IP_NAME_SZ 32 |
173 | #define MAX_MPLS_LABELS 16 /* This is the max label stack depth */ | 170 | #define MAX_MPLS_LABELS 16 /* This is the max label stack depth */ |
174 | #define MPLS_STACK_BOTTOM __constant_htonl(0x00000100) | 171 | #define MPLS_STACK_BOTTOM htonl(0x00000100) |
175 | 172 | ||
176 | /* Device flag bits */ | 173 | /* Device flag bits */ |
177 | #define F_IPSRC_RND (1<<0) /* IP-Src Random */ | 174 | #define F_IPSRC_RND (1<<0) /* IP-Src Random */ |
@@ -214,15 +211,11 @@ struct flow_state { | |||
214 | }; | 211 | }; |
215 | 212 | ||
216 | struct pktgen_dev { | 213 | struct pktgen_dev { |
217 | |||
218 | /* | 214 | /* |
219 | * Try to keep frequent/infrequent used vars. separated. | 215 | * Try to keep frequent/infrequent used vars. separated. |
220 | */ | 216 | */ |
221 | 217 | struct proc_dir_entry *entry; /* proc file */ | |
222 | char ifname[IFNAMSIZ]; | 218 | struct pktgen_thread *pg_thread;/* the owner */ |
223 | char result[512]; | ||
224 | |||
225 | struct pktgen_thread *pg_thread; /* the owner */ | ||
226 | struct list_head list; /* Used for chaining in the thread's run-queue */ | 219 | struct list_head list; /* Used for chaining in the thread's run-queue */ |
227 | 220 | ||
228 | int running; /* if this changes to false, the test will stop */ | 221 | int running; /* if this changes to false, the test will stop */ |
@@ -349,6 +342,8 @@ struct pktgen_dev { | |||
349 | unsigned cflows; /* Concurrent flows (config) */ | 342 | unsigned cflows; /* Concurrent flows (config) */ |
350 | unsigned lflow; /* Flow length (config) */ | 343 | unsigned lflow; /* Flow length (config) */ |
351 | unsigned nflows; /* accumulated flows (stats) */ | 344 | unsigned nflows; /* accumulated flows (stats) */ |
345 | |||
346 | char result[512]; | ||
352 | }; | 347 | }; |
353 | 348 | ||
354 | struct pktgen_hdr { | 349 | struct pktgen_hdr { |
@@ -468,17 +463,6 @@ static inline __u64 pg_div64(__u64 n, __u64 base) | |||
468 | return tmp; | 463 | return tmp; |
469 | } | 464 | } |
470 | 465 | ||
471 | static inline u32 pktgen_random(void) | ||
472 | { | ||
473 | #if 0 | ||
474 | __u32 n; | ||
475 | get_random_bytes(&n, 4); | ||
476 | return n; | ||
477 | #else | ||
478 | return net_random(); | ||
479 | #endif | ||
480 | } | ||
481 | |||
482 | static inline __u64 getCurMs(void) | 466 | static inline __u64 getCurMs(void) |
483 | { | 467 | { |
484 | struct timeval tv; | 468 | struct timeval tv; |
@@ -512,7 +496,7 @@ static void pktgen_stop_all_threads_ifs(void); | |||
512 | static int pktgen_stop_device(struct pktgen_dev *pkt_dev); | 496 | static int pktgen_stop_device(struct pktgen_dev *pkt_dev); |
513 | static void pktgen_stop(struct pktgen_thread *t); | 497 | static void pktgen_stop(struct pktgen_thread *t); |
514 | static void pktgen_clear_counters(struct pktgen_dev *pkt_dev); | 498 | static void pktgen_clear_counters(struct pktgen_dev *pkt_dev); |
515 | static int pktgen_mark_device(const char *ifname); | 499 | |
516 | static unsigned int scan_ip6(const char *s, char ip[16]); | 500 | static unsigned int scan_ip6(const char *s, char ip[16]); |
517 | static unsigned int fmt_ip6(char *s, const char ip[16]); | 501 | static unsigned int fmt_ip6(char *s, const char ip[16]); |
518 | 502 | ||
@@ -606,7 +590,7 @@ static int pktgen_if_show(struct seq_file *seq, void *v) | |||
606 | " frags: %d delay: %u clone_skb: %d ifname: %s\n", | 590 | " frags: %d delay: %u clone_skb: %d ifname: %s\n", |
607 | pkt_dev->nfrags, | 591 | pkt_dev->nfrags, |
608 | 1000 * pkt_dev->delay_us + pkt_dev->delay_ns, | 592 | 1000 * pkt_dev->delay_us + pkt_dev->delay_ns, |
609 | pkt_dev->clone_skb, pkt_dev->ifname); | 593 | pkt_dev->clone_skb, pkt_dev->odev->name); |
610 | 594 | ||
611 | seq_printf(seq, " flows: %u flowlen: %u\n", pkt_dev->cflows, | 595 | seq_printf(seq, " flows: %u flowlen: %u\n", pkt_dev->cflows, |
612 | pkt_dev->lflow); | 596 | pkt_dev->lflow); |
@@ -661,7 +645,7 @@ static int pktgen_if_show(struct seq_file *seq, void *v) | |||
661 | if (pkt_dev->nr_labels) { | 645 | if (pkt_dev->nr_labels) { |
662 | unsigned i; | 646 | unsigned i; |
663 | seq_printf(seq, " mpls: "); | 647 | seq_printf(seq, " mpls: "); |
664 | for(i = 0; i < pkt_dev->nr_labels; i++) | 648 | for (i = 0; i < pkt_dev->nr_labels; i++) |
665 | seq_printf(seq, "%08x%s", ntohl(pkt_dev->labels[i]), | 649 | seq_printf(seq, "%08x%s", ntohl(pkt_dev->labels[i]), |
666 | i == pkt_dev->nr_labels-1 ? "\n" : ", "); | 650 | i == pkt_dev->nr_labels-1 ? "\n" : ", "); |
667 | } | 651 | } |
@@ -766,7 +750,7 @@ static int hex32_arg(const char __user *user_buffer, unsigned long maxlen, __u32 | |||
766 | int i = 0; | 750 | int i = 0; |
767 | *num = 0; | 751 | *num = 0; |
768 | 752 | ||
769 | for(; i < maxlen; i++) { | 753 | for (; i < maxlen; i++) { |
770 | char c; | 754 | char c; |
771 | *num <<= 4; | 755 | *num <<= 4; |
772 | if (get_user(c, &user_buffer[i])) | 756 | if (get_user(c, &user_buffer[i])) |
@@ -802,7 +786,7 @@ static int count_trail_chars(const char __user * user_buffer, | |||
802 | break; | 786 | break; |
803 | default: | 787 | default: |
804 | goto done; | 788 | goto done; |
805 | }; | 789 | } |
806 | } | 790 | } |
807 | done: | 791 | done: |
808 | return i; | 792 | return i; |
@@ -845,7 +829,7 @@ static int strn_len(const char __user * user_buffer, unsigned int maxlen) | |||
845 | break; | 829 | break; |
846 | default: | 830 | default: |
847 | break; | 831 | break; |
848 | }; | 832 | } |
849 | } | 833 | } |
850 | done_str: | 834 | done_str: |
851 | return i; | 835 | return i; |
@@ -874,7 +858,7 @@ static ssize_t get_labels(const char __user *buffer, struct pktgen_dev *pkt_dev) | |||
874 | n++; | 858 | n++; |
875 | if (n >= MAX_MPLS_LABELS) | 859 | if (n >= MAX_MPLS_LABELS) |
876 | return -E2BIG; | 860 | return -E2BIG; |
877 | } while(c == ','); | 861 | } while (c == ','); |
878 | 862 | ||
879 | pkt_dev->nr_labels = n; | 863 | pkt_dev->nr_labels = n; |
880 | return i; | 864 | return i; |
@@ -1503,7 +1487,7 @@ static ssize_t pktgen_if_write(struct file *file, | |||
1503 | if (len < 0) { return len; } | 1487 | if (len < 0) { return len; } |
1504 | i += len; | 1488 | i += len; |
1505 | offset = sprintf(pg_result, "OK: mpls="); | 1489 | offset = sprintf(pg_result, "OK: mpls="); |
1506 | for(n = 0; n < pkt_dev->nr_labels; n++) | 1490 | for (n = 0; n < pkt_dev->nr_labels; n++) |
1507 | offset += sprintf(pg_result + offset, | 1491 | offset += sprintf(pg_result + offset, |
1508 | "%08x%s", ntohl(pkt_dev->labels[n]), | 1492 | "%08x%s", ntohl(pkt_dev->labels[n]), |
1509 | n == pkt_dev->nr_labels-1 ? "" : ","); | 1493 | n == pkt_dev->nr_labels-1 ? "" : ","); |
@@ -1697,13 +1681,13 @@ static int pktgen_thread_show(struct seq_file *seq, void *v) | |||
1697 | if_lock(t); | 1681 | if_lock(t); |
1698 | list_for_each_entry(pkt_dev, &t->if_list, list) | 1682 | list_for_each_entry(pkt_dev, &t->if_list, list) |
1699 | if (pkt_dev->running) | 1683 | if (pkt_dev->running) |
1700 | seq_printf(seq, "%s ", pkt_dev->ifname); | 1684 | seq_printf(seq, "%s ", pkt_dev->odev->name); |
1701 | 1685 | ||
1702 | seq_printf(seq, "\nStopped: "); | 1686 | seq_printf(seq, "\nStopped: "); |
1703 | 1687 | ||
1704 | list_for_each_entry(pkt_dev, &t->if_list, list) | 1688 | list_for_each_entry(pkt_dev, &t->if_list, list) |
1705 | if (!pkt_dev->running) | 1689 | if (!pkt_dev->running) |
1706 | seq_printf(seq, "%s ", pkt_dev->ifname); | 1690 | seq_printf(seq, "%s ", pkt_dev->odev->name); |
1707 | 1691 | ||
1708 | if (t->result[0]) | 1692 | if (t->result[0]) |
1709 | seq_printf(seq, "\nResult: %s\n", t->result); | 1693 | seq_printf(seq, "\nResult: %s\n", t->result); |
@@ -1849,16 +1833,14 @@ static struct pktgen_dev *__pktgen_NN_threads(const char *ifname, int remove) | |||
1849 | /* | 1833 | /* |
1850 | * mark a device for removal | 1834 | * mark a device for removal |
1851 | */ | 1835 | */ |
1852 | static int pktgen_mark_device(const char *ifname) | 1836 | static void pktgen_mark_device(const char *ifname) |
1853 | { | 1837 | { |
1854 | struct pktgen_dev *pkt_dev = NULL; | 1838 | struct pktgen_dev *pkt_dev = NULL; |
1855 | const int max_tries = 10, msec_per_try = 125; | 1839 | const int max_tries = 10, msec_per_try = 125; |
1856 | int i = 0; | 1840 | int i = 0; |
1857 | int ret = 0; | ||
1858 | 1841 | ||
1859 | mutex_lock(&pktgen_thread_lock); | 1842 | mutex_lock(&pktgen_thread_lock); |
1860 | PG_DEBUG(printk("pktgen: pktgen_mark_device marking %s for removal\n", | 1843 | pr_debug("pktgen: pktgen_mark_device marking %s for removal\n", ifname); |
1861 | ifname)); | ||
1862 | 1844 | ||
1863 | while (1) { | 1845 | while (1) { |
1864 | 1846 | ||
@@ -1867,8 +1849,8 @@ static int pktgen_mark_device(const char *ifname) | |||
1867 | break; /* success */ | 1849 | break; /* success */ |
1868 | 1850 | ||
1869 | mutex_unlock(&pktgen_thread_lock); | 1851 | mutex_unlock(&pktgen_thread_lock); |
1870 | PG_DEBUG(printk("pktgen: pktgen_mark_device waiting for %s " | 1852 | pr_debug("pktgen: pktgen_mark_device waiting for %s " |
1871 | "to disappear....\n", ifname)); | 1853 | "to disappear....\n", ifname); |
1872 | schedule_timeout_interruptible(msecs_to_jiffies(msec_per_try)); | 1854 | schedule_timeout_interruptible(msecs_to_jiffies(msec_per_try)); |
1873 | mutex_lock(&pktgen_thread_lock); | 1855 | mutex_lock(&pktgen_thread_lock); |
1874 | 1856 | ||
@@ -1876,79 +1858,91 @@ static int pktgen_mark_device(const char *ifname) | |||
1876 | printk("pktgen_mark_device: timed out after waiting " | 1858 | printk("pktgen_mark_device: timed out after waiting " |
1877 | "%d msec for device %s to be removed\n", | 1859 | "%d msec for device %s to be removed\n", |
1878 | msec_per_try * i, ifname); | 1860 | msec_per_try * i, ifname); |
1879 | ret = 1; | ||
1880 | break; | 1861 | break; |
1881 | } | 1862 | } |
1882 | 1863 | ||
1883 | } | 1864 | } |
1884 | 1865 | ||
1885 | mutex_unlock(&pktgen_thread_lock); | 1866 | mutex_unlock(&pktgen_thread_lock); |
1867 | } | ||
1886 | 1868 | ||
1887 | return ret; | 1869 | static void pktgen_change_name(struct net_device *dev) |
1870 | { | ||
1871 | struct pktgen_thread *t; | ||
1872 | |||
1873 | list_for_each_entry(t, &pktgen_threads, th_list) { | ||
1874 | struct pktgen_dev *pkt_dev; | ||
1875 | |||
1876 | list_for_each_entry(pkt_dev, &t->if_list, list) { | ||
1877 | if (pkt_dev->odev != dev) | ||
1878 | continue; | ||
1879 | |||
1880 | remove_proc_entry(pkt_dev->entry->name, pg_proc_dir); | ||
1881 | |||
1882 | pkt_dev->entry = create_proc_entry(dev->name, 0600, | ||
1883 | pg_proc_dir); | ||
1884 | if (!pkt_dev->entry) | ||
1885 | printk(KERN_ERR "pktgen: can't move proc " | ||
1886 | " entry for '%s'\n", dev->name); | ||
1887 | break; | ||
1888 | } | ||
1889 | } | ||
1888 | } | 1890 | } |
1889 | 1891 | ||
1890 | static int pktgen_device_event(struct notifier_block *unused, | 1892 | static int pktgen_device_event(struct notifier_block *unused, |
1891 | unsigned long event, void *ptr) | 1893 | unsigned long event, void *ptr) |
1892 | { | 1894 | { |
1893 | struct net_device *dev = (struct net_device *)(ptr); | 1895 | struct net_device *dev = ptr; |
1894 | 1896 | ||
1895 | /* It is OK that we do not hold the group lock right now, | 1897 | /* It is OK that we do not hold the group lock right now, |
1896 | * as we run under the RTNL lock. | 1898 | * as we run under the RTNL lock. |
1897 | */ | 1899 | */ |
1898 | 1900 | ||
1899 | switch (event) { | 1901 | switch (event) { |
1900 | case NETDEV_CHANGEADDR: | 1902 | case NETDEV_CHANGENAME: |
1901 | case NETDEV_GOING_DOWN: | 1903 | pktgen_change_name(dev); |
1902 | case NETDEV_DOWN: | ||
1903 | case NETDEV_UP: | ||
1904 | /* Ignore for now */ | ||
1905 | break; | 1904 | break; |
1906 | 1905 | ||
1907 | case NETDEV_UNREGISTER: | 1906 | case NETDEV_UNREGISTER: |
1908 | pktgen_mark_device(dev->name); | 1907 | pktgen_mark_device(dev->name); |
1909 | break; | 1908 | break; |
1910 | }; | 1909 | } |
1911 | 1910 | ||
1912 | return NOTIFY_DONE; | 1911 | return NOTIFY_DONE; |
1913 | } | 1912 | } |
1914 | 1913 | ||
1915 | /* Associate pktgen_dev with a device. */ | 1914 | /* Associate pktgen_dev with a device. */ |
1916 | 1915 | ||
1917 | static struct net_device *pktgen_setup_dev(struct pktgen_dev *pkt_dev) | 1916 | static int pktgen_setup_dev(struct pktgen_dev *pkt_dev, const char *ifname) |
1918 | { | 1917 | { |
1919 | struct net_device *odev; | 1918 | struct net_device *odev; |
1919 | int err; | ||
1920 | 1920 | ||
1921 | /* Clean old setups */ | 1921 | /* Clean old setups */ |
1922 | |||
1923 | if (pkt_dev->odev) { | 1922 | if (pkt_dev->odev) { |
1924 | dev_put(pkt_dev->odev); | 1923 | dev_put(pkt_dev->odev); |
1925 | pkt_dev->odev = NULL; | 1924 | pkt_dev->odev = NULL; |
1926 | } | 1925 | } |
1927 | 1926 | ||
1928 | odev = dev_get_by_name(pkt_dev->ifname); | 1927 | odev = dev_get_by_name(ifname); |
1929 | |||
1930 | if (!odev) { | 1928 | if (!odev) { |
1931 | printk("pktgen: no such netdevice: \"%s\"\n", pkt_dev->ifname); | 1929 | printk("pktgen: no such netdevice: \"%s\"\n", ifname); |
1932 | goto out; | 1930 | return -ENODEV; |
1933 | } | 1931 | } |
1932 | |||
1934 | if (odev->type != ARPHRD_ETHER) { | 1933 | if (odev->type != ARPHRD_ETHER) { |
1935 | printk("pktgen: not an ethernet device: \"%s\"\n", | 1934 | printk("pktgen: not an ethernet device: \"%s\"\n", ifname); |
1936 | pkt_dev->ifname); | 1935 | err = -EINVAL; |
1937 | goto out_put; | 1936 | } else if (!netif_running(odev)) { |
1938 | } | 1937 | printk("pktgen: device is down: \"%s\"\n", ifname); |
1939 | if (!netif_running(odev)) { | 1938 | err = -ENETDOWN; |
1940 | printk("pktgen: device is down: \"%s\"\n", pkt_dev->ifname); | 1939 | } else { |
1941 | goto out_put; | 1940 | pkt_dev->odev = odev; |
1941 | return 0; | ||
1942 | } | 1942 | } |
1943 | pkt_dev->odev = odev; | ||
1944 | 1943 | ||
1945 | return pkt_dev->odev; | ||
1946 | |||
1947 | out_put: | ||
1948 | dev_put(odev); | 1944 | dev_put(odev); |
1949 | out: | 1945 | return err; |
1950 | return NULL; | ||
1951 | |||
1952 | } | 1946 | } |
1953 | 1947 | ||
1954 | /* Read pkt_dev from the interface and set up internal pktgen_dev | 1948 | /* Read pkt_dev from the interface and set up internal pktgen_dev |
@@ -1956,10 +1950,6 @@ out: | |||
1956 | */ | 1950 | */ |
1957 | static void pktgen_setup_inject(struct pktgen_dev *pkt_dev) | 1951 | static void pktgen_setup_inject(struct pktgen_dev *pkt_dev) |
1958 | { | 1952 | { |
1959 | /* Try once more, just in case it works now. */ | ||
1960 | if (!pkt_dev->odev) | ||
1961 | pktgen_setup_dev(pkt_dev); | ||
1962 | |||
1963 | if (!pkt_dev->odev) { | 1953 | if (!pkt_dev->odev) { |
1964 | printk("pktgen: ERROR: pkt_dev->odev == NULL in setup_inject.\n"); | 1954 | printk("pktgen: ERROR: pkt_dev->odev == NULL in setup_inject.\n"); |
1965 | sprintf(pkt_dev->result, | 1955 | sprintf(pkt_dev->result, |
@@ -2096,7 +2086,7 @@ static void mod_cur_headers(struct pktgen_dev *pkt_dev) | |||
2096 | int flow = 0; | 2086 | int flow = 0; |
2097 | 2087 | ||
2098 | if (pkt_dev->cflows) { | 2088 | if (pkt_dev->cflows) { |
2099 | flow = pktgen_random() % pkt_dev->cflows; | 2089 | flow = random32() % pkt_dev->cflows; |
2100 | 2090 | ||
2101 | if (pkt_dev->flows[flow].count > pkt_dev->lflow) | 2091 | if (pkt_dev->flows[flow].count > pkt_dev->lflow) |
2102 | pkt_dev->flows[flow].count = 0; | 2092 | pkt_dev->flows[flow].count = 0; |
@@ -2108,7 +2098,7 @@ static void mod_cur_headers(struct pktgen_dev *pkt_dev) | |||
2108 | __u32 tmp; | 2098 | __u32 tmp; |
2109 | 2099 | ||
2110 | if (pkt_dev->flags & F_MACSRC_RND) | 2100 | if (pkt_dev->flags & F_MACSRC_RND) |
2111 | mc = pktgen_random() % (pkt_dev->src_mac_count); | 2101 | mc = random32() % pkt_dev->src_mac_count; |
2112 | else { | 2102 | else { |
2113 | mc = pkt_dev->cur_src_mac_offset++; | 2103 | mc = pkt_dev->cur_src_mac_offset++; |
2114 | if (pkt_dev->cur_src_mac_offset > | 2104 | if (pkt_dev->cur_src_mac_offset > |
@@ -2134,7 +2124,7 @@ static void mod_cur_headers(struct pktgen_dev *pkt_dev) | |||
2134 | __u32 tmp; | 2124 | __u32 tmp; |
2135 | 2125 | ||
2136 | if (pkt_dev->flags & F_MACDST_RND) | 2126 | if (pkt_dev->flags & F_MACDST_RND) |
2137 | mc = pktgen_random() % (pkt_dev->dst_mac_count); | 2127 | mc = random32() % pkt_dev->dst_mac_count; |
2138 | 2128 | ||
2139 | else { | 2129 | else { |
2140 | mc = pkt_dev->cur_dst_mac_offset++; | 2130 | mc = pkt_dev->cur_dst_mac_offset++; |
@@ -2158,27 +2148,26 @@ static void mod_cur_headers(struct pktgen_dev *pkt_dev) | |||
2158 | 2148 | ||
2159 | if (pkt_dev->flags & F_MPLS_RND) { | 2149 | if (pkt_dev->flags & F_MPLS_RND) { |
2160 | unsigned i; | 2150 | unsigned i; |
2161 | for(i = 0; i < pkt_dev->nr_labels; i++) | 2151 | for (i = 0; i < pkt_dev->nr_labels; i++) |
2162 | if (pkt_dev->labels[i] & MPLS_STACK_BOTTOM) | 2152 | if (pkt_dev->labels[i] & MPLS_STACK_BOTTOM) |
2163 | pkt_dev->labels[i] = MPLS_STACK_BOTTOM | | 2153 | pkt_dev->labels[i] = MPLS_STACK_BOTTOM | |
2164 | ((__force __be32)pktgen_random() & | 2154 | ((__force __be32)random32() & |
2165 | htonl(0x000fffff)); | 2155 | htonl(0x000fffff)); |
2166 | } | 2156 | } |
2167 | 2157 | ||
2168 | if ((pkt_dev->flags & F_VID_RND) && (pkt_dev->vlan_id != 0xffff)) { | 2158 | if ((pkt_dev->flags & F_VID_RND) && (pkt_dev->vlan_id != 0xffff)) { |
2169 | pkt_dev->vlan_id = pktgen_random() % 4096; | 2159 | pkt_dev->vlan_id = random32() & (4096-1); |
2170 | } | 2160 | } |
2171 | 2161 | ||
2172 | if ((pkt_dev->flags & F_SVID_RND) && (pkt_dev->svlan_id != 0xffff)) { | 2162 | if ((pkt_dev->flags & F_SVID_RND) && (pkt_dev->svlan_id != 0xffff)) { |
2173 | pkt_dev->svlan_id = pktgen_random() % 4096; | 2163 | pkt_dev->svlan_id = random32() & (4096 - 1); |
2174 | } | 2164 | } |
2175 | 2165 | ||
2176 | if (pkt_dev->udp_src_min < pkt_dev->udp_src_max) { | 2166 | if (pkt_dev->udp_src_min < pkt_dev->udp_src_max) { |
2177 | if (pkt_dev->flags & F_UDPSRC_RND) | 2167 | if (pkt_dev->flags & F_UDPSRC_RND) |
2178 | pkt_dev->cur_udp_src = | 2168 | pkt_dev->cur_udp_src = random32() % |
2179 | ((pktgen_random() % | 2169 | (pkt_dev->udp_src_max - pkt_dev->udp_src_min) |
2180 | (pkt_dev->udp_src_max - pkt_dev->udp_src_min)) + | 2170 | + pkt_dev->udp_src_min; |
2181 | pkt_dev->udp_src_min); | ||
2182 | 2171 | ||
2183 | else { | 2172 | else { |
2184 | pkt_dev->cur_udp_src++; | 2173 | pkt_dev->cur_udp_src++; |
@@ -2189,10 +2178,9 @@ static void mod_cur_headers(struct pktgen_dev *pkt_dev) | |||
2189 | 2178 | ||
2190 | if (pkt_dev->udp_dst_min < pkt_dev->udp_dst_max) { | 2179 | if (pkt_dev->udp_dst_min < pkt_dev->udp_dst_max) { |
2191 | if (pkt_dev->flags & F_UDPDST_RND) { | 2180 | if (pkt_dev->flags & F_UDPDST_RND) { |
2192 | pkt_dev->cur_udp_dst = | 2181 | pkt_dev->cur_udp_dst = random32() % |
2193 | ((pktgen_random() % | 2182 | (pkt_dev->udp_dst_max - pkt_dev->udp_dst_min) |
2194 | (pkt_dev->udp_dst_max - pkt_dev->udp_dst_min)) + | 2183 | + pkt_dev->udp_dst_min; |
2195 | pkt_dev->udp_dst_min); | ||
2196 | } else { | 2184 | } else { |
2197 | pkt_dev->cur_udp_dst++; | 2185 | pkt_dev->cur_udp_dst++; |
2198 | if (pkt_dev->cur_udp_dst >= pkt_dev->udp_dst_max) | 2186 | if (pkt_dev->cur_udp_dst >= pkt_dev->udp_dst_max) |
@@ -2207,7 +2195,7 @@ static void mod_cur_headers(struct pktgen_dev *pkt_dev) | |||
2207 | saddr_max))) { | 2195 | saddr_max))) { |
2208 | __u32 t; | 2196 | __u32 t; |
2209 | if (pkt_dev->flags & F_IPSRC_RND) | 2197 | if (pkt_dev->flags & F_IPSRC_RND) |
2210 | t = ((pktgen_random() % (imx - imn)) + imn); | 2198 | t = random32() % (imx - imn) + imn; |
2211 | else { | 2199 | else { |
2212 | t = ntohl(pkt_dev->cur_saddr); | 2200 | t = ntohl(pkt_dev->cur_saddr); |
2213 | t++; | 2201 | t++; |
@@ -2228,14 +2216,13 @@ static void mod_cur_headers(struct pktgen_dev *pkt_dev) | |||
2228 | __be32 s; | 2216 | __be32 s; |
2229 | if (pkt_dev->flags & F_IPDST_RND) { | 2217 | if (pkt_dev->flags & F_IPDST_RND) { |
2230 | 2218 | ||
2231 | t = pktgen_random() % (imx - imn) + imn; | 2219 | t = random32() % (imx - imn) + imn; |
2232 | s = htonl(t); | 2220 | s = htonl(t); |
2233 | 2221 | ||
2234 | while (LOOPBACK(s) || MULTICAST(s) | 2222 | while (LOOPBACK(s) || MULTICAST(s) |
2235 | || BADCLASS(s) || ZERONET(s) | 2223 | || BADCLASS(s) || ZERONET(s) |
2236 | || LOCAL_MCAST(s)) { | 2224 | || LOCAL_MCAST(s)) { |
2237 | t = (pktgen_random() % | 2225 | t = random32() % (imx - imn) + imn; |
2238 | (imx - imn)) + imn; | ||
2239 | s = htonl(t); | 2226 | s = htonl(t); |
2240 | } | 2227 | } |
2241 | pkt_dev->cur_daddr = s; | 2228 | pkt_dev->cur_daddr = s; |
@@ -2267,7 +2254,7 @@ static void mod_cur_headers(struct pktgen_dev *pkt_dev) | |||
2267 | 2254 | ||
2268 | for (i = 0; i < 4; i++) { | 2255 | for (i = 0; i < 4; i++) { |
2269 | pkt_dev->cur_in6_daddr.s6_addr32[i] = | 2256 | pkt_dev->cur_in6_daddr.s6_addr32[i] = |
2270 | (((__force __be32)pktgen_random() | | 2257 | (((__force __be32)random32() | |
2271 | pkt_dev->min_in6_daddr.s6_addr32[i]) & | 2258 | pkt_dev->min_in6_daddr.s6_addr32[i]) & |
2272 | pkt_dev->max_in6_daddr.s6_addr32[i]); | 2259 | pkt_dev->max_in6_daddr.s6_addr32[i]); |
2273 | } | 2260 | } |
@@ -2277,9 +2264,9 @@ static void mod_cur_headers(struct pktgen_dev *pkt_dev) | |||
2277 | if (pkt_dev->min_pkt_size < pkt_dev->max_pkt_size) { | 2264 | if (pkt_dev->min_pkt_size < pkt_dev->max_pkt_size) { |
2278 | __u32 t; | 2265 | __u32 t; |
2279 | if (pkt_dev->flags & F_TXSIZE_RND) { | 2266 | if (pkt_dev->flags & F_TXSIZE_RND) { |
2280 | t = ((pktgen_random() % | 2267 | t = random32() % |
2281 | (pkt_dev->max_pkt_size - pkt_dev->min_pkt_size)) | 2268 | (pkt_dev->max_pkt_size - pkt_dev->min_pkt_size) |
2282 | + pkt_dev->min_pkt_size); | 2269 | + pkt_dev->min_pkt_size; |
2283 | } else { | 2270 | } else { |
2284 | t = pkt_dev->cur_pkt_size + 1; | 2271 | t = pkt_dev->cur_pkt_size + 1; |
2285 | if (t > pkt_dev->max_pkt_size) | 2272 | if (t > pkt_dev->max_pkt_size) |
@@ -2294,7 +2281,7 @@ static void mod_cur_headers(struct pktgen_dev *pkt_dev) | |||
2294 | static void mpls_push(__be32 *mpls, struct pktgen_dev *pkt_dev) | 2281 | static void mpls_push(__be32 *mpls, struct pktgen_dev *pkt_dev) |
2295 | { | 2282 | { |
2296 | unsigned i; | 2283 | unsigned i; |
2297 | for(i = 0; i < pkt_dev->nr_labels; i++) { | 2284 | for (i = 0; i < pkt_dev->nr_labels; i++) { |
2298 | *mpls++ = pkt_dev->labels[i] & ~MPLS_STACK_BOTTOM; | 2285 | *mpls++ = pkt_dev->labels[i] & ~MPLS_STACK_BOTTOM; |
2299 | } | 2286 | } |
2300 | mpls--; | 2287 | mpls--; |
@@ -2316,7 +2303,7 @@ static struct sk_buff *fill_packet_ipv4(struct net_device *odev, | |||
2316 | int datalen, iplen; | 2303 | int datalen, iplen; |
2317 | struct iphdr *iph; | 2304 | struct iphdr *iph; |
2318 | struct pktgen_hdr *pgh = NULL; | 2305 | struct pktgen_hdr *pgh = NULL; |
2319 | __be16 protocol = __constant_htons(ETH_P_IP); | 2306 | __be16 protocol = htons(ETH_P_IP); |
2320 | __be32 *mpls; | 2307 | __be32 *mpls; |
2321 | __be16 *vlan_tci = NULL; /* Encapsulates priority and VLAN ID */ | 2308 | __be16 *vlan_tci = NULL; /* Encapsulates priority and VLAN ID */ |
2322 | __be16 *vlan_encapsulated_proto = NULL; /* packet type ID field (or len) for VLAN tag */ | 2309 | __be16 *vlan_encapsulated_proto = NULL; /* packet type ID field (or len) for VLAN tag */ |
@@ -2325,10 +2312,10 @@ static struct sk_buff *fill_packet_ipv4(struct net_device *odev, | |||
2325 | 2312 | ||
2326 | 2313 | ||
2327 | if (pkt_dev->nr_labels) | 2314 | if (pkt_dev->nr_labels) |
2328 | protocol = __constant_htons(ETH_P_MPLS_UC); | 2315 | protocol = htons(ETH_P_MPLS_UC); |
2329 | 2316 | ||
2330 | if (pkt_dev->vlan_id != 0xffff) | 2317 | if (pkt_dev->vlan_id != 0xffff) |
2331 | protocol = __constant_htons(ETH_P_8021Q); | 2318 | protocol = htons(ETH_P_8021Q); |
2332 | 2319 | ||
2333 | /* Update any of the values, used when we're incrementing various | 2320 | /* Update any of the values, used when we're incrementing various |
2334 | * fields. | 2321 | * fields. |
@@ -2354,24 +2341,28 @@ static struct sk_buff *fill_packet_ipv4(struct net_device *odev, | |||
2354 | mpls_push(mpls, pkt_dev); | 2341 | mpls_push(mpls, pkt_dev); |
2355 | 2342 | ||
2356 | if (pkt_dev->vlan_id != 0xffff) { | 2343 | if (pkt_dev->vlan_id != 0xffff) { |
2357 | if(pkt_dev->svlan_id != 0xffff) { | 2344 | if (pkt_dev->svlan_id != 0xffff) { |
2358 | svlan_tci = (__be16 *)skb_put(skb, sizeof(__be16)); | 2345 | svlan_tci = (__be16 *)skb_put(skb, sizeof(__be16)); |
2359 | *svlan_tci = build_tci(pkt_dev->svlan_id, | 2346 | *svlan_tci = build_tci(pkt_dev->svlan_id, |
2360 | pkt_dev->svlan_cfi, | 2347 | pkt_dev->svlan_cfi, |
2361 | pkt_dev->svlan_p); | 2348 | pkt_dev->svlan_p); |
2362 | svlan_encapsulated_proto = (__be16 *)skb_put(skb, sizeof(__be16)); | 2349 | svlan_encapsulated_proto = (__be16 *)skb_put(skb, sizeof(__be16)); |
2363 | *svlan_encapsulated_proto = __constant_htons(ETH_P_8021Q); | 2350 | *svlan_encapsulated_proto = htons(ETH_P_8021Q); |
2364 | } | 2351 | } |
2365 | vlan_tci = (__be16 *)skb_put(skb, sizeof(__be16)); | 2352 | vlan_tci = (__be16 *)skb_put(skb, sizeof(__be16)); |
2366 | *vlan_tci = build_tci(pkt_dev->vlan_id, | 2353 | *vlan_tci = build_tci(pkt_dev->vlan_id, |
2367 | pkt_dev->vlan_cfi, | 2354 | pkt_dev->vlan_cfi, |
2368 | pkt_dev->vlan_p); | 2355 | pkt_dev->vlan_p); |
2369 | vlan_encapsulated_proto = (__be16 *)skb_put(skb, sizeof(__be16)); | 2356 | vlan_encapsulated_proto = (__be16 *)skb_put(skb, sizeof(__be16)); |
2370 | *vlan_encapsulated_proto = __constant_htons(ETH_P_IP); | 2357 | *vlan_encapsulated_proto = htons(ETH_P_IP); |
2371 | } | 2358 | } |
2372 | 2359 | ||
2373 | iph = (struct iphdr *)skb_put(skb, sizeof(struct iphdr)); | 2360 | skb->network_header = skb->tail; |
2374 | udph = (struct udphdr *)skb_put(skb, sizeof(struct udphdr)); | 2361 | skb->transport_header = skb->network_header + sizeof(struct iphdr); |
2362 | skb_put(skb, sizeof(struct iphdr) + sizeof(struct udphdr)); | ||
2363 | |||
2364 | iph = ip_hdr(skb); | ||
2365 | udph = udp_hdr(skb); | ||
2375 | 2366 | ||
2376 | memcpy(eth, pkt_dev->hh, 12); | 2367 | memcpy(eth, pkt_dev->hh, 12); |
2377 | *(__be16 *) & eth[12] = protocol; | 2368 | *(__be16 *) & eth[12] = protocol; |
@@ -2400,12 +2391,11 @@ static struct sk_buff *fill_packet_ipv4(struct net_device *odev, | |||
2400 | iph->check = 0; | 2391 | iph->check = 0; |
2401 | iph->check = ip_fast_csum((void *)iph, iph->ihl); | 2392 | iph->check = ip_fast_csum((void *)iph, iph->ihl); |
2402 | skb->protocol = protocol; | 2393 | skb->protocol = protocol; |
2403 | skb->mac.raw = ((u8 *) iph) - 14 - pkt_dev->nr_labels*sizeof(u32) - | 2394 | skb->mac_header = (skb->network_header - ETH_HLEN - |
2404 | VLAN_TAG_SIZE(pkt_dev) - SVLAN_TAG_SIZE(pkt_dev); | 2395 | pkt_dev->nr_labels * sizeof(u32) - |
2396 | VLAN_TAG_SIZE(pkt_dev) - SVLAN_TAG_SIZE(pkt_dev)); | ||
2405 | skb->dev = odev; | 2397 | skb->dev = odev; |
2406 | skb->pkt_type = PACKET_HOST; | 2398 | skb->pkt_type = PACKET_HOST; |
2407 | skb->nh.iph = iph; | ||
2408 | skb->h.uh = udph; | ||
2409 | 2399 | ||
2410 | if (pkt_dev->nfrags <= 0) | 2400 | if (pkt_dev->nfrags <= 0) |
2411 | pgh = (struct pktgen_hdr *)skb_put(skb, datalen); | 2401 | pgh = (struct pktgen_hdr *)skb_put(skb, datalen); |
@@ -2654,7 +2644,7 @@ static struct sk_buff *fill_packet_ipv6(struct net_device *odev, | |||
2654 | int datalen; | 2644 | int datalen; |
2655 | struct ipv6hdr *iph; | 2645 | struct ipv6hdr *iph; |
2656 | struct pktgen_hdr *pgh = NULL; | 2646 | struct pktgen_hdr *pgh = NULL; |
2657 | __be16 protocol = __constant_htons(ETH_P_IPV6); | 2647 | __be16 protocol = htons(ETH_P_IPV6); |
2658 | __be32 *mpls; | 2648 | __be32 *mpls; |
2659 | __be16 *vlan_tci = NULL; /* Encapsulates priority and VLAN ID */ | 2649 | __be16 *vlan_tci = NULL; /* Encapsulates priority and VLAN ID */ |
2660 | __be16 *vlan_encapsulated_proto = NULL; /* packet type ID field (or len) for VLAN tag */ | 2650 | __be16 *vlan_encapsulated_proto = NULL; /* packet type ID field (or len) for VLAN tag */ |
@@ -2662,10 +2652,10 @@ static struct sk_buff *fill_packet_ipv6(struct net_device *odev, | |||
2662 | __be16 *svlan_encapsulated_proto = NULL; /* packet type ID field (or len) for SVLAN tag */ | 2652 | __be16 *svlan_encapsulated_proto = NULL; /* packet type ID field (or len) for SVLAN tag */ |
2663 | 2653 | ||
2664 | if (pkt_dev->nr_labels) | 2654 | if (pkt_dev->nr_labels) |
2665 | protocol = __constant_htons(ETH_P_MPLS_UC); | 2655 | protocol = htons(ETH_P_MPLS_UC); |
2666 | 2656 | ||
2667 | if (pkt_dev->vlan_id != 0xffff) | 2657 | if (pkt_dev->vlan_id != 0xffff) |
2668 | protocol = __constant_htons(ETH_P_8021Q); | 2658 | protocol = htons(ETH_P_8021Q); |
2669 | 2659 | ||
2670 | /* Update any of the values, used when we're incrementing various | 2660 | /* Update any of the values, used when we're incrementing various |
2671 | * fields. | 2661 | * fields. |
@@ -2690,24 +2680,28 @@ static struct sk_buff *fill_packet_ipv6(struct net_device *odev, | |||
2690 | mpls_push(mpls, pkt_dev); | 2680 | mpls_push(mpls, pkt_dev); |
2691 | 2681 | ||
2692 | if (pkt_dev->vlan_id != 0xffff) { | 2682 | if (pkt_dev->vlan_id != 0xffff) { |
2693 | if(pkt_dev->svlan_id != 0xffff) { | 2683 | if (pkt_dev->svlan_id != 0xffff) { |
2694 | svlan_tci = (__be16 *)skb_put(skb, sizeof(__be16)); | 2684 | svlan_tci = (__be16 *)skb_put(skb, sizeof(__be16)); |
2695 | *svlan_tci = build_tci(pkt_dev->svlan_id, | 2685 | *svlan_tci = build_tci(pkt_dev->svlan_id, |
2696 | pkt_dev->svlan_cfi, | 2686 | pkt_dev->svlan_cfi, |
2697 | pkt_dev->svlan_p); | 2687 | pkt_dev->svlan_p); |
2698 | svlan_encapsulated_proto = (__be16 *)skb_put(skb, sizeof(__be16)); | 2688 | svlan_encapsulated_proto = (__be16 *)skb_put(skb, sizeof(__be16)); |
2699 | *svlan_encapsulated_proto = __constant_htons(ETH_P_8021Q); | 2689 | *svlan_encapsulated_proto = htons(ETH_P_8021Q); |
2700 | } | 2690 | } |
2701 | vlan_tci = (__be16 *)skb_put(skb, sizeof(__be16)); | 2691 | vlan_tci = (__be16 *)skb_put(skb, sizeof(__be16)); |
2702 | *vlan_tci = build_tci(pkt_dev->vlan_id, | 2692 | *vlan_tci = build_tci(pkt_dev->vlan_id, |
2703 | pkt_dev->vlan_cfi, | 2693 | pkt_dev->vlan_cfi, |
2704 | pkt_dev->vlan_p); | 2694 | pkt_dev->vlan_p); |
2705 | vlan_encapsulated_proto = (__be16 *)skb_put(skb, sizeof(__be16)); | 2695 | vlan_encapsulated_proto = (__be16 *)skb_put(skb, sizeof(__be16)); |
2706 | *vlan_encapsulated_proto = __constant_htons(ETH_P_IPV6); | 2696 | *vlan_encapsulated_proto = htons(ETH_P_IPV6); |
2707 | } | 2697 | } |
2708 | 2698 | ||
2709 | iph = (struct ipv6hdr *)skb_put(skb, sizeof(struct ipv6hdr)); | 2699 | skb->network_header = skb->tail; |
2710 | udph = (struct udphdr *)skb_put(skb, sizeof(struct udphdr)); | 2700 | skb->transport_header = skb->network_header + sizeof(struct ipv6hdr); |
2701 | skb_put(skb, sizeof(struct ipv6hdr) + sizeof(struct udphdr)); | ||
2702 | |||
2703 | iph = ipv6_hdr(skb); | ||
2704 | udph = udp_hdr(skb); | ||
2711 | 2705 | ||
2712 | memcpy(eth, pkt_dev->hh, 12); | 2706 | memcpy(eth, pkt_dev->hh, 12); |
2713 | *(__be16 *) & eth[12] = protocol; | 2707 | *(__be16 *) & eth[12] = protocol; |
@@ -2729,7 +2723,7 @@ static struct sk_buff *fill_packet_ipv6(struct net_device *odev, | |||
2729 | udph->len = htons(datalen + sizeof(struct udphdr)); | 2723 | udph->len = htons(datalen + sizeof(struct udphdr)); |
2730 | udph->check = 0; /* No checksum */ | 2724 | udph->check = 0; /* No checksum */ |
2731 | 2725 | ||
2732 | *(__be32 *) iph = __constant_htonl(0x60000000); /* Version + flow */ | 2726 | *(__be32 *) iph = htonl(0x60000000); /* Version + flow */ |
2733 | 2727 | ||
2734 | if (pkt_dev->traffic_class) { | 2728 | if (pkt_dev->traffic_class) { |
2735 | /* Version + traffic class + flow (0) */ | 2729 | /* Version + traffic class + flow (0) */ |
@@ -2744,13 +2738,12 @@ static struct sk_buff *fill_packet_ipv6(struct net_device *odev, | |||
2744 | ipv6_addr_copy(&iph->daddr, &pkt_dev->cur_in6_daddr); | 2738 | ipv6_addr_copy(&iph->daddr, &pkt_dev->cur_in6_daddr); |
2745 | ipv6_addr_copy(&iph->saddr, &pkt_dev->cur_in6_saddr); | 2739 | ipv6_addr_copy(&iph->saddr, &pkt_dev->cur_in6_saddr); |
2746 | 2740 | ||
2747 | skb->mac.raw = ((u8 *) iph) - 14 - pkt_dev->nr_labels*sizeof(u32) - | 2741 | skb->mac_header = (skb->network_header - ETH_HLEN - |
2748 | VLAN_TAG_SIZE(pkt_dev) - SVLAN_TAG_SIZE(pkt_dev); | 2742 | pkt_dev->nr_labels * sizeof(u32) - |
2743 | VLAN_TAG_SIZE(pkt_dev) - SVLAN_TAG_SIZE(pkt_dev)); | ||
2749 | skb->protocol = protocol; | 2744 | skb->protocol = protocol; |
2750 | skb->dev = odev; | 2745 | skb->dev = odev; |
2751 | skb->pkt_type = PACKET_HOST; | 2746 | skb->pkt_type = PACKET_HOST; |
2752 | skb->nh.ipv6h = iph; | ||
2753 | skb->h.uh = udph; | ||
2754 | 2747 | ||
2755 | if (pkt_dev->nfrags <= 0) | 2748 | if (pkt_dev->nfrags <= 0) |
2756 | pgh = (struct pktgen_hdr *)skb_put(skb, datalen); | 2749 | pgh = (struct pktgen_hdr *)skb_put(skb, datalen); |
@@ -2848,7 +2841,7 @@ static void pktgen_run(struct pktgen_thread *t) | |||
2848 | struct pktgen_dev *pkt_dev; | 2841 | struct pktgen_dev *pkt_dev; |
2849 | int started = 0; | 2842 | int started = 0; |
2850 | 2843 | ||
2851 | PG_DEBUG(printk("pktgen: entering pktgen_run. %p\n", t)); | 2844 | pr_debug("pktgen: entering pktgen_run. %p\n", t); |
2852 | 2845 | ||
2853 | if_lock(t); | 2846 | if_lock(t); |
2854 | list_for_each_entry(pkt_dev, &t->if_list, list) { | 2847 | list_for_each_entry(pkt_dev, &t->if_list, list) { |
@@ -2880,7 +2873,7 @@ static void pktgen_stop_all_threads_ifs(void) | |||
2880 | { | 2873 | { |
2881 | struct pktgen_thread *t; | 2874 | struct pktgen_thread *t; |
2882 | 2875 | ||
2883 | PG_DEBUG(printk("pktgen: entering pktgen_stop_all_threads_ifs.\n")); | 2876 | pr_debug("pktgen: entering pktgen_stop_all_threads_ifs.\n"); |
2884 | 2877 | ||
2885 | mutex_lock(&pktgen_thread_lock); | 2878 | mutex_lock(&pktgen_thread_lock); |
2886 | 2879 | ||
@@ -2948,7 +2941,7 @@ static void pktgen_run_all_threads(void) | |||
2948 | { | 2941 | { |
2949 | struct pktgen_thread *t; | 2942 | struct pktgen_thread *t; |
2950 | 2943 | ||
2951 | PG_DEBUG(printk("pktgen: entering pktgen_run_all_threads.\n")); | 2944 | pr_debug("pktgen: entering pktgen_run_all_threads.\n"); |
2952 | 2945 | ||
2953 | mutex_lock(&pktgen_thread_lock); | 2946 | mutex_lock(&pktgen_thread_lock); |
2954 | 2947 | ||
@@ -3006,7 +2999,7 @@ static int pktgen_stop_device(struct pktgen_dev *pkt_dev) | |||
3006 | 2999 | ||
3007 | if (!pkt_dev->running) { | 3000 | if (!pkt_dev->running) { |
3008 | printk("pktgen: interface: %s is already stopped\n", | 3001 | printk("pktgen: interface: %s is already stopped\n", |
3009 | pkt_dev->ifname); | 3002 | pkt_dev->odev->name); |
3010 | return -EINVAL; | 3003 | return -EINVAL; |
3011 | } | 3004 | } |
3012 | 3005 | ||
@@ -3040,7 +3033,7 @@ static void pktgen_stop(struct pktgen_thread *t) | |||
3040 | { | 3033 | { |
3041 | struct pktgen_dev *pkt_dev; | 3034 | struct pktgen_dev *pkt_dev; |
3042 | 3035 | ||
3043 | PG_DEBUG(printk("pktgen: entering pktgen_stop\n")); | 3036 | pr_debug("pktgen: entering pktgen_stop\n"); |
3044 | 3037 | ||
3045 | if_lock(t); | 3038 | if_lock(t); |
3046 | 3039 | ||
@@ -3064,7 +3057,7 @@ static void pktgen_rem_one_if(struct pktgen_thread *t) | |||
3064 | struct list_head *q, *n; | 3057 | struct list_head *q, *n; |
3065 | struct pktgen_dev *cur; | 3058 | struct pktgen_dev *cur; |
3066 | 3059 | ||
3067 | PG_DEBUG(printk("pktgen: entering pktgen_rem_one_if\n")); | 3060 | pr_debug("pktgen: entering pktgen_rem_one_if\n"); |
3068 | 3061 | ||
3069 | if_lock(t); | 3062 | if_lock(t); |
3070 | 3063 | ||
@@ -3093,7 +3086,7 @@ static void pktgen_rem_all_ifs(struct pktgen_thread *t) | |||
3093 | 3086 | ||
3094 | /* Remove all devices, free mem */ | 3087 | /* Remove all devices, free mem */ |
3095 | 3088 | ||
3096 | PG_DEBUG(printk("pktgen: entering pktgen_rem_all_ifs\n")); | 3089 | pr_debug("pktgen: entering pktgen_rem_all_ifs\n"); |
3097 | if_lock(t); | 3090 | if_lock(t); |
3098 | 3091 | ||
3099 | list_for_each_safe(q, n, &t->if_list) { | 3092 | list_for_each_safe(q, n, &t->if_list) { |
@@ -3276,7 +3269,7 @@ static int pktgen_thread_worker(void *arg) | |||
3276 | 3269 | ||
3277 | t->pid = current->pid; | 3270 | t->pid = current->pid; |
3278 | 3271 | ||
3279 | PG_DEBUG(printk("pktgen: starting pktgen/%d: pid=%d\n", cpu, current->pid)); | 3272 | pr_debug("pktgen: starting pktgen/%d: pid=%d\n", cpu, current->pid); |
3280 | 3273 | ||
3281 | max_before_softirq = t->max_before_softirq; | 3274 | max_before_softirq = t->max_before_softirq; |
3282 | 3275 | ||
@@ -3339,13 +3332,13 @@ static int pktgen_thread_worker(void *arg) | |||
3339 | set_current_state(TASK_INTERRUPTIBLE); | 3332 | set_current_state(TASK_INTERRUPTIBLE); |
3340 | } | 3333 | } |
3341 | 3334 | ||
3342 | PG_DEBUG(printk("pktgen: %s stopping all device\n", t->tsk->comm)); | 3335 | pr_debug("pktgen: %s stopping all device\n", t->tsk->comm); |
3343 | pktgen_stop(t); | 3336 | pktgen_stop(t); |
3344 | 3337 | ||
3345 | PG_DEBUG(printk("pktgen: %s removing all device\n", t->tsk->comm)); | 3338 | pr_debug("pktgen: %s removing all device\n", t->tsk->comm); |
3346 | pktgen_rem_all_ifs(t); | 3339 | pktgen_rem_all_ifs(t); |
3347 | 3340 | ||
3348 | PG_DEBUG(printk("pktgen: %s removing thread.\n", t->tsk->comm)); | 3341 | pr_debug("pktgen: %s removing thread.\n", t->tsk->comm); |
3349 | pktgen_rem_thread(t); | 3342 | pktgen_rem_thread(t); |
3350 | 3343 | ||
3351 | return 0; | 3344 | return 0; |
@@ -3358,13 +3351,13 @@ static struct pktgen_dev *pktgen_find_dev(struct pktgen_thread *t, | |||
3358 | if_lock(t); | 3351 | if_lock(t); |
3359 | 3352 | ||
3360 | list_for_each_entry(p, &t->if_list, list) | 3353 | list_for_each_entry(p, &t->if_list, list) |
3361 | if (strncmp(p->ifname, ifname, IFNAMSIZ) == 0) { | 3354 | if (strncmp(p->odev->name, ifname, IFNAMSIZ) == 0) { |
3362 | pkt_dev = p; | 3355 | pkt_dev = p; |
3363 | break; | 3356 | break; |
3364 | } | 3357 | } |
3365 | 3358 | ||
3366 | if_unlock(t); | 3359 | if_unlock(t); |
3367 | PG_DEBUG(printk("pktgen: find_dev(%s) returning %p\n", ifname, pkt_dev)); | 3360 | pr_debug("pktgen: find_dev(%s) returning %p\n", ifname, pkt_dev); |
3368 | return pkt_dev; | 3361 | return pkt_dev; |
3369 | } | 3362 | } |
3370 | 3363 | ||
@@ -3399,7 +3392,7 @@ out: | |||
3399 | static int pktgen_add_device(struct pktgen_thread *t, const char *ifname) | 3392 | static int pktgen_add_device(struct pktgen_thread *t, const char *ifname) |
3400 | { | 3393 | { |
3401 | struct pktgen_dev *pkt_dev; | 3394 | struct pktgen_dev *pkt_dev; |
3402 | struct proc_dir_entry *pe; | 3395 | int err; |
3403 | 3396 | ||
3404 | /* We don't allow a device to be on several threads */ | 3397 | /* We don't allow a device to be on several threads */ |
3405 | 3398 | ||
@@ -3441,29 +3434,28 @@ static int pktgen_add_device(struct pktgen_thread *t, const char *ifname) | |||
3441 | pkt_dev->svlan_cfi = 0; | 3434 | pkt_dev->svlan_cfi = 0; |
3442 | pkt_dev->svlan_id = 0xffff; | 3435 | pkt_dev->svlan_id = 0xffff; |
3443 | 3436 | ||
3444 | strncpy(pkt_dev->ifname, ifname, IFNAMSIZ); | 3437 | err = pktgen_setup_dev(pkt_dev, ifname); |
3438 | if (err) | ||
3439 | goto out1; | ||
3445 | 3440 | ||
3446 | if (!pktgen_setup_dev(pkt_dev)) { | 3441 | pkt_dev->entry = create_proc_entry(ifname, 0600, pg_proc_dir); |
3447 | printk("pktgen: ERROR: pktgen_setup_dev failed.\n"); | 3442 | if (!pkt_dev->entry) { |
3448 | if (pkt_dev->flows) | ||
3449 | vfree(pkt_dev->flows); | ||
3450 | kfree(pkt_dev); | ||
3451 | return -ENODEV; | ||
3452 | } | ||
3453 | |||
3454 | pe = create_proc_entry(ifname, 0600, pg_proc_dir); | ||
3455 | if (!pe) { | ||
3456 | printk("pktgen: cannot create %s/%s procfs entry.\n", | 3443 | printk("pktgen: cannot create %s/%s procfs entry.\n", |
3457 | PG_PROC_DIR, ifname); | 3444 | PG_PROC_DIR, ifname); |
3458 | if (pkt_dev->flows) | 3445 | err = -EINVAL; |
3459 | vfree(pkt_dev->flows); | 3446 | goto out2; |
3460 | kfree(pkt_dev); | ||
3461 | return -EINVAL; | ||
3462 | } | 3447 | } |
3463 | pe->proc_fops = &pktgen_if_fops; | 3448 | pkt_dev->entry->proc_fops = &pktgen_if_fops; |
3464 | pe->data = pkt_dev; | 3449 | pkt_dev->entry->data = pkt_dev; |
3465 | 3450 | ||
3466 | return add_dev_to_thread(t, pkt_dev); | 3451 | return add_dev_to_thread(t, pkt_dev); |
3452 | out2: | ||
3453 | dev_put(pkt_dev->odev); | ||
3454 | out1: | ||
3455 | if (pkt_dev->flows) | ||
3456 | vfree(pkt_dev->flows); | ||
3457 | kfree(pkt_dev); | ||
3458 | return err; | ||
3467 | } | 3459 | } |
3468 | 3460 | ||
3469 | static int __init pktgen_create_thread(int cpu) | 3461 | static int __init pktgen_create_thread(int cpu) |
@@ -3533,7 +3525,7 @@ static int pktgen_remove_device(struct pktgen_thread *t, | |||
3533 | struct pktgen_dev *pkt_dev) | 3525 | struct pktgen_dev *pkt_dev) |
3534 | { | 3526 | { |
3535 | 3527 | ||
3536 | PG_DEBUG(printk("pktgen: remove_device pkt_dev=%p\n", pkt_dev)); | 3528 | pr_debug("pktgen: remove_device pkt_dev=%p\n", pkt_dev); |
3537 | 3529 | ||
3538 | if (pkt_dev->running) { | 3530 | if (pkt_dev->running) { |
3539 | printk("pktgen:WARNING: trying to remove a running interface, stopping it now.\n"); | 3531 | printk("pktgen:WARNING: trying to remove a running interface, stopping it now.\n"); |
@@ -3551,9 +3543,8 @@ static int pktgen_remove_device(struct pktgen_thread *t, | |||
3551 | 3543 | ||
3552 | _rem_dev_from_if_list(t, pkt_dev); | 3544 | _rem_dev_from_if_list(t, pkt_dev); |
3553 | 3545 | ||
3554 | /* Clean up proc file system */ | 3546 | if (pkt_dev->entry) |
3555 | 3547 | remove_proc_entry(pkt_dev->entry->name, pg_proc_dir); | |
3556 | remove_proc_entry(pkt_dev->ifname, pg_proc_dir); | ||
3557 | 3548 | ||
3558 | if (pkt_dev->flows) | 3549 | if (pkt_dev->flows) |
3559 | vfree(pkt_dev->flows); | 3550 | vfree(pkt_dev->flows); |