| From foo@baz Sat 18 Apr 2020 11:09:57 AM CEST |
| From: Wang Wenhu <wenhu.wang@vivo.com> |
| Date: Wed, 8 Apr 2020 19:53:53 -0700 |
| Subject: net: qrtr: send msgs from local of same id as broadcast |
| |
| From: Wang Wenhu <wenhu.wang@vivo.com> |
| |
| [ Upstream commit 6dbf02acef69b0742c238574583b3068afbd227c ] |
| |
| 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: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/qrtr/qrtr.c | 7 ++++--- |
| 1 file changed, 4 insertions(+), 3 deletions(-) |
| |
| --- a/net/qrtr/qrtr.c |
| +++ b/net/qrtr/qrtr.c |
| @@ -763,20 +763,21 @@ static int qrtr_sendmsg(struct socket *s |
| |
| 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; |