diff options
author | Patrick McHardy <kaber@trash.net> | 2013-04-18 22:04:31 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-04-19 14:46:06 -0400 |
commit | 8ad227ff89a7e6f05d07cd0acfd95ed3a24450ca (patch) | |
tree | 90cb532df2523a011e47844434cc423664441d71 /include | |
parent | 86a9bad3ab6b6f858fd4443b48738cabbb6d094c (diff) |
net: vlan: add 802.1ad support
Add support for 802.1ad VLAN devices. This mainly consists of checking for
ETH_P_8021AD in addition to ETH_P_8021Q in a couple of places and check
offloading capabilities based on the used protocol.
Configuration is done using "ip link":
# ip link add link eth0 eth0.1000 \
type vlan proto 802.1ad id 1000
# ip link add link eth0.1000 eth0.1000.1000 \
type vlan proto 802.1q id 1000
52:54:00:12:34:56 > 92:b1:54:28:e4:8c, ethertype 802.1Q (0x8100), length 106: vlan 1000, p 0, ethertype 802.1Q, vlan 1000, p 0, ethertype IPv4, (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP (1), length 84)
20.1.0.2 > 20.1.0.1: ICMP echo request, id 3003, seq 8, length 64
92:b1:54:28:e4:8c > 52:54:00:12:34:56, ethertype 802.1Q-QinQ (0x88a8), length 106: vlan 1000, p 0, ethertype 802.1Q, vlan 1000, p 0, ethertype IPv4, (tos 0x0, ttl 64, id 47944, offset 0, flags [none], proto ICMP (1), length 84)
20.1.0.1 > 20.1.0.2: ICMP echo reply, id 3003, seq 8, length 64
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/if_vlan.h | 6 | ||||
-rw-r--r-- | include/linux/netdev_features.h | 6 | ||||
-rw-r--r-- | include/uapi/linux/if_link.h | 1 |
3 files changed, 11 insertions, 2 deletions
diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h index 8086ff9988b1..a78f9390da87 100644 --- a/include/linux/if_vlan.h +++ b/include/linux/if_vlan.h | |||
@@ -162,6 +162,8 @@ static inline bool vlan_hw_offload_capable(netdev_features_t features, | |||
162 | { | 162 | { |
163 | if (proto == htons(ETH_P_8021Q) && features & NETIF_F_HW_VLAN_CTAG_TX) | 163 | if (proto == htons(ETH_P_8021Q) && features & NETIF_F_HW_VLAN_CTAG_TX) |
164 | return true; | 164 | return true; |
165 | if (proto == htons(ETH_P_8021AD) && features & NETIF_F_HW_VLAN_STAG_TX) | ||
166 | return true; | ||
165 | return false; | 167 | return false; |
166 | } | 168 | } |
167 | 169 | ||
@@ -271,9 +273,9 @@ static inline int __vlan_get_tag(const struct sk_buff *skb, u16 *vlan_tci) | |||
271 | { | 273 | { |
272 | struct vlan_ethhdr *veth = (struct vlan_ethhdr *)skb->data; | 274 | struct vlan_ethhdr *veth = (struct vlan_ethhdr *)skb->data; |
273 | 275 | ||
274 | if (veth->h_vlan_proto != htons(ETH_P_8021Q)) { | 276 | if (veth->h_vlan_proto != htons(ETH_P_8021Q) && |
277 | veth->h_vlan_proto != htons(ETH_P_8021AD)) | ||
275 | return -EINVAL; | 278 | return -EINVAL; |
276 | } | ||
277 | 279 | ||
278 | *vlan_tci = ntohs(veth->h_vlan_TCI); | 280 | *vlan_tci = ntohs(veth->h_vlan_TCI); |
279 | return 0; | 281 | return 0; |
diff --git a/include/linux/netdev_features.h b/include/linux/netdev_features.h index 785913b8983d..cbaa027ef5a7 100644 --- a/include/linux/netdev_features.h +++ b/include/linux/netdev_features.h | |||
@@ -25,6 +25,9 @@ enum { | |||
25 | NETIF_F_HW_VLAN_CTAG_TX_BIT, /* Transmit VLAN CTAG HW acceleration */ | 25 | NETIF_F_HW_VLAN_CTAG_TX_BIT, /* Transmit VLAN CTAG HW acceleration */ |
26 | NETIF_F_HW_VLAN_CTAG_RX_BIT, /* Receive VLAN CTAG HW acceleration */ | 26 | NETIF_F_HW_VLAN_CTAG_RX_BIT, /* Receive VLAN CTAG HW acceleration */ |
27 | NETIF_F_HW_VLAN_CTAG_FILTER_BIT,/* Receive filtering on VLAN CTAGs */ | 27 | NETIF_F_HW_VLAN_CTAG_FILTER_BIT,/* Receive filtering on VLAN CTAGs */ |
28 | NETIF_F_HW_VLAN_STAG_TX_BIT, /* Transmit VLAN STAG HW acceleration */ | ||
29 | NETIF_F_HW_VLAN_STAG_RX_BIT, /* Receive VLAN STAG HW acceleration */ | ||
30 | NETIF_F_HW_VLAN_STAG_FILTER_BIT,/* Receive filtering on VLAN STAGs */ | ||
28 | NETIF_F_VLAN_CHALLENGED_BIT, /* Device cannot handle VLAN packets */ | 31 | NETIF_F_VLAN_CHALLENGED_BIT, /* Device cannot handle VLAN packets */ |
29 | NETIF_F_GSO_BIT, /* Enable software GSO. */ | 32 | NETIF_F_GSO_BIT, /* Enable software GSO. */ |
30 | NETIF_F_LLTX_BIT, /* LockLess TX - deprecated. Please */ | 33 | NETIF_F_LLTX_BIT, /* LockLess TX - deprecated. Please */ |
@@ -83,6 +86,9 @@ enum { | |||
83 | #define NETIF_F_HW_VLAN_CTAG_FILTER __NETIF_F(HW_VLAN_CTAG_FILTER) | 86 | #define NETIF_F_HW_VLAN_CTAG_FILTER __NETIF_F(HW_VLAN_CTAG_FILTER) |
84 | #define NETIF_F_HW_VLAN_CTAG_RX __NETIF_F(HW_VLAN_CTAG_RX) | 87 | #define NETIF_F_HW_VLAN_CTAG_RX __NETIF_F(HW_VLAN_CTAG_RX) |
85 | #define NETIF_F_HW_VLAN_CTAG_TX __NETIF_F(HW_VLAN_CTAG_TX) | 88 | #define NETIF_F_HW_VLAN_CTAG_TX __NETIF_F(HW_VLAN_CTAG_TX) |
89 | #define NETIF_F_HW_VLAN_STAG_FILTER __NETIF_F(HW_VLAN_STAG_FILTER) | ||
90 | #define NETIF_F_HW_VLAN_STAG_RX __NETIF_F(HW_VLAN_STAG_RX) | ||
91 | #define NETIF_F_HW_VLAN_STAG_TX __NETIF_F(HW_VLAN_STAG_TX) | ||
86 | #define NETIF_F_IP_CSUM __NETIF_F(IP_CSUM) | 92 | #define NETIF_F_IP_CSUM __NETIF_F(IP_CSUM) |
87 | #define NETIF_F_IPV6_CSUM __NETIF_F(IPV6_CSUM) | 93 | #define NETIF_F_IPV6_CSUM __NETIF_F(IPV6_CSUM) |
88 | #define NETIF_F_LLTX __NETIF_F(LLTX) | 94 | #define NETIF_F_LLTX __NETIF_F(LLTX) |
diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h index 9922704f08af..e3163544f339 100644 --- a/include/uapi/linux/if_link.h +++ b/include/uapi/linux/if_link.h | |||
@@ -250,6 +250,7 @@ enum { | |||
250 | IFLA_VLAN_FLAGS, | 250 | IFLA_VLAN_FLAGS, |
251 | IFLA_VLAN_EGRESS_QOS, | 251 | IFLA_VLAN_EGRESS_QOS, |
252 | IFLA_VLAN_INGRESS_QOS, | 252 | IFLA_VLAN_INGRESS_QOS, |
253 | IFLA_VLAN_PROTOCOL, | ||
253 | __IFLA_VLAN_MAX, | 254 | __IFLA_VLAN_MAX, |
254 | }; | 255 | }; |
255 | 256 | ||