diff options
-rw-r--r-- | include/net/udp.h | 1 | ||||
-rw-r--r-- | net/ipv4/udp.c | 3 | ||||
-rw-r--r-- | net/ipv6/udp.c | 7 |
3 files changed, 9 insertions, 2 deletions
diff --git a/include/net/udp.h b/include/net/udp.h index 065f379c6503..ad99eedc6168 100644 --- a/include/net/udp.h +++ b/include/net/udp.h | |||
@@ -181,6 +181,7 @@ extern int udp_get_port(struct sock *sk, unsigned short snum, | |||
181 | extern void udp_err(struct sk_buff *, u32); | 181 | extern void udp_err(struct sk_buff *, u32); |
182 | extern int udp_sendmsg(struct kiocb *iocb, struct sock *sk, | 182 | extern int udp_sendmsg(struct kiocb *iocb, struct sock *sk, |
183 | struct msghdr *msg, size_t len); | 183 | struct msghdr *msg, size_t len); |
184 | extern int udp_push_pending_frames(struct sock *sk); | ||
184 | extern void udp_flush_pending_frames(struct sock *sk); | 185 | extern void udp_flush_pending_frames(struct sock *sk); |
185 | extern int udp_rcv(struct sk_buff *skb); | 186 | extern int udp_rcv(struct sk_buff *skb); |
186 | extern int udp_ioctl(struct sock *sk, int cmd, unsigned long arg); | 187 | extern int udp_ioctl(struct sock *sk, int cmd, unsigned long arg); |
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 0bf5d399a03c..93b731d53221 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
@@ -799,7 +799,7 @@ send: | |||
799 | /* | 799 | /* |
800 | * Push out all pending data as one UDP datagram. Socket is locked. | 800 | * Push out all pending data as one UDP datagram. Socket is locked. |
801 | */ | 801 | */ |
802 | static int udp_push_pending_frames(struct sock *sk) | 802 | int udp_push_pending_frames(struct sock *sk) |
803 | { | 803 | { |
804 | struct udp_sock *up = udp_sk(sk); | 804 | struct udp_sock *up = udp_sk(sk); |
805 | struct inet_sock *inet = inet_sk(sk); | 805 | struct inet_sock *inet = inet_sk(sk); |
@@ -818,6 +818,7 @@ out: | |||
818 | up->pending = 0; | 818 | up->pending = 0; |
819 | return err; | 819 | return err; |
820 | } | 820 | } |
821 | EXPORT_SYMBOL(udp_push_pending_frames); | ||
821 | 822 | ||
822 | int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | 823 | int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, |
823 | size_t len) | 824 | size_t len) |
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 42923b14dfa6..e7b28f9bb02b 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
@@ -955,11 +955,16 @@ static int udp_v6_push_pending_frames(struct sock *sk) | |||
955 | struct udphdr *uh; | 955 | struct udphdr *uh; |
956 | struct udp_sock *up = udp_sk(sk); | 956 | struct udp_sock *up = udp_sk(sk); |
957 | struct inet_sock *inet = inet_sk(sk); | 957 | struct inet_sock *inet = inet_sk(sk); |
958 | struct flowi6 *fl6 = &inet->cork.fl.u.ip6; | 958 | struct flowi6 *fl6; |
959 | int err = 0; | 959 | int err = 0; |
960 | int is_udplite = IS_UDPLITE(sk); | 960 | int is_udplite = IS_UDPLITE(sk); |
961 | __wsum csum = 0; | 961 | __wsum csum = 0; |
962 | 962 | ||
963 | if (up->pending == AF_INET) | ||
964 | return udp_push_pending_frames(sk); | ||
965 | |||
966 | fl6 = &inet->cork.fl.u.ip6; | ||
967 | |||
963 | /* Grab the skbuff where UDP header space exists. */ | 968 | /* Grab the skbuff where UDP header space exists. */ |
964 | if ((skb = skb_peek(&sk->sk_write_queue)) == NULL) | 969 | if ((skb = skb_peek(&sk->sk_write_queue)) == NULL) |
965 | goto out; | 970 | goto out; |