netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
[parent not found: <E791C176A6139242A988ABA8B3D9B38A02A46612@hasmsx403.iil.intel.com>]
* RE: [PATCH 3/6][8021q][2.4] Use VLAN tag set functionality in 8021q module
@ 2004-01-25 12:28 Hen, Shmulik
  2004-01-26  5:34 ` David S. Miller
  0 siblings, 1 reply; 8+ messages in thread
From: Hen, Shmulik @ 2004-01-25 12:28 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev, bonding-devel

-----Original Message-----
From: David S. Miller [mailto:davem@redhat.com]
Sent: Thursday, January 22, 2004 8:07 PM
To: Hen, Shmulik
Cc: netdev@oss.sgi.com; bonding-devel@lists.sourceforge.net
Subject: Re: [PATCH 3/6][8021q][2.4] Use VLAN tag set functionality in 8021q module

> On Thu, 22 Jan 2004 17:57:19 +0200
> Shmuel Hen <shmulik.hen@intel.com> wrote:
> 
> > Make the regular/HW accelerated xmit functions in the 8021q module
> > use the new set VLAN tag functionality to reduce code duplication.
> 
> I'm fine with this and the ARP change, I am pretty sure.
> 
> But we have way too much stuff pending for the next 2.6.x release,
> so I'm going to defer adding these changes until Linus puts something
> final out.
> 
> Please resend these two changes after he does a release.

Fair enough. What about 2.4 ?

Thanks,
Shmulik.

^ permalink raw reply	[flat|nested] 8+ messages in thread
* [PATCH 3/6][8021q][2.4] Use VLAN tag set functionality in 8021q module
@ 2004-01-22 15:57 Shmuel Hen
  2004-01-22 18:06 ` David S. Miller
  0 siblings, 1 reply; 8+ messages in thread
From: Shmuel Hen @ 2004-01-22 15:57 UTC (permalink / raw)
  To: netdev, bonding-devel

Make the regular/HW accelerated xmit functions in the 8021q module
use the new set VLAN tag functionality to reduce code duplication.


