xref: /openbmc/linux/net/qrtr/af_qrtr.c (revision 34d6f206a88c2651d216bd3487ac956a40b2ba8e)
1a365023aSLuca Weiss // SPDX-License-Identifier: GPL-2.0-only
2a365023aSLuca Weiss /*
3a365023aSLuca Weiss  * Copyright (c) 2015, Sony Mobile Communications Inc.
4a365023aSLuca Weiss  * Copyright (c) 2013, The Linux Foundation. All rights reserved.
5a365023aSLuca Weiss  */
6a365023aSLuca Weiss #include <linux/module.h>
7a365023aSLuca Weiss #include <linux/netlink.h>
8a365023aSLuca Weiss #include <linux/qrtr.h>
9a365023aSLuca Weiss #include <linux/termios.h>	/* For TIOCINQ/OUTQ */
10a365023aSLuca Weiss #include <linux/spinlock.h>
11a365023aSLuca Weiss #include <linux/wait.h>
12a365023aSLuca Weiss 
13a365023aSLuca Weiss #include <net/sock.h>
14a365023aSLuca Weiss 
15a365023aSLuca Weiss #include "qrtr.h"
16a365023aSLuca Weiss 
17a365023aSLuca Weiss #define QRTR_PROTO_VER_1 1
18a365023aSLuca Weiss #define QRTR_PROTO_VER_2 3
19a365023aSLuca Weiss 
20a365023aSLuca Weiss /* auto-bind range */
21a365023aSLuca Weiss #define QRTR_MIN_EPH_SOCKET 0x4000
22a365023aSLuca Weiss #define QRTR_MAX_EPH_SOCKET 0x7fff
23a365023aSLuca Weiss #define QRTR_EPH_PORT_RANGE \
24a365023aSLuca Weiss 		XA_LIMIT(QRTR_MIN_EPH_SOCKET, QRTR_MAX_EPH_SOCKET)
25a365023aSLuca Weiss 
2669940b88SVignesh Viswanathan #define QRTR_PORT_CTRL_LEGACY 0xffff
2769940b88SVignesh Viswanathan 
28a365023aSLuca Weiss /**
29a365023aSLuca Weiss  * struct qrtr_hdr_v1 - (I|R)PCrouter packet header version 1
30a365023aSLuca Weiss  * @version: protocol version
31a365023aSLuca Weiss  * @type: packet type; one of QRTR_TYPE_*
32a365023aSLuca Weiss  * @src_node_id: source node
33a365023aSLuca Weiss  * @src_port_id: source port
34a365023aSLuca Weiss  * @confirm_rx: boolean; whether a resume-tx packet should be send in reply
35a365023aSLuca Weiss  * @size: length of packet, excluding this header
36a365023aSLuca Weiss  * @dst_node_id: destination node
37a365023aSLuca Weiss  * @dst_port_id: destination port
38a365023aSLuca Weiss  */
39a365023aSLuca Weiss struct qrtr_hdr_v1 {
40a365023aSLuca Weiss 	__le32 version;
41a365023aSLuca Weiss 	__le32 type;
42a365023aSLuca Weiss 	__le32 src_node_id;
43a365023aSLuca Weiss 	__le32 src_port_id;
44a365023aSLuca Weiss 	__le32 confirm_rx;
45a365023aSLuca Weiss 	__le32 size;
46a365023aSLuca Weiss 	__le32 dst_node_id;
47a365023aSLuca Weiss 	__le32 dst_port_id;
48a365023aSLuca Weiss } __packed;
49a365023aSLuca Weiss 
50a365023aSLuca Weiss /**
51a365023aSLuca Weiss  * struct qrtr_hdr_v2 - (I|R)PCrouter packet header later versions
52a365023aSLuca Weiss  * @version: protocol version
53a365023aSLuca Weiss  * @type: packet type; one of QRTR_TYPE_*
54a365023aSLuca Weiss  * @flags: bitmask of QRTR_FLAGS_*
55a365023aSLuca Weiss  * @optlen: length of optional header data
56a365023aSLuca Weiss  * @size: length of packet, excluding this header and optlen
57a365023aSLuca Weiss  * @src_node_id: source node
58a365023aSLuca Weiss  * @src_port_id: source port
59a365023aSLuca Weiss  * @dst_node_id: destination node
60a365023aSLuca Weiss  * @dst_port_id: destination port
61a365023aSLuca Weiss  */
62a365023aSLuca Weiss struct qrtr_hdr_v2 {
63a365023aSLuca Weiss 	u8 version;
64a365023aSLuca Weiss 	u8 type;
65a365023aSLuca Weiss 	u8 flags;
66a365023aSLuca Weiss 	u8 optlen;
67a365023aSLuca Weiss 	__le32 size;
68a365023aSLuca Weiss 	__le16 src_node_id;
69a365023aSLuca Weiss 	__le16 src_port_id;
70a365023aSLuca Weiss 	__le16 dst_node_id;
71a365023aSLuca Weiss 	__le16 dst_port_id;
72a365023aSLuca Weiss };
73a365023aSLuca Weiss 
74a365023aSLuca Weiss #define QRTR_FLAGS_CONFIRM_RX	BIT(0)
75a365023aSLuca Weiss 
76a365023aSLuca Weiss struct qrtr_cb {
77a365023aSLuca Weiss 	u32 src_node;
78a365023aSLuca Weiss 	u32 src_port;
79a365023aSLuca Weiss 	u32 dst_node;
80a365023aSLuca Weiss 	u32 dst_port;
81a365023aSLuca Weiss 
82a365023aSLuca Weiss 	u8 type;
83a365023aSLuca Weiss 	u8 confirm_rx;
84a365023aSLuca Weiss };
85a365023aSLuca Weiss 
86a365023aSLuca Weiss #define QRTR_HDR_MAX_SIZE max_t(size_t, sizeof(struct qrtr_hdr_v1), \
87a365023aSLuca Weiss 					sizeof(struct qrtr_hdr_v2))
88a365023aSLuca Weiss 
89a365023aSLuca Weiss struct qrtr_sock {
90a365023aSLuca Weiss 	/* WARNING: sk must be the first member */
91a365023aSLuca Weiss 	struct sock sk;
92a365023aSLuca Weiss 	struct sockaddr_qrtr us;
93a365023aSLuca Weiss 	struct sockaddr_qrtr peer;
94a365023aSLuca Weiss };
95a365023aSLuca Weiss 
qrtr_sk(struct sock * sk)96a365023aSLuca Weiss static inline struct qrtr_sock *qrtr_sk(struct sock *sk)
97a365023aSLuca Weiss {
98a365023aSLuca Weiss 	BUILD_BUG_ON(offsetof(struct qrtr_sock, sk) != 0);
99a365023aSLuca Weiss 	return container_of(sk, struct qrtr_sock, sk);
100a365023aSLuca Weiss }
101a365023aSLuca Weiss 
102a365023aSLuca Weiss static unsigned int qrtr_local_nid = 1;
103a365023aSLuca Weiss 
104a365023aSLuca Weiss /* for node ids */
105a365023aSLuca Weiss static RADIX_TREE(qrtr_nodes, GFP_ATOMIC);
106a365023aSLuca Weiss static DEFINE_SPINLOCK(qrtr_nodes_lock);
107a365023aSLuca Weiss /* broadcast list */
108a365023aSLuca Weiss static LIST_HEAD(qrtr_all_nodes);
109a365023aSLuca Weiss /* lock for qrtr_all_nodes and node reference */
110a365023aSLuca Weiss static DEFINE_MUTEX(qrtr_node_lock);
111a365023aSLuca Weiss 
112a365023aSLuca Weiss /* local port allocation management */
113a365023aSLuca Weiss static DEFINE_XARRAY_ALLOC(qrtr_ports);
114a365023aSLuca Weiss 
115a365023aSLuca Weiss /**
116a365023aSLuca Weiss  * struct qrtr_node - endpoint node
117a365023aSLuca Weiss  * @ep_lock: lock for endpoint management and callbacks
118a365023aSLuca Weiss  * @ep: endpoint
119a365023aSLuca Weiss  * @ref: reference count for node
120a365023aSLuca Weiss  * @nid: node id
121a365023aSLuca Weiss  * @qrtr_tx_flow: tree of qrtr_tx_flow, keyed by node << 32 | port
122a365023aSLuca Weiss  * @qrtr_tx_lock: lock for qrtr_tx_flow inserts
123a365023aSLuca Weiss  * @rx_queue: receive queue
124a365023aSLuca Weiss  * @item: list item for broadcast list
125a365023aSLuca Weiss  */
126a365023aSLuca Weiss struct qrtr_node {
127a365023aSLuca Weiss 	struct mutex ep_lock;
128a365023aSLuca Weiss 	struct qrtr_endpoint *ep;
129a365023aSLuca Weiss 	struct kref ref;
130a365023aSLuca Weiss 	unsigned int nid;
131a365023aSLuca Weiss 
132a365023aSLuca Weiss 	struct radix_tree_root qrtr_tx_flow;
133a365023aSLuca Weiss 	struct mutex qrtr_tx_lock; /* for qrtr_tx_flow */
134a365023aSLuca Weiss 
135a365023aSLuca Weiss 	struct sk_buff_head rx_queue;
136a365023aSLuca Weiss 	struct list_head item;
137a365023aSLuca Weiss };
138a365023aSLuca Weiss 
139a365023aSLuca Weiss /**
140a365023aSLuca Weiss  * struct qrtr_tx_flow - tx flow control
141a365023aSLuca Weiss  * @resume_tx: waiters for a resume tx from the remote
142a365023aSLuca Weiss  * @pending: number of waiting senders
143a365023aSLuca Weiss  * @tx_failed: indicates that a message with confirm_rx flag was lost
144a365023aSLuca Weiss  */
145a365023aSLuca Weiss struct qrtr_tx_flow {
146a365023aSLuca Weiss 	struct wait_queue_head resume_tx;
147a365023aSLuca Weiss 	int pending;
148a365023aSLuca Weiss 	int tx_failed;
149a365023aSLuca Weiss };
150a365023aSLuca Weiss 
151a365023aSLuca Weiss #define QRTR_TX_FLOW_HIGH	10
152a365023aSLuca Weiss #define QRTR_TX_FLOW_LOW	5
153a365023aSLuca Weiss 
154a365023aSLuca Weiss static int qrtr_local_enqueue(struct qrtr_node *node, struct sk_buff *skb,
155a365023aSLuca Weiss 			      int type, struct sockaddr_qrtr *from,
156a365023aSLuca Weiss 			      struct sockaddr_qrtr *to);
157a365023aSLuca Weiss static int qrtr_bcast_enqueue(struct qrtr_node *node, struct sk_buff *skb,
158a365023aSLuca Weiss 			      int type, struct sockaddr_qrtr *from,
159a365023aSLuca Weiss 			      struct sockaddr_qrtr *to);
160a365023aSLuca Weiss static struct qrtr_sock *qrtr_port_lookup(int port);
161a365023aSLuca Weiss static void qrtr_port_put(struct qrtr_sock *ipc);
162a365023aSLuca Weiss 
163a365023aSLuca Weiss /* Release node resources and free the node.
164a365023aSLuca Weiss  *
165a365023aSLuca Weiss  * Do not call directly, use qrtr_node_release.  To be used with
166a365023aSLuca Weiss  * kref_put_mutex.  As such, the node mutex is expected to be locked on call.
167a365023aSLuca Weiss  */
__qrtr_node_release(struct kref * kref)168a365023aSLuca Weiss static void __qrtr_node_release(struct kref *kref)
169a365023aSLuca Weiss {
170a365023aSLuca Weiss 	struct qrtr_node *node = container_of(kref, struct qrtr_node, ref);
171a365023aSLuca Weiss 	struct radix_tree_iter iter;
172a365023aSLuca Weiss 	struct qrtr_tx_flow *flow;
173a365023aSLuca Weiss 	unsigned long flags;
174a365023aSLuca Weiss 	void __rcu **slot;
175a365023aSLuca Weiss 
176a365023aSLuca Weiss 	spin_lock_irqsave(&qrtr_nodes_lock, flags);
177a365023aSLuca Weiss 	/* If the node is a bridge for other nodes, there are possibly
178a365023aSLuca Weiss 	 * multiple entries pointing to our released node, delete them all.
179a365023aSLuca Weiss 	 */
180a365023aSLuca Weiss 	radix_tree_for_each_slot(slot, &qrtr_nodes, &iter, 0) {
181a365023aSLuca Weiss 		if (*slot == node)
182a365023aSLuca Weiss 			radix_tree_iter_delete(&qrtr_nodes, &iter, slot);
183a365023aSLuca Weiss 	}
184a365023aSLuca Weiss 	spin_unlock_irqrestore(&qrtr_nodes_lock, flags);
185a365023aSLuca Weiss 
186a365023aSLuca Weiss 	list_del(&node->item);
187a365023aSLuca Weiss 	mutex_unlock(&qrtr_node_lock);
188a365023aSLuca Weiss 
189a365023aSLuca Weiss 	skb_queue_purge(&node->rx_queue);
190a365023aSLuca Weiss 
191a365023aSLuca Weiss 	/* Free tx flow counters */
192a365023aSLuca Weiss 	radix_tree_for_each_slot(slot, &node->qrtr_tx_flow, &iter, 0) {
193a365023aSLuca Weiss 		flow = *slot;
194a365023aSLuca Weiss 		radix_tree_iter_delete(&node->qrtr_tx_flow, &iter, slot);
195a365023aSLuca Weiss 		kfree(flow);
196a365023aSLuca Weiss 	}
197a365023aSLuca Weiss 	kfree(node);
198a365023aSLuca Weiss }
199a365023aSLuca Weiss 
200a365023aSLuca Weiss /* Increment reference to node. */
qrtr_node_acquire(struct qrtr_node * node)201a365023aSLuca Weiss static struct qrtr_node *qrtr_node_acquire(struct qrtr_node *node)
202a365023aSLuca Weiss {
203a365023aSLuca Weiss 	if (node)
204a365023aSLuca Weiss 		kref_get(&node->ref);
205a365023aSLuca Weiss 	return node;
206a365023aSLuca Weiss }
207a365023aSLuca Weiss 
208a365023aSLuca Weiss /* Decrement reference to node and release as necessary. */
qrtr_node_release(struct qrtr_node * node)209a365023aSLuca Weiss static void qrtr_node_release(struct qrtr_node *node)
210a365023aSLuca Weiss {
211a365023aSLuca Weiss 	if (!node)
212a365023aSLuca Weiss 		return;
213a365023aSLuca Weiss 	kref_put_mutex(&node->ref, __qrtr_node_release, &qrtr_node_lock);
214a365023aSLuca Weiss }
215a365023aSLuca Weiss 
216a365023aSLuca Weiss /**
217a365023aSLuca Weiss  * qrtr_tx_resume() - reset flow control counter
218a365023aSLuca Weiss  * @node:	qrtr_node that the QRTR_TYPE_RESUME_TX packet arrived on
219a365023aSLuca Weiss  * @skb:	resume_tx packet
220a365023aSLuca Weiss  */
qrtr_tx_resume(struct qrtr_node * node,struct sk_buff * skb)221a365023aSLuca Weiss static void qrtr_tx_resume(struct qrtr_node *node, struct sk_buff *skb)
222a365023aSLuca Weiss {
223a365023aSLuca Weiss 	struct qrtr_ctrl_pkt *pkt = (struct qrtr_ctrl_pkt *)skb->data;
224a365023aSLuca Weiss 	u64 remote_node = le32_to_cpu(pkt->client.node);
225a365023aSLuca Weiss 	u32 remote_port = le32_to_cpu(pkt->client.port);
226a365023aSLuca Weiss 	struct qrtr_tx_flow *flow;
227a365023aSLuca Weiss 	unsigned long key;
228a365023aSLuca Weiss 
229a365023aSLuca Weiss 	key = remote_node << 32 | remote_port;
230a365023aSLuca Weiss 
231a365023aSLuca Weiss 	rcu_read_lock();
232a365023aSLuca Weiss 	flow = radix_tree_lookup(&node->qrtr_tx_flow, key);
233a365023aSLuca Weiss 	rcu_read_unlock();
234a365023aSLuca Weiss 	if (flow) {
235a365023aSLuca Weiss 		spin_lock(&flow->resume_tx.lock);
236a365023aSLuca Weiss 		flow->pending = 0;
237a365023aSLuca Weiss 		spin_unlock(&flow->resume_tx.lock);
238a365023aSLuca Weiss 		wake_up_interruptible_all(&flow->resume_tx);
239a365023aSLuca Weiss 	}
240a365023aSLuca Weiss 
241a365023aSLuca Weiss 	consume_skb(skb);
242a365023aSLuca Weiss }
243a365023aSLuca Weiss 
244a365023aSLuca Weiss /**
245a365023aSLuca Weiss  * qrtr_tx_wait() - flow control for outgoing packets
246a365023aSLuca Weiss  * @node:	qrtr_node that the packet is to be send to
247a365023aSLuca Weiss  * @dest_node:	node id of the destination
248a365023aSLuca Weiss  * @dest_port:	port number of the destination
249a365023aSLuca Weiss  * @type:	type of message
250a365023aSLuca Weiss  *
251a365023aSLuca Weiss  * The flow control scheme is based around the low and high "watermarks". When
252a365023aSLuca Weiss  * the low watermark is passed the confirm_rx flag is set on the outgoing
253a365023aSLuca Weiss  * message, which will trigger the remote to send a control message of the type
254a365023aSLuca Weiss  * QRTR_TYPE_RESUME_TX to reset the counter. If the high watermark is hit
255a365023aSLuca Weiss  * further transmision should be paused.
256a365023aSLuca Weiss  *
257a365023aSLuca Weiss  * Return: 1 if confirm_rx should be set, 0 otherwise or errno failure
258a365023aSLuca Weiss  */
qrtr_tx_wait(struct qrtr_node * node,int dest_node,int dest_port,int type)259a365023aSLuca Weiss static int qrtr_tx_wait(struct qrtr_node *node, int dest_node, int dest_port,
260a365023aSLuca Weiss 			int type)
261a365023aSLuca Weiss {
262a365023aSLuca Weiss 	unsigned long key = (u64)dest_node << 32 | dest_port;
263a365023aSLuca Weiss 	struct qrtr_tx_flow *flow;
264a365023aSLuca Weiss 	int confirm_rx = 0;
265a365023aSLuca Weiss 	int ret;
266a365023aSLuca Weiss 
267a365023aSLuca Weiss 	/* Never set confirm_rx on non-data packets */
268a365023aSLuca Weiss 	if (type != QRTR_TYPE_DATA)
269a365023aSLuca Weiss 		return 0;
270a365023aSLuca Weiss 
271a365023aSLuca Weiss 	mutex_lock(&node->qrtr_tx_lock);
272a365023aSLuca Weiss 	flow = radix_tree_lookup(&node->qrtr_tx_flow, key);
273a365023aSLuca Weiss 	if (!flow) {
274a365023aSLuca Weiss 		flow = kzalloc(sizeof(*flow), GFP_KERNEL);
275a365023aSLuca Weiss 		if (flow) {
276a365023aSLuca Weiss 			init_waitqueue_head(&flow->resume_tx);
277a365023aSLuca Weiss 			if (radix_tree_insert(&node->qrtr_tx_flow, key, flow)) {
278a365023aSLuca Weiss 				kfree(flow);
279a365023aSLuca Weiss 				flow = NULL;
280a365023aSLuca Weiss 			}
281a365023aSLuca Weiss 		}
282a365023aSLuca Weiss 	}
283a365023aSLuca Weiss 	mutex_unlock(&node->qrtr_tx_lock);
284a365023aSLuca Weiss 
285a365023aSLuca Weiss 	/* Set confirm_rx if we where unable to find and allocate a flow */
286a365023aSLuca Weiss 	if (!flow)
287a365023aSLuca Weiss 		return 1;
288a365023aSLuca Weiss 
289a365023aSLuca Weiss 	spin_lock_irq(&flow->resume_tx.lock);
290a365023aSLuca Weiss 	ret = wait_event_interruptible_locked_irq(flow->resume_tx,
291a365023aSLuca Weiss 						  flow->pending < QRTR_TX_FLOW_HIGH ||
292a365023aSLuca Weiss 						  flow->tx_failed ||
293a365023aSLuca Weiss 						  !node->ep);
294a365023aSLuca Weiss 	if (ret < 0) {
295a365023aSLuca Weiss 		confirm_rx = ret;
296a365023aSLuca Weiss 	} else if (!node->ep) {
297a365023aSLuca Weiss 		confirm_rx = -EPIPE;
298a365023aSLuca Weiss 	} else if (flow->tx_failed) {
299a365023aSLuca Weiss 		flow->tx_failed = 0;
300a365023aSLuca Weiss 		confirm_rx = 1;
301a365023aSLuca Weiss 	} else {
302a365023aSLuca Weiss 		flow->pending++;
303a365023aSLuca Weiss 		confirm_rx = flow->pending == QRTR_TX_FLOW_LOW;
304a365023aSLuca Weiss 	}
305a365023aSLuca Weiss 	spin_unlock_irq(&flow->resume_tx.lock);
306a365023aSLuca Weiss 
307a365023aSLuca Weiss 	return confirm_rx;
308a365023aSLuca Weiss }
309a365023aSLuca Weiss 
310a365023aSLuca Weiss /**
311a365023aSLuca Weiss  * qrtr_tx_flow_failed() - flag that tx of confirm_rx flagged messages failed
312a365023aSLuca Weiss  * @node:	qrtr_node that the packet is to be send to
313a365023aSLuca Weiss  * @dest_node:	node id of the destination
314a365023aSLuca Weiss  * @dest_port:	port number of the destination
315a365023aSLuca Weiss  *
316a365023aSLuca Weiss  * Signal that the transmission of a message with confirm_rx flag failed. The
317a365023aSLuca Weiss  * flow's "pending" counter will keep incrementing towards QRTR_TX_FLOW_HIGH,
318a365023aSLuca Weiss  * at which point transmission would stall forever waiting for the resume TX
319a365023aSLuca Weiss  * message associated with the dropped confirm_rx message.
320a365023aSLuca Weiss  * Work around this by marking the flow as having a failed transmission and
321a365023aSLuca Weiss  * cause the next transmission attempt to be sent with the confirm_rx.
322a365023aSLuca Weiss  */
qrtr_tx_flow_failed(struct qrtr_node * node,int dest_node,int dest_port)323a365023aSLuca Weiss static void qrtr_tx_flow_failed(struct qrtr_node *node, int dest_node,
324a365023aSLuca Weiss 				int dest_port)
325a365023aSLuca Weiss {
326a365023aSLuca Weiss 	unsigned long key = (u64)dest_node << 32 | dest_port;
327a365023aSLuca Weiss 	struct qrtr_tx_flow *flow;
328a365023aSLuca Weiss 
329a365023aSLuca Weiss 	rcu_read_lock();
330a365023aSLuca Weiss 	flow = radix_tree_lookup(&node->qrtr_tx_flow, key);
331a365023aSLuca Weiss 	rcu_read_unlock();
332a365023aSLuca Weiss 	if (flow) {
333a365023aSLuca Weiss 		spin_lock_irq(&flow->resume_tx.lock);
334a365023aSLuca Weiss 		flow->tx_failed = 1;
335a365023aSLuca Weiss 		spin_unlock_irq(&flow->resume_tx.lock);
336a365023aSLuca Weiss 	}
337a365023aSLuca Weiss }
338a365023aSLuca Weiss 
339a365023aSLuca Weiss /* Pass an outgoing packet socket buffer to the endpoint driver. */
qrtr_node_enqueue(struct qrtr_node * node,struct sk_buff * skb,int type,struct sockaddr_qrtr * from,struct sockaddr_qrtr * to)340a365023aSLuca Weiss static int qrtr_node_enqueue(struct qrtr_node *node, struct sk_buff *skb,
341a365023aSLuca Weiss 			     int type, struct sockaddr_qrtr *from,
342a365023aSLuca Weiss 			     struct sockaddr_qrtr *to)
343a365023aSLuca Weiss {
344a365023aSLuca Weiss 	struct qrtr_hdr_v1 *hdr;
345a365023aSLuca Weiss 	size_t len = skb->len;
346a365023aSLuca Weiss 	int rc, confirm_rx;
347a365023aSLuca Weiss 
348a365023aSLuca Weiss 	confirm_rx = qrtr_tx_wait(node, to->sq_node, to->sq_port, type);
349a365023aSLuca Weiss 	if (confirm_rx < 0) {
350a365023aSLuca Weiss 		kfree_skb(skb);
351a365023aSLuca Weiss 		return confirm_rx;
352a365023aSLuca Weiss 	}
353a365023aSLuca Weiss 
354a365023aSLuca Weiss 	hdr = skb_push(skb, sizeof(*hdr));
355a365023aSLuca Weiss 	hdr->version = cpu_to_le32(QRTR_PROTO_VER_1);
356a365023aSLuca Weiss 	hdr->type = cpu_to_le32(type);
357a365023aSLuca Weiss 	hdr->src_node_id = cpu_to_le32(from->sq_node);
358a365023aSLuca Weiss 	hdr->src_port_id = cpu_to_le32(from->sq_port);
359a365023aSLuca Weiss 	if (to->sq_port == QRTR_PORT_CTRL) {
360a365023aSLuca Weiss 		hdr->dst_node_id = cpu_to_le32(node->nid);
361a365023aSLuca Weiss 		hdr->dst_port_id = cpu_to_le32(QRTR_PORT_CTRL);
362a365023aSLuca Weiss 	} else {
363a365023aSLuca Weiss 		hdr->dst_node_id = cpu_to_le32(to->sq_node);
364a365023aSLuca Weiss 		hdr->dst_port_id = cpu_to_le32(to->sq_port);
365a365023aSLuca Weiss 	}
366a365023aSLuca Weiss 
367a365023aSLuca Weiss 	hdr->size = cpu_to_le32(len);
368a365023aSLuca Weiss 	hdr->confirm_rx = !!confirm_rx;
369a365023aSLuca Weiss 
370a365023aSLuca Weiss 	rc = skb_put_padto(skb, ALIGN(len, 4) + sizeof(*hdr));
371a365023aSLuca Weiss 
372a365023aSLuca Weiss 	if (!rc) {
373a365023aSLuca Weiss 		mutex_lock(&node->ep_lock);
374a365023aSLuca Weiss 		rc = -ENODEV;
375a365023aSLuca Weiss 		if (node->ep)
376a365023aSLuca Weiss 			rc = node->ep->xmit(node->ep, skb);
377a365023aSLuca Weiss 		else
378a365023aSLuca Weiss 			kfree_skb(skb);
379a365023aSLuca Weiss 		mutex_unlock(&node->ep_lock);
380a365023aSLuca Weiss 	}
381a365023aSLuca Weiss 	/* Need to ensure that a subsequent message carries the otherwise lost
382a365023aSLuca Weiss 	 * confirm_rx flag if we dropped this one */
383a365023aSLuca Weiss 	if (rc && confirm_rx)
384a365023aSLuca Weiss 		qrtr_tx_flow_failed(node, to->sq_node, to->sq_port);
385a365023aSLuca Weiss 
386a365023aSLuca Weiss 	return rc;
387a365023aSLuca Weiss }
388a365023aSLuca Weiss 
389a365023aSLuca Weiss /* Lookup node by id.
390a365023aSLuca Weiss  *
391a365023aSLuca Weiss  * callers must release with qrtr_node_release()
392a365023aSLuca Weiss  */
qrtr_node_lookup(unsigned int nid)393a365023aSLuca Weiss static struct qrtr_node *qrtr_node_lookup(unsigned int nid)
394a365023aSLuca Weiss {
395a365023aSLuca Weiss 	struct qrtr_node *node;
396a365023aSLuca Weiss 	unsigned long flags;
397a365023aSLuca Weiss 
39844d80732SZiyang Xuan 	mutex_lock(&qrtr_node_lock);
399a365023aSLuca Weiss 	spin_lock_irqsave(&qrtr_nodes_lock, flags);
400a365023aSLuca Weiss 	node = radix_tree_lookup(&qrtr_nodes, nid);
401a365023aSLuca Weiss 	node = qrtr_node_acquire(node);
402a365023aSLuca Weiss 	spin_unlock_irqrestore(&qrtr_nodes_lock, flags);
40344d80732SZiyang Xuan 	mutex_unlock(&qrtr_node_lock);
404a365023aSLuca Weiss 
405a365023aSLuca Weiss 	return node;
406a365023aSLuca Weiss }
407a365023aSLuca Weiss 
408a365023aSLuca Weiss /* Assign node id to node.
409a365023aSLuca Weiss  *
410a365023aSLuca Weiss  * This is mostly useful for automatic node id assignment, based on
411a365023aSLuca Weiss  * the source id in the incoming packet.
412a365023aSLuca Weiss  */
qrtr_node_assign(struct qrtr_node * node,unsigned int nid)413a365023aSLuca Weiss static void qrtr_node_assign(struct qrtr_node *node, unsigned int nid)
414a365023aSLuca Weiss {
415a365023aSLuca Weiss 	unsigned long flags;
416a365023aSLuca Weiss 
417a365023aSLuca Weiss 	if (nid == QRTR_EP_NID_AUTO)
418a365023aSLuca Weiss 		return;
419a365023aSLuca Weiss 
420a365023aSLuca Weiss 	spin_lock_irqsave(&qrtr_nodes_lock, flags);
421a365023aSLuca Weiss 	radix_tree_insert(&qrtr_nodes, nid, node);
422a365023aSLuca Weiss 	if (node->nid == QRTR_EP_NID_AUTO)
423a365023aSLuca Weiss 		node->nid = nid;
424a365023aSLuca Weiss 	spin_unlock_irqrestore(&qrtr_nodes_lock, flags);
425a365023aSLuca Weiss }
426a365023aSLuca Weiss 
427a365023aSLuca Weiss /**
428a365023aSLuca Weiss  * qrtr_endpoint_post() - post incoming data
429a365023aSLuca Weiss  * @ep: endpoint handle
430a365023aSLuca Weiss  * @data: data pointer
431a365023aSLuca Weiss  * @len: size of data in bytes
432a365023aSLuca Weiss  *
433a365023aSLuca Weiss  * Return: 0 on success; negative error code on failure
434a365023aSLuca Weiss  */
qrtr_endpoint_post(struct qrtr_endpoint * ep,const void * data,size_t len)435a365023aSLuca Weiss int qrtr_endpoint_post(struct qrtr_endpoint *ep, const void *data, size_t len)
436a365023aSLuca Weiss {
437a365023aSLuca Weiss 	struct qrtr_node *node = ep->node;
438a365023aSLuca Weiss 	const struct qrtr_hdr_v1 *v1;
439a365023aSLuca Weiss 	const struct qrtr_hdr_v2 *v2;
440a365023aSLuca Weiss 	struct qrtr_sock *ipc;
441a365023aSLuca Weiss 	struct sk_buff *skb;
442a365023aSLuca Weiss 	struct qrtr_cb *cb;
443a365023aSLuca Weiss 	size_t size;
444a365023aSLuca Weiss 	unsigned int ver;
445a365023aSLuca Weiss 	size_t hdrlen;
446a365023aSLuca Weiss 
447a365023aSLuca Weiss 	if (len == 0 || len & 3)
448a365023aSLuca Weiss 		return -EINVAL;
449a365023aSLuca Weiss 
450a365023aSLuca Weiss 	skb = __netdev_alloc_skb(NULL, len, GFP_ATOMIC | __GFP_NOWARN);
451a365023aSLuca Weiss 	if (!skb)
452a365023aSLuca Weiss 		return -ENOMEM;
453a365023aSLuca Weiss 
454a365023aSLuca Weiss 	cb = (struct qrtr_cb *)skb->cb;
455a365023aSLuca Weiss 
456a365023aSLuca Weiss 	/* Version field in v1 is little endian, so this works for both cases */
457a365023aSLuca Weiss 	ver = *(u8*)data;
458a365023aSLuca Weiss 
459a365023aSLuca Weiss 	switch (ver) {
460a365023aSLuca Weiss 	case QRTR_PROTO_VER_1:
461a365023aSLuca Weiss 		if (len < sizeof(*v1))
462a365023aSLuca Weiss 			goto err;
463a365023aSLuca Weiss 		v1 = data;
464a365023aSLuca Weiss 		hdrlen = sizeof(*v1);
465a365023aSLuca Weiss 
466a365023aSLuca Weiss 		cb->type = le32_to_cpu(v1->type);
467a365023aSLuca Weiss 		cb->src_node = le32_to_cpu(v1->src_node_id);
468a365023aSLuca Weiss 		cb->src_port = le32_to_cpu(v1->src_port_id);
469a365023aSLuca Weiss 		cb->confirm_rx = !!v1->confirm_rx;
470a365023aSLuca Weiss 		cb->dst_node = le32_to_cpu(v1->dst_node_id);
471a365023aSLuca Weiss 		cb->dst_port = le32_to_cpu(v1->dst_port_id);
472a365023aSLuca Weiss 
473a365023aSLuca Weiss 		size = le32_to_cpu(v1->size);
474a365023aSLuca Weiss 		break;
475a365023aSLuca Weiss 	case QRTR_PROTO_VER_2:
476a365023aSLuca Weiss 		if (len < sizeof(*v2))
477a365023aSLuca Weiss 			goto err;
478a365023aSLuca Weiss 		v2 = data;
479a365023aSLuca Weiss 		hdrlen = sizeof(*v2) + v2->optlen;
480a365023aSLuca Weiss 
481a365023aSLuca Weiss 		cb->type = v2->type;
482a365023aSLuca Weiss 		cb->confirm_rx = !!(v2->flags & QRTR_FLAGS_CONFIRM_RX);
483a365023aSLuca Weiss 		cb->src_node = le16_to_cpu(v2->src_node_id);
484a365023aSLuca Weiss 		cb->src_port = le16_to_cpu(v2->src_port_id);
485a365023aSLuca Weiss 		cb->dst_node = le16_to_cpu(v2->dst_node_id);
486a365023aSLuca Weiss 		cb->dst_port = le16_to_cpu(v2->dst_port_id);
487a365023aSLuca Weiss 
488a365023aSLuca Weiss 		if (cb->src_port == (u16)QRTR_PORT_CTRL)
489a365023aSLuca Weiss 			cb->src_port = QRTR_PORT_CTRL;
490a365023aSLuca Weiss 		if (cb->dst_port == (u16)QRTR_PORT_CTRL)
491a365023aSLuca Weiss 			cb->dst_port = QRTR_PORT_CTRL;
492a365023aSLuca Weiss 
493a365023aSLuca Weiss 		size = le32_to_cpu(v2->size);
494a365023aSLuca Weiss 		break;
495a365023aSLuca Weiss 	default:
496a365023aSLuca Weiss 		pr_err("qrtr: Invalid version %d\n", ver);
497a365023aSLuca Weiss 		goto err;
498a365023aSLuca Weiss 	}
499a365023aSLuca Weiss 
50069940b88SVignesh Viswanathan 	if (cb->dst_port == QRTR_PORT_CTRL_LEGACY)
50169940b88SVignesh Viswanathan 		cb->dst_port = QRTR_PORT_CTRL;
50269940b88SVignesh Viswanathan 
503a365023aSLuca Weiss 	if (!size || len != ALIGN(size, 4) + hdrlen)
504a365023aSLuca Weiss 		goto err;
505a365023aSLuca Weiss 
50664170709SZiyang Xuan 	if ((cb->type == QRTR_TYPE_NEW_SERVER ||
50764170709SZiyang Xuan 	     cb->type == QRTR_TYPE_RESUME_TX) &&
50864170709SZiyang Xuan 	    size < sizeof(struct qrtr_ctrl_pkt))
50964170709SZiyang Xuan 		goto err;
51064170709SZiyang Xuan 
511a365023aSLuca Weiss 	if (cb->dst_port != QRTR_PORT_CTRL && cb->type != QRTR_TYPE_DATA &&
512a365023aSLuca Weiss 	    cb->type != QRTR_TYPE_RESUME_TX)
513a365023aSLuca Weiss 		goto err;
514a365023aSLuca Weiss 
515a365023aSLuca Weiss 	skb_put_data(skb, data + hdrlen, size);
516a365023aSLuca Weiss 
517a365023aSLuca Weiss 	qrtr_node_assign(node, cb->src_node);
518a365023aSLuca Weiss 
519a365023aSLuca Weiss 	if (cb->type == QRTR_TYPE_NEW_SERVER) {
520a365023aSLuca Weiss 		/* Remote node endpoint can bridge other distant nodes */
521a365023aSLuca Weiss 		const struct qrtr_ctrl_pkt *pkt;
522a365023aSLuca Weiss 
523a365023aSLuca Weiss 		pkt = data + hdrlen;
524a365023aSLuca Weiss 		qrtr_node_assign(node, le32_to_cpu(pkt->server.node));
525a365023aSLuca Weiss 	}
526a365023aSLuca Weiss 
527a365023aSLuca Weiss 	if (cb->type == QRTR_TYPE_RESUME_TX) {
528a365023aSLuca Weiss 		qrtr_tx_resume(node, skb);
529a365023aSLuca Weiss 	} else {
530a365023aSLuca Weiss 		ipc = qrtr_port_lookup(cb->dst_port);
531a365023aSLuca Weiss 		if (!ipc)
532a365023aSLuca Weiss 			goto err;
533a365023aSLuca Weiss 
534a365023aSLuca Weiss 		if (sock_queue_rcv_skb(&ipc->sk, skb)) {
535a365023aSLuca Weiss 			qrtr_port_put(ipc);
536a365023aSLuca Weiss 			goto err;
537a365023aSLuca Weiss 		}
538a365023aSLuca Weiss 
539a365023aSLuca Weiss 		qrtr_port_put(ipc);
540a365023aSLuca Weiss 	}
541a365023aSLuca Weiss 
542a365023aSLuca Weiss 	return 0;
543a365023aSLuca Weiss 
544a365023aSLuca Weiss err:
545a365023aSLuca Weiss 	kfree_skb(skb);
546a365023aSLuca Weiss 	return -EINVAL;
547a365023aSLuca Weiss 
548a365023aSLuca Weiss }
549a365023aSLuca Weiss EXPORT_SYMBOL_GPL(qrtr_endpoint_post);
550a365023aSLuca Weiss 
551a365023aSLuca Weiss /**
552a365023aSLuca Weiss  * qrtr_alloc_ctrl_packet() - allocate control packet skb
553a365023aSLuca Weiss  * @pkt: reference to qrtr_ctrl_pkt pointer
554a365023aSLuca Weiss  * @flags: the type of memory to allocate
555a365023aSLuca Weiss  *
556a365023aSLuca Weiss  * Returns newly allocated sk_buff, or NULL on failure
557a365023aSLuca Weiss  *
558a365023aSLuca Weiss  * This function allocates a sk_buff large enough to carry a qrtr_ctrl_pkt and
559a365023aSLuca Weiss  * on success returns a reference to the control packet in @pkt.
560a365023aSLuca Weiss  */
qrtr_alloc_ctrl_packet(struct qrtr_ctrl_pkt ** pkt,gfp_t flags)561a365023aSLuca Weiss static struct sk_buff *qrtr_alloc_ctrl_packet(struct qrtr_ctrl_pkt **pkt,
562a365023aSLuca Weiss 					      gfp_t flags)
563a365023aSLuca Weiss {
564a365023aSLuca Weiss 	const int pkt_len = sizeof(struct qrtr_ctrl_pkt);
565a365023aSLuca Weiss 	struct sk_buff *skb;
566a365023aSLuca Weiss 
567a365023aSLuca Weiss 	skb = alloc_skb(QRTR_HDR_MAX_SIZE + pkt_len, flags);
568a365023aSLuca Weiss 	if (!skb)
569a365023aSLuca Weiss 		return NULL;
570a365023aSLuca Weiss 
571a365023aSLuca Weiss 	skb_reserve(skb, QRTR_HDR_MAX_SIZE);
572a365023aSLuca Weiss 	*pkt = skb_put_zero(skb, pkt_len);
573a365023aSLuca Weiss 
574a365023aSLuca Weiss 	return skb;
575a365023aSLuca Weiss }
576a365023aSLuca Weiss 
577a365023aSLuca Weiss /**
578a365023aSLuca Weiss  * qrtr_endpoint_register() - register a new endpoint
579a365023aSLuca Weiss  * @ep: endpoint to register
580a365023aSLuca Weiss  * @nid: desired node id; may be QRTR_EP_NID_AUTO for auto-assignment
581a365023aSLuca Weiss  * Return: 0 on success; negative error code on failure
582a365023aSLuca Weiss  *
583a365023aSLuca Weiss  * The specified endpoint must have the xmit function pointer set on call.
584a365023aSLuca Weiss  */
qrtr_endpoint_register(struct qrtr_endpoint * ep,unsigned int nid)585a365023aSLuca Weiss int qrtr_endpoint_register(struct qrtr_endpoint *ep, unsigned int nid)
586a365023aSLuca Weiss {
587a365023aSLuca Weiss 	struct qrtr_node *node;
588a365023aSLuca Weiss 
589a365023aSLuca Weiss 	if (!ep || !ep->xmit)
590a365023aSLuca Weiss 		return -EINVAL;
591a365023aSLuca Weiss 
592a365023aSLuca Weiss 	node = kzalloc(sizeof(*node), GFP_KERNEL);
593a365023aSLuca Weiss 	if (!node)
594a365023aSLuca Weiss 		return -ENOMEM;
595a365023aSLuca Weiss 
596a365023aSLuca Weiss 	kref_init(&node->ref);
597a365023aSLuca Weiss 	mutex_init(&node->ep_lock);
598a365023aSLuca Weiss 	skb_queue_head_init(&node->rx_queue);
599a365023aSLuca Weiss 	node->nid = QRTR_EP_NID_AUTO;
600a365023aSLuca Weiss 	node->ep = ep;
601a365023aSLuca Weiss 
602a365023aSLuca Weiss 	INIT_RADIX_TREE(&node->qrtr_tx_flow, GFP_KERNEL);
603a365023aSLuca Weiss 	mutex_init(&node->qrtr_tx_lock);
604a365023aSLuca Weiss 
605a365023aSLuca Weiss 	qrtr_node_assign(node, nid);
606a365023aSLuca Weiss 
607a365023aSLuca Weiss 	mutex_lock(&qrtr_node_lock);
608a365023aSLuca Weiss 	list_add(&node->item, &qrtr_all_nodes);
609a365023aSLuca Weiss 	mutex_unlock(&qrtr_node_lock);
610a365023aSLuca Weiss 	ep->node = node;
611a365023aSLuca Weiss 
612a365023aSLuca Weiss 	return 0;
613a365023aSLuca Weiss }
614a365023aSLuca Weiss EXPORT_SYMBOL_GPL(qrtr_endpoint_register);
615a365023aSLuca Weiss 
616a365023aSLuca Weiss /**
617a365023aSLuca Weiss  * qrtr_endpoint_unregister - unregister endpoint
618a365023aSLuca Weiss  * @ep: endpoint to unregister
619a365023aSLuca Weiss  */
qrtr_endpoint_unregister(struct qrtr_endpoint * ep)620a365023aSLuca Weiss void qrtr_endpoint_unregister(struct qrtr_endpoint *ep)
621a365023aSLuca Weiss {
622a365023aSLuca Weiss 	struct qrtr_node *node = ep->node;
623a365023aSLuca Weiss 	struct sockaddr_qrtr src = {AF_QIPCRTR, node->nid, QRTR_PORT_CTRL};
624a365023aSLuca Weiss 	struct sockaddr_qrtr dst = {AF_QIPCRTR, qrtr_local_nid, QRTR_PORT_CTRL};
625a365023aSLuca Weiss 	struct radix_tree_iter iter;
626a365023aSLuca Weiss 	struct qrtr_ctrl_pkt *pkt;
627a365023aSLuca Weiss 	struct qrtr_tx_flow *flow;
628a365023aSLuca Weiss 	struct sk_buff *skb;
629a365023aSLuca Weiss 	unsigned long flags;
630a365023aSLuca Weiss 	void __rcu **slot;
631a365023aSLuca Weiss 
632a365023aSLuca Weiss 	mutex_lock(&node->ep_lock);
633a365023aSLuca Weiss 	node->ep = NULL;
634a365023aSLuca Weiss 	mutex_unlock(&node->ep_lock);
635a365023aSLuca Weiss 
636a365023aSLuca Weiss 	/* Notify the local controller about the event */
637a365023aSLuca Weiss 	spin_lock_irqsave(&qrtr_nodes_lock, flags);
638a365023aSLuca Weiss 	radix_tree_for_each_slot(slot, &qrtr_nodes, &iter, 0) {
639a365023aSLuca Weiss 		if (*slot != node)
640a365023aSLuca Weiss 			continue;
641a365023aSLuca Weiss 		src.sq_node = iter.index;
642a365023aSLuca Weiss 		skb = qrtr_alloc_ctrl_packet(&pkt, GFP_ATOMIC);
643a365023aSLuca Weiss 		if (skb) {
644a365023aSLuca Weiss 			pkt->cmd = cpu_to_le32(QRTR_TYPE_BYE);
645a365023aSLuca Weiss 			qrtr_local_enqueue(NULL, skb, QRTR_TYPE_BYE, &src, &dst);
646a365023aSLuca Weiss 		}
647a365023aSLuca Weiss 	}
648a365023aSLuca Weiss 	spin_unlock_irqrestore(&qrtr_nodes_lock, flags);
649a365023aSLuca Weiss 
650a365023aSLuca Weiss 	/* Wake up any transmitters waiting for resume-tx from the node */
651a365023aSLuca Weiss 	mutex_lock(&node->qrtr_tx_lock);
652a365023aSLuca Weiss 	radix_tree_for_each_slot(slot, &node->qrtr_tx_flow, &iter, 0) {
653a365023aSLuca Weiss 		flow = *slot;
654a365023aSLuca Weiss 		wake_up_interruptible_all(&flow->resume_tx);
655a365023aSLuca Weiss 	}
656a365023aSLuca Weiss 	mutex_unlock(&node->qrtr_tx_lock);
657a365023aSLuca Weiss 
658a365023aSLuca Weiss 	qrtr_node_release(node);
659a365023aSLuca Weiss 	ep->node = NULL;
660a365023aSLuca Weiss }
661a365023aSLuca Weiss EXPORT_SYMBOL_GPL(qrtr_endpoint_unregister);
662a365023aSLuca Weiss 
663a365023aSLuca Weiss /* Lookup socket by port.
664a365023aSLuca Weiss  *
665a365023aSLuca Weiss  * Callers must release with qrtr_port_put()
666a365023aSLuca Weiss  */
qrtr_port_lookup(int port)667a365023aSLuca Weiss static struct qrtr_sock *qrtr_port_lookup(int port)
668a365023aSLuca Weiss {
669a365023aSLuca Weiss 	struct qrtr_sock *ipc;
670a365023aSLuca Weiss 
671a365023aSLuca Weiss 	if (port == QRTR_PORT_CTRL)
672a365023aSLuca Weiss 		port = 0;
673a365023aSLuca Weiss 
674a365023aSLuca Weiss 	rcu_read_lock();
675a365023aSLuca Weiss 	ipc = xa_load(&qrtr_ports, port);
676a365023aSLuca Weiss 	if (ipc)
677a365023aSLuca Weiss 		sock_hold(&ipc->sk);
678a365023aSLuca Weiss 	rcu_read_unlock();
679a365023aSLuca Weiss 
680a365023aSLuca Weiss 	return ipc;
681a365023aSLuca Weiss }
682a365023aSLuca Weiss 
683a365023aSLuca Weiss /* Release acquired socket. */
qrtr_port_put(struct qrtr_sock * ipc)684a365023aSLuca Weiss static void qrtr_port_put(struct qrtr_sock *ipc)
685a365023aSLuca Weiss {
686a365023aSLuca Weiss 	sock_put(&ipc->sk);
687a365023aSLuca Weiss }
688a365023aSLuca Weiss 
689a365023aSLuca Weiss /* Remove port assignment. */
qrtr_port_remove(struct qrtr_sock * ipc)690a365023aSLuca Weiss static void qrtr_port_remove(struct qrtr_sock *ipc)
691a365023aSLuca Weiss {
692a365023aSLuca Weiss 	struct qrtr_ctrl_pkt *pkt;
693a365023aSLuca Weiss 	struct sk_buff *skb;
694a365023aSLuca Weiss 	int port = ipc->us.sq_port;
695a365023aSLuca Weiss 	struct sockaddr_qrtr to;
696a365023aSLuca Weiss 
697a365023aSLuca Weiss 	to.sq_family = AF_QIPCRTR;
698a365023aSLuca Weiss 	to.sq_node = QRTR_NODE_BCAST;
699a365023aSLuca Weiss 	to.sq_port = QRTR_PORT_CTRL;
700a365023aSLuca Weiss 
701a365023aSLuca Weiss 	skb = qrtr_alloc_ctrl_packet(&pkt, GFP_KERNEL);
702a365023aSLuca Weiss 	if (skb) {
703a365023aSLuca Weiss 		pkt->cmd = cpu_to_le32(QRTR_TYPE_DEL_CLIENT);
704a365023aSLuca Weiss 		pkt->client.node = cpu_to_le32(ipc->us.sq_node);
705a365023aSLuca Weiss 		pkt->client.port = cpu_to_le32(ipc->us.sq_port);
706a365023aSLuca Weiss 
707a365023aSLuca Weiss 		skb_set_owner_w(skb, &ipc->sk);
708a365023aSLuca Weiss 		qrtr_bcast_enqueue(NULL, skb, QRTR_TYPE_DEL_CLIENT, &ipc->us,
709a365023aSLuca Weiss 				   &to);
710a365023aSLuca Weiss 	}
711a365023aSLuca Weiss 
712a365023aSLuca Weiss 	if (port == QRTR_PORT_CTRL)
713a365023aSLuca Weiss 		port = 0;
714a365023aSLuca Weiss 
715a365023aSLuca Weiss 	__sock_put(&ipc->sk);
716a365023aSLuca Weiss 
717a365023aSLuca Weiss 	xa_erase(&qrtr_ports, port);
718a365023aSLuca Weiss 
719a365023aSLuca Weiss 	/* Ensure that if qrtr_port_lookup() did enter the RCU read section we
720a365023aSLuca Weiss 	 * wait for it to up increment the refcount */
721a365023aSLuca Weiss 	synchronize_rcu();
722a365023aSLuca Weiss }
723a365023aSLuca Weiss 
724a365023aSLuca Weiss /* Assign port number to socket.
725a365023aSLuca Weiss  *
726a365023aSLuca Weiss  * Specify port in the integer pointed to by port, and it will be adjusted
727a365023aSLuca Weiss  * on return as necesssary.
728a365023aSLuca Weiss  *
729a365023aSLuca Weiss  * Port may be:
730a365023aSLuca Weiss  *   0: Assign ephemeral port in [QRTR_MIN_EPH_SOCKET, QRTR_MAX_EPH_SOCKET]
731a365023aSLuca Weiss  *   <QRTR_MIN_EPH_SOCKET: Specified; requires CAP_NET_ADMIN
732a365023aSLuca Weiss  *   >QRTR_MIN_EPH_SOCKET: Specified; available to all
733a365023aSLuca Weiss  */
qrtr_port_assign(struct qrtr_sock * ipc,int * port)734a365023aSLuca Weiss static int qrtr_port_assign(struct qrtr_sock *ipc, int *port)
735a365023aSLuca Weiss {
736a365023aSLuca Weiss 	int rc;
737a365023aSLuca Weiss 
738a365023aSLuca Weiss 	if (!*port) {
739a365023aSLuca Weiss 		rc = xa_alloc(&qrtr_ports, port, ipc, QRTR_EPH_PORT_RANGE,
740a365023aSLuca Weiss 				GFP_KERNEL);
741a365023aSLuca Weiss 	} else if (*port < QRTR_MIN_EPH_SOCKET && !capable(CAP_NET_ADMIN)) {
742a365023aSLuca Weiss 		rc = -EACCES;
743a365023aSLuca Weiss 	} else if (*port == QRTR_PORT_CTRL) {
744a365023aSLuca Weiss 		rc = xa_insert(&qrtr_ports, 0, ipc, GFP_KERNEL);
745a365023aSLuca Weiss 	} else {
746a365023aSLuca Weiss 		rc = xa_insert(&qrtr_ports, *port, ipc, GFP_KERNEL);
747a365023aSLuca Weiss 	}
748a365023aSLuca Weiss 
749a365023aSLuca Weiss 	if (rc == -EBUSY)
750a365023aSLuca Weiss 		return -EADDRINUSE;
751a365023aSLuca Weiss 	else if (rc < 0)
752a365023aSLuca Weiss 		return rc;
753a365023aSLuca Weiss 
754a365023aSLuca Weiss 	sock_hold(&ipc->sk);
755a365023aSLuca Weiss 
756a365023aSLuca Weiss 	return 0;
757a365023aSLuca Weiss }
758a365023aSLuca Weiss 
759a365023aSLuca Weiss /* Reset all non-control ports */
qrtr_reset_ports(void)760a365023aSLuca Weiss static void qrtr_reset_ports(void)
761a365023aSLuca Weiss {
762a365023aSLuca Weiss 	struct qrtr_sock *ipc;
763a365023aSLuca Weiss 	unsigned long index;
764a365023aSLuca Weiss 
765a365023aSLuca Weiss 	rcu_read_lock();
766a365023aSLuca Weiss 	xa_for_each_start(&qrtr_ports, index, ipc, 1) {
767a365023aSLuca Weiss 		sock_hold(&ipc->sk);
768a365023aSLuca Weiss 		ipc->sk.sk_err = ENETRESET;
769a365023aSLuca Weiss 		sk_error_report(&ipc->sk);
770a365023aSLuca Weiss 		sock_put(&ipc->sk);
771a365023aSLuca Weiss 	}
772a365023aSLuca Weiss 	rcu_read_unlock();
773a365023aSLuca Weiss }
774a365023aSLuca Weiss 
775a365023aSLuca Weiss /* Bind socket to address.
776a365023aSLuca Weiss  *
777a365023aSLuca Weiss  * Socket should be locked upon call.
778a365023aSLuca Weiss  */
__qrtr_bind(struct socket * sock,const struct sockaddr_qrtr * addr,int zapped)779a365023aSLuca Weiss static int __qrtr_bind(struct socket *sock,
780a365023aSLuca Weiss 		       const struct sockaddr_qrtr *addr, int zapped)
781a365023aSLuca Weiss {
782a365023aSLuca Weiss 	struct qrtr_sock *ipc = qrtr_sk(sock->sk);
783a365023aSLuca Weiss 	struct sock *sk = sock->sk;
784a365023aSLuca Weiss 	int port;
785a365023aSLuca Weiss 	int rc;
786a365023aSLuca Weiss 
787a365023aSLuca Weiss 	/* rebinding ok */
788a365023aSLuca Weiss 	if (!zapped && addr->sq_port == ipc->us.sq_port)
789a365023aSLuca Weiss 		return 0;
790a365023aSLuca Weiss 
791a365023aSLuca Weiss 	port = addr->sq_port;
792a365023aSLuca Weiss 	rc = qrtr_port_assign(ipc, &port);
793a365023aSLuca Weiss 	if (rc)
794a365023aSLuca Weiss 		return rc;
795a365023aSLuca Weiss 
796a365023aSLuca Weiss 	/* unbind previous, if any */
797a365023aSLuca Weiss 	if (!zapped)
798a365023aSLuca Weiss 		qrtr_port_remove(ipc);
799a365023aSLuca Weiss 	ipc->us.sq_port = port;
800a365023aSLuca Weiss 
801a365023aSLuca Weiss 	sock_reset_flag(sk, SOCK_ZAPPED);
802a365023aSLuca Weiss 
803a365023aSLuca Weiss 	/* Notify all open ports about the new controller */
804a365023aSLuca Weiss 	if (port == QRTR_PORT_CTRL)
805a365023aSLuca Weiss 		qrtr_reset_ports();
806a365023aSLuca Weiss 
807a365023aSLuca Weiss 	return 0;
808a365023aSLuca Weiss }
809a365023aSLuca Weiss 
810a365023aSLuca Weiss /* Auto bind to an ephemeral port. */
qrtr_autobind(struct socket * sock)811a365023aSLuca Weiss static int qrtr_autobind(struct socket *sock)
812a365023aSLuca Weiss {
813a365023aSLuca Weiss 	struct sock *sk = sock->sk;
814a365023aSLuca Weiss 	struct sockaddr_qrtr addr;
815a365023aSLuca Weiss 
816a365023aSLuca Weiss 	if (!sock_flag(sk, SOCK_ZAPPED))
817a365023aSLuca Weiss 		return 0;
818a365023aSLuca Weiss 
819a365023aSLuca Weiss 	addr.sq_family = AF_QIPCRTR;
820a365023aSLuca Weiss 	addr.sq_node = qrtr_local_nid;
821a365023aSLuca Weiss 	addr.sq_port = 0;
822a365023aSLuca Weiss 
823a365023aSLuca Weiss 	return __qrtr_bind(sock, &addr, 1);
824a365023aSLuca Weiss }
825a365023aSLuca Weiss 
826a365023aSLuca Weiss /* Bind socket to specified sockaddr. */
qrtr_bind(struct socket * sock,struct sockaddr * saddr,int len)827a365023aSLuca Weiss static int qrtr_bind(struct socket *sock, struct sockaddr *saddr, int len)
828a365023aSLuca Weiss {
829a365023aSLuca Weiss 	DECLARE_SOCKADDR(struct sockaddr_qrtr *, addr, saddr);
830a365023aSLuca Weiss 	struct qrtr_sock *ipc = qrtr_sk(sock->sk);
831a365023aSLuca Weiss 	struct sock *sk = sock->sk;
832a365023aSLuca Weiss 	int rc;
833a365023aSLuca Weiss 
834a365023aSLuca Weiss 	if (len < sizeof(*addr) || addr->sq_family != AF_QIPCRTR)
835a365023aSLuca Weiss 		return -EINVAL;
836a365023aSLuca Weiss 
837a365023aSLuca Weiss 	if (addr->sq_node != ipc->us.sq_node)
838a365023aSLuca Weiss 		return -EINVAL;
839a365023aSLuca Weiss 
840a365023aSLuca Weiss 	lock_sock(sk);
841a365023aSLuca Weiss 	rc = __qrtr_bind(sock, addr, sock_flag(sk, SOCK_ZAPPED));
842a365023aSLuca Weiss 	release_sock(sk);
843a365023aSLuca Weiss 
844a365023aSLuca Weiss 	return rc;
845a365023aSLuca Weiss }
846a365023aSLuca Weiss 
847a365023aSLuca Weiss /* Queue packet to local peer socket. */
qrtr_local_enqueue(struct qrtr_node * node,struct sk_buff * skb,int type,struct sockaddr_qrtr * from,struct sockaddr_qrtr * to)848a365023aSLuca Weiss static int qrtr_local_enqueue(struct qrtr_node *node, struct sk_buff *skb,
849a365023aSLuca Weiss 			      int type, struct sockaddr_qrtr *from,
850a365023aSLuca Weiss 			      struct sockaddr_qrtr *to)
851a365023aSLuca Weiss {
852a365023aSLuca Weiss 	struct qrtr_sock *ipc;
853a365023aSLuca Weiss 	struct qrtr_cb *cb;
854a365023aSLuca Weiss 
855a365023aSLuca Weiss 	ipc = qrtr_port_lookup(to->sq_port);
856a365023aSLuca Weiss 	if (!ipc || &ipc->sk == skb->sk) { /* do not send to self */
857a365023aSLuca Weiss 		if (ipc)
858a365023aSLuca Weiss 			qrtr_port_put(ipc);
859a365023aSLuca Weiss 		kfree_skb(skb);
860a365023aSLuca Weiss 		return -ENODEV;
861a365023aSLuca Weiss 	}
862a365023aSLuca Weiss 
863a365023aSLuca Weiss 	cb = (struct qrtr_cb *)skb->cb;
864a365023aSLuca Weiss 	cb->src_node = from->sq_node;
865a365023aSLuca Weiss 	cb->src_port = from->sq_port;
866a365023aSLuca Weiss 
867a365023aSLuca Weiss 	if (sock_queue_rcv_skb(&ipc->sk, skb)) {
868a365023aSLuca Weiss 		qrtr_port_put(ipc);
869a365023aSLuca Weiss 		kfree_skb(skb);
870a365023aSLuca Weiss 		return -ENOSPC;
871a365023aSLuca Weiss 	}
872a365023aSLuca Weiss 
873a365023aSLuca Weiss 	qrtr_port_put(ipc);
874a365023aSLuca Weiss 
875a365023aSLuca Weiss 	return 0;
876a365023aSLuca Weiss }
877a365023aSLuca Weiss 
878a365023aSLuca Weiss /* Queue packet for broadcast. */
qrtr_bcast_enqueue(struct qrtr_node * node,struct sk_buff * skb,int type,struct sockaddr_qrtr * from,struct sockaddr_qrtr * to)879a365023aSLuca Weiss static int qrtr_bcast_enqueue(struct qrtr_node *node, struct sk_buff *skb,
880a365023aSLuca Weiss 			      int type, struct sockaddr_qrtr *from,
881a365023aSLuca Weiss 			      struct sockaddr_qrtr *to)
882a365023aSLuca Weiss {
883a365023aSLuca Weiss 	struct sk_buff *skbn;
884a365023aSLuca Weiss 
885a365023aSLuca Weiss 	mutex_lock(&qrtr_node_lock);
886a365023aSLuca Weiss 	list_for_each_entry(node, &qrtr_all_nodes, item) {
887*00a0c2d4SYoussef Samir 		skbn = pskb_copy(skb, GFP_KERNEL);
888a365023aSLuca Weiss 		if (!skbn)
889a365023aSLuca Weiss 			break;
890a365023aSLuca Weiss 		skb_set_owner_w(skbn, skb->sk);
891a365023aSLuca Weiss 		qrtr_node_enqueue(node, skbn, type, from, to);
892a365023aSLuca Weiss 	}
893a365023aSLuca Weiss 	mutex_unlock(&qrtr_node_lock);
894a365023aSLuca Weiss 
895a365023aSLuca Weiss 	qrtr_local_enqueue(NULL, skb, type, from, to);
896a365023aSLuca Weiss 
897a365023aSLuca Weiss 	return 0;
898a365023aSLuca Weiss }
899a365023aSLuca Weiss 
qrtr_sendmsg(struct socket * sock,struct msghdr * msg,size_t len)900a365023aSLuca Weiss static int qrtr_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
901a365023aSLuca Weiss {
902a365023aSLuca Weiss 	DECLARE_SOCKADDR(struct sockaddr_qrtr *, addr, msg->msg_name);
903a365023aSLuca Weiss 	int (*enqueue_fn)(struct qrtr_node *, struct sk_buff *, int,
904a365023aSLuca Weiss 			  struct sockaddr_qrtr *, struct sockaddr_qrtr *);
905a365023aSLuca Weiss 	__le32 qrtr_type = cpu_to_le32(QRTR_TYPE_DATA);
906a365023aSLuca Weiss 	struct qrtr_sock *ipc = qrtr_sk(sock->sk);
907a365023aSLuca Weiss 	struct sock *sk = sock->sk;
908a365023aSLuca Weiss 	struct qrtr_node *node;
909a365023aSLuca Weiss 	struct sk_buff *skb;
910a365023aSLuca Weiss 	size_t plen;
911a365023aSLuca Weiss 	u32 type;
912a365023aSLuca Weiss 	int rc;
913a365023aSLuca Weiss 
914a365023aSLuca Weiss 	if (msg->msg_flags & ~(MSG_DONTWAIT))
915a365023aSLuca Weiss 		return -EINVAL;
916a365023aSLuca Weiss 
917a365023aSLuca Weiss 	if (len > 65535)
918a365023aSLuca Weiss 		return -EMSGSIZE;
919a365023aSLuca Weiss 
920a365023aSLuca Weiss 	lock_sock(sk);
921a365023aSLuca Weiss 
922a365023aSLuca Weiss 	if (addr) {
923a365023aSLuca Weiss 		if (msg->msg_namelen < sizeof(*addr)) {
924a365023aSLuca Weiss 			release_sock(sk);
925a365023aSLuca Weiss 			return -EINVAL;
926a365023aSLuca Weiss 		}
927a365023aSLuca Weiss 
928a365023aSLuca Weiss 		if (addr->sq_family != AF_QIPCRTR) {
929a365023aSLuca Weiss 			release_sock(sk);
930a365023aSLuca Weiss 			return -EINVAL;
931a365023aSLuca Weiss 		}
932a365023aSLuca Weiss 
933a365023aSLuca Weiss 		rc = qrtr_autobind(sock);
934a365023aSLuca Weiss 		if (rc) {
935a365023aSLuca Weiss 			release_sock(sk);
936a365023aSLuca Weiss 			return rc;
937a365023aSLuca Weiss 		}
938a365023aSLuca Weiss 	} else if (sk->sk_state == TCP_ESTABLISHED) {
939a365023aSLuca Weiss 		addr = &ipc->peer;
940a365023aSLuca Weiss 	} else {
941a365023aSLuca Weiss 		release_sock(sk);
942a365023aSLuca Weiss 		return -ENOTCONN;
943a365023aSLuca Weiss 	}
944a365023aSLuca Weiss 
945a365023aSLuca Weiss 	node = NULL;
946a365023aSLuca Weiss 	if (addr->sq_node == QRTR_NODE_BCAST) {
947a365023aSLuca Weiss 		if (addr->sq_port != QRTR_PORT_CTRL &&
948a365023aSLuca Weiss 		    qrtr_local_nid != QRTR_NODE_BCAST) {
949a365023aSLuca Weiss 			release_sock(sk);
950a365023aSLuca Weiss 			return -ENOTCONN;
951a365023aSLuca Weiss 		}
952a365023aSLuca Weiss 		enqueue_fn = qrtr_bcast_enqueue;
953a365023aSLuca Weiss 	} else if (addr->sq_node == ipc->us.sq_node) {
954a365023aSLuca Weiss 		enqueue_fn = qrtr_local_enqueue;
955a365023aSLuca Weiss 	} else {
956a365023aSLuca Weiss 		node = qrtr_node_lookup(addr->sq_node);
957a365023aSLuca Weiss 		if (!node) {
958a365023aSLuca Weiss 			release_sock(sk);
959a365023aSLuca Weiss 			return -ECONNRESET;
960a365023aSLuca Weiss 		}
961a365023aSLuca Weiss 		enqueue_fn = qrtr_node_enqueue;
962a365023aSLuca Weiss 	}
963a365023aSLuca Weiss 
964a365023aSLuca Weiss 	plen = (len + 3) & ~3;
965a365023aSLuca Weiss 	skb = sock_alloc_send_skb(sk, plen + QRTR_HDR_MAX_SIZE,
966a365023aSLuca Weiss 				  msg->msg_flags & MSG_DONTWAIT, &rc);
967a365023aSLuca Weiss 	if (!skb) {
968a365023aSLuca Weiss 		rc = -ENOMEM;
969a365023aSLuca Weiss 		goto out_node;
970a365023aSLuca Weiss 	}
971a365023aSLuca Weiss 
972a365023aSLuca Weiss 	skb_reserve(skb, QRTR_HDR_MAX_SIZE);
973a365023aSLuca Weiss 
974a365023aSLuca Weiss 	rc = memcpy_from_msg(skb_put(skb, len), msg, len);
975a365023aSLuca Weiss 	if (rc) {
976a365023aSLuca Weiss 		kfree_skb(skb);
977a365023aSLuca Weiss 		goto out_node;
978a365023aSLuca Weiss 	}
979a365023aSLuca Weiss 
980a365023aSLuca Weiss 	if (ipc->us.sq_port == QRTR_PORT_CTRL) {
981a365023aSLuca Weiss 		if (len < 4) {
982a365023aSLuca Weiss 			rc = -EINVAL;
983a365023aSLuca Weiss 			kfree_skb(skb);
984a365023aSLuca Weiss 			goto out_node;
985a365023aSLuca Weiss 		}
986a365023aSLuca Weiss 
987a365023aSLuca Weiss 		/* control messages already require the type as 'command' */
988a365023aSLuca Weiss 		skb_copy_bits(skb, 0, &qrtr_type, 4);
989a365023aSLuca Weiss 	}
990a365023aSLuca Weiss 
991a365023aSLuca Weiss 	type = le32_to_cpu(qrtr_type);
992a365023aSLuca Weiss 	rc = enqueue_fn(node, skb, type, &ipc->us, addr);
993a365023aSLuca Weiss 	if (rc >= 0)
994a365023aSLuca Weiss 		rc = len;
995a365023aSLuca Weiss 
996a365023aSLuca Weiss out_node:
997a365023aSLuca Weiss 	qrtr_node_release(node);
998a365023aSLuca Weiss 	release_sock(sk);
999a365023aSLuca Weiss 
1000a365023aSLuca Weiss 	return rc;
1001a365023aSLuca Weiss }
1002a365023aSLuca Weiss 
qrtr_send_resume_tx(struct qrtr_cb * cb)1003a365023aSLuca Weiss static int qrtr_send_resume_tx(struct qrtr_cb *cb)
1004a365023aSLuca Weiss {
1005a365023aSLuca Weiss 	struct sockaddr_qrtr remote = { AF_QIPCRTR, cb->src_node, cb->src_port };
1006a365023aSLuca Weiss 	struct sockaddr_qrtr local = { AF_QIPCRTR, cb->dst_node, cb->dst_port };
1007a365023aSLuca Weiss 	struct qrtr_ctrl_pkt *pkt;
1008a365023aSLuca Weiss 	struct qrtr_node *node;
1009a365023aSLuca Weiss 	struct sk_buff *skb;
1010a365023aSLuca Weiss 	int ret;
1011a365023aSLuca Weiss 
1012a365023aSLuca Weiss 	node = qrtr_node_lookup(remote.sq_node);
1013a365023aSLuca Weiss 	if (!node)
1014a365023aSLuca Weiss 		return -EINVAL;
1015a365023aSLuca Weiss 
1016a365023aSLuca Weiss 	skb = qrtr_alloc_ctrl_packet(&pkt, GFP_KERNEL);
1017a365023aSLuca Weiss 	if (!skb)
1018a365023aSLuca Weiss 		return -ENOMEM;
1019a365023aSLuca Weiss 
1020a365023aSLuca Weiss 	pkt->cmd = cpu_to_le32(QRTR_TYPE_RESUME_TX);
1021a365023aSLuca Weiss 	pkt->client.node = cpu_to_le32(cb->dst_node);
1022a365023aSLuca Weiss 	pkt->client.port = cpu_to_le32(cb->dst_port);
1023a365023aSLuca Weiss 
1024a365023aSLuca Weiss 	ret = qrtr_node_enqueue(node, skb, QRTR_TYPE_RESUME_TX, &local, &remote);
1025a365023aSLuca Weiss 
1026a365023aSLuca Weiss 	qrtr_node_release(node);
1027a365023aSLuca Weiss 
1028a365023aSLuca Weiss 	return ret;
1029a365023aSLuca Weiss }
1030a365023aSLuca Weiss 
qrtr_recvmsg(struct socket * sock,struct msghdr * msg,size_t size,int flags)1031a365023aSLuca Weiss static int qrtr_recvmsg(struct socket *sock, struct msghdr *msg,
1032a365023aSLuca Weiss 			size_t size, int flags)
1033a365023aSLuca Weiss {
1034a365023aSLuca Weiss 	DECLARE_SOCKADDR(struct sockaddr_qrtr *, addr, msg->msg_name);
1035a365023aSLuca Weiss 	struct sock *sk = sock->sk;
1036a365023aSLuca Weiss 	struct sk_buff *skb;
1037a365023aSLuca Weiss 	struct qrtr_cb *cb;
1038a365023aSLuca Weiss 	int copied, rc;
1039a365023aSLuca Weiss 
1040a365023aSLuca Weiss 	lock_sock(sk);
1041a365023aSLuca Weiss 
1042a365023aSLuca Weiss 	if (sock_flag(sk, SOCK_ZAPPED)) {
1043a365023aSLuca Weiss 		release_sock(sk);
1044a365023aSLuca Weiss 		return -EADDRNOTAVAIL;
1045a365023aSLuca Weiss 	}
1046a365023aSLuca Weiss 
1047f4b41f06SOliver Hartkopp 	skb = skb_recv_datagram(sk, flags, &rc);
1048a365023aSLuca Weiss 	if (!skb) {
1049a365023aSLuca Weiss 		release_sock(sk);
1050a365023aSLuca Weiss 		return rc;
1051a365023aSLuca Weiss 	}
1052a365023aSLuca Weiss 	cb = (struct qrtr_cb *)skb->cb;
1053a365023aSLuca Weiss 
1054a365023aSLuca Weiss 	copied = skb->len;
1055a365023aSLuca Weiss 	if (copied > size) {
1056a365023aSLuca Weiss 		copied = size;
1057a365023aSLuca Weiss 		msg->msg_flags |= MSG_TRUNC;
1058a365023aSLuca Weiss 	}
1059a365023aSLuca Weiss 
1060a365023aSLuca Weiss 	rc = skb_copy_datagram_msg(skb, 0, msg, copied);
1061a365023aSLuca Weiss 	if (rc < 0)
1062a365023aSLuca Weiss 		goto out;
1063a365023aSLuca Weiss 	rc = copied;
1064a365023aSLuca Weiss 
1065a365023aSLuca Weiss 	if (addr) {
1066a365023aSLuca Weiss 		/* There is an anonymous 2-byte hole after sq_family,
1067a365023aSLuca Weiss 		 * make sure to clear it.
1068a365023aSLuca Weiss 		 */
1069a365023aSLuca Weiss 		memset(addr, 0, sizeof(*addr));
1070a365023aSLuca Weiss 
1071a365023aSLuca Weiss 		addr->sq_family = AF_QIPCRTR;
1072a365023aSLuca Weiss 		addr->sq_node = cb->src_node;
1073a365023aSLuca Weiss 		addr->sq_port = cb->src_port;
1074a365023aSLuca Weiss 		msg->msg_namelen = sizeof(*addr);
1075a365023aSLuca Weiss 	}
1076a365023aSLuca Weiss 
1077a365023aSLuca Weiss out:
1078a365023aSLuca Weiss 	if (cb->confirm_rx)
1079a365023aSLuca Weiss 		qrtr_send_resume_tx(cb);
1080a365023aSLuca Weiss 
1081a365023aSLuca Weiss 	skb_free_datagram(sk, skb);
1082a365023aSLuca Weiss 	release_sock(sk);
1083a365023aSLuca Weiss 
1084a365023aSLuca Weiss 	return rc;
1085a365023aSLuca Weiss }
1086a365023aSLuca Weiss 
qrtr_connect(struct socket * sock,struct sockaddr * saddr,int len,int flags)1087a365023aSLuca Weiss static int qrtr_connect(struct socket *sock, struct sockaddr *saddr,
1088a365023aSLuca Weiss 			int len, int flags)
1089a365023aSLuca Weiss {
1090a365023aSLuca Weiss 	DECLARE_SOCKADDR(struct sockaddr_qrtr *, addr, saddr);
1091a365023aSLuca Weiss 	struct qrtr_sock *ipc = qrtr_sk(sock->sk);
1092a365023aSLuca Weiss 	struct sock *sk = sock->sk;
1093a365023aSLuca Weiss 	int rc;
1094a365023aSLuca Weiss 
1095a365023aSLuca Weiss 	if (len < sizeof(*addr) || addr->sq_family != AF_QIPCRTR)
1096a365023aSLuca Weiss 		return -EINVAL;
1097a365023aSLuca Weiss 
1098a365023aSLuca Weiss 	lock_sock(sk);
1099a365023aSLuca Weiss 
1100a365023aSLuca Weiss 	sk->sk_state = TCP_CLOSE;
1101a365023aSLuca Weiss 	sock->state = SS_UNCONNECTED;
1102a365023aSLuca Weiss 
1103a365023aSLuca Weiss 	rc = qrtr_autobind(sock);
1104a365023aSLuca Weiss 	if (rc) {
1105a365023aSLuca Weiss 		release_sock(sk);
1106a365023aSLuca Weiss 		return rc;
1107a365023aSLuca Weiss 	}
1108a365023aSLuca Weiss 
1109a365023aSLuca Weiss 	ipc->peer = *addr;
1110a365023aSLuca Weiss 	sock->state = SS_CONNECTED;
1111a365023aSLuca Weiss 	sk->sk_state = TCP_ESTABLISHED;
1112a365023aSLuca Weiss 
1113a365023aSLuca Weiss 	release_sock(sk);
1114a365023aSLuca Weiss 
1115a365023aSLuca Weiss 	return 0;
1116a365023aSLuca Weiss }
1117a365023aSLuca Weiss 
qrtr_getname(struct socket * sock,struct sockaddr * saddr,int peer)1118a365023aSLuca Weiss static int qrtr_getname(struct socket *sock, struct sockaddr *saddr,
1119a365023aSLuca Weiss 			int peer)
1120a365023aSLuca Weiss {
1121a365023aSLuca Weiss 	struct qrtr_sock *ipc = qrtr_sk(sock->sk);
1122a365023aSLuca Weiss 	struct sockaddr_qrtr qaddr;
1123a365023aSLuca Weiss 	struct sock *sk = sock->sk;
1124a365023aSLuca Weiss 
1125a365023aSLuca Weiss 	lock_sock(sk);
1126a365023aSLuca Weiss 	if (peer) {
1127a365023aSLuca Weiss 		if (sk->sk_state != TCP_ESTABLISHED) {
1128a365023aSLuca Weiss 			release_sock(sk);
1129a365023aSLuca Weiss 			return -ENOTCONN;
1130a365023aSLuca Weiss 		}
1131a365023aSLuca Weiss 
1132a365023aSLuca Weiss 		qaddr = ipc->peer;
1133a365023aSLuca Weiss 	} else {
1134a365023aSLuca Weiss 		qaddr = ipc->us;
1135a365023aSLuca Weiss 	}
1136a365023aSLuca Weiss 	release_sock(sk);
1137a365023aSLuca Weiss 
1138a365023aSLuca Weiss 	qaddr.sq_family = AF_QIPCRTR;
1139a365023aSLuca Weiss 
1140a365023aSLuca Weiss 	memcpy(saddr, &qaddr, sizeof(qaddr));
1141a365023aSLuca Weiss 
1142a365023aSLuca Weiss 	return sizeof(qaddr);
1143a365023aSLuca Weiss }
1144a365023aSLuca Weiss 
qrtr_ioctl(struct socket * sock,unsigned int cmd,unsigned long arg)1145a365023aSLuca Weiss static int qrtr_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1146a365023aSLuca Weiss {
1147a365023aSLuca Weiss 	void __user *argp = (void __user *)arg;
1148a365023aSLuca Weiss 	struct qrtr_sock *ipc = qrtr_sk(sock->sk);
1149a365023aSLuca Weiss 	struct sock *sk = sock->sk;
1150a365023aSLuca Weiss 	struct sockaddr_qrtr *sq;
1151a365023aSLuca Weiss 	struct sk_buff *skb;
1152a365023aSLuca Weiss 	struct ifreq ifr;
1153a365023aSLuca Weiss 	long len = 0;
1154a365023aSLuca Weiss 	int rc = 0;
1155a365023aSLuca Weiss 
1156a365023aSLuca Weiss 	lock_sock(sk);
1157a365023aSLuca Weiss 
1158a365023aSLuca Weiss 	switch (cmd) {
1159a365023aSLuca Weiss 	case TIOCOUTQ:
1160a365023aSLuca Weiss 		len = sk->sk_sndbuf - sk_wmem_alloc_get(sk);
1161a365023aSLuca Weiss 		if (len < 0)
1162a365023aSLuca Weiss 			len = 0;
1163a365023aSLuca Weiss 		rc = put_user(len, (int __user *)argp);
1164a365023aSLuca Weiss 		break;
1165a365023aSLuca Weiss 	case TIOCINQ:
1166a365023aSLuca Weiss 		skb = skb_peek(&sk->sk_receive_queue);
1167a365023aSLuca Weiss 		if (skb)
1168a365023aSLuca Weiss 			len = skb->len;
1169a365023aSLuca Weiss 		rc = put_user(len, (int __user *)argp);
1170a365023aSLuca Weiss 		break;
1171a365023aSLuca Weiss 	case SIOCGIFADDR:
1172a365023aSLuca Weiss 		if (get_user_ifreq(&ifr, NULL, argp)) {
1173a365023aSLuca Weiss 			rc = -EFAULT;
1174a365023aSLuca Weiss 			break;
1175a365023aSLuca Weiss 		}
1176a365023aSLuca Weiss 
1177a365023aSLuca Weiss 		sq = (struct sockaddr_qrtr *)&ifr.ifr_addr;
1178a365023aSLuca Weiss 		*sq = ipc->us;
1179a365023aSLuca Weiss 		if (put_user_ifreq(&ifr, argp)) {
1180a365023aSLuca Weiss 			rc = -EFAULT;
1181a365023aSLuca Weiss 			break;
1182a365023aSLuca Weiss 		}
1183a365023aSLuca Weiss 		break;
1184a365023aSLuca Weiss 	case SIOCADDRT:
1185a365023aSLuca Weiss 	case SIOCDELRT:
1186a365023aSLuca Weiss 	case SIOCSIFADDR:
1187a365023aSLuca Weiss 	case SIOCGIFDSTADDR:
1188a365023aSLuca Weiss 	case SIOCSIFDSTADDR:
1189a365023aSLuca Weiss 	case SIOCGIFBRDADDR:
1190a365023aSLuca Weiss 	case SIOCSIFBRDADDR:
1191a365023aSLuca Weiss 	case SIOCGIFNETMASK:
1192a365023aSLuca Weiss 	case SIOCSIFNETMASK:
1193a365023aSLuca Weiss 		rc = -EINVAL;
1194a365023aSLuca Weiss 		break;
1195a365023aSLuca Weiss 	default:
1196a365023aSLuca Weiss 		rc = -ENOIOCTLCMD;
1197a365023aSLuca Weiss 		break;
1198a365023aSLuca Weiss 	}
1199a365023aSLuca Weiss 
1200a365023aSLuca Weiss 	release_sock(sk);
1201a365023aSLuca Weiss 
1202a365023aSLuca Weiss 	return rc;
1203a365023aSLuca Weiss }
1204a365023aSLuca Weiss 
qrtr_release(struct socket * sock)1205a365023aSLuca Weiss static int qrtr_release(struct socket *sock)
1206a365023aSLuca Weiss {
1207a365023aSLuca Weiss 	struct sock *sk = sock->sk;
1208a365023aSLuca Weiss 	struct qrtr_sock *ipc;
1209a365023aSLuca Weiss 
1210a365023aSLuca Weiss 	if (!sk)
1211a365023aSLuca Weiss 		return 0;
1212a365023aSLuca Weiss 
1213a365023aSLuca Weiss 	lock_sock(sk);
1214a365023aSLuca Weiss 
1215a365023aSLuca Weiss 	ipc = qrtr_sk(sk);
1216a365023aSLuca Weiss 	sk->sk_shutdown = SHUTDOWN_MASK;
1217a365023aSLuca Weiss 	if (!sock_flag(sk, SOCK_DEAD))
1218a365023aSLuca Weiss 		sk->sk_state_change(sk);
1219a365023aSLuca Weiss 
1220a365023aSLuca Weiss 	sock_set_flag(sk, SOCK_DEAD);
1221a365023aSLuca Weiss 	sock_orphan(sk);
1222a365023aSLuca Weiss 	sock->sk = NULL;
1223a365023aSLuca Weiss 
1224a365023aSLuca Weiss 	if (!sock_flag(sk, SOCK_ZAPPED))
1225a365023aSLuca Weiss 		qrtr_port_remove(ipc);
1226a365023aSLuca Weiss 
1227a365023aSLuca Weiss 	skb_queue_purge(&sk->sk_receive_queue);
1228a365023aSLuca Weiss 
1229a365023aSLuca Weiss 	release_sock(sk);
1230a365023aSLuca Weiss 	sock_put(sk);
1231a365023aSLuca Weiss 
1232a365023aSLuca Weiss 	return 0;
1233a365023aSLuca Weiss }
1234a365023aSLuca Weiss 
1235a365023aSLuca Weiss static const struct proto_ops qrtr_proto_ops = {
1236a365023aSLuca Weiss 	.owner		= THIS_MODULE,
1237a365023aSLuca Weiss 	.family		= AF_QIPCRTR,
1238a365023aSLuca Weiss 	.bind		= qrtr_bind,
1239a365023aSLuca Weiss 	.connect	= qrtr_connect,
1240a365023aSLuca Weiss 	.socketpair	= sock_no_socketpair,
1241a365023aSLuca Weiss 	.accept		= sock_no_accept,
1242a365023aSLuca Weiss 	.listen		= sock_no_listen,
1243a365023aSLuca Weiss 	.sendmsg	= qrtr_sendmsg,
1244a365023aSLuca Weiss 	.recvmsg	= qrtr_recvmsg,
1245a365023aSLuca Weiss 	.getname	= qrtr_getname,
1246a365023aSLuca Weiss 	.ioctl		= qrtr_ioctl,
1247a365023aSLuca Weiss 	.gettstamp	= sock_gettstamp,
1248a365023aSLuca Weiss 	.poll		= datagram_poll,
1249a365023aSLuca Weiss 	.shutdown	= sock_no_shutdown,
1250a365023aSLuca Weiss 	.release	= qrtr_release,
1251a365023aSLuca Weiss 	.mmap		= sock_no_mmap,
1252a365023aSLuca Weiss };
1253a365023aSLuca Weiss 
1254a365023aSLuca Weiss static struct proto qrtr_proto = {
1255a365023aSLuca Weiss 	.name		= "QIPCRTR",
1256a365023aSLuca Weiss 	.owner		= THIS_MODULE,
1257a365023aSLuca Weiss 	.obj_size	= sizeof(struct qrtr_sock),
1258a365023aSLuca Weiss };
1259a365023aSLuca Weiss 
qrtr_create(struct net * net,struct socket * sock,int protocol,int kern)1260a365023aSLuca Weiss static int qrtr_create(struct net *net, struct socket *sock,
1261a365023aSLuca Weiss 		       int protocol, int kern)
1262a365023aSLuca Weiss {
1263a365023aSLuca Weiss 	struct qrtr_sock *ipc;
1264a365023aSLuca Weiss 	struct sock *sk;
1265a365023aSLuca Weiss 
1266a365023aSLuca Weiss 	if (sock->type != SOCK_DGRAM)
1267a365023aSLuca Weiss 		return -EPROTOTYPE;
1268a365023aSLuca Weiss 
1269a365023aSLuca Weiss 	sk = sk_alloc(net, AF_QIPCRTR, GFP_KERNEL, &qrtr_proto, kern);
1270a365023aSLuca Weiss 	if (!sk)
1271a365023aSLuca Weiss 		return -ENOMEM;
1272a365023aSLuca Weiss 
1273a365023aSLuca Weiss 	sock_set_flag(sk, SOCK_ZAPPED);
1274a365023aSLuca Weiss 
1275a365023aSLuca Weiss 	sock_init_data(sock, sk);
1276a365023aSLuca Weiss 	sock->ops = &qrtr_proto_ops;
1277a365023aSLuca Weiss 
1278a365023aSLuca Weiss 	ipc = qrtr_sk(sk);
1279a365023aSLuca Weiss 	ipc->us.sq_family = AF_QIPCRTR;
1280a365023aSLuca Weiss 	ipc->us.sq_node = qrtr_local_nid;
1281a365023aSLuca Weiss 	ipc->us.sq_port = 0;
1282a365023aSLuca Weiss 
1283a365023aSLuca Weiss 	return 0;
1284a365023aSLuca Weiss }
1285a365023aSLuca Weiss 
1286a365023aSLuca Weiss static const struct net_proto_family qrtr_family = {
1287a365023aSLuca Weiss 	.owner	= THIS_MODULE,
1288a365023aSLuca Weiss 	.family	= AF_QIPCRTR,
1289a365023aSLuca Weiss 	.create	= qrtr_create,
1290a365023aSLuca Weiss };
1291a365023aSLuca Weiss 
qrtr_proto_init(void)1292a365023aSLuca Weiss static int __init qrtr_proto_init(void)
1293a365023aSLuca Weiss {
1294a365023aSLuca Weiss 	int rc;
1295a365023aSLuca Weiss 
1296a365023aSLuca Weiss 	rc = proto_register(&qrtr_proto, 1);
1297a365023aSLuca Weiss 	if (rc)
1298a365023aSLuca Weiss 		return rc;
1299a365023aSLuca Weiss 
1300a365023aSLuca Weiss 	rc = sock_register(&qrtr_family);
1301a365023aSLuca Weiss 	if (rc)
1302a365023aSLuca Weiss 		goto err_proto;
1303a365023aSLuca Weiss 
1304a365023aSLuca Weiss 	rc = qrtr_ns_init();
1305a365023aSLuca Weiss 	if (rc)
1306a365023aSLuca Weiss 		goto err_sock;
1307a365023aSLuca Weiss 
1308a365023aSLuca Weiss 	return 0;
1309a365023aSLuca Weiss 
1310a365023aSLuca Weiss err_sock:
1311a365023aSLuca Weiss 	sock_unregister(qrtr_family.family);
1312a365023aSLuca Weiss err_proto:
1313a365023aSLuca Weiss 	proto_unregister(&qrtr_proto);
1314a365023aSLuca Weiss 	return rc;
1315a365023aSLuca Weiss }
1316a365023aSLuca Weiss postcore_initcall(qrtr_proto_init);
1317a365023aSLuca Weiss 
qrtr_proto_fini(void)1318a365023aSLuca Weiss static void __exit qrtr_proto_fini(void)
1319a365023aSLuca Weiss {
1320a365023aSLuca Weiss 	qrtr_ns_remove();
1321a365023aSLuca Weiss 	sock_unregister(qrtr_family.family);
1322a365023aSLuca Weiss 	proto_unregister(&qrtr_proto);
1323a365023aSLuca Weiss }
1324a365023aSLuca Weiss module_exit(qrtr_proto_fini);
1325a365023aSLuca Weiss 
1326a365023aSLuca Weiss MODULE_DESCRIPTION("Qualcomm IPC-router driver");
1327a365023aSLuca Weiss MODULE_LICENSE("GPL v2");
1328a365023aSLuca Weiss MODULE_ALIAS_NETPROTO(PF_QIPCRTR);
1329