]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - net/tipc/socket.c
[TIPC]: Allow stream receive to read from multiple TIPC messages
[mv-sheeva.git] / net / tipc / socket.c
index d3f9c2d87b0dd7b4535e9c3c8d917ea1907af5aa..c1a199c0fa6d838119bf1cca89df479e75d692eb 100644 (file)
@@ -58,7 +58,8 @@
 #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;
@@ -170,7 +171,7 @@ static int tipc_create(struct net *net, struct socket *sock, int protocol)
        }
 
        sock_init_data(sock, sk);
-       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);
@@ -918,7 +919,8 @@ restart:
        /* 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);
        }
@@ -1063,7 +1065,9 @@ restart:
        /* 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 */
            )
@@ -1529,7 +1533,7 @@ static int setsockopt(struct socket *sock,
                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;
@@ -1582,7 +1586,7 @@ static int getsockopt(struct socket *sock,
                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;