diff options
Diffstat (limited to 'net/ipv6/udp.c')
| -rw-r--r-- | net/ipv6/udp.c | 62 | 
1 files changed, 20 insertions, 42 deletions
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 42923b14dfa6..f4058150262b 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c @@ -46,6 +46,7 @@  #include <net/ip6_checksum.h>  #include <net/xfrm.h>  #include <net/inet6_hashtables.h> +#include <net/busy_poll.h>  #include <linux/proc_fs.h>  #include <linux/seq_file.h> @@ -841,7 +842,10 @@ int __udp6_lib_rcv(struct sk_buff *skb, struct udp_table *udptable,  	 */  	sk = __udp6_lib_lookup_skb(skb, uh->source, uh->dest, udptable);  	if (sk != NULL) { -		int ret = udpv6_queue_rcv_skb(sk, skb); +		int ret; + +		sk_mark_napi_id(sk, skb); +		ret = udpv6_queue_rcv_skb(sk, skb);  		sock_put(sk);  		/* a return value > 0 means to resubmit the input, but @@ -955,11 +959,16 @@ static int udp_v6_push_pending_frames(struct sock *sk)  	struct udphdr *uh;  	struct udp_sock  *up = udp_sk(sk);  	struct inet_sock *inet = inet_sk(sk); -	struct flowi6 *fl6 = &inet->cork.fl.u.ip6; +	struct flowi6 *fl6;  	int err = 0;  	int is_udplite = IS_UDPLITE(sk);  	__wsum csum = 0; +	if (up->pending == AF_INET) +		return udp_push_pending_frames(sk); + +	fl6 = &inet->cork.fl.u.ip6; +  	/* Grab the skbuff where UDP header space exists. */  	if ((skb = skb_peek(&sk->sk_write_queue)) == NULL)  		goto out; @@ -1359,48 +1368,17 @@ static const struct inet6_protocol udpv6_protocol = {  /* ------------------------------------------------------------------------ */  #ifdef CONFIG_PROC_FS - -static void udp6_sock_seq_show(struct seq_file *seq, struct sock *sp, int bucket) -{ -	struct inet_sock *inet = inet_sk(sp); -	struct ipv6_pinfo *np = inet6_sk(sp); -	const struct in6_addr *dest, *src; -	__u16 destp, srcp; - -	dest  = &np->daddr; -	src   = &np->rcv_saddr; -	destp = ntohs(inet->inet_dport); -	srcp  = ntohs(inet->inet_sport); -	seq_printf(seq, -		   "%5d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X " -		   "%02X %08X:%08X %02X:%08lX %08X %5d %8d %lu %d %pK %d\n", -		   bucket, -		   src->s6_addr32[0], src->s6_addr32[1], -		   src->s6_addr32[2], src->s6_addr32[3], srcp, -		   dest->s6_addr32[0], dest->s6_addr32[1], -		   dest->s6_addr32[2], dest->s6_addr32[3], destp, -		   sp->sk_state, -		   sk_wmem_alloc_get(sp), -		   sk_rmem_alloc_get(sp), -		   0, 0L, 0, -		   from_kuid_munged(seq_user_ns(seq), sock_i_uid(sp)), -		   0, -		   sock_i_ino(sp), -		   atomic_read(&sp->sk_refcnt), sp, -		   atomic_read(&sp->sk_drops)); -} -  int udp6_seq_show(struct seq_file *seq, void *v)  { -	if (v == SEQ_START_TOKEN) -		seq_printf(seq, -			   "  sl  " -			   "local_address                         " -			   "remote_address                        " -			   "st tx_queue rx_queue tr tm->when retrnsmt" -			   "   uid  timeout inode ref pointer drops\n"); -	else -		udp6_sock_seq_show(seq, v, ((struct udp_iter_state *)seq->private)->bucket); +	if (v == SEQ_START_TOKEN) { +		seq_puts(seq, IPV6_SEQ_DGRAM_HEADER); +	} else { +		int bucket = ((struct udp_iter_state *)seq->private)->bucket; +		struct inet_sock *inet = inet_sk(v); +		__u16 srcp = ntohs(inet->inet_sport); +		__u16 destp = ntohs(inet->inet_dport); +		ip6_dgram_sock_seq_show(seq, v, srcp, destp, bucket); +	}  	return 0;  }  | 
