Skip to content

Commit

Permalink
net: qrtr: Broadcast DEL_CLIENT message when endpoint is closed
Browse files Browse the repository at this point in the history
Per the QMUXv2 protocol specificiation a DEL_CLIENT message should be
broadcasted when an endpoint is disconnected.

The protocol specification does suggest that the router can keep track
of which nodes the endpoint has been communicating with to not wake up
sleeping remotes unecessarily, but implementation of this suggestion is
left for the future.

Cc: Courtney Cavin <[email protected]>
Signed-off-by: Bjorn Andersson <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
andersson authored and davem330 committed Jun 8, 2017
1 parent 8acc8ee commit 1784473
Showing 1 changed file with 28 additions and 0 deletions.
28 changes: 28 additions & 0 deletions net/qrtr/qrtr.c
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ struct qrtr_node {
};

static int qrtr_local_enqueue(struct qrtr_node *node, struct sk_buff *skb);
static int qrtr_bcast_enqueue(struct qrtr_node *node, struct sk_buff *skb);

/* Release node resources and free the node.
*
Expand Down Expand Up @@ -312,6 +313,26 @@ static struct sk_buff *qrtr_alloc_local_bye(u32 src_node)
return skb;
}

static struct sk_buff *qrtr_alloc_del_client(struct sockaddr_qrtr *sq)
{
const int pkt_len = 20;
struct sk_buff *skb;
__le32 *buf;

skb = qrtr_alloc_ctrl_packet(QRTR_TYPE_DEL_CLIENT, pkt_len,
sq->sq_node, QRTR_NODE_BCAST);
if (!skb)
return NULL;

buf = (__le32 *)skb_put(skb, pkt_len);
memset(buf, 0, pkt_len);
buf[0] = cpu_to_le32(QRTR_TYPE_DEL_CLIENT);
buf[1] = cpu_to_le32(sq->sq_node);
buf[2] = cpu_to_le32(sq->sq_port);

return skb;
}

static struct qrtr_sock *qrtr_port_lookup(int port);
static void qrtr_port_put(struct qrtr_sock *ipc);

Expand Down Expand Up @@ -448,8 +469,15 @@ static void qrtr_port_put(struct qrtr_sock *ipc)
/* Remove port assignment. */
static void qrtr_port_remove(struct qrtr_sock *ipc)
{
struct sk_buff *skb;
int port = ipc->us.sq_port;

skb = qrtr_alloc_del_client(&ipc->us);
if (skb) {
skb_set_owner_w(skb, &ipc->sk);
qrtr_bcast_enqueue(NULL, skb);
}

if (port == QRTR_PORT_CTRL)
port = 0;

Expand Down

0 comments on commit 1784473

Please sign in to comment.