All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/4] pktgen: use pr_debug
@ 2007-02-27 20:04 Stephen Hemminger
  2007-02-27 20:06 ` [PATCH 2/4] pktgen: use random32 Stephen Hemminger
                   ` (3 more replies)
  0 siblings, 4 replies; 9+ messages in thread
From: Stephen Hemminger @ 2007-02-27 20:04 UTC (permalink / raw)
  To: Robert Olsson, David S. Miller; +Cc: netdev

Remove private debug macro and replace with standard version

Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>


---
 net/core/pktgen.c |   34 +++++++++++++++-------------------
 1 file changed, 15 insertions(+), 19 deletions(-)

--- pktgen.orig/net/core/pktgen.c	2007-02-26 13:21:54.000000000 -0800
+++ pktgen/net/core/pktgen.c	2007-02-26 13:22:04.000000000 -0800
@@ -163,9 +163,6 @@
 
 #define VERSION  "pktgen v2.68: Packet Generator for packet performance testing.\n"
 
-/* #define PG_DEBUG(a) a */
-#define PG_DEBUG(a)
-
 /* The buckets are exponential in 'width' */
 #define LAT_BUCKETS_MAX 32
 #define IP_NAME_SZ 32
@@ -1856,8 +1853,7 @@
 	int ret = 0;
 
 	mutex_lock(&pktgen_thread_lock);
