forked from mirrors/linux
		
	[IPV6]: Add UDP_MIB_{SND,RCV}BUFERRORS handling.
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									81aa646cc4
								
							
						
					
					
						commit
						a18135eb93
					
				
					 1 changed files with 16 additions and 1 deletions
				
			
		| 
						 | 
					@ -345,6 +345,8 @@ static void udpv6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline int udpv6_queue_rcv_skb(struct sock * sk, struct sk_buff *skb)
 | 
					static inline int udpv6_queue_rcv_skb(struct sock * sk, struct sk_buff *skb)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						int rc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb)) {
 | 
						if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb)) {
 | 
				
			||||||
		kfree_skb(skb);
 | 
							kfree_skb(skb);
 | 
				
			||||||
		return -1;
 | 
							return -1;
 | 
				
			||||||
| 
						 | 
					@ -356,7 +358,10 @@ static inline int udpv6_queue_rcv_skb(struct sock * sk, struct sk_buff *skb)
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (sock_queue_rcv_skb(sk,skb)<0) {
 | 
						if ((rc = sock_queue_rcv_skb(sk,skb)) < 0) {
 | 
				
			||||||
 | 
							/* Note that an ENOMEM error is charged twice */
 | 
				
			||||||
 | 
							if (rc == -ENOMEM)
 | 
				
			||||||
 | 
								UDP_INC_STATS_BH(UDP_MIB_RCVBUFERRORS);
 | 
				
			||||||
		UDP6_INC_STATS_BH(UDP_MIB_INERRORS);
 | 
							UDP6_INC_STATS_BH(UDP_MIB_INERRORS);
 | 
				
			||||||
		kfree_skb(skb);
 | 
							kfree_skb(skb);
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
| 
						 | 
					@ -857,6 +862,16 @@ static int udpv6_sendmsg(struct kiocb *iocb, struct sock *sk,
 | 
				
			||||||
		UDP6_INC_STATS_USER(UDP_MIB_OUTDATAGRAMS);
 | 
							UDP6_INC_STATS_USER(UDP_MIB_OUTDATAGRAMS);
 | 
				
			||||||
		return len;
 | 
							return len;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * ENOBUFS = no kernel mem, SOCK_NOSPACE = no sndbuf space.  Reporting
 | 
				
			||||||
 | 
						 * ENOBUFS might not be good (it's not tunable per se), but otherwise
 | 
				
			||||||
 | 
						 * we don't have a good statistic (IpOutDiscards but it can be too many
 | 
				
			||||||
 | 
						 * things).  We could add another new stat but at least for now that
 | 
				
			||||||
 | 
						 * seems like overkill.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						if (err == -ENOBUFS || test_bit(SOCK_NOSPACE, &sk->sk_socket->flags)) {
 | 
				
			||||||
 | 
							UDP_INC_STATS_USER(UDP_MIB_SNDBUFERRORS);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	return err;
 | 
						return err;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
do_confirm:
 | 
					do_confirm:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue