struct tipc_port *tport = tipc_sk_port(sk);
        struct sockaddr_tipc *dest = (struct sockaddr_tipc *)m->msg_name;
        int needs_conn;
+       long timeout_val;
        int res = -EINVAL;
 
        if (unlikely(!dest))
                reject_rx_queue(sk);
        }
 
+       timeout_val = sock_sndtimeo(sk, m->msg_flags & MSG_DONTWAIT);
+
        do {
                if (dest->addrtype == TIPC_ADDR_NAME) {
                        res = dest_name_check(dest, m);
                                sock->state = SS_CONNECTING;
                        break;
                }
-               if (m->msg_flags & MSG_DONTWAIT) {
-                       res = -EWOULDBLOCK;
+               if (timeout_val <= 0L) {
+                       res = timeout_val ? timeout_val : -EWOULDBLOCK;
                        break;
                }
                release_sock(sk);
-               res = wait_event_interruptible(*sk_sleep(sk),
-                                              !tport->congested);
+               timeout_val = wait_event_interruptible_timeout(*sk_sleep(sk),
+                                              !tport->congested, timeout_val);
                lock_sock(sk);
-               if (res)
-                       break;
        } while (1);
 
 exit:
        struct sock *sk = sock->sk;
        struct tipc_port *tport = tipc_sk_port(sk);
        struct sockaddr_tipc *dest = (struct sockaddr_tipc *)m->msg_name;
+       long timeout_val;
        int res;
 
        /* Handle implied connection establishment */
        if (iocb)
                lock_sock(sk);
 
+       timeout_val = sock_sndtimeo(sk, m->msg_flags & MSG_DONTWAIT);
+
        do {
                if (unlikely(sock->state != SS_CONNECTED)) {
                        if (sock->state == SS_DISCONNECTING)
                                total_len);
                if (likely(res != -ELINKCONG))
                        break;
-               if (m->msg_flags & MSG_DONTWAIT) {
-                       res = -EWOULDBLOCK;
+               if (timeout_val <= 0L) {
+                       res = timeout_val ? timeout_val : -EWOULDBLOCK;
                        break;
                }
                release_sock(sk);
-               res = wait_event_interruptible(*sk_sleep(sk),
-                       (!tport->congested || !tport->connected));
+               timeout_val = wait_event_interruptible_timeout(*sk_sleep(sk),
+                       (!tport->congested || !tport->connected), timeout_val);
                lock_sock(sk);
-               if (res)
-                       break;
        } while (1);
 
        if (iocb)