| From 6d6da9459b7e964b86bac5f35bbd68c1bd7bfa89 Mon Sep 17 00:00:00 2001 |
| From: Wang Wenhu <wenhu.wang@vivo.com> |
| Date: Wed, 8 Apr 2020 19:53:53 -0700 |
| Subject: [PATCH] net: qrtr: send msgs from local of same id as broadcast |
| |
| commit 6dbf02acef69b0742c238574583b3068afbd227c upstream. |
| |
| If the local node id(qrtr_local_nid) is not modified after its |
| initialization, it equals to the broadcast node id(QRTR_NODE_BCAST). |
| So the messages from local node should not be taken as broadcast |
| and keep the process going to send them out anyway. |
| |
| The definitions are as follow: |
| static unsigned int qrtr_local_nid = NUMA_NO_NODE; |
| |
| Fixes: fdf5fd397566 ("net: qrtr: Broadcast messages only from control port") |
| Signed-off-by: Wang Wenhu <wenhu.wang@vivo.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c |
| index 3d24d45be5f4..930f48a20546 100644 |
| --- a/net/qrtr/qrtr.c |
| +++ b/net/qrtr/qrtr.c |
| @@ -763,20 +763,21 @@ static int qrtr_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) |
| |
| node = NULL; |
| if (addr->sq_node == QRTR_NODE_BCAST) { |
| - enqueue_fn = qrtr_bcast_enqueue; |
| - if (addr->sq_port != QRTR_PORT_CTRL) { |
| + if (addr->sq_port != QRTR_PORT_CTRL && |
| + qrtr_local_nid != QRTR_NODE_BCAST) { |
| release_sock(sk); |
| return -ENOTCONN; |
| } |
| + enqueue_fn = qrtr_bcast_enqueue; |
| } else if (addr->sq_node == ipc->us.sq_node) { |
| 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; |
| } |
| + enqueue_fn = qrtr_node_enqueue; |
| } |
| |
| plen = (len + 3) & ~3; |
| -- |
| 2.7.4 |
| |