datapath: Check for Centos 6.4 backports.
[sliver-openvswitch.git] / datapath / linux / compat / include / linux / if_vlan.h
1 #ifndef __LINUX_IF_VLAN_WRAPPER_H
2 #define __LINUX_IF_VLAN_WRAPPER_H 1
3
4 #include <linux/skbuff.h>
5 #include <linux/version.h>
6 #include_next <linux/if_vlan.h>
7
8 /*
9  * The behavior of __vlan_put_tag() has changed over time:
10  *
11  *      - In 2.6.26 and earlier, it adjusted both MAC and network header
12  *        pointers.  (The latter didn't make any sense.)
13  *
14  *      - In 2.6.27 and 2.6.28, it did not adjust any header pointers at all.
15  *
16  *      - In 2.6.29 and later, it adjusts the MAC header pointer only.
17  *
18  * This is the version from 2.6.33.  We unconditionally substitute this version
19  * to avoid the need to guess whether the version in the kernel tree is
20  * acceptable.
21  */
22 #define __vlan_put_tag rpl_vlan_put_tag
23 static inline struct sk_buff *__vlan_put_tag(struct sk_buff *skb, u16 vlan_tci)
24 {
25         struct vlan_ethhdr *veth;
26
27         if (skb_cow_head(skb, VLAN_HLEN) < 0) {
28                 kfree_skb(skb);
29                 return NULL;
30         }
31         veth = (struct vlan_ethhdr *)skb_push(skb, VLAN_HLEN);
32
33         /* Move the mac addresses to the beginning of the new header. */
34         memmove(skb->data, skb->data + VLAN_HLEN, 2 * ETH_ALEN);
35         skb->mac_header -= VLAN_HLEN;
36
37         /* first, the ethernet type */
38         veth->h_vlan_proto = htons(ETH_P_8021Q);
39
40         /* now, the TCI */
41         veth->h_vlan_TCI = htons(vlan_tci);
42
43         skb->protocol = htons(ETH_P_8021Q);
44
45         return skb;
46 }
47
48
49 /* All of these were introduced in a single commit preceding 2.6.33, so
50  * presumably all of them or none of them are present. */
51 #ifndef VLAN_PRIO_MASK
52 #define VLAN_PRIO_MASK          0xe000 /* Priority Code Point */
53 #define VLAN_PRIO_SHIFT         13
54 #define VLAN_CFI_MASK           0x1000 /* Canonical Format Indicator */
55 #define VLAN_TAG_PRESENT        VLAN_CFI_MASK
56 #endif
57
58 #ifndef HAVE_VLAN_SET_ENCAP_PROTO
59 static inline void vlan_set_encap_proto(struct sk_buff *skb, struct vlan_hdr *vhdr)
60 {
61         __be16 proto;
62         unsigned char *rawp;
63
64         /*
65          * Was a VLAN packet, grab the encapsulated protocol, which the layer
66          * three protocols care about.
67          */
68
69         proto = vhdr->h_vlan_encapsulated_proto;
70         if (ntohs(proto) >= 1536) {
71                 skb->protocol = proto;
72                 return;
73         }
74
75         rawp = skb->data;
76         if (*(unsigned short *) rawp == 0xFFFF)
77                 /*
78                  * This is a magic hack to spot IPX packets. Older Novell
79                  * breaks the protocol design and runs IPX over 802.3 without
80                  * an 802.2 LLC layer. We look for FFFF which isn't a used
81                  * 802.2 SSAP/DSAP. This won't work for fault tolerant netware
82                  * but does for the rest.
83                  */
84                 skb->protocol = htons(ETH_P_802_3);
85         else
86                 /*
87                  * Real 802.2 LLC
88                  */
89                 skb->protocol = htons(ETH_P_802_2);
90 }
91 #endif
92 #endif  /* linux/if_vlan.h wrapper */