From 7b5c2d1cd6cdf69430b3ad5234ae25a9037939b4 Mon Sep 17 00:00:00 2001 From: Thomas Schoebel-Theuer Date: Fri, 22 Nov 2013 08:09:58 +0100 Subject: [PATCH] net: find out current tcp send buffer space available --- kernel/mars_net.c | 21 +++++++++++++++++++++ kernel/mars_net.h | 1 + 2 files changed, 22 insertions(+) diff --git a/kernel/mars_net.c b/kernel/mars_net.c index d358578e..cb8f8995 100644 --- a/kernel/mars_net.c +++ b/kernel/mars_net.c @@ -354,6 +354,27 @@ done: } EXPORT_SYMBOL_GPL(mars_socket_is_alive); +long mars_socket_send_space_available(struct mars_socket *msock) +{ + struct socket *raw_sock = msock->s_socket; + long res = 0; + if (!msock->s_alive || !raw_sock || !raw_sock->sk) + goto done; + if (unlikely(atomic_read(&msock->s_count) <= 0)) { + MARS_ERR("#%d bad nesting on msock = %p sock = %p\n", msock->s_debug_nr, msock, msock->s_socket); + goto done; + } + + res = raw_sock->sk->sk_sndbuf - raw_sock->sk->sk_wmem_queued; + if (res < 0) + res = 0; + res += msock->s_pos; + +done: + return res; +} +EXPORT_SYMBOL_GPL(mars_socket_send_space_available); + static int _mars_send_raw(struct mars_socket *msock, const void *buf, int len) { diff --git a/kernel/mars_net.h b/kernel/mars_net.h index 98c0eb58..2cb3f553 100644 --- a/kernel/mars_net.h +++ b/kernel/mars_net.h @@ -125,6 +125,7 @@ extern bool mars_get_socket(struct mars_socket *msock); extern void mars_put_socket(struct mars_socket *msock); extern void mars_shutdown_socket(struct mars_socket *msock); extern bool mars_socket_is_alive(struct mars_socket *msock); +extern long mars_socket_send_space_available(struct mars_socket *msock); extern int mars_send_raw(struct mars_socket *msock, const void *buf, int len, bool cork); extern int mars_recv_raw(struct mars_socket *msock, void *buf, int minlen, int maxlen);