diff options
Diffstat (limited to 'net/openvswitch/actions.c')
| -rw-r--r-- | net/openvswitch/actions.c | 28 | 
1 files changed, 10 insertions, 18 deletions
diff --git a/net/openvswitch/actions.c b/net/openvswitch/actions.c index 855f2c155956..b87bfc82f44f 100644 --- a/net/openvswitch/actions.c +++ b/net/openvswitch/actions.c @@ -277,9 +277,11 @@ static int set_eth_addr(struct sk_buff *skb, struct sw_flow_key *flow_key,   */  static int pop_eth(struct sk_buff *skb, struct sw_flow_key *key)  { -	skb_pull_rcsum(skb, ETH_HLEN); -	skb_reset_mac_header(skb); -	skb_reset_mac_len(skb); +	int err; + +	err = skb_eth_pop(skb); +	if (err) +		return err;  	/* safe right before invalidate_flow_key */  	key->mac_proto = MAC_PROTO_NONE; @@ -290,22 +292,12 @@ static int pop_eth(struct sk_buff *skb, struct sw_flow_key *key)  static int push_eth(struct sk_buff *skb, struct sw_flow_key *key,  		    const struct ovs_action_push_eth *ethh)  { -	struct ethhdr *hdr; - -	/* Add the new Ethernet header */ -	if (skb_cow_head(skb, ETH_HLEN) < 0) -		return -ENOMEM; - -	skb_push(skb, ETH_HLEN); -	skb_reset_mac_header(skb); -	skb_reset_mac_len(skb); - -	hdr = eth_hdr(skb); -	ether_addr_copy(hdr->h_source, ethh->addresses.eth_src); -	ether_addr_copy(hdr->h_dest, ethh->addresses.eth_dst); -	hdr->h_proto = skb->protocol; +	int err; -	skb_postpush_rcsum(skb, hdr, ETH_HLEN); +	err = skb_eth_push(skb, ethh->addresses.eth_dst, +			   ethh->addresses.eth_src); +	if (err) +		return err;  	/* safe right before invalidate_flow_key */  	key->mac_proto = MAC_PROTO_ETHERNET;  | 
