diff options
Diffstat (limited to 'net/ipv6/udp.c')
-rw-r--r-- | net/ipv6/udp.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 20d2ffc15f0d..164040613c2e 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
@@ -724,12 +724,18 @@ static int udp_v6_push_pending_frames(struct sock *sk) | |||
724 | 724 | ||
725 | send: | 725 | send: |
726 | err = ip6_push_pending_frames(sk); | 726 | err = ip6_push_pending_frames(sk); |
727 | if (err) { | ||
728 | if (err == -ENOBUFS && !inet6_sk(sk)->recverr) { | ||
729 | UDP6_INC_STATS_USER(sock_net(sk), | ||
730 | UDP_MIB_SNDBUFERRORS, is_udplite); | ||
731 | err = 0; | ||
732 | } | ||
733 | } else | ||
734 | UDP6_INC_STATS_USER(sock_net(sk), | ||
735 | UDP_MIB_OUTDATAGRAMS, is_udplite); | ||
727 | out: | 736 | out: |
728 | up->len = 0; | 737 | up->len = 0; |
729 | up->pending = 0; | 738 | up->pending = 0; |
730 | if (!err) | ||
731 | UDP6_INC_STATS_USER(sock_net(sk), | ||
732 | UDP_MIB_OUTDATAGRAMS, is_udplite); | ||
733 | return err; | 739 | return err; |
734 | } | 740 | } |
735 | 741 | ||