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.c299
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
216struct pktgen_dev { 213struct 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
354struct pktgen_hdr { 349struct 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
471static 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
482static inline __u64 getCurMs(void) 466static 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);
512static int pktgen_stop_device(struct pktgen_dev *pkt_dev); 496static int pktgen_stop_device(struct pktgen_dev *pkt_dev);
513static void pktgen_stop(struct pktgen_thread *t); 497static void pktgen_stop(struct pktgen_thread *t);
514static void pktgen_clear_counters(struct pktgen_dev *pkt_dev); 498static void pktgen_clear_counters(struct pktgen_dev *pkt_dev);
515static int pktgen_mark_device(const char *ifname); 499
516static unsigned int scan_ip6(const char *s, char ip[16]); 500static unsigned int scan_ip6(const char *s, char ip[16]);
517static unsigned int fmt_ip6(char *s, const char ip[16]); 501static 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 }
807done: 791done:
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 }
850done_str: 834done_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 */
1852static int pktgen_mark_device(const char *ifname) 1836static 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; 1869static 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
1890static int pktgen_device_event(struct notifier_block *unused, 1892static 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
1917static struct net_device *pktgen_setup_dev(struct pktgen_dev *pkt_dev) 1916static 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
1947out_put:
1948 dev_put(odev); 1944 dev_put(odev);
1949out: 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 */
1957static void pktgen_setup_inject(struct pktgen_dev *pkt_dev) 1951static 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)
2294static void mpls_push(__be32 *mpls, struct pktgen_dev *pkt_dev) 2281static 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:
3399static int pktgen_add_device(struct pktgen_thread *t, const char *ifname) 3392static 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);
3452out2:
3453 dev_put(pkt_dev->odev);
3454out1:
3455 if (pkt_dev->flows)
3456 vfree(pkt_dev->flows);
3457 kfree(pkt_dev);
3458 return err;
3467} 3459}
3468 3460
3469static int __init pktgen_create_thread(int cpu) 3461static 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);