hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/net/tipc/topsrv.c
....@@ -40,6 +40,7 @@
4040 #include "socket.h"
4141 #include "addr.h"
4242 #include "msg.h"
43
+#include "bearer.h"
4344 #include <net/sock.h>
4445 #include <linux/module.h>
4546
....@@ -47,7 +48,6 @@
4748 #define MAX_SEND_MSG_COUNT 25
4849 #define MAX_RECV_MSG_COUNT 25
4950 #define CF_CONNECTED 1
50
-#define CF_SERVER 2
5151
5252 #define TIPC_SERVER_NAME_LEN 32
5353
....@@ -57,16 +57,11 @@
5757 * @idr_lock: protect the connection identifier set
5858 * @idr_in_use: amount of allocated identifier entry
5959 * @net: network namspace instance
60
- * @rcvbuf_cache: memory cache of server receive buffer
60
+ * @awork: accept work item
6161 * @rcv_wq: receive workqueue
6262 * @send_wq: send workqueue
63
- * @max_rcvbuf_size: maximum permitted receive message length
64
- * @tipc_conn_new: callback will be called when new connection is incoming
65
- * @tipc_conn_release: callback will be called before releasing the connection
66
- * @tipc_conn_recvmsg: callback will be called when message arrives
63
+ * @listener: topsrv listener socket
6764 * @name: server name
68
- * @imp: message importance
69
- * @type: socket type
7065 */
7166 struct tipc_topsrv {
7267 struct idr conn_idr;
....@@ -76,7 +71,6 @@
7671 struct work_struct awork;
7772 struct workqueue_struct *rcv_wq;
7873 struct workqueue_struct *send_wq;
79
- int max_rcvbuf_size;
8074 struct socket *listener;
8175 char name[TIPC_SERVER_NAME_LEN];
8276 };
....@@ -90,9 +84,7 @@
9084 * @server: pointer to connected server
9185 * @sub_list: lsit to all pertaing subscriptions
9286 * @sub_lock: lock protecting the subscription list
93
- * @outqueue_lock: control access to the outqueue
9487 * @rwork: receive work item
95
- * @rx_action: what to do when connection socket is active
9688 * @outqueue: pointer to first outbound message in queue
9789 * @outqueue_lock: control access to the outqueue
9890 * @swork: send work item
....@@ -184,7 +176,7 @@
184176 conn_put(con);
185177 }
186178
187
-static struct tipc_conn *tipc_conn_alloc(struct tipc_topsrv *s)
179
+static struct tipc_conn *tipc_conn_alloc(struct tipc_topsrv *s, struct socket *sock)
188180 {
189181 struct tipc_conn *con;
190182 int ret;
....@@ -210,10 +202,12 @@
210202 }
211203 con->conid = ret;
212204 s->idr_in_use++;
213
- spin_unlock_bh(&s->idr_lock);
214205
215206 set_bit(CF_CONNECTED, &con->flags);
216207 con->server = s;
208
+ con->sock = sock;
209
+ conn_get(con);
210
+ spin_unlock_bh(&s->idr_lock);
217211
218212 return con;
219213 }
....@@ -244,8 +238,8 @@
244238 if (!s || !memcmp(s, &sub->evt.s, sizeof(*s))) {
245239 tipc_sub_unsubscribe(sub);
246240 atomic_dec(&tn->subscription_count);
247
- } else if (s) {
248
- break;
241
+ if (s)
242
+ break;
249243 }
250244 }
251245 spin_unlock_bh(&con->sub_lock);
....@@ -369,9 +363,10 @@
369363 {
370364 struct tipc_net *tn = tipc_net(srv->net);
371365 struct tipc_subscription *sub;
366
+ u32 s_filter = tipc_sub_read(s, filter);
372367
373
- if (tipc_sub_read(s, filter) & TIPC_SUB_CANCEL) {
374
- s->filter &= __constant_ntohl(~TIPC_SUB_CANCEL);
368
+ if (s_filter & TIPC_SUB_CANCEL) {
369
+ tipc_sub_write(s, filter, s_filter & ~TIPC_SUB_CANCEL);
375370 tipc_conn_delete_sub(con, s);
376371 return 0;
377372 }
....@@ -401,7 +396,7 @@
401396 iov.iov_base = &s;
402397 iov.iov_len = sizeof(s);
403398 msg.msg_name = NULL;
404
- iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &iov, 1, iov.iov_len);
399
+ iov_iter_kvec(&msg.msg_iter, READ, &iov, 1, iov.iov_len);
405400 ret = sock_recvmsg(con->sock, &msg, MSG_DONTWAIT);
406401 if (ret == -EWOULDBLOCK)
407402 return -EWOULDBLOCK;
....@@ -457,17 +452,24 @@
457452 static void tipc_topsrv_accept(struct work_struct *work)
458453 {
459454 struct tipc_topsrv *srv = container_of(work, struct tipc_topsrv, awork);
460
- struct socket *lsock = srv->listener;
461
- struct socket *newsock;
455
+ struct socket *newsock, *lsock;
462456 struct tipc_conn *con;
463457 struct sock *newsk;
464458 int ret;
459
+
460
+ spin_lock_bh(&srv->idr_lock);
461
+ if (!srv->listener) {
462
+ spin_unlock_bh(&srv->idr_lock);
463
+ return;
464
+ }
465
+ lsock = srv->listener;
466
+ spin_unlock_bh(&srv->idr_lock);
465467
466468 while (1) {
467469 ret = kernel_accept(lsock, &newsock, O_NONBLOCK);
468470 if (ret < 0)
469471 return;
470
- con = tipc_conn_alloc(srv);
472
+ con = tipc_conn_alloc(srv, newsock);
471473 if (IS_ERR(con)) {
472474 ret = PTR_ERR(con);
473475 sock_release(newsock);
....@@ -479,15 +481,15 @@
479481 newsk->sk_data_ready = tipc_conn_data_ready;
480482 newsk->sk_write_space = tipc_conn_write_space;
481483 newsk->sk_user_data = con;
482
- con->sock = newsock;
483484 write_unlock_bh(&newsk->sk_callback_lock);
484485
485486 /* Wake up receive process in case of 'SYN+' message */
486487 newsk->sk_data_ready(newsk);
488
+ conn_put(con);
487489 }
488490 }
489491
490
-/* tipc_toprsv_listener_data_ready - interrupt callback with connection request
492
+/* tipc_topsrv_listener_data_ready - interrupt callback with connection request
491493 * The queued job is launched into tipc_topsrv_accept()
492494 */
493495 static void tipc_topsrv_listener_data_ready(struct sock *sk)
....@@ -496,14 +498,13 @@
496498
497499 read_lock_bh(&sk->sk_callback_lock);
498500 srv = sk->sk_user_data;
499
- if (srv->listener)
501
+ if (srv)
500502 queue_work(srv->rcv_wq, &srv->awork);
501503 read_unlock_bh(&sk->sk_callback_lock);
502504 }
503505
504506 static int tipc_topsrv_create_listener(struct tipc_topsrv *srv)
505507 {
506
- int imp = TIPC_CRITICAL_IMPORTANCE;
507508 struct socket *lsock = NULL;
508509 struct sockaddr_tipc saddr;
509510 struct sock *sk;
....@@ -520,8 +521,9 @@
520521 sk->sk_user_data = srv;
521522 write_unlock_bh(&sk->sk_callback_lock);
522523
523
- rc = kernel_setsockopt(lsock, SOL_TIPC, TIPC_IMPORTANCE,
524
- (char *)&imp, sizeof(imp));
524
+ lock_sock(sk);
525
+ rc = tsk_set_importance(sk, TIPC_CRITICAL_IMPORTANCE);
526
+ release_sock(sk);
525527 if (rc < 0)
526528 goto err;
527529
....@@ -575,19 +577,19 @@
575577 sub.seq.upper = upper;
576578 sub.timeout = TIPC_WAIT_FOREVER;
577579 sub.filter = filter;
578
- *(u32 *)&sub.usr_handle = port;
580
+ *(u64 *)&sub.usr_handle = (u64)port;
579581
580
- con = tipc_conn_alloc(tipc_topsrv(net));
582
+ con = tipc_conn_alloc(tipc_topsrv(net), NULL);
581583 if (IS_ERR(con))
582584 return false;
583585
584586 *conid = con->conid;
585
- con->sock = NULL;
586587 rc = tipc_conn_rcv_sub(tipc_topsrv(net), con, &sub);
587
- if (rc >= 0)
588
- return true;
588
+ if (rc)
589
+ conn_put(con);
590
+
589591 conn_put(con);
590
- return false;
592
+ return !rc;
591593 }
592594
593595 void tipc_topsrv_kern_unsubscr(struct net *net, int conid)
....@@ -619,6 +621,7 @@
619621 memcpy(msg_data(buf_msg(skb)), evt, sizeof(*evt));
620622 skb_queue_head_init(&evtq);
621623 __skb_queue_tail(&evtq, skb);
624
+ tipc_loopback_trace(net, &evtq);
622625 tipc_sk_rcv(net, &evtq);
623626 }
624627
....@@ -658,7 +661,6 @@
658661 return -ENOMEM;
659662
660663 srv->net = net;
661
- srv->max_rcvbuf_size = sizeof(struct tipc_subscr);
662664 INIT_WORK(&srv->awork, tipc_topsrv_accept);
663665
664666 strscpy(srv->name, name, sizeof(srv->name));
....@@ -706,8 +708,9 @@
706708 __module_get(lsock->sk->sk_prot_creator->owner);
707709 srv->listener = NULL;
708710 spin_unlock_bh(&srv->idr_lock);
709
- sock_release(lsock);
711
+
710712 tipc_topsrv_work_stop(srv);
713
+ sock_release(lsock);
711714 idr_destroy(&srv->conn_idr);
712715 kfree(srv);
713716 }