#define SS_LISTENING -1 /* socket is listening */
#define SS_READY -2 /* socket is connectionless */
-#define OVERLOAD_LIMIT_BASE 5000
+#define OVERLOAD_LIMIT_BASE 5000
+#define CONN_TIMEOUT_DEFAULT 8000 /* default connect timeout = 8s */
struct tipc_sock {
struct sock sk;
}
sock_init_data(sock, sk);
- init_waitqueue_head(sk->sk_sleep);
- sk->sk_rcvtimeo = 8 * HZ; /* default connect timeout = 8s */
+ sk->sk_rcvtimeo = msecs_to_jiffies(CONN_TIMEOUT_DEFAULT);
tsock = tipc_sk(sk);
port = tipc_get_port(ref);
/* Consume received message (optional) */
if (likely(!(flags & MSG_PEEK))) {
- if (unlikely(++tsock->p->conn_unacked >= TIPC_FLOW_CONTROL_WIN))
+ if ((sock->state != SS_READY) &&
+ (++tsock->p->conn_unacked >= TIPC_FLOW_CONTROL_WIN))
tipc_acknowledge(tsock->p->ref, tsock->p->conn_unacked);
advance_queue(tsock);
}
/* Loop around if more data is required */
if ((sz_copied < buf_len) /* didn't get all requested data */
- && (flags & MSG_WAITALL) /* ... and need to wait for more */
+ && (!skb_queue_empty(&sock->sk->sk_receive_queue) ||
+ (flags & MSG_WAITALL))
+ /* ... and more is ready or required */
&& (!(flags & MSG_PEEK)) /* ... and aren't just peeking at data */
&& (!err) /* ... and haven't reached a FIN */
)
res = tipc_set_portunreturnable(tsock->p->ref, value);
break;
case TIPC_CONN_TIMEOUT:
- sock->sk->sk_rcvtimeo = (value * HZ / 1000);
+ sock->sk->sk_rcvtimeo = msecs_to_jiffies(value);
break;
default:
res = -EINVAL;
res = tipc_portunreturnable(tsock->p->ref, &value);
break;
case TIPC_CONN_TIMEOUT:
- value = (sock->sk->sk_rcvtimeo * 1000) / HZ;
+ value = jiffies_to_msecs(sock->sk->sk_rcvtimeo);
break;
default:
res = -EINVAL;