diff options
Diffstat (limited to 'net/packet/af_packet.c')
| -rw-r--r-- | net/packet/af_packet.c | 14 | 
1 files changed, 7 insertions, 7 deletions
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 640d94e34635..a2dbeb264f26 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c @@ -1934,10 +1934,8 @@ static void packet_parse_headers(struct sk_buff *skb, struct socket *sock)  	/* Move network header to the right position for VLAN tagged packets */  	if (likely(skb->dev->type == ARPHRD_ETHER) &&  	    eth_type_vlan(skb->protocol) && -	    __vlan_get_protocol(skb, skb->protocol, &depth) != 0) { -		if (pskb_may_pull(skb, depth)) -			skb_set_network_header(skb, depth); -	} +	    vlan_get_protocol_and_depth(skb, skb->protocol, &depth) != 0) +		skb_set_network_header(skb, depth);  	skb_probe_transport_header(skb);  } @@ -3203,6 +3201,9 @@ static int packet_do_bind(struct sock *sk, const char *name, int ifindex,  	lock_sock(sk);  	spin_lock(&po->bind_lock); +	if (!proto) +		proto = po->num; +  	rcu_read_lock();  	if (po->fanout) { @@ -3301,7 +3302,7 @@ static int packet_bind_spkt(struct socket *sock, struct sockaddr *uaddr,  	memcpy(name, uaddr->sa_data, sizeof(uaddr->sa_data_min));  	name[sizeof(uaddr->sa_data_min)] = 0; -	return packet_do_bind(sk, name, 0, pkt_sk(sk)->num); +	return packet_do_bind(sk, name, 0, 0);  }  static int packet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) @@ -3318,8 +3319,7 @@ static int packet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len  	if (sll->sll_family != AF_PACKET)  		return -EINVAL; -	return packet_do_bind(sk, NULL, sll->sll_ifindex, -			      sll->sll_protocol ? : pkt_sk(sk)->num); +	return packet_do_bind(sk, NULL, sll->sll_ifindex, sll->sll_protocol);  }  static struct proto packet_proto = {  | 
