similarity index 98%rename from kernel/net/qrtr/qrtr.crename to kernel/net/qrtr/af_qrtr.c.. | .. |
---|
388 | 388 | struct qrtr_node *node; |
---|
389 | 389 | unsigned long flags; |
---|
390 | 390 | |
---|
| 391 | + mutex_lock(&qrtr_node_lock); |
---|
391 | 392 | spin_lock_irqsave(&qrtr_nodes_lock, flags); |
---|
392 | 393 | node = radix_tree_lookup(&qrtr_nodes, nid); |
---|
393 | 394 | node = qrtr_node_acquire(node); |
---|
394 | 395 | spin_unlock_irqrestore(&qrtr_nodes_lock, flags); |
---|
| 396 | + mutex_unlock(&qrtr_node_lock); |
---|
395 | 397 | |
---|
396 | 398 | return node; |
---|
397 | 399 | } |
---|
.. | .. |
---|
490 | 492 | if (!size || len != ALIGN(size, 4) + hdrlen) |
---|
491 | 493 | goto err; |
---|
492 | 494 | |
---|
| 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 | + |
---|
493 | 500 | if (cb->dst_port != QRTR_PORT_CTRL && cb->type != QRTR_TYPE_DATA && |
---|
494 | 501 | cb->type != QRTR_TYPE_RESUME_TX) |
---|
495 | 502 | goto err; |
---|
.. | .. |
---|
498 | 505 | |
---|
499 | 506 | qrtr_node_assign(node, cb->src_node); |
---|
500 | 507 | |
---|
| 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 | + |
---|
501 | 516 | if (cb->type == QRTR_TYPE_RESUME_TX) { |
---|
502 | 517 | qrtr_tx_resume(node, skb); |
---|
503 | 518 | } else { |
---|