Thread (7 messages) 7 messages, 4 authors, 2015-12-17

Re: [PATCH] net: add Qualcomm IPC router

From: Courtney Cavin <hidden>
Date: 2015-12-16 23:39:06
Also in: linux-arm-kernel, linux-arm-msm, lkml, netdev

On Fri, Dec 11, 2015 at 09:41:59PM +0100, Bjorn Andersson wrote:
From: Courtney Cavin <redacted>

Add an implementation of Qualcomm's IPC router protocol, used to
communicate with service providing remote processors.

Signed-off-by: Courtney Cavin <redacted>
---
[...]
+static int qrtr_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
+{
+       DECLARE_SOCKADDR(struct sockaddr_qrtr *, addr, msg->msg_name);
+       int (*enqueue_fn)(struct qrtr_node *, struct sk_buff *);
+       struct qrtr_sock *ipc = qrtr_sk(sock->sk);
+       struct sock *sk = sock->sk;
+       struct qrtr_node *node;
+       struct qrtr_hdr *hdr;
+       struct sk_buff *skb;
+       size_t plen;
+       int rc;
+
+       if (msg->msg_flags & ~(MSG_DONTWAIT))
+               return -EINVAL;
+
+       if (len > 65535)
+               return -EMSGSIZE;
+
+       lock_sock(sk);
+
+       if (addr) {
+               if (msg->msg_namelen < sizeof(*addr)) {
+                       release_sock(sk);
+                       return -EINVAL;
+               }
+
+               if (addr->sq_family != AF_QIPCRTR) {
+                       release_sock(sk);
+                       return -EINVAL;
+               }
+
+               rc = qrtr_autobind(sock);
+               if (rc) {
+                       release_sock(sk);
+                       return rc;
+               }
+       } else if (sk->sk_state == TCP_ESTABLISHED) {
+               addr = &ipc->peer;
+       } else {
+               release_sock(sk);
+               return -ENOTCONN;
+       }
+
+       node = NULL;
+       if (addr->sq_node == QRTR_NODE_BCAST) {
+               enqueue_fn = qrtr_bcast_enqueue;
+       } else if (addr->sq_node == 0 || addr->sq_node == ipc->us.sq_node) {
'addr->sq_node == 0' should be removed from this if-condition.  Zero is
a valid node id.  Clients needing the local address can use
getsockname(2).
+               enqueue_fn = qrtr_local_enqueue;
+       } else {
+               enqueue_fn = qrtr_node_enqueue;
+               node = qrtr_node_lookup(addr->sq_node);
+               if (!node) {
+                       release_sock(sk);
+                       return -ECONNRESET;
+               }
+       }
-Courtney
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help