-	PG_DEBUG(printk("pktgen: pktgen_mark_device marking %s for removal\n",
-			ifname));
+	pr_debug("pktgen: pktgen_mark_device marking %s for removal\n", ifname);
 
 	while (1) {
 
@@ -1866,8 +1862,8 @@
 			break;	/* success */
 
 		mutex_unlock(&pktgen_thread_lock);
-		PG_DEBUG(printk("pktgen: pktgen_mark_device waiting for %s "
-				"to disappear....\n", ifname));
+		pr_debug("pktgen: pktgen_mark_device waiting for %s "
+				"to disappear....\n", ifname);
 		schedule_timeout_interruptible(msecs_to_jiffies(msec_per_try));
 		mutex_lock(&pktgen_thread_lock);
 
@@ -2847,7 +2843,7 @@
 	struct pktgen_dev *pkt_dev;
 	int started = 0;
 
-	PG_DEBUG(printk("pktgen: entering pktgen_run. %p\n", t));
+	pr_debug("pktgen: entering pktgen_run. %p\n", t);
 
 	if_lock(t);
 	list_for_each_entry(pkt_dev, &t->if_list, list) {
@@ -2879,7 +2875,7 @@
 {
 	struct pktgen_thread *t;
 
-	PG_DEBUG(printk("pktgen: entering pktgen_stop_all_threads_ifs.\n"));
+	pr_debug("pktgen: entering pktgen_stop_all_threads_ifs.\n");
 
 	mutex_lock(&pktgen_thread_lock);
 
@@ -2947,7 +2943,7 @@
 {
 	struct pktgen_thread *t;
 
-	PG_DEBUG(printk("pktgen: entering pktgen_run_all_threads.\n"));
+	pr_debug("pktgen: entering pktgen_run_all_threads.\n");
 
 	mutex_lock(&pktgen_thread_lock);
 
@@ -3039,7 +3035,7 @@
 {
 	struct pktgen_dev *pkt_dev;
 
-	PG_DEBUG(printk("pktgen: entering pktgen_stop\n"));
+	pr_debug("pktgen: entering pktgen_stop\n");
 
 	if_lock(t);
 
@@ -3063,7 +3059,7 @@
 	struct list_head *q, *n;
 	struct pktgen_dev *cur;
 
-	PG_DEBUG(printk("pktgen: entering pktgen_rem_one_if\n"));
+	pr_debug("pktgen: entering pktgen_rem_one_if\n");
 
 	if_lock(t);
 
@@ -3092,7 +3088,7 @@
 
 	/* Remove all devices, free mem */
 
-	PG_DEBUG(printk("pktgen: entering pktgen_rem_all_ifs\n"));
+	pr_debug("pktgen: entering pktgen_rem_all_ifs\n");
 	if_lock(t);
 
 	list_for_each_safe(q, n, &t->if_list) {
@@ -3275,7 +3271,7 @@
 
 	t->pid = current->pid;
 
-	PG_DEBUG(printk("pktgen: starting pktgen/%d:  pid=%d\n", cpu, current->pid));
+	pr_debug("pktgen: starting pktgen/%d:  pid=%d\n", cpu, current->pid);
 
 	max_before_softirq = t->max_before_softirq;
 
@@ -3336,13 +3332,13 @@
 		set_current_state(TASK_INTERRUPTIBLE);
 	}
 
-	PG_DEBUG(printk("pktgen: %s stopping all device\n", t->tsk->comm));
+	pr_debug("pktgen: %s stopping all device\n", t->tsk->comm);
 	pktgen_stop(t);
 
-	PG_DEBUG(printk("pktgen: %s removing all device\n", t->tsk->comm));
+	pr_debug("pktgen: %s removing all device\n", t->tsk->comm);
 	pktgen_rem_all_ifs(t);
 
-	PG_DEBUG(printk("pktgen: %s removing thread.\n", t->tsk->comm));
+	pr_debug("pktgen: %s removing thread.\n", t->tsk->comm);
 	pktgen_rem_thread(t);
 
 	return 0;
@@ -3361,7 +3357,7 @@
 		}
 
 	if_unlock(t);
-	PG_DEBUG(printk("pktgen: find_dev(%s) returning %p\n", ifname, pkt_dev));
+	pr_debug("pktgen: find_dev(%s) returning %p\n", ifname, pkt_dev);
 	return pkt_dev;
 }
 
@@ -3530,7 +3526,7 @@
 				struct pktgen_dev *pkt_dev)
 {
 
-	PG_DEBUG(printk("pktgen: remove_device pkt_dev=%p\n", pkt_dev));
+	pr_debug("pktgen: remove_device pkt_dev=%p\n", pkt_dev);
 
 	if (pkt_dev->running) {
 		printk("pktgen:WARNING: trying to remove a running interface, stopping it now.\n");

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 2/4] pktgen: use random32
  2007-02-27 20:04 [PATCH 1/4] pktgen: use pr_debug Stephen Hemminger
@ 2007-02-27 20:06 ` Stephen Hemminger
  2007-02-28 16:56   ` Robert Olsson
  2007-02-27 20:12 ` [PATCH 3/4] pktgen: don't use __constant_htonl() Stephen Hemminger
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 9+ messages in thread
From: Stephen Hemminger @ 2007-02-27 20:06 UTC (permalink / raw)
  To: Robert Olsson, David S. Miller; +Cc: netdev

Can use random32() now.

Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>

---
 net/core/pktgen.c |   52 +++++++++++++++++++---------------------------------
 1 file changed, 19 insertions(+), 33 deletions(-)

--- pktgen.orig/net/core/pktgen.c	2007-02-26 14:34:36.000000000 -0800
+++ pktgen/net/core/pktgen.c	2007-02-26 14:39:53.000000000 -0800
@@ -464,17 +464,6 @@
 	return tmp;
 }
 
-static inline u32 pktgen_random(void)
-{
-#if 0
-	__u32 n;
-	get_random_bytes(&n, 4);
-	return n;
-#else
-	return net_random();
-#endif
-}
-
 static inline __u64 getCurMs(void)
 {
 	struct timeval tv;
@@ -2091,7 +2080,7 @@
 	int flow = 0;
 
 	if (pkt_dev->cflows) {
-		flow = pktgen_random() % pkt_dev->cflows;
+		flow = random32() % pkt_dev->cflows;
 
 		if (pkt_dev->flows[flow].count > pkt_dev->lflow)
 			pkt_dev->flows[flow].count = 0;
@@ -2103,7 +2092,7 @@
 		__u32 tmp;
 
 		if (pkt_dev->flags & F_MACSRC_RND)
-			mc = pktgen_random() % (pkt_dev->src_mac_count);
+			mc = random32() % pkt_dev->src_mac_count;
 		else {
 			mc = pkt_dev->cur_src_mac_offset++;
 			if (pkt_dev->cur_src_mac_offset >
@@ -2129,7 +2118,7 @@
 		__u32 tmp;
 
 		if (pkt_dev->flags & F_MACDST_RND)
-			mc = pktgen_random() % (pkt_dev->dst_mac_count);
+			mc = random32() % pkt_dev->dst_mac_count;
 
 		else {
 			mc = pkt_dev->cur_dst_mac_offset++;
@@ -2156,24 +2145,23 @@
 		for(i = 0; i < pkt_dev->nr_labels; i++)
 			if (pkt_dev->labels[i] & MPLS_STACK_BOTTOM)
 				pkt_dev->labels[i] = MPLS_STACK_BOTTOM |
-					     ((__force __be32)pktgen_random() &
+					     ((__force __be32)random32() &
 						      htonl(0x000fffff));
 	}
 
 	if ((pkt_dev->flags & F_VID_RND) && (pkt_dev->vlan_id != 0xffff)) {
-		pkt_dev->vlan_id = pktgen_random() % 4096;
+		pkt_dev->vlan_id = random32() & (4096-1);
 	}
 
 	if ((pkt_dev->flags & F_SVID_RND) && (pkt_dev->svlan_id != 0xffff)) {
-		pkt_dev->svlan_id = pktgen_random() % 4096;
+		pkt_dev->svlan_id = random32() & (4096 - 1);
 	}
 
 	if (pkt_dev->udp_src_min < pkt_dev->udp_src_max) {
 		if (pkt_dev->flags & F_UDPSRC_RND)
-			pkt_dev->cur_udp_src =
-			    ((pktgen_random() %
-			      (pkt_dev->udp_src_max - pkt_dev->udp_src_min)) +
-			     pkt_dev->udp_src_min);
+			pkt_dev->cur_udp_src = random32() %
+				(pkt_dev->udp_src_max - pkt_dev->udp_src_min)
+				+ pkt_dev->udp_src_min;
 
 		else {
 			pkt_dev->cur_udp_src++;
@@ -2184,10 +2172,9 @@
 
 	if (pkt_dev->udp_dst_min < pkt_dev->udp_dst_max) {
 		if (pkt_dev->flags & F_UDPDST_RND) {
-			pkt_dev->cur_udp_dst =
-			    ((pktgen_random() %
-			      (pkt_dev->udp_dst_max - pkt_dev->udp_dst_min)) +
-			     pkt_dev->udp_dst_min);
+			pkt_dev->cur_udp_dst = random32() %
+				(pkt_dev->udp_dst_max - pkt_dev->udp_dst_min)
+				+ pkt_dev->udp_dst_min;
 		} else {
 			pkt_dev->cur_udp_dst++;
 			if (pkt_dev->cur_udp_dst >= pkt_dev->udp_dst_max)
@@ -2202,7 +2189,7 @@
 							       saddr_max))) {
 			__u32 t;
 			if (pkt_dev->flags & F_IPSRC_RND)
-				t = ((pktgen_random() % (imx - imn)) + imn);
+				t = random32() % (imx - imn) + imn;
 			else {
 				t = ntohl(pkt_dev->cur_saddr);
 				t++;
@@ -2223,14 +2210,13 @@
 				__be32 s;
 				if (pkt_dev->flags & F_IPDST_RND) {
 
-					t = pktgen_random() % (imx - imn) + imn;
+					t = random32() % (imx - imn) + imn;
 					s = htonl(t);
 
 					while (LOOPBACK(s) || MULTICAST(s)
 					       || BADCLASS(s) || ZERONET(s)
 					       || LOCAL_MCAST(s)) {
-						t = (pktgen_random() %
-						      (imx - imn)) + imn;
+						t = random32() % (imx - imn) + imn;
 						s = htonl(t);
 					}
 					pkt_dev->cur_daddr = s;
@@ -2262,7 +2248,7 @@
 
 			for (i = 0; i < 4; i++) {
 				pkt_dev->cur_in6_daddr.s6_addr32[i] =
-				    (((__force __be32)pktgen_random() |
+				    (((__force __be32)random32() |
 				      pkt_dev->min_in6_daddr.s6_addr32[i]) &
 				     pkt_dev->max_in6_daddr.s6_addr32[i]);
 			}
@@ -2272,9 +2258,9 @@
 	if (pkt_dev->min_pkt_size < pkt_dev->max_pkt_size) {
 		__u32 t;
 		if (pkt_dev->flags & F_TXSIZE_RND) {
-			t = ((pktgen_random() %
-			      (pkt_dev->max_pkt_size - pkt_dev->min_pkt_size))
-			     + pkt_dev->min_pkt_size);
+			t = random32() %
+				(pkt_dev->max_pkt_size - pkt_dev->min_pkt_size)
+				+ pkt_dev->min_pkt_size;
 		} else {
 			t = pkt_dev->cur_pkt_size + 1;
 			if (t > pkt_dev->max_pkt_size)

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 3/4] pktgen: don't use __constant_htonl()
  2007-02-27 20:04 [PATCH 1/4] pktgen: use pr_debug Stephen Hemminger
  2007-02-27 20:06 ` [PATCH 2/4] pktgen: use random32 Stephen Hemminger
@ 2007-02-27 20:12 ` Stephen Hemminger
  2007-02-28 16:58   ` Robert Olsson
  2007-02-27 20:13 ` [PATCH 4/4] pktgen: fix device name handling Stephen Hemminger
  2007-02-28 16:52 ` [PATCH 1/4] pktgen: use pr_debug Robert Olsson
  3 siblings, 1 reply; 9+ messages in thread
From: Stephen Hemminger @ 2007-02-27 20:12 UTC (permalink / raw)
  To: Robert Olsson, David S. Miller; +Cc: netdev

The existing htonl() macro is smart enough to do the same code as
using __constant_htonl() and it looks cleaner.

Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>

---
 net/core/pktgen.c |   24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)

--- pktgen.orig/net/core/pktgen.c	2007-02-26 14:40:31.000000000 -0800
+++ pktgen/net/core/pktgen.c	2007-02-26 15:36:38.000000000 -0800
@@ -167,7 +167,7 @@
 #define LAT_BUCKETS_MAX 32
 #define IP_NAME_SZ 32
 #define MAX_MPLS_LABELS 16 /* This is the max label stack depth */
-#define MPLS_STACK_BOTTOM __constant_htonl(0x00000100)
+#define MPLS_STACK_BOTTOM htonl(0x00000100)
 
 /* Device flag bits */
 #define F_IPSRC_RND   (1<<0)	/* IP-Src Random  */
@@ -2297,7 +2297,7 @@
 	int datalen, iplen;
 	struct iphdr *iph;
 	struct pktgen_hdr *pgh = NULL;
-	__be16 protocol = __constant_htons(ETH_P_IP);
+	__be16 protocol = htons(ETH_P_IP);
 	__be32 *mpls;
 	__be16 *vlan_tci = NULL;                 /* Encapsulates priority and VLAN ID */
 	__be16 *vlan_encapsulated_proto = NULL;  /* packet type ID field (or len) for VLAN tag */
@@ -2306,10 +2306,10 @@
 
 
 	if (pkt_dev->nr_labels)
-		protocol = __constant_htons(ETH_P_MPLS_UC);
+		protocol = htons(ETH_P_MPLS_UC);
 
 	if (pkt_dev->vlan_id != 0xffff)
-		protocol = __constant_htons(ETH_P_8021Q);
+		protocol = htons(ETH_P_8021Q);
 
 	/* Update any of the values, used when we're incrementing various
 	 * fields.
@@ -2341,14 +2341,14 @@
 					       pkt_dev->svlan_cfi,
 					       pkt_dev->svlan_p);
 			svlan_encapsulated_proto = (__be16 *)skb_put(skb, sizeof(__be16));
-			*svlan_encapsulated_proto = __constant_htons(ETH_P_8021Q);
+			*svlan_encapsulated_proto = htons(ETH_P_8021Q);
 		}
 		vlan_tci = (__be16 *)skb_put(skb, sizeof(__be16));
 		*vlan_tci = build_tci(pkt_dev->vlan_id,
 				      pkt_dev->vlan_cfi,
 				      pkt_dev->vlan_p);
 		vlan_encapsulated_proto = (__be16 *)skb_put(skb, sizeof(__be16));
-		*vlan_encapsulated_proto = __constant_htons(ETH_P_IP);
+		*vlan_encapsulated_proto = htons(ETH_P_IP);
 	}
 
 	iph = (struct iphdr *)skb_put(skb, sizeof(struct iphdr));
@@ -2635,7 +2635,7 @@
 	int datalen;
 	struct ipv6hdr *iph;
 	struct pktgen_hdr *pgh = NULL;
-	__be16 protocol = __constant_htons(ETH_P_IPV6);
+	__be16 protocol = htons(ETH_P_IPV6);
 	__be32 *mpls;
 	__be16 *vlan_tci = NULL;                 /* Encapsulates priority and VLAN ID */
 	__be16 *vlan_encapsulated_proto = NULL;  /* packet type ID field (or len) for VLAN tag */
@@ -2643,10 +2643,10 @@
 	__be16 *svlan_encapsulated_proto = NULL; /* packet type ID field (or len) for SVLAN tag */
 
 	if (pkt_dev->nr_labels)
-		protocol = __constant_htons(ETH_P_MPLS_UC);
+		protocol = htons(ETH_P_MPLS_UC);
 
 	if (pkt_dev->vlan_id != 0xffff)
-		protocol = __constant_htons(ETH_P_8021Q);
+		protocol = htons(ETH_P_8021Q);
 
 	/* Update any of the values, used when we're incrementing various
 	 * fields.
@@ -2677,14 +2677,14 @@
 					       pkt_dev->svlan_cfi,
 					       pkt_dev->svlan_p);
 			svlan_encapsulated_proto = (__be16 *)skb_put(skb, sizeof(__be16));
-			*svlan_encapsulated_proto = __constant_htons(ETH_P_8021Q);
+			*svlan_encapsulated_proto = htons(ETH_P_8021Q);
 		}
 		vlan_tci = (__be16 *)skb_put(skb, sizeof(__be16));
 		*vlan_tci = build_tci(pkt_dev->vlan_id,
 				      pkt_dev->vlan_cfi,
 				      pkt_dev->vlan_p);
 		vlan_encapsulated_proto = (__be16 *)skb_put(skb, sizeof(__be16));
-		*vlan_encapsulated_proto = __constant_htons(ETH_P_IPV6);
+		*vlan_encapsulated_proto = htons(ETH_P_IPV6);
 	}
 
 	iph = (struct ipv6hdr *)skb_put(skb, sizeof(struct ipv6hdr));
@@ -2710,7 +2710,7 @@
 	udph->len = htons(datalen + sizeof(struct udphdr));
 	udph->check = 0;	/* No checksum */
 
-	*(__be32 *) iph = __constant_htonl(0x60000000);	/* Version + flow */
+	*(__be32 *) iph = htonl(0x60000000);	/* Version + flow */
 
 	if (pkt_dev->traffic_class) {
 		/* Version + traffic class + flow (0) */

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 4/4] pktgen: fix device name handling
  2007-02-27 20:04 [PATCH 1/4] pktgen: use pr_debug Stephen Hemminger
  2007-02-27 20:06 ` [PATCH 2/4] pktgen: use random32 Stephen Hemminger
  2007-02-27 20:12 ` [PATCH 3/4] pktgen: don't use __constant_htonl() Stephen Hemminger
@ 2007-02-27 20:13 ` Stephen Hemminger
  2007-02-28 17:07   ` Robert Olsson
  2007-02-28 16:52 ` [PATCH 1/4] pktgen: use pr_debug Robert Olsson
  3 siblings, 1 reply; 9+ messages in thread
From: Stephen Hemminger @ 2007-02-27 20:13 UTC (permalink / raw)
  To: Robert Olsson, David S. Miller; +Cc: netdev

Since devices can change name and other wierdness, don't hold onto
a copy of device name, instead use pointer to output device.

Fix a couple of leaks in error handling path as well.

Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>

---
 net/core/pktgen.c |  137 +++++++++++++++++++++++++++---------------------------
 1 file changed, 70 insertions(+), 67 deletions(-)

--- pktgen.orig/net/core/pktgen.c	2007-02-27 12:08:58.000000000 -0800
+++ pktgen/net/core/pktgen.c	2007-02-27 12:11:32.000000000 -0800
@@ -210,15 +210,11 @@
 };
 
 struct pktgen_dev {
-
 	/*
 	 * Try to keep frequent/infrequent used vars. separated.
 	 */
-
-	char ifname[IFNAMSIZ];
-	char result[512];
-
-	struct pktgen_thread *pg_thread;	/* the owner */
+	struct proc_dir_entry *entry;	/* proc file */
+	struct pktgen_thread *pg_thread;/* the owner */
 	struct list_head list;		/* Used for chaining in the thread's run-queue */
 
 	int running;		/* if this changes to false, the test will stop */
@@ -345,6 +341,8 @@
 	unsigned cflows;	/* Concurrent flows (config) */
 	unsigned lflow;		/* Flow length  (config) */
 	unsigned nflows;	/* accumulated flows (stats) */
+
+	char result[512];
 };
 
 struct pktgen_hdr {
@@ -497,7 +495,7 @@
 static int pktgen_stop_device(struct pktgen_dev *pkt_dev);
 static void pktgen_stop(struct pktgen_thread *t);
 static void pktgen_clear_counters(struct pktgen_dev *pkt_dev);
-static int pktgen_mark_device(const char *ifname);
+
 static unsigned int scan_ip6(const char *s, char ip[16]);
 static unsigned int fmt_ip6(char *s, const char ip[16]);
 
@@ -591,7 +589,7 @@
 		   "     frags: %d  delay: %u  clone_skb: %d  ifname: %s\n",
 		   pkt_dev->nfrags,
 		   1000 * pkt_dev->delay_us + pkt_dev->delay_ns,
-		   pkt_dev->clone_skb, pkt_dev->ifname);
+		   pkt_dev->clone_skb, pkt_dev->odev->name);
 
 	seq_printf(seq, "     flows: %u flowlen: %u\n", pkt_dev->cflows,
 		   pkt_dev->lflow);
@@ -1682,13 +1680,13 @@
 	if_lock(t);
 	list_for_each_entry(pkt_dev, &t->if_list, list)
 		if (pkt_dev->running)
-			seq_printf(seq, "%s ", pkt_dev->ifname);
+			seq_printf(seq, "%s ", pkt_dev->odev->name);
 
 	seq_printf(seq, "\nStopped: ");
 
 	list_for_each_entry(pkt_dev, &t->if_list, list)
 		if (!pkt_dev->running)
-			seq_printf(seq, "%s ", pkt_dev->ifname);
+			seq_printf(seq, "%s ", pkt_dev->odev->name);
 
 	if (t->result[0])
 		seq_printf(seq, "\nResult: %s\n", t->result);
@@ -1834,12 +1832,11 @@
 /*
  * mark a device for removal
  */
-static int pktgen_mark_device(const char *ifname)
+static void pktgen_mark_device(const char *ifname)
 {
 	struct pktgen_dev *pkt_dev = NULL;
 	const int max_tries = 10, msec_per_try = 125;
 	int i = 0;
-	int ret = 0;
 
 	mutex_lock(&pktgen_thread_lock);
 	pr_debug("pktgen: pktgen_mark_device marking %s for removal\n", ifname);
@@ -1860,32 +1857,49 @@
 			printk("pktgen_mark_device: timed out after waiting "
 			       "%d msec for device %s to be removed\n",
 			       msec_per_try * i, ifname);
-			ret = 1;
 			break;
 		}
 
 	}
 
 	mutex_unlock(&pktgen_thread_lock);
+}
 
-	return ret;
+static void pktgen_change_name(struct net_device *dev)
+{
+	struct pktgen_thread *t;
+
+	list_for_each_entry(t, &pktgen_threads, th_list) {
+		struct pktgen_dev *pkt_dev;
+
+		list_for_each_entry(pkt_dev, &t->if_list, list) {
+			if (pkt_dev->odev != dev)
+				continue;
+
+			remove_proc_entry(pkt_dev->entry->name, pg_proc_dir);
+
+			pkt_dev->entry = create_proc_entry(dev->name, 0600,
+							   pg_proc_dir);
+			if (!pkt_dev->entry)
+				printk(KERN_ERR "pktgen: can't move proc "
+				       " entry for '%s'\n", dev->name);
+			break;
+		}
+	}
 }
 
 static int pktgen_device_event(struct notifier_block *unused,
 			       unsigned long event, void *ptr)
 {
-	struct net_device *dev = (struct net_device *)(ptr);
+	struct net_device *dev = ptr;
 
 	/* It is OK that we do not hold the group lock right now,
 	 * as we run under the RTNL lock.
 	 */
 
 	switch (event) {
-	case NETDEV_CHANGEADDR:
-	case NETDEV_GOING_DOWN:
-	case NETDEV_DOWN:
-	case NETDEV_UP:
-		/* Ignore for now */
+	case NETDEV_CHANGENAME:
+		pktgen_change_name(dev);
 		break;
 
 	case NETDEV_UNREGISTER:
@@ -1898,41 +1912,36 @@
 
 /* Associate pktgen_dev with a device. */
 
-static struct net_device *pktgen_setup_dev(struct pktgen_dev *pkt_dev)
+static int pktgen_setup_dev(struct pktgen_dev *pkt_dev, const char *ifname)
 {
 	struct net_device *odev;
+	int err;
 
 	/* Clean old setups */
-
 	if (pkt_dev->odev) {
 		dev_put(pkt_dev->odev);
 		pkt_dev->odev = NULL;
 	}
 
-	odev = dev_get_by_name(pkt_dev->ifname);
-
+	odev = dev_get_by_name(ifname);
 	if (!odev) {
-		printk("pktgen: no such netdevice: \"%s\"\n", pkt_dev->ifname);
-		goto out;
+		printk("pktgen: no such netdevice: \"%s\"\n", ifname);
+		return -ENODEV;
 	}
+
 	if (odev->type != ARPHRD_ETHER) {
-		printk("pktgen: not an ethernet device: \"%s\"\n",
-		       pkt_dev->ifname);
-		goto out_put;
-	}
-	if (!netif_running(odev)) {
-		printk("pktgen: device is down: \"%s\"\n", pkt_dev->ifname);
-		goto out_put;
+		printk("pktgen: not an ethernet device: \"%s\"\n", ifname);
+		err = -EINVAL;
+	} else if (!netif_running(odev)) {
+		printk("pktgen: device is down: \"%s\"\n", ifname);
+		err = -ENETDOWN;
+	} else {
+		pkt_dev->odev = odev;
+		return 0;
 	}
-	pkt_dev->odev = odev;
-
-	return pkt_dev->odev;
 
-out_put:
 	dev_put(odev);
-out:
-	return NULL;
-
+	return err;
 }
 
 /* Read pkt_dev from the interface and set up internal pktgen_dev
@@ -1940,10 +1949,6 @@
  */
 static void pktgen_setup_inject(struct pktgen_dev *pkt_dev)
 {
-	/* Try once more, just in case it works now. */
-	if (!pkt_dev->odev)
-		pktgen_setup_dev(pkt_dev);
-
 	if (!pkt_dev->odev) {
 		printk("pktgen: ERROR: pkt_dev->odev == NULL in setup_inject.\n");
 		sprintf(pkt_dev->result,
@@ -2987,7 +2992,7 @@
 
 	if (!pkt_dev->running) {
 		printk("pktgen: interface: %s is already stopped\n",
-		       pkt_dev->ifname);
+		       pkt_dev->odev->name);
 		return -EINVAL;
 	}
 
@@ -3337,7 +3342,7 @@
 	if_lock(t);
 
 	list_for_each_entry(p, &t->if_list, list)
-		if (strncmp(p->ifname, ifname, IFNAMSIZ) == 0) {
+		if (strncmp(p->odev->name, ifname, IFNAMSIZ) == 0) {
 			pkt_dev = p;
 			break;
 		}
@@ -3378,7 +3383,7 @@
 static int pktgen_add_device(struct pktgen_thread *t, const char *ifname)
 {
 	struct pktgen_dev *pkt_dev;
-	struct proc_dir_entry *pe;
+	int err;
 
 	/* We don't allow a device to be on several threads */
 
@@ -3420,29 +3425,28 @@
 	pkt_dev->svlan_cfi = 0;
 	pkt_dev->svlan_id = 0xffff;
 
-	strncpy(pkt_dev->ifname, ifname, IFNAMSIZ);
+	err = pktgen_setup_dev(pkt_dev, ifname);
+	if (err)
+		goto out1;
 
-	if (!pktgen_setup_dev(pkt_dev)) {
-		printk("pktgen: ERROR: pktgen_setup_dev failed.\n");
-		if (pkt_dev->flows)
-			vfree(pkt_dev->flows);
-		kfree(pkt_dev);
-		return -ENODEV;
-	}
-
-	pe = create_proc_entry(ifname, 0600, pg_proc_dir);
-	if (!pe) {
+	pkt_dev->entry = create_proc_entry(ifname, 0600, pg_proc_dir);
+	if (!pkt_dev->entry) {
 		printk("pktgen: cannot create %s/%s procfs entry.\n",
 		       PG_PROC_DIR, ifname);
-		if (pkt_dev->flows)
-			vfree(pkt_dev->flows);
-		kfree(pkt_dev);
-		return -EINVAL;
+		err = -EINVAL;
+		goto out2;
 	}
-	pe->proc_fops = &pktgen_if_fops;
-	pe->data = pkt_dev;
+	pkt_dev->entry->proc_fops = &pktgen_if_fops;
+	pkt_dev->entry->data = pkt_dev;
 
 	return add_dev_to_thread(t, pkt_dev);
+out2:
+	dev_put(pkt_dev->odev);
+out1:
+	if (pkt_dev->flows)
+		vfree(pkt_dev->flows);
+	kfree(pkt_dev);
+	return err;
 }
 
 static int __init pktgen_create_thread(int cpu)
@@ -3530,9 +3534,8 @@
 
 	_rem_dev_from_if_list(t, pkt_dev);
 
-	/* Clean up proc file system */
-
-	remove_proc_entry(pkt_dev->ifname, pg_proc_dir);
+	if (pkt_dev->entry)
+		remove_proc_entry(pkt_dev->entry->name, pg_proc_dir);
 
 	if (pkt_dev->flows)
 		vfree(pkt_dev->flows);

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/4] pktgen: use pr_debug
  2007-02-27 20:04 [PATCH 1/4] pktgen: use pr_debug Stephen Hemminger
                   ` (2 preceding siblings ...)
  2007-02-27 20:13 ` [PATCH 4/4] pktgen: fix device name handling Stephen Hemminger
@ 2007-02-28 16:52 ` Robert Olsson
  3 siblings, 0 replies; 9+ messages in thread
From: Robert Olsson @ 2007-02-28 16:52 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: Robert Olsson, David S. Miller, netdev


Thanks!

Signed-off-by: Robert Olsson <robert.olsson@its.uu.se>

					--ro



Stephen Hemminger writes:
 > Remove private debug macro and replace with standard version
 > 
 > Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
 > 
 > 
 > ---
 >  net/core/pktgen.c |   34 +++++++++++++++-------------------
 >  1 file changed, 15 insertions(+), 19 deletions(-)
 > 
 > --- pktgen.orig/net/core/pktgen.c	2007-02-26 13:21:54.000000000 -0800
 > +++ pktgen/net/core/pktgen.c	2007-02-26 13:22:04.000000000 -0800
 > @@ -163,9 +163,6 @@
 >  
 >  #define VERSION  "pktgen v2.68: Packet Generator for packet performance testing.\n"
 >  
 > -/* #define PG_DEBUG(a) a */
 > -#define PG_DEBUG(a)
 > -
 >  /* The buckets are exponential in 'width' */
 >  #define LAT_BUCKETS_MAX 32
 >  #define IP_NAME_SZ 32
 > @@ -1856,8 +1853,7 @@
 >  	int ret = 0;
 >  
 >  	mutex_lock(&pktgen_thread_lock);
 > -	PG_DEBUG(printk("pktgen: pktgen_mark_device marking %s for removal\n",
 > -			ifname));
 > +	pr_debug("pktgen: pktgen_mark_device marking %s for removal\n", ifname);
 >  
 >  	while (1) {
 >  
 > @@ -1866,8 +1862,8 @@
 >  			break;	/* success */
 >  
 >  		mutex_unlock(&pktgen_thread_lock);
 > -		PG_DEBUG(printk("pktgen: pktgen_mark_device waiting for %s "
 > -				"to disappear....\n", ifname));
 > +		pr_debug("pktgen: pktgen_mark_device waiting for %s "
 > +				"to disappear....\n", ifname);
 >  		schedule_timeout_interruptible(msecs_to_jiffies(msec_per_try));
 >  		mutex_lock(&pktgen_thread_lock);
 >  
 > @@ -2847,7 +2843,7 @@
 >  	struct pktgen_dev *pkt_dev;
 >  	int started = 0;
 >  
 > -	PG_DEBUG(printk("pktgen: entering pktgen_run. %p\n", t));
 > +	pr_debug("pktgen: entering pktgen_run. %p\n", t);
 >  
 >  	if_lock(t);
 >  	list_for_each_entry(pkt_dev, &t->if_list, list) {
 > @@ -2879,7 +2875,7 @@
 >  {
 >  	struct pktgen_thread *t;
 >  
 > -	PG_DEBUG(printk("pktgen: entering pktgen_stop_all_threads_ifs.\n"));
 > +	pr_debug("pktgen: entering pktgen_stop_all_threads_ifs.\n");
 >  
 >  	mutex_lock(&pktgen_thread_lock);
 >  
 > @@ -2947,7 +2943,7 @@
 >  {
 >  	struct pktgen_thread *t;
 >  
 > -	PG_DEBUG(printk("pktgen: entering pktgen_run_all_threads.\n"));
 > +	pr_debug("pktgen: entering pktgen_run_all_threads.\n");
 >  
 >  	mutex_lock(&pktgen_thread_lock);
 >  
 > @@ -3039,7 +3035,7 @@
 >  {
 >  	struct pktgen_dev *pkt_dev;
 >  
 > -	PG_DEBUG(printk("pktgen: entering pktgen_stop\n"));
 > +	pr_debug("pktgen: entering pktgen_stop\n");
 >  
 >  	if_lock(t);
 >  
 > @@ -3063,7 +3059,7 @@
 >  	struct list_head *q, *n;
 >  	struct pktgen_dev *cur;
 >  
 > -	PG_DEBUG(printk("pktgen: entering pktgen_rem_one_if\n"));
 > +	pr_debug("pktgen: entering pktgen_rem_one_if\n");
 >  
 >  	if_lock(t);
 >  
 > @@ -3092,7 +3088,7 @@
 >  
 >  	/* Remove all devices, free mem */
 >  
 > -	PG_DEBUG(printk("pktgen: entering pktgen_rem_all_ifs\n"));
 > +	pr_debug("pktgen: entering pktgen_rem_all_ifs\n");
 >  	if_lock(t);
 >  
 >  	list_for_each_safe(q, n, &t->if_list) {
 > @@ -3275,7 +3271,7 @@
 >  
 >  	t->pid = current->pid;
 >  
 > -	PG_DEBUG(printk("pktgen: starting pktgen/%d:  pid=%d\n", cpu, current->pid));
 > +	pr_debug("pktgen: starting pktgen/%d:  pid=%d\n", cpu, current->pid);
 >  
 >  	max_before_softirq = t->max_before_softirq;
 >  
 > @@ -3336,13 +3332,13 @@
 >  		set_current_state(TASK_INTERRUPTIBLE);
 >  	}
 >  
 > -	PG_DEBUG(printk("pktgen: %s stopping all device\n", t->tsk->comm));
 > +	pr_debug("pktgen: %s stopping all device\n", t->tsk->comm);
 >  	pktgen_stop(t);
 >  
 > -	PG_DEBUG(printk("pktgen: %s removing all device\n", t->tsk->comm));
 > +	pr_debug("pktgen: %s removing all device\n", t->tsk->comm);
 >  	pktgen_rem_all_ifs(t);
 >  
 > -	PG_DEBUG(printk("pktgen: %s removing thread.\n", t->tsk->comm));
 > +	pr_debug("pktgen: %s removing thread.\n", t->tsk->comm);
 >  	pktgen_rem_thread(t);
 >  
 >  	return 0;
 > @@ -3361,7 +3357,7 @@
 >  		}
 >  
 >  	if_unlock(t);
 > -	PG_DEBUG(printk("pktgen: find_dev(%s) returning %p\n", ifname, pkt_dev));
 > +	pr_debug("pktgen: find_dev(%s) returning %p\n", ifname, pkt_dev);
 >  	return pkt_dev;
 >  }
 >  
 > @@ -3530,7 +3526,7 @@
 >  				struct pktgen_dev *pkt_dev)
 >  {
 >  
 > -	PG_DEBUG(printk("pktgen: remove_device pkt_dev=%p\n", pkt_dev));
 > +	pr_debug("pktgen: remove_device pkt_dev=%p\n", pkt_dev);
 >  
 >  	if (pkt_dev->running) {
 >  		printk("pktgen:WARNING: trying to remove a running interface, stopping it now.\n");
 > -
 > To unsubscribe from this list: send the line "unsubscribe netdev" in
 > the body of a message to majordomo@vger.kernel.org
 > More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 2/4] pktgen: use random32
  2007-02-27 20:06 ` [PATCH 2/4] pktgen: use random32 Stephen Hemminger
@ 2007-02-28 16:56   ` Robert Olsson
  0 siblings, 0 replies; 9+ messages in thread
From: Robert Olsson @ 2007-02-28 16:56 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: Robert Olsson, David S. Miller, netdev


Thanks!

It seems like network code has preference for net_random() but they
are the same now.

Signed-off-by: Robert Olsson <robert.olsson@its.uu.se>

Cheers.

					--ro

Stephen Hemminger writes:
 > Can use random32() now.
 > 
 > Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
 > 
 > ---
 >  net/core/pktgen.c |   52 +++++++++++++++++++---------------------------------
 >  1 file changed, 19 insertions(+), 33 deletions(-)
 > 
 > --- pktgen.orig/net/core/pktgen.c	2007-02-26 14:34:36.000000000 -0800
 > +++ pktgen/net/core/pktgen.c	2007-02-26 14:39:53.000000000 -0800
 > @@ -464,17 +464,6 @@
 >  	return tmp;
 >  }
 >  
 > -static inline u32 pktgen_random(void)
 > -{
 > -#if 0
 > -	__u32 n;
 > -	get_random_bytes(&n, 4);
 > -	return n;
 > -#else
 > -	return net_random();
 > -#endif
 > -}
 > -
 >  static inline __u64 getCurMs(void)
 >  {
 >  	struct timeval tv;
 > @@ -2091,7 +2080,7 @@
 >  	int flow = 0;
 >  
 >  	if (pkt_dev->cflows) {
 > -		flow = pktgen_random() % pkt_dev->cflows;
 > +		flow = random32() % pkt_dev->cflows;
 >  
 >  		if (pkt_dev->flows[flow].count > pkt_dev->lflow)
 >  			pkt_dev->flows[flow].count = 0;
 > @@ -2103,7 +2092,7 @@
 >  		__u32 tmp;
 >  
 >  		if (pkt_dev->flags & F_MACSRC_RND)
 > -			mc = pktgen_random() % (pkt_dev->src_mac_count);
 > +			mc = random32() % pkt_dev->src_mac_count;
 >  		else {
 >  			mc = pkt_dev->cur_src_mac_offset++;
 >  			if (pkt_dev->cur_src_mac_offset >
 > @@ -2129,7 +2118,7 @@
 >  		__u32 tmp;
 >  
 >  		if (pkt_dev->flags & F_MACDST_RND)
 > -			mc = pktgen_random() % (pkt_dev->dst_mac_count);
 > +			mc = random32() % pkt_dev->dst_mac_count;
 >  
 >  		else {
 >  			mc = pkt_dev->cur_dst_mac_offset++;
 > @@ -2156,24 +2145,23 @@
 >  		for(i = 0; i < pkt_dev->nr_labels; i++)
 >  			if (pkt_dev->labels[i] & MPLS_STACK_BOTTOM)
 >  				pkt_dev->labels[i] = MPLS_STACK_BOTTOM |
 > -					     ((__force __be32)pktgen_random() &
 > +					     ((__force __be32)random32() &
 >  						      htonl(0x000fffff));
 >  	}
 >  
 >  	if ((pkt_dev->flags & F_VID_RND) && (pkt_dev->vlan_id != 0xffff)) {
 > -		pkt_dev->vlan_id = pktgen_random() % 4096;
 > +		pkt_dev->vlan_id = random32() & (4096-1);
 >  	}
 >  
 >  	if ((pkt_dev->flags & F_SVID_RND) && (pkt_dev->svlan_id != 0xffff)) {
 > -		pkt_dev->svlan_id = pktgen_random() % 4096;
 > +		pkt_dev->svlan_id = random32() & (4096 - 1);
 >  	}
 >  
 >  	if (pkt_dev->udp_src_min < pkt_dev->udp_src_max) {
 >  		if (pkt_dev->flags & F_UDPSRC_RND)
 > -			pkt_dev->cur_udp_src =
 > -			    ((pktgen_random() %
 > -			      (pkt_dev->udp_src_max - pkt_dev->udp_src_min)) +
 > -			     pkt_dev->udp_src_min);
 > +			pkt_dev->cur_udp_src = random32() %
 > +				(pkt_dev->udp_src_max - pkt_dev->udp_src_min)
 > +				+ pkt_dev->udp_src_min;
 >  
 >  		else {
 >  			pkt_dev->cur_udp_src++;
 > @@ -2184,10 +2172,9 @@
 >  
 >  	if (pkt_dev->udp_dst_min < pkt_dev->udp_dst_max) {
 >  		if (pkt_dev->flags & F_UDPDST_RND) {
 > -			pkt_dev->cur_udp_dst =
 > -			    ((pktgen_random() %
 > -			      (pkt_dev->udp_dst_max - pkt_dev->udp_dst_min)) +
 > -			     pkt_dev->udp_dst_min);
 > +			pkt_dev->cur_udp_dst = random32() %
 > +				(pkt_dev->udp_dst_max - pkt_dev->udp_dst_min)
 > +				+ pkt_dev->udp_dst_min;
 >  		} else {
 >  			pkt_dev->cur_udp_dst++;
 >  			if (pkt_dev->cur_udp_dst >= pkt_dev->udp_dst_max)
 > @@ -2202,7 +2189,7 @@
 >  							       saddr_max))) {
 >  			__u32 t;
 >  			if (pkt_dev->flags & F_IPSRC_RND)
 > -				t = ((pktgen_random() % (imx - imn)) + imn);
 > +				t = random32() % (imx - imn) + imn;
 >  			else {
 >  				t = ntohl(pkt_dev->cur_saddr);
 >  				t++;
 > @@ -2223,14 +2210,13 @@
 >  				__be32 s;
 >  				if (pkt_dev->flags & F_IPDST_RND) {
 >  
 > -					t = pktgen_random() % (imx - imn) + imn;
 > +					t = random32() % (imx - imn) + imn;
 >  					s = htonl(t);
 >  
 >  					while (LOOPBACK(s) || MULTICAST(s)
 >  					       || BADCLASS(s) || ZERONET(s)
 >  					       || LOCAL_MCAST(s)) {
 > -						t = (pktgen_random() %
 > -						      (imx - imn)) + imn;
 > +						t = random32() % (imx - imn) + imn;
 >  						s = htonl(t);
 >  					}
 >  					pkt_dev->cur_daddr = s;
 > @@ -2262,7 +2248,7 @@
 >  
 >  			for (i = 0; i < 4; i++) {
 >  				pkt_dev->cur_in6_daddr.s6_addr32[i] =
 > -				    (((__force __be32)pktgen_random() |
 > +				    (((__force __be32)random32() |
 >  				      pkt_dev->min_in6_daddr.s6_addr32[i]) &
 >  				     pkt_dev->max_in6_daddr.s6_addr32[i]);
 >  			}
 > @@ -2272,9 +2258,9 @@
 >  	if (pkt_dev->min_pkt_size < pkt_dev->max_pkt_size) {
 >  		__u32 t;
 >  		if (pkt_dev->flags & F_TXSIZE_RND) {
 > -			t = ((pktgen_random() %
 > -			      (pkt_dev->max_pkt_size - pkt_dev->min_pkt_size))
 > -			     + pkt_dev->min_pkt_size);
 > +			t = random32() %
 > +				(pkt_dev->max_pkt_size - pkt_dev->min_pkt_size)
 > +				+ pkt_dev->min_pkt_size;
 >  		} else {
 >  			t = pkt_dev->cur_pkt_size + 1;
 >  			if (t > pkt_dev->max_pkt_size)
 > -
 > To unsubscribe from this list: send the line "unsubscribe netdev" in
 > the body of a message to majordomo@vger.kernel.org
 > More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 3/4] pktgen: don't use __constant_htonl()
  2007-02-27 20:12 ` [PATCH 3/4] pktgen: don't use __constant_htonl() Stephen Hemminger
@ 2007-02-28 16:58   ` Robert Olsson
  0 siblings, 0 replies; 9+ messages in thread
From: Robert Olsson @ 2007-02-28 16:58 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: Robert Olsson, David S. Miller, netdev


OK!

Signed-off-by: Robert Olsson <robert.olsson@its.uu.se>

Cheers.
					--ro

Stephen Hemminger writes:
 > The existing htonl() macro is smart enough to do the same code as
 > using __constant_htonl() and it looks cleaner.
 > 
 > Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
 > 
 > ---
 >  net/core/pktgen.c |   24 ++++++++++++------------
 >  1 file changed, 12 insertions(+), 12 deletions(-)
 > 
 > --- pktgen.orig/net/core/pktgen.c	2007-02-26 14:40:31.000000000 -0800
 > +++ pktgen/net/core/pktgen.c	2007-02-26 15:36:38.000000000 -0800
 > @@ -167,7 +167,7 @@
 >  #define LAT_BUCKETS_MAX 32
 >  #define IP_NAME_SZ 32
 >  #define MAX_MPLS_LABELS 16 /* This is the max label stack depth */
 > -#define MPLS_STACK_BOTTOM __constant_htonl(0x00000100)
 > +#define MPLS_STACK_BOTTOM htonl(0x00000100)
 >  
 >  /* Device flag bits */
 >  #define F_IPSRC_RND   (1<<0)	/* IP-Src Random  */
 > @@ -2297,7 +2297,7 @@
 >  	int datalen, iplen;
 >  	struct iphdr *iph;
 >  	struct pktgen_hdr *pgh = NULL;
 > -	__be16 protocol = __constant_htons(ETH_P_IP);
 > +	__be16 protocol = htons(ETH_P_IP);
 >  	__be32 *mpls;
 >  	__be16 *vlan_tci = NULL;                 /* Encapsulates priority and VLAN ID */
 >  	__be16 *vlan_encapsulated_proto = NULL;  /* packet type ID field (or len) for VLAN tag */
 > @@ -2306,10 +2306,10 @@
 >  
 >  
 >  	if (pkt_dev->nr_labels)
 > -		protocol = __constant_htons(ETH_P_MPLS_UC);
 > +		protocol = htons(ETH_P_MPLS_UC);
 >  
 >  	if (pkt_dev->vlan_id != 0xffff)
 > -		protocol = __constant_htons(ETH_P_8021Q);
 > +		protocol = htons(ETH_P_8021Q);
 >  
 >  	/* Update any of the values, used when we're incrementing various
 >  	 * fields.
 > @@ -2341,14 +2341,14 @@
 >  					       pkt_dev->svlan_cfi,
 >  					       pkt_dev->svlan_p);
 >  			svlan_encapsulated_proto = (__be16 *)skb_put(skb, sizeof(__be16));
 > -			*svlan_encapsulated_proto = __constant_htons(ETH_P_8021Q);
 > +			*svlan_encapsulated_proto = htons(ETH_P_8021Q);
 >  		}
 >  		vlan_tci = (__be16 *)skb_put(skb, sizeof(__be16));
 >  		*vlan_tci = build_tci(pkt_dev->vlan_id,
 >  				      pkt_dev->vlan_cfi,
 >  				      pkt_dev->vlan_p);
 >  		vlan_encapsulated_proto = (__be16 *)skb_put(skb, sizeof(__be16));
 > -		*vlan_encapsulated_proto = __constant_htons(ETH_P_IP);
 > +		*vlan_encapsulated_proto = htons(ETH_P_IP);
 >  	}
 >  
 >  	iph = (struct iphdr *)skb_put(skb, sizeof(struct iphdr));
 > @@ -2635,7 +2635,7 @@
 >  	int datalen;
 >  	struct ipv6hdr *iph;
 >  	struct pktgen_hdr *pgh = NULL;
 > -	__be16 protocol = __constant_htons(ETH_P_IPV6);
 > +	__be16 protocol = htons(ETH_P_IPV6);
 >  	__be32 *mpls;
 >  	__be16 *vlan_tci = NULL;                 /* Encapsulates priority and VLAN ID */
 >  	__be16 *vlan_encapsulated_proto = NULL;  /* packet type ID field (or len) for VLAN tag */
 > @@ -2643,10 +2643,10 @@
 >  	__be16 *svlan_encapsulated_proto = NULL; /* packet type ID field (or len) for SVLAN tag */
 >  
 >  	if (pkt_dev->nr_labels)
 > -		protocol = __constant_htons(ETH_P_MPLS_UC);
 > +		protocol = htons(ETH_P_MPLS_UC);
 >  
 >  	if (pkt_dev->vlan_id != 0xffff)
 > -		protocol = __constant_htons(ETH_P_8021Q);
 > +		protocol = htons(ETH_P_8021Q);
 >  
 >  	/* Update any of the values, used when we're incrementing various
 >  	 * fields.
 > @@ -2677,14 +2677,14 @@
 >  					       pkt_dev->svlan_cfi,
 >  					       pkt_dev->svlan_p);
 >  			svlan_encapsulated_proto = (__be16 *)skb_put(skb, sizeof(__be16));
 > -			*svlan_encapsulated_proto = __constant_htons(ETH_P_8021Q);
 > +			*svlan_encapsulated_proto = htons(ETH_P_8021Q);
 >  		}
 >  		vlan_tci = (__be16 *)skb_put(skb, sizeof(__be16));
 >  		*vlan_tci = build_tci(pkt_dev->vlan_id,
 >  				      pkt_dev->vlan_cfi,
 >  				      pkt_dev->vlan_p);
 >  		vlan_encapsulated_proto = (__be16 *)skb_put(skb, sizeof(__be16));
 > -		*vlan_encapsulated_proto = __constant_htons(ETH_P_IPV6);
 > +		*vlan_encapsulated_proto = htons(ETH_P_IPV6);
 >  	}
 >  
 >  	iph = (struct ipv6hdr *)skb_put(skb, sizeof(struct ipv6hdr));
 > @@ -2710,7 +2710,7 @@
 >  	udph->len = htons(datalen + sizeof(struct udphdr));
 >  	udph->check = 0;	/* No checksum */
 >  
 > -	*(__be32 *) iph = __constant_htonl(0x60000000);	/* Version + flow */
 > +	*(__be32 *) iph = htonl(0x60000000);	/* Version + flow */
 >  
 >  	if (pkt_dev->traffic_class) {
 >  		/* Version + traffic class + flow (0) */
 > -
 > To unsubscribe from this list: send the line "unsubscribe netdev" in
 > the body of a message to majordomo@vger.kernel.org
 > More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 4/4] pktgen: fix device name handling
  2007-02-27 20:13 ` [PATCH 4/4] pktgen: fix device name handling Stephen Hemminger
@ 2007-02-28 17:07   ` Robert Olsson
  2007-03-03  0:02     ` David Miller
  0 siblings, 1 reply; 9+ messages in thread
From: Robert Olsson @ 2007-02-28 17:07 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: Robert Olsson, David S. Miller, netdev



Yes it seems be handle dev name change. So configuration scripts should
use ifindex now :)

Signed-off-by: Robert Olsson <robert.olsson@its.uu.se>

Cheers.
					--ro



Stephen Hemminger writes:
 > Since devices can change name and other wierdness, don't hold onto
 > a copy of device name, instead use pointer to output device.
 > 
 > Fix a couple of leaks in error handling path as well.
 > 
 > Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
 > 
 > ---
 >  net/core/pktgen.c |  137 +++++++++++++++++++++++++++---------------------------
 >  1 file changed, 70 insertions(+), 67 deletions(-)
 > 
 > --- pktgen.orig/net/core/pktgen.c	2007-02-27 12:08:58.000000000 -0800
 > +++ pktgen/net/core/pktgen.c	2007-02-27 12:11:32.000000000 -0800
 > @@ -210,15 +210,11 @@
 >  };
 >  
 >  struct pktgen_dev {
 > -
 >  	/*
 >  	 * Try to keep frequent/infrequent used vars. separated.
 >  	 */
 > -
 > -	char ifname[IFNAMSIZ];
 > -	char result[512];
 > -
 > -	struct pktgen_thread *pg_thread;	/* the owner */
 > +	struct proc_dir_entry *entry;	/* proc file */
 > +	struct pktgen_thread *pg_thread;/* the owner */
 >  	struct list_head list;		/* Used for chaining in the thread's run-queue */
 >  
 >  	int running;		/* if this changes to false, the test will stop */
 > @@ -345,6 +341,8 @@
 >  	unsigned cflows;	/* Concurrent flows (config) */
 >  	unsigned lflow;		/* Flow length  (config) */
 >  	unsigned nflows;	/* accumulated flows (stats) */
 > +
 > +	char result[512];
 >  };
 >  
 >  struct pktgen_hdr {
 > @@ -497,7 +495,7 @@
 >  static int pktgen_stop_device(struct pktgen_dev *pkt_dev);
 >  static void pktgen_stop(struct pktgen_thread *t);
 >  static void pktgen_clear_counters(struct pktgen_dev *pkt_dev);
 > -static int pktgen_mark_device(const char *ifname);
 > +
 >  static unsigned int scan_ip6(const char *s, char ip[16]);
 >  static unsigned int fmt_ip6(char *s, const char ip[16]);
 >  
 > @@ -591,7 +589,7 @@
 >  		   "     frags: %d  delay: %u  clone_skb: %d  ifname: %s\n",
 >  		   pkt_dev->nfrags,
 >  		   1000 * pkt_dev->delay_us + pkt_dev->delay_ns,
 > -		   pkt_dev->clone_skb, pkt_dev->ifname);
 > +		   pkt_dev->clone_skb, pkt_dev->odev->name);
 >  
 >  	seq_printf(seq, "     flows: %u flowlen: %u\n", pkt_dev->cflows,
 >  		   pkt_dev->lflow);
 > @@ -1682,13 +1680,13 @@
 >  	if_lock(t);
 >  	list_for_each_entry(pkt_dev, &t->if_list, list)
 >  		if (pkt_dev->running)
 > -			seq_printf(seq, "%s ", pkt_dev->ifname);
 > +			seq_printf(seq, "%s ", pkt_dev->odev->name);
 >  
 >  	seq_printf(seq, "\nStopped: ");
 >  
 >  	list_for_each_entry(pkt_dev, &t->if_list, list)
 >  		if (!pkt_dev->running)
 > -			seq_printf(seq, "%s ", pkt_dev->ifname);
 > +			seq_printf(seq, "%s ", pkt_dev->odev->name);
 >  
 >  	if (t->result[0])
 >  		seq_printf(seq, "\nResult: %s\n", t->result);
 > @@ -1834,12 +1832,11 @@
 >  /*
 >   * mark a device for removal
 >   */
 > -static int pktgen_mark_device(const char *ifname)
 > +static void pktgen_mark_device(const char *ifname)
 >  {
 >  	struct pktgen_dev *pkt_dev = NULL;
 >  	const int max_tries = 10, msec_per_try = 125;
 >  	int i = 0;
 > -	int ret = 0;
 >  
 >  	mutex_lock(&pktgen_thread_lock);
 >  	pr_debug("pktgen: pktgen_mark_device marking %s for removal\n", ifname);
 > @@ -1860,32 +1857,49 @@
 >  			printk("pktgen_mark_device: timed out after waiting "
 >  			       "%d msec for device %s to be removed\n",
 >  			       msec_per_try * i, ifname);
 > -			ret = 1;
 >  			break;
 >  		}
 >  
 >  	}
 >  
 >  	mutex_unlock(&pktgen_thread_lock);
 > +}
 >  
 > -	return ret;
 > +static void pktgen_change_name(struct net_device *dev)
 > +{
 > +	struct pktgen_thread *t;
 > +
 > +	list_for_each_entry(t, &pktgen_threads, th_list) {
 > +		struct pktgen_dev *pkt_dev;
 > +
 > +		list_for_each_entry(pkt_dev, &t->if_list, list) {
 > +			if (pkt_dev->odev != dev)
 > +				continue;
 > +
 > +			remove_proc_entry(pkt_dev->entry->name, pg_proc_dir);
 > +
 > +			pkt_dev->entry = create_proc_entry(dev->name, 0600,
 > +							   pg_proc_dir);
 > +			if (!pkt_dev->entry)
 > +				printk(KERN_ERR "pktgen: can't move proc "
 > +				       " entry for '%s'\n", dev->name);
 > +			break;
 > +		}
 > +	}
 >  }
 >  
 >  static int pktgen_device_event(struct notifier_block *unused,
 >  			       unsigned long event, void *ptr)
 >  {
 > -	struct net_device *dev = (struct net_device *)(ptr);
 > +	struct net_device *dev = ptr;
 >  
 >  	/* It is OK that we do not hold the group lock right now,
 >  	 * as we run under the RTNL lock.
 >  	 */
 >  
 >  	switch (event) {
 > -	case NETDEV_CHANGEADDR:
 > -	case NETDEV_GOING_DOWN:
 > -	case NETDEV_DOWN:
 > -	case NETDEV_UP:
 > -		/* Ignore for now */
 > +	case NETDEV_CHANGENAME:
 > +		pktgen_change_name(dev);
 >  		break;
 >  
 >  	case NETDEV_UNREGISTER:
 > @@ -1898,41 +1912,36 @@
 >  
 >  /* Associate pktgen_dev with a device. */
 >  
 > -static struct net_device *pktgen_setup_dev(struct pktgen_dev *pkt_dev)
 > +static int pktgen_setup_dev(struct pktgen_dev *pkt_dev, const char *ifname)
 >  {
 >  	struct net_device *odev;
 > +	int err;
 >  
 >  	/* Clean old setups */
 > -
 >  	if (pkt_dev->odev) {
 >  		dev_put(pkt_dev->odev);
 >  		pkt_dev->odev = NULL;
 >  	}
 >  
 > -	odev = dev_get_by_name(pkt_dev->ifname);
 > -
 > +	odev = dev_get_by_name(ifname);
 >  	if (!odev) {
 > -		printk("pktgen: no such netdevice: \"%s\"\n", pkt_dev->ifname);
 > -		goto out;
 > +		printk("pktgen: no such netdevice: \"%s\"\n", ifname);
 > +		return -ENODEV;
 >  	}
 > +
 >  	if (odev->type != ARPHRD_ETHER) {
 > -		printk("pktgen: not an ethernet device: \"%s\"\n",
 > -		       pkt_dev->ifname);
 > -		goto out_put;
 > -	}
 > -	if (!netif_running(odev)) {
 > -		printk("pktgen: device is down: \"%s\"\n", pkt_dev->ifname);
 > -		goto out_put;
 > +		printk("pktgen: not an ethernet device: \"%s\"\n", ifname);
 > +		err = -EINVAL;
 > +	} else if (!netif_running(odev)) {
 > +		printk("pktgen: device is down: \"%s\"\n", ifname);
 > +		err = -ENETDOWN;
 > +	} else {
 > +		pkt_dev->odev = odev;
 > +		return 0;
 >  	}
 > -	pkt_dev->odev = odev;
 > -
 > -	return pkt_dev->odev;
 >  
 > -out_put:
 >  	dev_put(odev);
 > -out:
 > -	return NULL;
 > -
 > +	return err;
 >  }
 >  
 >  /* Read pkt_dev from the interface and set up internal pktgen_dev
 > @@ -1940,10 +1949,6 @@
 >   */
 >  static void pktgen_setup_inject(struct pktgen_dev *pkt_dev)
 >  {
 > -	/* Try once more, just in case it works now. */
 > -	if (!pkt_dev->odev)
 > -		pktgen_setup_dev(pkt_dev);
 > -
 >  	if (!pkt_dev->odev) {
 >  		printk("pktgen: ERROR: pkt_dev->odev == NULL in setup_inject.\n");
 >  		sprintf(pkt_dev->result,
 > @@ -2987,7 +2992,7 @@
 >  
 >  	if (!pkt_dev->running) {
 >  		printk("pktgen: interface: %s is already stopped\n",
 > -		       pkt_dev->ifname);
 > +		       pkt_dev->odev->name);
 >  		return -EINVAL;
 >  	}
 >  
 > @@ -3337,7 +3342,7 @@
 >  	if_lock(t);
 >  
 >  	list_for_each_entry(p, &t->if_list, list)
 > -		if (strncmp(p->ifname, ifname, IFNAMSIZ) == 0) {
 > +		if (strncmp(p->odev->name, ifname, IFNAMSIZ) == 0) {
 >  			pkt_dev = p;
 >  			break;
 >  		}
 > @@ -3378,7 +3383,7 @@
 >  static int pktgen_add_device(struct pktgen_thread *t, const char *ifname)
 >  {
 >  	struct pktgen_dev *pkt_dev;
 > -	struct proc_dir_entry *pe;
 > +	int err;
 >  
 >  	/* We don't allow a device to be on several threads */
 >  
 > @@ -3420,29 +3425,28 @@
 >  	pkt_dev->svlan_cfi = 0;
 >  	pkt_dev->svlan_id = 0xffff;
 >  
 > -	strncpy(pkt_dev->ifname, ifname, IFNAMSIZ);
 > +	err = pktgen_setup_dev(pkt_dev, ifname);
 > +	if (err)
 > +		goto out1;
 >  
 > -	if (!pktgen_setup_dev(pkt_dev)) {
 > -		printk("pktgen: ERROR: pktgen_setup_dev failed.\n");
 > -		if (pkt_dev->flows)
 > -			vfree(pkt_dev->flows);
 > -		kfree(pkt_dev);
 > -		return -ENODEV;
 > -	}
 > -
 > -	pe = create_proc_entry(ifname, 0600, pg_proc_dir);
 > -	if (!pe) {
 > +	pkt_dev->entry = create_proc_entry(ifname, 0600, pg_proc_dir);
 > +	if (!pkt_dev->entry) {
 >  		printk("pktgen: cannot create %s/%s procfs entry.\n",
 >  		       PG_PROC_DIR, ifname);
 > -		if (pkt_dev->flows)
 > -			vfree(pkt_dev->flows);
 > -		kfree(pkt_dev);
 > -		return -EINVAL;
 > +		err = -EINVAL;
 > +		goto out2;
 >  	}
 > -	pe->proc_fops = &pktgen_if_fops;
 > -	pe->data = pkt_dev;
 > +	pkt_dev->entry->proc_fops = &pktgen_if_fops;
 > +	pkt_dev->entry->data = pkt_dev;
 >  
 >  	return add_dev_to_thread(t, pkt_dev);
 > +out2:
 > +	dev_put(pkt_dev->odev);
 > +out1:
 > +	if (pkt_dev->flows)
 > +		vfree(pkt_dev->flows);
 > +	kfree(pkt_dev);
 > +	return err;
 >  }
 >  
 >  static int __init pktgen_create_thread(int cpu)
 > @@ -3530,9 +3534,8 @@
 >  
 >  	_rem_dev_from_if_list(t, pkt_dev);
 >  
 > -	/* Clean up proc file system */
 > -
 > -	remove_proc_entry(pkt_dev->ifname, pg_proc_dir);
 > +	if (pkt_dev->entry)
 > +		remove_proc_entry(pkt_dev->entry->name, pg_proc_dir);
 >  
 >  	if (pkt_dev->flows)
 >  		vfree(pkt_dev->flows);
 > -
 > To unsubscribe from this list: send the line "unsubscribe netdev" in
 > the body of a message to majordomo@vger.kernel.org
 > More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 4/4] pktgen: fix device name handling
  2007-02-28 17:07   ` Robert Olsson
@ 2007-03-03  0:02     ` David Miller
  0 siblings, 0 replies; 9+ messages in thread
From: David Miller @ 2007-03-03  0:02 UTC (permalink / raw)
  To: Robert.Olsson; +Cc: shemminger, netdev

From: Robert Olsson <Robert.Olsson@data.slu.se>
Date: Wed, 28 Feb 2007 18:07:09 +0100

> Yes it seems be handle dev name change. So configuration scripts should
> use ifindex now :)
> 
> Signed-off-by: Robert Olsson <robert.olsson@its.uu.se>

I will apply all 4 of these patches to net-2.6.22, thanks everyone.

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2007-03-03  0:02 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-02-27 20:04 [PATCH 1/4] pktgen: use pr_debug Stephen Hemminger
2007-02-27 20:06 ` [PATCH 2/4] pktgen: use random32 Stephen Hemminger
2007-02-28 16:56   ` Robert Olsson
2007-02-27 20:12 ` [PATCH 3/4] pktgen: don't use __constant_htonl() Stephen Hemminger
2007-02-28 16:58   ` Robert Olsson
2007-02-27 20:13 ` [PATCH 4/4] pktgen: fix device name handling Stephen Hemminger
2007-02-28 17:07   ` Robert Olsson
2007-03-03  0:02     ` David Miller
2007-02-28 16:52 ` [PATCH 1/4] pktgen: use pr_debug Robert Olsson

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.