aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc/socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/tipc/socket.c')
-rw-r--r--net/tipc/socket.c402
1 files changed, 232 insertions, 170 deletions
diff --git a/net/tipc/socket.c b/net/tipc/socket.c
index 6cc7ddd2fb7c..a4cf274455aa 100644
--- a/net/tipc/socket.c
+++ b/net/tipc/socket.c
@@ -55,9 +55,6 @@ struct tipc_sock {
55#define tipc_sk(sk) ((struct tipc_sock *)(sk)) 55#define tipc_sk(sk) ((struct tipc_sock *)(sk))
56#define tipc_sk_port(sk) (tipc_sk(sk)->p) 56#define tipc_sk_port(sk) (tipc_sk(sk)->p)
57 57
58#define tipc_rx_ready(sock) (!skb_queue_empty(&sock->sk->sk_receive_queue) || \
59 (sock->state == SS_DISCONNECTING))
60
61static int backlog_rcv(struct sock *sk, struct sk_buff *skb); 58static int backlog_rcv(struct sock *sk, struct sk_buff *skb);
62static u32 dispatch(struct tipc_port *tport, struct sk_buff *buf); 59static u32 dispatch(struct tipc_port *tport, struct sk_buff *buf);
63static void wakeupdispatch(struct tipc_port *tport); 60static void wakeupdispatch(struct tipc_port *tport);
@@ -73,8 +70,6 @@ static const struct proto_ops msg_ops;
73static struct proto tipc_proto; 70static struct proto tipc_proto;
74static struct proto tipc_proto_kern; 71static struct proto tipc_proto_kern;
75 72
76static int sockets_enabled;
77
78/* 73/*
79 * Revised TIPC socket locking policy: 74 * Revised TIPC socket locking policy:
80 * 75 *
@@ -239,7 +234,6 @@ static int tipc_sk_create(struct net *net, struct socket *sock, int protocol,
239int tipc_sock_create_local(int type, struct socket **res) 234int tipc_sock_create_local(int type, struct socket **res)
240{ 235{
241 int rc; 236 int rc;
242 struct sock *sk;
243 237
244 rc = sock_create_lite(AF_TIPC, type, 0, res); 238 rc = sock_create_lite(AF_TIPC, type, 0, res);
245 if (rc < 0) { 239 if (rc < 0) {
@@ -248,8 +242,6 @@ int tipc_sock_create_local(int type, struct socket **res)
248 } 242 }
249 tipc_sk_create(&init_net, *res, 0, 1); 243 tipc_sk_create(&init_net, *res, 0, 1);
250 244
251 sk = (*res)->sk;
252
253 return 0; 245 return 0;
254} 246}
255 247
@@ -338,7 +330,7 @@ static int release(struct socket *sock)
338 buf = __skb_dequeue(&sk->sk_receive_queue); 330 buf = __skb_dequeue(&sk->sk_receive_queue);
339 if (buf == NULL) 331 if (buf == NULL)
340 break; 332 break;
341 if (TIPC_SKB_CB(buf)->handle != 0) 333 if (TIPC_SKB_CB(buf)->handle != NULL)
342 kfree_skb(buf); 334 kfree_skb(buf);
343 else { 335 else {
344 if ((sock->state == SS_CONNECTING) || 336 if ((sock->state == SS_CONNECTING) ||
@@ -354,7 +346,7 @@ static int release(struct socket *sock)
354 * Delete TIPC port; this ensures no more messages are queued 346 * Delete TIPC port; this ensures no more messages are queued
355 * (also disconnects an active connection & sends a 'FIN-' to peer) 347 * (also disconnects an active connection & sends a 'FIN-' to peer)
356 */ 348 */
357 res = tipc_deleteport(tport->ref); 349 res = tipc_deleteport(tport);
358 350
359 /* Discard any remaining (connection-based) messages in receive queue */ 351 /* Discard any remaining (connection-based) messages in receive queue */
360 __skb_queue_purge(&sk->sk_receive_queue); 352 __skb_queue_purge(&sk->sk_receive_queue);
@@ -386,30 +378,46 @@ static int release(struct socket *sock)
386 */ 378 */
387static int bind(struct socket *sock, struct sockaddr *uaddr, int uaddr_len) 379static int bind(struct socket *sock, struct sockaddr *uaddr, int uaddr_len)
388{ 380{
381 struct sock *sk = sock->sk;
389 struct sockaddr_tipc *addr = (struct sockaddr_tipc *)uaddr; 382 struct sockaddr_tipc *addr = (struct sockaddr_tipc *)uaddr;
390 u32 portref = tipc_sk_port(sock->sk)->ref; 383 struct tipc_port *tport = tipc_sk_port(sock->sk);
384 int res = -EINVAL;
391 385
392 if (unlikely(!uaddr_len)) 386 lock_sock(sk);
393 return tipc_withdraw(portref, 0, NULL); 387 if (unlikely(!uaddr_len)) {
388 res = tipc_withdraw(tport, 0, NULL);
389 goto exit;
390 }
394 391
395 if (uaddr_len < sizeof(struct sockaddr_tipc)) 392 if (uaddr_len < sizeof(struct sockaddr_tipc)) {
396 return -EINVAL; 393 res = -EINVAL;
397 if (addr->family != AF_TIPC) 394 goto exit;
398 return -EAFNOSUPPORT; 395 }
396 if (addr->family != AF_TIPC) {
397 res = -EAFNOSUPPORT;
398 goto exit;
399 }
399 400
400 if (addr->addrtype == TIPC_ADDR_NAME) 401 if (addr->addrtype == TIPC_ADDR_NAME)
401 addr->addr.nameseq.upper = addr->addr.nameseq.lower; 402 addr->addr.nameseq.upper = addr->addr.nameseq.lower;
402 else if (addr->addrtype != TIPC_ADDR_NAMESEQ) 403 else if (addr->addrtype != TIPC_ADDR_NAMESEQ) {
403 return -EAFNOSUPPORT; 404 res = -EAFNOSUPPORT;
405 goto exit;
406 }
404 407
405 if ((addr->addr.nameseq.type < TIPC_RESERVED_TYPES) && 408 if ((addr->addr.nameseq.type < TIPC_RESERVED_TYPES) &&
406 (addr->addr.nameseq.type != TIPC_TOP_SRV) && 409 (addr->addr.nameseq.type != TIPC_TOP_SRV) &&
407 (addr->addr.nameseq.type != TIPC_CFG_SRV)) 410 (addr->addr.nameseq.type != TIPC_CFG_SRV)) {
408 return -EACCES; 411 res = -EACCES;
412 goto exit;
413 }
409 414
410 return (addr->scope > 0) ? 415 res = (addr->scope > 0) ?
411 tipc_publish(portref, addr->scope, &addr->addr.nameseq) : 416 tipc_publish(tport, addr->scope, &addr->addr.nameseq) :
412 tipc_withdraw(portref, -addr->scope, &addr->addr.nameseq); 417 tipc_withdraw(tport, -addr->scope, &addr->addr.nameseq);
418exit:
419 release_sock(sk);
420 return res;
413} 421}
414 422
415/** 423/**
@@ -554,6 +562,31 @@ static int dest_name_check(struct sockaddr_tipc *dest, struct msghdr *m)
554 return 0; 562 return 0;
555} 563}
556 564
565static int tipc_wait_for_sndmsg(struct socket *sock, long *timeo_p)
566{
567 struct sock *sk = sock->sk;
568 struct tipc_port *tport = tipc_sk_port(sk);
569 DEFINE_WAIT(wait);
570 int done;
571
572 do {
573 int err = sock_error(sk);
574 if (err)
575 return err;
576 if (sock->state == SS_DISCONNECTING)
577 return -EPIPE;
578 if (!*timeo_p)
579 return -EAGAIN;
580 if (signal_pending(current))
581 return sock_intr_errno(*timeo_p);
582
583 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
584 done = sk_wait_event(sk, timeo_p, !tport->congested);
585 finish_wait(sk_sleep(sk), &wait);
586 } while (!done);
587 return 0;
588}
589
557/** 590/**
558 * send_msg - send message in connectionless manner 591 * send_msg - send message in connectionless manner
559 * @iocb: if NULL, indicates that socket lock is already held 592 * @iocb: if NULL, indicates that socket lock is already held
@@ -573,9 +606,9 @@ static int send_msg(struct kiocb *iocb, struct socket *sock,
573{ 606{
574 struct sock *sk = sock->sk; 607 struct sock *sk = sock->sk;
575 struct tipc_port *tport = tipc_sk_port(sk); 608 struct tipc_port *tport = tipc_sk_port(sk);
576 struct sockaddr_tipc *dest = (struct sockaddr_tipc *)m->msg_name; 609 DECLARE_SOCKADDR(struct sockaddr_tipc *, dest, m->msg_name);
577 int needs_conn; 610 int needs_conn;
578 long timeout_val; 611 long timeo;
579 int res = -EINVAL; 612 int res = -EINVAL;
580 613
581 if (unlikely(!dest)) 614 if (unlikely(!dest))
@@ -612,8 +645,7 @@ static int send_msg(struct kiocb *iocb, struct socket *sock,
612 reject_rx_queue(sk); 645 reject_rx_queue(sk);
613 } 646 }
614 647
615 timeout_val = sock_sndtimeo(sk, m->msg_flags & MSG_DONTWAIT); 648 timeo = sock_sndtimeo(sk, m->msg_flags & MSG_DONTWAIT);
616
617 do { 649 do {
618 if (dest->addrtype == TIPC_ADDR_NAME) { 650 if (dest->addrtype == TIPC_ADDR_NAME) {
619 res = dest_name_check(dest, m); 651 res = dest_name_check(dest, m);
@@ -622,13 +654,11 @@ static int send_msg(struct kiocb *iocb, struct socket *sock,
622 res = tipc_send2name(tport->ref, 654 res = tipc_send2name(tport->ref,
623 &dest->addr.name.name, 655 &dest->addr.name.name,
624 dest->addr.name.domain, 656 dest->addr.name.domain,
625 m->msg_iovlen,
626 m->msg_iov, 657 m->msg_iov,
627 total_len); 658 total_len);
628 } else if (dest->addrtype == TIPC_ADDR_ID) { 659 } else if (dest->addrtype == TIPC_ADDR_ID) {
629 res = tipc_send2port(tport->ref, 660 res = tipc_send2port(tport->ref,
630 &dest->addr.id, 661 &dest->addr.id,
631 m->msg_iovlen,
632 m->msg_iov, 662 m->msg_iov,
633 total_len); 663 total_len);
634 } else if (dest->addrtype == TIPC_ADDR_MCAST) { 664 } else if (dest->addrtype == TIPC_ADDR_MCAST) {
@@ -641,7 +671,6 @@ static int send_msg(struct kiocb *iocb, struct socket *sock,
641 break; 671 break;
642 res = tipc_multicast(tport->ref, 672 res = tipc_multicast(tport->ref,
643 &dest->addr.nameseq, 673 &dest->addr.nameseq,
644 m->msg_iovlen,
645 m->msg_iov, 674 m->msg_iov,
646 total_len); 675 total_len);
647 } 676 }
@@ -650,14 +679,9 @@ static int send_msg(struct kiocb *iocb, struct socket *sock,
650 sock->state = SS_CONNECTING; 679 sock->state = SS_CONNECTING;
651 break; 680 break;
652 } 681 }
653 if (timeout_val <= 0L) { 682 res = tipc_wait_for_sndmsg(sock, &timeo);
654 res = timeout_val ? timeout_val : -EWOULDBLOCK; 683 if (res)
655 break; 684 break;
656 }
657 release_sock(sk);
658 timeout_val = wait_event_interruptible_timeout(*sk_sleep(sk),
659 !tport->congested, timeout_val);
660 lock_sock(sk);
661 } while (1); 685 } while (1);
662 686
663exit: 687exit:
@@ -666,6 +690,34 @@ exit:
666 return res; 690 return res;
667} 691}
668 692
693static int tipc_wait_for_sndpkt(struct socket *sock, long *timeo_p)
694{
695 struct sock *sk = sock->sk;
696 struct tipc_port *tport = tipc_sk_port(sk);
697 DEFINE_WAIT(wait);
698 int done;
699
700 do {
701 int err = sock_error(sk);
702 if (err)
703 return err;
704 if (sock->state == SS_DISCONNECTING)
705 return -EPIPE;
706 else if (sock->state != SS_CONNECTED)
707 return -ENOTCONN;
708 if (!*timeo_p)
709 return -EAGAIN;
710 if (signal_pending(current))
711 return sock_intr_errno(*timeo_p);
712
713 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
714 done = sk_wait_event(sk, timeo_p,
715 (!tport->congested || !tport->connected));
716 finish_wait(sk_sleep(sk), &wait);
717 } while (!done);
718 return 0;
719}
720
669/** 721/**
670 * send_packet - send a connection-oriented message 722 * send_packet - send a connection-oriented message
671 * @iocb: if NULL, indicates that socket lock is already held 723 * @iocb: if NULL, indicates that socket lock is already held
@@ -682,9 +734,9 @@ static int send_packet(struct kiocb *iocb, struct socket *sock,
682{ 734{
683 struct sock *sk = sock->sk; 735 struct sock *sk = sock->sk;
684 struct tipc_port *tport = tipc_sk_port(sk); 736 struct tipc_port *tport = tipc_sk_port(sk);
685 struct sockaddr_tipc *dest = (struct sockaddr_tipc *)m->msg_name; 737 DECLARE_SOCKADDR(struct sockaddr_tipc *, dest, m->msg_name);
686 long timeout_val; 738 int res = -EINVAL;
687 int res; 739 long timeo;
688 740
689 /* Handle implied connection establishment */ 741 /* Handle implied connection establishment */
690 if (unlikely(dest)) 742 if (unlikely(dest))
@@ -696,31 +748,24 @@ static int send_packet(struct kiocb *iocb, struct socket *sock,
696 if (iocb) 748 if (iocb)
697 lock_sock(sk); 749 lock_sock(sk);
698 750
699 timeout_val = sock_sndtimeo(sk, m->msg_flags & MSG_DONTWAIT); 751 if (unlikely(sock->state != SS_CONNECTED)) {
752 if (sock->state == SS_DISCONNECTING)
753 res = -EPIPE;
754 else
755 res = -ENOTCONN;
756 goto exit;
757 }
700 758
759 timeo = sock_sndtimeo(sk, m->msg_flags & MSG_DONTWAIT);
701 do { 760 do {
702 if (unlikely(sock->state != SS_CONNECTED)) { 761 res = tipc_send(tport->ref, m->msg_iov, total_len);
703 if (sock->state == SS_DISCONNECTING)
704 res = -EPIPE;
705 else
706 res = -ENOTCONN;
707 break;
708 }
709
710 res = tipc_send(tport->ref, m->msg_iovlen, m->msg_iov,
711 total_len);
712 if (likely(res != -ELINKCONG)) 762 if (likely(res != -ELINKCONG))
713 break; 763 break;
714 if (timeout_val <= 0L) { 764 res = tipc_wait_for_sndpkt(sock, &timeo);
715 res = timeout_val ? timeout_val : -EWOULDBLOCK; 765 if (res)
716 break; 766 break;
717 }
718 release_sock(sk);
719 timeout_val = wait_event_interruptible_timeout(*sk_sleep(sk),
720 (!tport->congested || !tport->connected), timeout_val);
721 lock_sock(sk);
722 } while (1); 767 } while (1);
723 768exit:
724 if (iocb) 769 if (iocb)
725 release_sock(sk); 770 release_sock(sk);
726 return res; 771 return res;
@@ -758,16 +803,11 @@ static int send_stream(struct kiocb *iocb, struct socket *sock,
758 803
759 /* Handle special cases where there is no connection */ 804 /* Handle special cases where there is no connection */
760 if (unlikely(sock->state != SS_CONNECTED)) { 805 if (unlikely(sock->state != SS_CONNECTED)) {
761 if (sock->state == SS_UNCONNECTED) { 806 if (sock->state == SS_UNCONNECTED)
762 res = send_packet(NULL, sock, m, total_len); 807 res = send_packet(NULL, sock, m, total_len);
763 goto exit; 808 else
764 } else if (sock->state == SS_DISCONNECTING) { 809 res = sock->state == SS_DISCONNECTING ? -EPIPE : -ENOTCONN;
765 res = -EPIPE; 810 goto exit;
766 goto exit;
767 } else {
768 res = -ENOTCONN;
769 goto exit;
770 }
771 } 811 }
772 812
773 if (unlikely(m->msg_name)) { 813 if (unlikely(m->msg_name)) {
@@ -864,7 +904,7 @@ static int auto_connect(struct socket *sock, struct tipc_msg *msg)
864 */ 904 */
865static void set_orig_addr(struct msghdr *m, struct tipc_msg *msg) 905static void set_orig_addr(struct msghdr *m, struct tipc_msg *msg)
866{ 906{
867 struct sockaddr_tipc *addr = (struct sockaddr_tipc *)m->msg_name; 907 DECLARE_SOCKADDR(struct sockaddr_tipc *, addr, m->msg_name);
868 908
869 if (addr) { 909 if (addr) {
870 addr->family = AF_TIPC; 910 addr->family = AF_TIPC;
@@ -949,6 +989,37 @@ static int anc_data_recv(struct msghdr *m, struct tipc_msg *msg,
949 return 0; 989 return 0;
950} 990}
951 991
992static int tipc_wait_for_rcvmsg(struct socket *sock, long timeo)
993{
994 struct sock *sk = sock->sk;
995 DEFINE_WAIT(wait);
996 int err;
997
998 for (;;) {
999 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
1000 if (skb_queue_empty(&sk->sk_receive_queue)) {
1001 if (sock->state == SS_DISCONNECTING) {
1002 err = -ENOTCONN;
1003 break;
1004 }
1005 release_sock(sk);
1006 timeo = schedule_timeout(timeo);
1007 lock_sock(sk);
1008 }
1009 err = 0;
1010 if (!skb_queue_empty(&sk->sk_receive_queue))
1011 break;
1012 err = sock_intr_errno(timeo);
1013 if (signal_pending(current))
1014 break;
1015 err = -EAGAIN;
1016 if (!timeo)
1017 break;
1018 }
1019 finish_wait(sk_sleep(sk), &wait);
1020 return err;
1021}
1022
952/** 1023/**
953 * recv_msg - receive packet-oriented message 1024 * recv_msg - receive packet-oriented message
954 * @iocb: (unused) 1025 * @iocb: (unused)
@@ -968,7 +1039,7 @@ static int recv_msg(struct kiocb *iocb, struct socket *sock,
968 struct tipc_port *tport = tipc_sk_port(sk); 1039 struct tipc_port *tport = tipc_sk_port(sk);
969 struct sk_buff *buf; 1040 struct sk_buff *buf;
970 struct tipc_msg *msg; 1041 struct tipc_msg *msg;
971 long timeout; 1042 long timeo;
972 unsigned int sz; 1043 unsigned int sz;
973 u32 err; 1044 u32 err;
974 int res; 1045 int res;
@@ -984,28 +1055,13 @@ static int recv_msg(struct kiocb *iocb, struct socket *sock,
984 goto exit; 1055 goto exit;
985 } 1056 }
986 1057
987 /* will be updated in set_orig_addr() if needed */ 1058 timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
988 m->msg_namelen = 0;
989
990 timeout = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
991restart: 1059restart:
992 1060
993 /* Look for a message in receive queue; wait if necessary */ 1061 /* Look for a message in receive queue; wait if necessary */
994 while (skb_queue_empty(&sk->sk_receive_queue)) { 1062 res = tipc_wait_for_rcvmsg(sock, timeo);
995 if (sock->state == SS_DISCONNECTING) { 1063 if (res)
996 res = -ENOTCONN; 1064 goto exit;
997 goto exit;
998 }
999 if (timeout <= 0L) {
1000 res = timeout ? timeout : -EWOULDBLOCK;
1001 goto exit;
1002 }
1003 release_sock(sk);
1004 timeout = wait_event_interruptible_timeout(*sk_sleep(sk),
1005 tipc_rx_ready(sock),
1006 timeout);
1007 lock_sock(sk);
1008 }
1009 1065
1010 /* Look at first message in receive queue */ 1066 /* Look at first message in receive queue */
1011 buf = skb_peek(&sk->sk_receive_queue); 1067 buf = skb_peek(&sk->sk_receive_queue);
@@ -1077,7 +1133,7 @@ static int recv_stream(struct kiocb *iocb, struct socket *sock,
1077 struct tipc_port *tport = tipc_sk_port(sk); 1133 struct tipc_port *tport = tipc_sk_port(sk);
1078 struct sk_buff *buf; 1134 struct sk_buff *buf;
1079 struct tipc_msg *msg; 1135 struct tipc_msg *msg;
1080 long timeout; 1136 long timeo;
1081 unsigned int sz; 1137 unsigned int sz;
1082 int sz_to_copy, target, needed; 1138 int sz_to_copy, target, needed;
1083 int sz_copied = 0; 1139 int sz_copied = 0;
@@ -1090,34 +1146,19 @@ static int recv_stream(struct kiocb *iocb, struct socket *sock,
1090 1146
1091 lock_sock(sk); 1147 lock_sock(sk);
1092 1148
1093 if (unlikely((sock->state == SS_UNCONNECTED))) { 1149 if (unlikely(sock->state == SS_UNCONNECTED)) {
1094 res = -ENOTCONN; 1150 res = -ENOTCONN;
1095 goto exit; 1151 goto exit;
1096 } 1152 }
1097 1153
1098 /* will be updated in set_orig_addr() if needed */
1099 m->msg_namelen = 0;
1100
1101 target = sock_rcvlowat(sk, flags & MSG_WAITALL, buf_len); 1154 target = sock_rcvlowat(sk, flags & MSG_WAITALL, buf_len);
1102 timeout = sock_rcvtimeo(sk, flags & MSG_DONTWAIT); 1155 timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
1103 1156
1104restart: 1157restart:
1105 /* Look for a message in receive queue; wait if necessary */ 1158 /* Look for a message in receive queue; wait if necessary */
1106 while (skb_queue_empty(&sk->sk_receive_queue)) { 1159 res = tipc_wait_for_rcvmsg(sock, timeo);
1107 if (sock->state == SS_DISCONNECTING) { 1160 if (res)
1108 res = -ENOTCONN; 1161 goto exit;
1109 goto exit;
1110 }
1111 if (timeout <= 0L) {
1112 res = timeout ? timeout : -EWOULDBLOCK;
1113 goto exit;
1114 }
1115 release_sock(sk);
1116 timeout = wait_event_interruptible_timeout(*sk_sleep(sk),
1117 tipc_rx_ready(sock),
1118 timeout);
1119 lock_sock(sk);
1120 }
1121 1162
1122 /* Look at first message in receive queue */ 1163 /* Look at first message in receive queue */
1123 buf = skb_peek(&sk->sk_receive_queue); 1164 buf = skb_peek(&sk->sk_receive_queue);
@@ -1321,14 +1362,12 @@ static u32 filter_connect(struct tipc_sock *tsock, struct sk_buff **buf)
1321static unsigned int rcvbuf_limit(struct sock *sk, struct sk_buff *buf) 1362static unsigned int rcvbuf_limit(struct sock *sk, struct sk_buff *buf)
1322{ 1363{
1323 struct tipc_msg *msg = buf_msg(buf); 1364 struct tipc_msg *msg = buf_msg(buf);
1324 unsigned int limit;
1325 1365
1326 if (msg_connected(msg)) 1366 if (msg_connected(msg))
1327 limit = sysctl_tipc_rmem[2]; 1367 return sysctl_tipc_rmem[2];
1328 else 1368
1329 limit = sk->sk_rcvbuf >> TIPC_CRITICAL_IMPORTANCE << 1369 return sk->sk_rcvbuf >> TIPC_CRITICAL_IMPORTANCE <<
1330 msg_importance(msg); 1370 msg_importance(msg);
1331 return limit;
1332} 1371}
1333 1372
1334/** 1373/**
@@ -1368,7 +1407,7 @@ static u32 filter_rcv(struct sock *sk, struct sk_buff *buf)
1368 return TIPC_ERR_OVERLOAD; 1407 return TIPC_ERR_OVERLOAD;
1369 1408
1370 /* Enqueue message */ 1409 /* Enqueue message */
1371 TIPC_SKB_CB(buf)->handle = 0; 1410 TIPC_SKB_CB(buf)->handle = NULL;
1372 __skb_queue_tail(&sk->sk_receive_queue, buf); 1411 __skb_queue_tail(&sk->sk_receive_queue, buf);
1373 skb_set_owner_r(buf, sk); 1412 skb_set_owner_r(buf, sk);
1374 1413
@@ -1442,6 +1481,28 @@ static void wakeupdispatch(struct tipc_port *tport)
1442 sk->sk_write_space(sk); 1481 sk->sk_write_space(sk);
1443} 1482}
1444 1483
1484static int tipc_wait_for_connect(struct socket *sock, long *timeo_p)
1485{
1486 struct sock *sk = sock->sk;
1487 DEFINE_WAIT(wait);
1488 int done;
1489
1490 do {
1491 int err = sock_error(sk);
1492 if (err)
1493 return err;
1494 if (!*timeo_p)
1495 return -ETIMEDOUT;
1496 if (signal_pending(current))
1497 return sock_intr_errno(*timeo_p);
1498
1499 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
1500 done = sk_wait_event(sk, timeo_p, sock->state != SS_CONNECTING);
1501 finish_wait(sk_sleep(sk), &wait);
1502 } while (!done);
1503 return 0;
1504}
1505
1445/** 1506/**
1446 * connect - establish a connection to another TIPC port 1507 * connect - establish a connection to another TIPC port
1447 * @sock: socket structure 1508 * @sock: socket structure
@@ -1457,7 +1518,8 @@ static int connect(struct socket *sock, struct sockaddr *dest, int destlen,
1457 struct sock *sk = sock->sk; 1518 struct sock *sk = sock->sk;
1458 struct sockaddr_tipc *dst = (struct sockaddr_tipc *)dest; 1519 struct sockaddr_tipc *dst = (struct sockaddr_tipc *)dest;
1459 struct msghdr m = {NULL,}; 1520 struct msghdr m = {NULL,};
1460 unsigned int timeout; 1521 long timeout = (flags & O_NONBLOCK) ? 0 : tipc_sk(sk)->conn_timeout;
1522 socket_state previous;
1461 int res; 1523 int res;
1462 1524
1463 lock_sock(sk); 1525 lock_sock(sk);
@@ -1479,8 +1541,7 @@ static int connect(struct socket *sock, struct sockaddr *dest, int destlen,
1479 goto exit; 1541 goto exit;
1480 } 1542 }
1481 1543
1482 timeout = (flags & O_NONBLOCK) ? 0 : tipc_sk(sk)->conn_timeout; 1544 previous = sock->state;
1483
1484 switch (sock->state) { 1545 switch (sock->state) {
1485 case SS_UNCONNECTED: 1546 case SS_UNCONNECTED:
1486 /* Send a 'SYN-' to destination */ 1547 /* Send a 'SYN-' to destination */
@@ -1502,43 +1563,22 @@ static int connect(struct socket *sock, struct sockaddr *dest, int destlen,
1502 * case is EINPROGRESS, rather than EALREADY. 1563 * case is EINPROGRESS, rather than EALREADY.
1503 */ 1564 */
1504 res = -EINPROGRESS; 1565 res = -EINPROGRESS;
1505 break;
1506 case SS_CONNECTING: 1566 case SS_CONNECTING:
1507 res = -EALREADY; 1567 if (previous == SS_CONNECTING)
1568 res = -EALREADY;
1569 if (!timeout)
1570 goto exit;
1571 timeout = msecs_to_jiffies(timeout);
1572 /* Wait until an 'ACK' or 'RST' arrives, or a timeout occurs */
1573 res = tipc_wait_for_connect(sock, &timeout);
1508 break; 1574 break;
1509 case SS_CONNECTED: 1575 case SS_CONNECTED:
1510 res = -EISCONN; 1576 res = -EISCONN;
1511 break; 1577 break;
1512 default: 1578 default:
1513 res = -EINVAL; 1579 res = -EINVAL;
1514 goto exit; 1580 break;
1515 }
1516
1517 if (sock->state == SS_CONNECTING) {
1518 if (!timeout)
1519 goto exit;
1520
1521 /* Wait until an 'ACK' or 'RST' arrives, or a timeout occurs */
1522 release_sock(sk);
1523 res = wait_event_interruptible_timeout(*sk_sleep(sk),
1524 sock->state != SS_CONNECTING,
1525 timeout ? (long)msecs_to_jiffies(timeout)
1526 : MAX_SCHEDULE_TIMEOUT);
1527 lock_sock(sk);
1528 if (res <= 0) {
1529 if (res == 0)
1530 res = -ETIMEDOUT;
1531 else
1532 ; /* leave "res" unchanged */
1533 goto exit;
1534 }
1535 } 1581 }
1536
1537 if (unlikely(sock->state == SS_DISCONNECTING))
1538 res = sock_error(sk);
1539 else
1540 res = 0;
1541
1542exit: 1582exit:
1543 release_sock(sk); 1583 release_sock(sk);
1544 return res; 1584 return res;
@@ -1569,6 +1609,42 @@ static int listen(struct socket *sock, int len)
1569 return res; 1609 return res;
1570} 1610}
1571 1611
1612static int tipc_wait_for_accept(struct socket *sock, long timeo)
1613{
1614 struct sock *sk = sock->sk;
1615 DEFINE_WAIT(wait);
1616 int err;
1617
1618 /* True wake-one mechanism for incoming connections: only
1619 * one process gets woken up, not the 'whole herd'.
1620 * Since we do not 'race & poll' for established sockets
1621 * anymore, the common case will execute the loop only once.
1622 */
1623 for (;;) {
1624 prepare_to_wait_exclusive(sk_sleep(sk), &wait,
1625 TASK_INTERRUPTIBLE);
1626 if (skb_queue_empty(&sk->sk_receive_queue)) {
1627 release_sock(sk);
1628 timeo = schedule_timeout(timeo);
1629 lock_sock(sk);
1630 }
1631 err = 0;
1632 if (!skb_queue_empty(&sk->sk_receive_queue))
1633 break;
1634 err = -EINVAL;
1635 if (sock->state != SS_LISTENING)
1636 break;
1637 err = sock_intr_errno(timeo);
1638 if (signal_pending(current))
1639 break;
1640 err = -EAGAIN;
1641 if (!timeo)
1642 break;
1643 }
1644 finish_wait(sk_sleep(sk), &wait);
1645 return err;
1646}
1647
1572/** 1648/**
1573 * accept - wait for connection request 1649 * accept - wait for connection request
1574 * @sock: listening socket 1650 * @sock: listening socket
@@ -1585,7 +1661,7 @@ static int accept(struct socket *sock, struct socket *new_sock, int flags)
1585 struct tipc_port *new_tport; 1661 struct tipc_port *new_tport;
1586 struct tipc_msg *msg; 1662 struct tipc_msg *msg;
1587 u32 new_ref; 1663 u32 new_ref;
1588 1664 long timeo;
1589 int res; 1665 int res;
1590 1666
1591 lock_sock(sk); 1667 lock_sock(sk);
@@ -1595,18 +1671,10 @@ static int accept(struct socket *sock, struct socket *new_sock, int flags)
1595 goto exit; 1671 goto exit;
1596 } 1672 }
1597 1673
1598 while (skb_queue_empty(&sk->sk_receive_queue)) { 1674 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
1599 if (flags & O_NONBLOCK) { 1675 res = tipc_wait_for_accept(sock, timeo);
1600 res = -EWOULDBLOCK; 1676 if (res)
1601 goto exit; 1677 goto exit;
1602 }
1603 release_sock(sk);
1604 res = wait_event_interruptible(*sk_sleep(sk),
1605 (!skb_queue_empty(&sk->sk_receive_queue)));
1606 lock_sock(sk);
1607 if (res)
1608 goto exit;
1609 }
1610 1678
1611 buf = skb_peek(&sk->sk_receive_queue); 1679 buf = skb_peek(&sk->sk_receive_queue);
1612 1680
@@ -1691,7 +1759,7 @@ restart:
1691 /* Disconnect and send a 'FIN+' or 'FIN-' message to peer */ 1759 /* Disconnect and send a 'FIN+' or 'FIN-' message to peer */
1692 buf = __skb_dequeue(&sk->sk_receive_queue); 1760 buf = __skb_dequeue(&sk->sk_receive_queue);
1693 if (buf) { 1761 if (buf) {
1694 if (TIPC_SKB_CB(buf)->handle != 0) { 1762 if (TIPC_SKB_CB(buf)->handle != NULL) {
1695 kfree_skb(buf); 1763 kfree_skb(buf);
1696 goto restart; 1764 goto restart;
1697 } 1765 }
@@ -1957,8 +2025,6 @@ int tipc_socket_init(void)
1957 proto_unregister(&tipc_proto); 2025 proto_unregister(&tipc_proto);
1958 goto out; 2026 goto out;
1959 } 2027 }
1960
1961 sockets_enabled = 1;
1962 out: 2028 out:
1963 return res; 2029 return res;
1964} 2030}
@@ -1968,10 +2034,6 @@ int tipc_socket_init(void)
1968 */ 2034 */
1969void tipc_socket_stop(void) 2035void tipc_socket_stop(void)
1970{ 2036{
1971 if (!sockets_enabled)
1972 return;
1973
1974 sockets_enabled = 0;
1975 sock_unregister(tipc_family_ops.family); 2037 sock_unregister(tipc_family_ops.family);
1976 proto_unregister(&tipc_proto); 2038 proto_unregister(&tipc_proto);
1977} 2039}