Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a98b7115 authored by Chris Lew's avatar Chris Lew
Browse files

qrtr: Add support for multiple nodes on a single ept



An ept can be associated with multiple node ids in network. The node
tree should keep track of how to send to a specific node id where as
the node list should keep track of all the adjacent nodes in the
network. Use the node list to broadcast control messages to adjacent
nodes.

Change-Id: If0f4828da149b6e590525518a8410f497f5e3894
Signed-off-by: default avatarChris Lew <clew@codeaurora.org>
parent eb182d17
Loading
Loading
Loading
Loading
+14 −5
Original line number Diff line number Diff line
@@ -150,9 +150,15 @@ static int qrtr_bcast_enqueue(struct qrtr_node *node, struct sk_buff *skb,
static void __qrtr_node_release(struct kref *kref)
{
	struct qrtr_node *node = container_of(kref, struct qrtr_node, ref);
	struct radix_tree_iter iter;
	void **slot;

	if (node->nid != QRTR_EP_NID_AUTO)
		radix_tree_delete(&qrtr_nodes, node->nid);
	if (node->nid != QRTR_EP_NID_AUTO) {
		radix_tree_for_each_slot(slot, &qrtr_nodes, &iter, 0) {
			if (node == *slot)
				radix_tree_delete(&qrtr_nodes, iter.index);
		}
	}

	list_del(&node->item);
	mutex_unlock(&qrtr_node_lock);
@@ -232,11 +238,14 @@ static struct qrtr_node *qrtr_node_lookup(unsigned int nid)
 */
static void qrtr_node_assign(struct qrtr_node *node, unsigned int nid)
{
	if (node->nid != QRTR_EP_NID_AUTO || nid == QRTR_EP_NID_AUTO)
	if (nid == QRTR_EP_NID_AUTO)
		return;

	mutex_lock(&qrtr_node_lock);
	if (!radix_tree_lookup(&qrtr_nodes, nid))
		radix_tree_insert(&qrtr_nodes, nid, node);

	if (node->nid == QRTR_EP_NID_AUTO)
		node->nid = nid;
	mutex_unlock(&qrtr_node_lock);
}