Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 103532
b: refs/heads/master
c: 1349fe9
h: refs/heads/master
v: v3
  • Loading branch information
Patrick McHardy authored and David S. Miller committed Jul 15, 2008
1 parent 8341587 commit 0038dac
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 47 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 19b9a4e256758a0c032c915eebe0a39b370ea133
refs/heads/master: 1349fe9a6bc580fb80e1a43a93b68c15d674ed0a
55 changes: 9 additions & 46 deletions trunk/net/8021q/vlan_dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -256,81 +256,44 @@ static int vlan_dev_hard_header(struct sk_buff *skb, struct net_device *dev,
unsigned int len)
{
struct vlan_hdr *vhdr;
unsigned int vhdrlen = 0;
u16 vlan_tci = 0;
int rc = 0;
int build_vlan_header = 0;

pr_debug("%s: skb: %p type: %hx len: %u vlan_id: %hx, daddr: %p\n",
__func__, skb, type, len, vlan_dev_info(dev)->vlan_id,
daddr);
int rc;

if (WARN_ON(skb_headroom(skb) < dev->hard_header_len))
return -ENOSPC;

/* build vlan header only if re_order_header flag is NOT set. This
* fixes some programs that get confused when they see a VLAN device
* sending a frame that is VLAN encoded (the consensus is that the VLAN
* device should look completely like an Ethernet device when the
* REORDER_HEADER flag is set) The drawback to this is some extra
* header shuffling in the hard_start_xmit. Users can turn off this
* REORDER behaviour with the vconfig tool.
*/
if (!(vlan_dev_info(dev)->flags & VLAN_FLAG_REORDER_HDR))
build_vlan_header = 1;

if (build_vlan_header) {
if (!(vlan_dev_info(dev)->flags & VLAN_FLAG_REORDER_HDR)) {
vhdr = (struct vlan_hdr *) skb_push(skb, VLAN_HLEN);

/* build the four bytes that make this a VLAN header. */

/* Now, 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)
*
*/
vlan_tci = vlan_dev_info(dev)->vlan_id;
vlan_tci |= vlan_dev_get_egress_qos_mask(dev, skb);

vhdr->h_vlan_TCI = htons(vlan_tci);

/*
* Set the protocol type. For a packet of type ETH_P_802_3 we
* put the length in here instead. It is up to the 802.2
* layer to carry protocol information.
*/

if (type != ETH_P_802_3)
vhdr->h_vlan_encapsulated_proto = htons(type);
else
vhdr->h_vlan_encapsulated_proto = htons(len);

skb->protocol = htons(ETH_P_8021Q);
type = ETH_P_8021Q;
vhdrlen = VLAN_HLEN;
}

/* Before delegating work to the lower layer, enter our MAC-address */
if (saddr == NULL)
saddr = dev->dev_addr;

/* Now make the underlying real hard header */
dev = vlan_dev_info(dev)->real_dev;

if (build_vlan_header) {
/* Now make the underlying real hard header */
rc = dev_hard_header(skb, dev, ETH_P_8021Q, daddr, saddr,
len + VLAN_HLEN);
if (rc > 0)
rc += VLAN_HLEN;
else if (rc < 0)
rc -= VLAN_HLEN;
} else
/* If here, then we'll just make a normal looking ethernet
* frame, but, the hard_start_xmit method will insert the tag
* (it has to be able to do this for bridged and other skbs
* that don't come down the protocol stack in an orderly manner.
*/
rc = dev_hard_header(skb, dev, type, daddr, saddr, len);

rc = dev_hard_header(skb, dev, type, daddr, saddr, len + vhdrlen);
if (rc > 0)
rc += vhdrlen;
return rc;
}

Expand Down

0 comments on commit 0038dac

Please sign in to comment.