diff options
| author | David S. Miller <davem@davemloft.net> | 2013-03-15 09:00:39 -0400 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2013-03-15 09:00:39 -0400 | 
| commit | 296b60109e0a2dfae4d22b393744634ca6322822 (patch) | |
| tree | 88bd4277e8fc4d9b9fa35c6414c9a7e05ccb45a2 | |
| parent | 3f104c38259dcb3e5443c246f0805bc04d887cc3 (diff) | |
| parent | d176ca2a48ff2b5d7becfacdcbd1d72c73bd22d1 (diff) | |
Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jesse/openvswitch
Jesse Gross says:
====================
A few different bug fixes, including several for issues with userspace
communication that have gone unnoticed up until now.  These are intended
for net/3.9.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | net/openvswitch/actions.c | 4 | ||||
| -rw-r--r-- | net/openvswitch/datapath.c | 3 | ||||
| -rw-r--r-- | net/openvswitch/flow.c | 6 | ||||
| -rw-r--r-- | net/openvswitch/vport-netdev.c | 3 | ||||
| -rw-r--r-- | net/openvswitch/vport.c | 3 | 
5 files changed, 12 insertions, 7 deletions
| diff --git a/net/openvswitch/actions.c b/net/openvswitch/actions.c index ac2defeeba83..d4d5363c7ba7 100644 --- a/net/openvswitch/actions.c +++ b/net/openvswitch/actions.c @@ -58,7 +58,7 @@ static int __pop_vlan_tci(struct sk_buff *skb, __be16 *current_tci)  	if (skb->ip_summed == CHECKSUM_COMPLETE)  		skb->csum = csum_sub(skb->csum, csum_partial(skb->data -					+ ETH_HLEN, VLAN_HLEN, 0)); +					+ (2 * ETH_ALEN), VLAN_HLEN, 0));  	vhdr = (struct vlan_hdr *)(skb->data + ETH_HLEN);  	*current_tci = vhdr->h_vlan_TCI; @@ -115,7 +115,7 @@ static int push_vlan(struct sk_buff *skb, const struct ovs_action_push_vlan *vla  		if (skb->ip_summed == CHECKSUM_COMPLETE)  			skb->csum = csum_add(skb->csum, csum_partial(skb->data -					+ ETH_HLEN, VLAN_HLEN, 0)); +					+ (2 * ETH_ALEN), VLAN_HLEN, 0));  	}  	__vlan_hwaccel_put_tag(skb, ntohs(vlan->vlan_tci) & ~VLAN_TAG_PRESENT); diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c index e87a26506dba..a4b724708a1a 100644 --- a/net/openvswitch/datapath.c +++ b/net/openvswitch/datapath.c @@ -394,6 +394,7 @@ static int queue_userspace_packet(struct net *net, int dp_ifindex,  	skb_copy_and_csum_dev(skb, nla_data(nla)); +	genlmsg_end(user_skb, upcall);  	err = genlmsg_unicast(net, user_skb, upcall_info->portid);  out: @@ -1690,6 +1691,7 @@ static int ovs_vport_cmd_new(struct sk_buff *skb, struct genl_info *info)  	if (IS_ERR(vport))  		goto exit_unlock; +	err = 0;  	reply = ovs_vport_cmd_build_info(vport, info->snd_portid, info->snd_seq,  					 OVS_VPORT_CMD_NEW);  	if (IS_ERR(reply)) { @@ -1771,6 +1773,7 @@ static int ovs_vport_cmd_del(struct sk_buff *skb, struct genl_info *info)  	if (IS_ERR(reply))  		goto exit_unlock; +	err = 0;  	ovs_dp_detach_port(vport);  	genl_notify(reply, genl_info_net(info), info->snd_portid, diff --git a/net/openvswitch/flow.c b/net/openvswitch/flow.c index 20605ecf100b..fe0e4215c73d 100644 --- a/net/openvswitch/flow.c +++ b/net/openvswitch/flow.c @@ -482,7 +482,11 @@ static __be16 parse_ethertype(struct sk_buff *skb)  		return htons(ETH_P_802_2);  	__skb_pull(skb, sizeof(struct llc_snap_hdr)); -	return llc->ethertype; + +	if (ntohs(llc->ethertype) >= 1536) +		return llc->ethertype; + +	return htons(ETH_P_802_2);  }  static int parse_icmpv6(struct sk_buff *skb, struct sw_flow_key *key, diff --git a/net/openvswitch/vport-netdev.c b/net/openvswitch/vport-netdev.c index 670cbc3518de..2130d61c384a 100644 --- a/net/openvswitch/vport-netdev.c +++ b/net/openvswitch/vport-netdev.c @@ -43,8 +43,7 @@ static void netdev_port_receive(struct vport *vport, struct sk_buff *skb)  	/* Make our own copy of the packet.  Otherwise we will mangle the  	 * packet for anyone who came before us (e.g. tcpdump via AF_PACKET). -	 * (No one comes after us, since we tell handle_bridge() that we took -	 * the packet.) */ +	 */  	skb = skb_share_check(skb, GFP_ATOMIC);  	if (unlikely(!skb))  		return; diff --git a/net/openvswitch/vport.c b/net/openvswitch/vport.c index ba717cc038b3..f6b8132ce4cb 100644 --- a/net/openvswitch/vport.c +++ b/net/openvswitch/vport.c @@ -325,8 +325,7 @@ int ovs_vport_get_options(const struct vport *vport, struct sk_buff *skb)   * @skb: skb that was received   *   * Must be called with rcu_read_lock.  The packet cannot be shared and - * skb->data should point to the Ethernet header.  The caller must have already - * called compute_ip_summed() to initialize the checksumming fields. + * skb->data should point to the Ethernet header.   */  void ovs_vport_receive(struct vport *vport, struct sk_buff *skb)  { | 
