summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Maloy <jon.maloy@ericsson.com>2018-02-15 04:40:42 -0500
committerDavid S. Miller <davem@davemloft.net>2018-02-16 15:26:33 -0500
commit27469b7352b5197cffa0e3dadb5f1127f055da27 (patch)
tree3d69eb67760f1e213820be002e634990be8edf35
parent35ed663f5f4f70dd750ea3e0166c5b90db9feea3 (diff)
tipc: remove redundant code in topology server
The socket handling in the topology server is unnecessarily generic. It is prepared to handle both SOCK_RDM, SOCK_DGRAM and SOCK_STREAM type sockets, as well as the only socket type which is really used, SOCK_SEQPACKET. We now remove this redundant code to make the code more readable. Acked-by: Ying Xue <ying.xue@windriver.com> Signed-off-by: Jon Maloy <jon.maloy@ericsson.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--net/tipc/server.c36
-rw-r--r--net/tipc/server.h4
-rw-r--r--net/tipc/subscr.c4
3 files changed, 9 insertions, 35 deletions
diff --git a/net/tipc/server.c b/net/tipc/server.c
index df0c563c90cd..04a6dd99dd65 100644
--- a/net/tipc/server.c
+++ b/net/tipc/server.c
@@ -82,7 +82,6 @@ struct tipc_conn {
82struct outqueue_entry { 82struct outqueue_entry {
83 struct list_head list; 83 struct list_head list;
84 struct kvec iov; 84 struct kvec iov;
85 struct sockaddr_tipc dest;
86}; 85};
87 86
88static void tipc_recv_work(struct work_struct *work); 87static void tipc_recv_work(struct work_struct *work);
@@ -93,7 +92,6 @@ static void tipc_conn_kref_release(struct kref *kref)
93{ 92{
94 struct tipc_conn *con = container_of(kref, struct tipc_conn, kref); 93 struct tipc_conn *con = container_of(kref, struct tipc_conn, kref);
95 struct tipc_server *s = con->server; 94 struct tipc_server *s = con->server;
96 struct sockaddr_tipc *saddr = s->saddr;
97 struct socket *sock = con->sock; 95 struct socket *sock = con->sock;
98 struct sock *sk; 96 struct sock *sk;
99 97
@@ -103,8 +101,6 @@ static void tipc_conn_kref_release(struct kref *kref)
103 __module_get(sock->ops->owner); 101 __module_get(sock->ops->owner);
104 __module_get(sk->sk_prot_creator->owner); 102 __module_get(sk->sk_prot_creator->owner);
105 } 103 }
106 saddr->scope = -TIPC_NODE_SCOPE;
107 kernel_bind(sock, (struct sockaddr *)saddr, sizeof(*saddr));
108 sock_release(sock); 104 sock_release(sock);
109 con->sock = NULL; 105 con->sock = NULL;
110 } 106 }
@@ -325,36 +321,24 @@ static struct socket *tipc_create_listen_sock(struct tipc_conn *con)
325{ 321{
326 struct tipc_server *s = con->server; 322 struct tipc_server *s = con->server;
327 struct socket *sock = NULL; 323 struct socket *sock = NULL;
324 int imp = TIPC_CRITICAL_IMPORTANCE;
328 int ret; 325 int ret;
329 326
330 ret = sock_create_kern(s->net, AF_TIPC, SOCK_SEQPACKET, 0, &sock); 327 ret = sock_create_kern(s->net, AF_TIPC, SOCK_SEQPACKET, 0, &sock);
331 if (ret < 0) 328 if (ret < 0)
332 return NULL; 329 return NULL;
333 ret = kernel_setsockopt(sock, SOL_TIPC, TIPC_IMPORTANCE, 330 ret = kernel_setsockopt(sock, SOL_TIPC, TIPC_IMPORTANCE,
334 (char *)&s->imp, sizeof(s->imp)); 331 (char *)&imp, sizeof(imp));
335 if (ret < 0) 332 if (ret < 0)
336 goto create_err; 333 goto create_err;
337 ret = kernel_bind(sock, (struct sockaddr *)s->saddr, sizeof(*s->saddr)); 334 ret = kernel_bind(sock, (struct sockaddr *)s->saddr, sizeof(*s->saddr));
338 if (ret < 0) 335 if (ret < 0)
339 goto create_err; 336 goto create_err;
340 337
341 switch (s->type) { 338 con->rx_action = tipc_accept_from_sock;
342 case SOCK_STREAM: 339 ret = kernel_listen(sock, 0);
343 case SOCK_SEQPACKET: 340 if (ret < 0)
344 con->rx_action = tipc_accept_from_sock;
345
346 ret = kernel_listen(sock, 0);
347 if (ret < 0)
348 goto create_err;
349 break;
350 case SOCK_DGRAM:
351 case SOCK_RDM:
352 con->rx_action = tipc_receive_from_sock;
353 break;
354 default:
355 pr_err("Unknown socket type %d\n", s->type);
356 goto create_err; 341 goto create_err;
357 }
358 342
359 /* As server's listening socket owner and creator is the same module, 343 /* As server's listening socket owner and creator is the same module,
360 * we have to decrease TIPC module reference count to guarantee that 344 * we have to decrease TIPC module reference count to guarantee that
@@ -444,7 +428,7 @@ static void tipc_clean_outqueues(struct tipc_conn *con)
444} 428}
445 429
446int tipc_conn_sendmsg(struct tipc_server *s, int conid, 430int tipc_conn_sendmsg(struct tipc_server *s, int conid,
447 struct sockaddr_tipc *addr, void *data, size_t len) 431 void *data, size_t len)
448{ 432{
449 struct outqueue_entry *e; 433 struct outqueue_entry *e;
450 struct tipc_conn *con; 434 struct tipc_conn *con;
@@ -464,9 +448,6 @@ int tipc_conn_sendmsg(struct tipc_server *s, int conid,
464 return -ENOMEM; 448 return -ENOMEM;
465 } 449 }
466 450
467 if (addr)
468 memcpy(&e->dest, addr, sizeof(struct sockaddr_tipc));
469
470 spin_lock_bh(&con->outqueue_lock); 451 spin_lock_bh(&con->outqueue_lock);
471 list_add_tail(&e->list, &con->outqueue); 452 list_add_tail(&e->list, &con->outqueue);
472 spin_unlock_bh(&con->outqueue_lock); 453 spin_unlock_bh(&con->outqueue_lock);
@@ -575,10 +556,6 @@ static void tipc_send_to_sock(struct tipc_conn *con)
575 if (con->sock) { 556 if (con->sock) {
576 memset(&msg, 0, sizeof(msg)); 557 memset(&msg, 0, sizeof(msg));
577 msg.msg_flags = MSG_DONTWAIT; 558 msg.msg_flags = MSG_DONTWAIT;
578 if (s->type == SOCK_DGRAM || s->type == SOCK_RDM) {
579 msg.msg_name = &e->dest;
580 msg.msg_namelen = sizeof(struct sockaddr_tipc);
581 }
582 ret = kernel_sendmsg(con->sock, &msg, &e->iov, 1, 559 ret = kernel_sendmsg(con->sock, &msg, &e->iov, 1,
583 e->iov.iov_len); 560 e->iov.iov_len);
584 if (ret == -EWOULDBLOCK || ret == 0) { 561 if (ret == -EWOULDBLOCK || ret == 0) {
@@ -591,6 +568,7 @@ static void tipc_send_to_sock(struct tipc_conn *con)
591 evt = e->iov.iov_base; 568 evt = e->iov.iov_base;
592 tipc_send_kern_top_evt(s->net, evt); 569 tipc_send_kern_top_evt(s->net, evt);
593 } 570 }
571
594 /* Don't starve users filling buffers */ 572 /* Don't starve users filling buffers */
595 if (++count >= MAX_SEND_MSG_COUNT) { 573 if (++count >= MAX_SEND_MSG_COUNT) {
596 cond_resched(); 574 cond_resched();
diff --git a/net/tipc/server.h b/net/tipc/server.h
index 64df7513cd70..434736d545c2 100644
--- a/net/tipc/server.h
+++ b/net/tipc/server.h
@@ -79,12 +79,10 @@ struct tipc_server {
79 void *buf, size_t len); 79 void *buf, size_t len);
80 struct sockaddr_tipc *saddr; 80 struct sockaddr_tipc *saddr;
81 char name[TIPC_SERVER_NAME_LEN]; 81 char name[TIPC_SERVER_NAME_LEN];
82 int imp;
83 int type;
84}; 82};
85 83
86int tipc_conn_sendmsg(struct tipc_server *s, int conid, 84int tipc_conn_sendmsg(struct tipc_server *s, int conid,
87 struct sockaddr_tipc *addr, void *data, size_t len); 85 void *data, size_t len);
88 86
89bool tipc_topsrv_kern_subscr(struct net *net, u32 port, u32 type, u32 lower, 87bool tipc_topsrv_kern_subscr(struct net *net, u32 port, u32 type, u32 lower,
90 u32 upper, u32 filter, int *conid); 88 u32 upper, u32 filter, int *conid);
diff --git a/net/tipc/subscr.c b/net/tipc/subscr.c
index 68e26470c516..eaef826fc06d 100644
--- a/net/tipc/subscr.c
+++ b/net/tipc/subscr.c
@@ -81,7 +81,7 @@ static void tipc_subscrp_send_event(struct tipc_subscription *sub,
81 sub->evt.found_upper = htohl(found_upper, sub->swap); 81 sub->evt.found_upper = htohl(found_upper, sub->swap);
82 sub->evt.port.ref = htohl(port_ref, sub->swap); 82 sub->evt.port.ref = htohl(port_ref, sub->swap);
83 sub->evt.port.node = htohl(node, sub->swap); 83 sub->evt.port.node = htohl(node, sub->swap);
84 tipc_conn_sendmsg(tn->topsrv, subscriber->conid, NULL, 84 tipc_conn_sendmsg(tn->topsrv, subscriber->conid,
85 msg_sect.iov_base, msg_sect.iov_len); 85 msg_sect.iov_base, msg_sect.iov_len);
86} 86}
87 87
@@ -375,8 +375,6 @@ int tipc_topsrv_start(struct net *net)
375 } 375 }
376 topsrv->net = net; 376 topsrv->net = net;
377 topsrv->saddr = saddr; 377 topsrv->saddr = saddr;
378 topsrv->imp = TIPC_CRITICAL_IMPORTANCE;
379 topsrv->type = SOCK_SEQPACKET;
380 topsrv->max_rcvbuf_size = sizeof(struct tipc_subscr); 378 topsrv->max_rcvbuf_size = sizeof(struct tipc_subscr);
381 topsrv->tipc_conn_recvmsg = tipc_subscrb_rcv_cb; 379 topsrv->tipc_conn_recvmsg = tipc_subscrb_rcv_cb;
382 topsrv->tipc_conn_new = tipc_subscrb_connect_cb; 380 topsrv->tipc_conn_new = tipc_subscrb_connect_cb;