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