hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/net/qrtr/qrtr.c
similarity index 98%rename from kernel/net/qrtr/qrtr.crename to kernel/net/qrtr/af_qrtr.c
....@@ -388,10 +388,12 @@
388388 struct qrtr_node *node;
389389 unsigned long flags;
390390
391
+ mutex_lock(&qrtr_node_lock);
391392 spin_lock_irqsave(&qrtr_nodes_lock, flags);
392393 node = radix_tree_lookup(&qrtr_nodes, nid);
393394 node = qrtr_node_acquire(node);
394395 spin_unlock_irqrestore(&qrtr_nodes_lock, flags);
396
+ mutex_unlock(&qrtr_node_lock);
395397
396398 return node;
397399 }
....@@ -490,6 +492,11 @@
490492 if (!size || len != ALIGN(size, 4) + hdrlen)
491493 goto err;
492494
495
+ if ((cb->type == QRTR_TYPE_NEW_SERVER ||
496
+ cb->type == QRTR_TYPE_RESUME_TX) &&
497
+ size < sizeof(struct qrtr_ctrl_pkt))
498
+ goto err;
499
+
493500 if (cb->dst_port != QRTR_PORT_CTRL && cb->type != QRTR_TYPE_DATA &&
494501 cb->type != QRTR_TYPE_RESUME_TX)
495502 goto err;
....@@ -498,6 +505,14 @@
498505
499506 qrtr_node_assign(node, cb->src_node);
500507
508
+ if (cb->type == QRTR_TYPE_NEW_SERVER) {
509
+ /* Remote node endpoint can bridge other distant nodes */
510
+ const struct qrtr_ctrl_pkt *pkt;
511
+
512
+ pkt = data + hdrlen;
513
+ qrtr_node_assign(node, le32_to_cpu(pkt->server.node));
514
+ }
515
+
501516 if (cb->type == QRTR_TYPE_RESUME_TX) {
502517 qrtr_tx_resume(node, skb);
503518 } else {