diff options
author | Jon Maloy <jon.maloy@ericsson.com> | 2018-02-15 04:40:42 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-02-16 15:26:33 -0500 |
commit | 27469b7352b5197cffa0e3dadb5f1127f055da27 (patch) | |
tree | 3d69eb67760f1e213820be002e634990be8edf35 | |
parent | 35ed663f5f4f70dd750ea3e0166c5b90db9feea3 (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.c | 36 | ||||
-rw-r--r-- | net/tipc/server.h | 4 | ||||
-rw-r--r-- | net/tipc/subscr.c | 4 |
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 { | |||
82 | struct outqueue_entry { | 82 | struct 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 | ||
88 | static void tipc_recv_work(struct work_struct *work); | 87 | static 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 | ||
446 | int tipc_conn_sendmsg(struct tipc_server *s, int conid, | 430 | int 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 | ||
86 | int tipc_conn_sendmsg(struct tipc_server *s, int conid, | 84 | int 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 | ||
89 | bool tipc_topsrv_kern_subscr(struct net *net, u32 port, u32 type, u32 lower, | 87 | bool 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; |