net: ipc_router: Add write_space callback

Flow control events in IPC Router are posted through a resume_tx
message. For clients that prefer a callback approach, add support
for write_space callback to notify about the flow control events.
The resume_tx message is not posted for such clients.

Change-Id: Iae25fd78f190bc7aeb7311ece68b3be407a1f910
Signed-off-by: Atish Kumar Patra <apatra@codeaurora.org>
This commit is contained in:
Atish Kumar Patra 2015-03-23 14:49:35 -06:00
parent 3da72c23d7
commit baeaf0b61d
2 changed files with 13 additions and 1 deletions

View File

@ -1424,6 +1424,8 @@ static void post_resume_tx(struct msm_ipc_router_remote_port *rport_ptr,
{
struct msm_ipc_resume_tx_port *rtx_port, *tmp_rtx_port;
struct msm_ipc_port *local_port;
struct sock *sk;
void (*write_space)(struct sock *sk) = NULL;
list_for_each_entry_safe(rtx_port, tmp_rtx_port,
&rport_ptr->resume_tx_port_list, list) {
@ -1434,7 +1436,16 @@ static void post_resume_tx(struct msm_ipc_router_remote_port *rport_ptr,
sizeof(*msg), local_port->priv);
} else if (local_port) {
wake_up(&local_port->port_tx_wait_q);
post_pkt_to_port(local_port, pkt, 1);
sk = ipc_port_sk(local_port->endpoint);
if (sk) {
read_lock(&sk->sk_callback_lock);
write_space = sk->sk_write_space;
read_unlock(&sk->sk_callback_lock);
if (write_space)
write_space(sk);
}
if (!write_space)
post_pkt_to_port(local_port, pkt, 1);
} else {
IPC_RTR_ERR("%s: Local Port %d not Found",
__func__, rtx_port->port_id);

View File

@ -208,6 +208,7 @@ static int msm_ipc_router_create(struct net *net,
sock->ops = &msm_ipc_proto_ops;
sock_init_data(sock, sk);
sk->sk_data_ready = NULL;
sk->sk_write_space = NULL;
sk->sk_rcvtimeo = DEFAULT_RCV_TIMEO;
sk->sk_sndtimeo = DEFAULT_SND_TIMEO;