|
@@ -187,7 +187,8 @@ static int push_mpls(struct sk_buff *skb, struct sw_flow_key *key,
|
|
|
|
|
|
skb_postpush_rcsum(skb, new_mpls_lse, MPLS_HLEN);
|
|
skb_postpush_rcsum(skb, new_mpls_lse, MPLS_HLEN);
|
|
|
|
|
|
- update_ethertype(skb, eth_hdr(skb), mpls->mpls_ethertype);
|
|
|
|
|
|
+ if (ovs_key_mac_proto(key) == MAC_PROTO_ETHERNET)
|
|
|
|
+ update_ethertype(skb, eth_hdr(skb), mpls->mpls_ethertype);
|
|
skb->protocol = mpls->mpls_ethertype;
|
|
skb->protocol = mpls->mpls_ethertype;
|
|
|
|
|
|
invalidate_flow_key(key);
|
|
invalidate_flow_key(key);
|
|
@@ -197,7 +198,6 @@ static int push_mpls(struct sk_buff *skb, struct sw_flow_key *key,
|
|
static int pop_mpls(struct sk_buff *skb, struct sw_flow_key *key,
|
|
static int pop_mpls(struct sk_buff *skb, struct sw_flow_key *key,
|
|
const __be16 ethertype)
|
|
const __be16 ethertype)
|
|
{
|
|
{
|
|
- struct ethhdr *hdr;
|
|
|
|
int err;
|
|
int err;
|
|
|
|
|
|
err = skb_ensure_writable(skb, skb->mac_len + MPLS_HLEN);
|
|
err = skb_ensure_writable(skb, skb->mac_len + MPLS_HLEN);
|
|
@@ -213,11 +213,15 @@ static int pop_mpls(struct sk_buff *skb, struct sw_flow_key *key,
|
|
skb_reset_mac_header(skb);
|
|
skb_reset_mac_header(skb);
|
|
skb_set_network_header(skb, skb->mac_len);
|
|
skb_set_network_header(skb, skb->mac_len);
|
|
|
|
|
|
- /* mpls_hdr() is used to locate the ethertype field correctly in the
|
|
|
|
- * presence of VLAN tags.
|
|
|
|
- */
|
|
|
|
- hdr = (struct ethhdr *)((void *)mpls_hdr(skb) - ETH_HLEN);
|
|
|
|
- update_ethertype(skb, hdr, ethertype);
|
|
|
|
|
|
+ if (ovs_key_mac_proto(key) == MAC_PROTO_ETHERNET) {
|
|
|
|
+ struct ethhdr *hdr;
|
|
|
|
+
|
|
|
|
+ /* mpls_hdr() is used to locate the ethertype field correctly in the
|
|
|
|
+ * presence of VLAN tags.
|
|
|
|
+ */
|
|
|
|
+ hdr = (struct ethhdr *)((void *)mpls_hdr(skb) - ETH_HLEN);
|
|
|
|
+ update_ethertype(skb, hdr, ethertype);
|
|
|
|
+ }
|
|
if (eth_p_mpls(skb->protocol))
|
|
if (eth_p_mpls(skb->protocol))
|
|
skb->protocol = ethertype;
|
|
skb->protocol = ethertype;
|
|
|
|
|