diff -Nuarp a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c
--- a/net/8021q/vlan_dev.c	Wed Jan 21 16:55:02 2004
+++ b/net/8021q/vlan_dev.c	Wed Jan 21 16:55:04 2004
@@ -446,6 +446,7 @@ int vlan_dev_hard_start_xmit(struct sk_b
 	 */
 
 	if (veth->h_vlan_proto != __constant_htons(ETH_P_8021Q)) {
+		int orig_headroom = skb_headroom(skb);
 		unsigned short veth_TCI;
 
 		/* This is not a VLAN frame...but we can fix that! */
@@ -455,33 +456,7 @@ int vlan_dev_hard_start_xmit(struct sk_b
 		printk(VLAN_DBG "%s: proto to encap: 0x%hx (hbo)\n",
 			__FUNCTION__, htons(veth->h_vlan_proto));
 #endif
-
-		if (skb_headroom(skb) < VLAN_HLEN) {
-			struct sk_buff *sk_tmp = skb;
-			skb = skb_realloc_headroom(sk_tmp, VLAN_HLEN);
-			kfree_skb(sk_tmp);
-			if (skb == NULL) {
-				stats->tx_dropped++;
-				return 0;
-			}
-			VLAN_DEV_INFO(dev)->cnt_inc_headroom_on_tx++;
-		} else {
-			if (!(skb = skb_unshare(skb, GFP_ATOMIC))) {
-				printk(KERN_ERR "vlan: failed to unshare skbuff\n");
-				stats->tx_dropped++;
-				return 0;
-			}
-		}
-		veth = (struct vlan_ethhdr *)skb_push(skb, VLAN_HLEN);
-
-		/* Move the mac addresses to the beginning of the new header. */
-		memmove(skb->data, skb->data + VLAN_HLEN, 12);
-
-		/* first, the ethernet type */
-		/* put_unaligned(__constant_htons(ETH_P_8021Q), &veth->h_vlan_proto); */
-		veth->h_vlan_proto = __constant_htons(ETH_P_8021Q);
-
-		/* Now, construct the second two bytes. This field looks something
+		/* Construct the second two bytes. This field looks something
 		 * like:
 		 * usr_priority: 3 bits	 (high bits)
 		 * CFI		 1 bit
@@ -490,10 +465,16 @@ int vlan_dev_hard_start_xmit(struct sk_b
 		veth_TCI = VLAN_DEV_INFO(dev)->vlan_id;
 		veth_TCI |= vlan_dev_get_egress_qos_mask(dev, skb);
 
-		veth->h_vlan_TCI = htons(veth_TCI);
-	}
+		skb = __vlan_put_tag(skb, veth_TCI);
+		if (!skb) {
+			stats->tx_dropped++;
+			return 0;
+		}
 
-	skb->dev = VLAN_DEV_INFO(dev)->real_dev;
+		if (orig_headroom < VLAN_HLEN) {
+			VLAN_DEV_INFO(dev)->cnt_inc_headroom_on_tx++;
+		}
+	}
 
 #ifdef VLAN_DEBUG
 	printk(VLAN_DBG "%s: about to send skb: %p to dev: %s\n",
@@ -507,6 +488,7 @@ int vlan_dev_hard_start_xmit(struct sk_b
 	stats->tx_packets++; /* for statics only */
 	stats->tx_bytes += skb->len;
 
+	skb->dev = VLAN_DEV_INFO(dev)->real_dev;
 	dev_queue_xmit(skb);
 
 	return 0;
@@ -515,17 +497,22 @@ int vlan_dev_hard_start_xmit(struct sk_b
 int vlan_dev_hwaccel_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
 {
 	struct net_device_stats *stats = vlan_dev_get_stats(dev);
-	struct vlan_skb_tx_cookie *cookie;
+	unsigned short veth_TCI;
+
+	/* Construct the second two bytes. This field looks something
+	 * like:
+	 * usr_priority: 3 bits	 (high bits)
+	 * CFI		 1 bit
+	 * VLAN ID	 12 bits (low bits)
+	 */
+	veth_TCI = VLAN_DEV_INFO(dev)->vlan_id;
+	veth_TCI |= vlan_dev_get_egress_qos_mask(dev, skb);
+	skb = __vlan_hwaccel_put_tag(skb, veth_TCI);
 
 	stats->tx_packets++;
 	stats->tx_bytes += skb->len;
 
 	skb->dev = VLAN_DEV_INFO(dev)->real_dev;
-	cookie = VLAN_TX_SKB_CB(skb);
-	cookie->magic = VLAN_TX_COOKIE_MAGIC;
-	cookie->vlan_tag = (VLAN_DEV_INFO(dev)->vlan_id |
-			    vlan_dev_get_egress_qos_mask(dev, skb));
-
 	dev_queue_xmit(skb);
 
 	return 0;

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

end of thread, other threads:[~2004-01-28 19:40 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <E791C176A6139242A988ABA8B3D9B38A03A9CCD5@hasmsx403.iil.intel.com>
2004-01-28 16:57 ` [PATCH 3/6][8021q][2.4] Use VLAN tag set functionality in 8021q module Shmuel Hen
2004-01-28 19:40   ` David S. Miller
     [not found] <E791C176A6139242A988ABA8B3D9B38A02A46612@hasmsx403.iil.intel.com>
2004-01-26 13:22 ` Shmuel Hen
2004-01-26 17:42   ` Jeff Garzik
2004-01-25 12:28 Hen, Shmulik
2004-01-26  5:34 ` David S. Miller
  -- strict thread matches above, loose matches on Subject: below --
2004-01-22 15:57 Shmuel Hen
2004-01-22 18:06 ` David S. Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).