summaryrefslogtreecommitdiffstats
path: root/net/qrtr
diff options
context:
space:
mode:
authorBjorn Andersson <bjorn.andersson@linaro.org>2017-10-11 02:45:21 -0400
committerDavid S. Miller <davem@davemloft.net>2017-10-11 18:28:38 -0400
commit1a7959c76641674991ba3a49f25432f1e105391e (patch)
treec8a52ea573b8159676b2fa7f7d7efbc831e67c4d /net/qrtr
parente7044482c8ac5081f4775063995647787d5082a4 (diff)
net: qrtr: Clean up control packet handling
As the message header generation is deferred the internal functions for generating control packets can be simplified. This patch modifies qrtr_alloc_ctrl_packet() to, in addition to the sk_buff, return a reference to a struct qrtr_ctrl_pkt, which clarifies and simplifies the helpers to the point that these functions can be folded back into the callers. Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/qrtr')
-rw-r--r--net/qrtr/qrtr.c93
1 files changed, 29 insertions, 64 deletions
diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c
index 82dc83789310..a84edba7b1ef 100644
--- a/net/qrtr/qrtr.c
+++ b/net/qrtr/qrtr.c
@@ -255,9 +255,18 @@ int qrtr_endpoint_post(struct qrtr_endpoint *ep, const void *data, size_t len)
255} 255}
256EXPORT_SYMBOL_GPL(qrtr_endpoint_post); 256EXPORT_SYMBOL_GPL(qrtr_endpoint_post);
257 257
258static struct sk_buff *qrtr_alloc_ctrl_packet(u32 type, size_t pkt_len, 258/**
259 u32 src_node, u32 dst_node) 259 * qrtr_alloc_ctrl_packet() - allocate control packet skb
260 * @pkt: reference to qrtr_ctrl_pkt pointer
261 *
262 * Returns newly allocated sk_buff, or NULL on failure
263 *
264 * This function allocates a sk_buff large enough to carry a qrtr_ctrl_pkt and
265 * on success returns a reference to the control packet in @pkt.
266 */
267static struct sk_buff *qrtr_alloc_ctrl_packet(struct qrtr_ctrl_pkt **pkt)
260{ 268{
269 const int pkt_len = sizeof(struct qrtr_ctrl_pkt);
261 struct sk_buff *skb; 270 struct sk_buff *skb;
262 271
263 skb = alloc_skb(QRTR_HDR_SIZE + pkt_len, GFP_KERNEL); 272 skb = alloc_skb(QRTR_HDR_SIZE + pkt_len, GFP_KERNEL);
@@ -265,64 +274,7 @@ static struct sk_buff *qrtr_alloc_ctrl_packet(u32 type, size_t pkt_len,
265 return NULL; 274 return NULL;
266 275
267 skb_reserve(skb, QRTR_HDR_SIZE); 276 skb_reserve(skb, QRTR_HDR_SIZE);
268 277 *pkt = skb_put_zero(skb, pkt_len);
269 return skb;
270}
271
272/* Allocate and construct a resume-tx packet. */
273static struct sk_buff *qrtr_alloc_resume_tx(u32 src_node,
274 u32 dst_node, u32 port)
275{
276 const int pkt_len = 20;
277 struct sk_buff *skb;
278 __le32 *buf;
279
280 skb = qrtr_alloc_ctrl_packet(QRTR_TYPE_RESUME_TX, pkt_len,
281 src_node, dst_node);
282 if (!skb)
283 return NULL;
284
285 buf = skb_put_zero(skb, pkt_len);
286 buf[0] = cpu_to_le32(QRTR_TYPE_RESUME_TX);
287 buf[1] = cpu_to_le32(src_node);
288 buf[2] = cpu_to_le32(port);
289
290 return skb;
291}
292
293/* Allocate and construct a BYE message to signal remote termination */
294static struct sk_buff *qrtr_alloc_local_bye(u32 src_node)
295{
296 const int pkt_len = 20;
297 struct sk_buff *skb;
298 __le32 *buf;
299
300 skb = qrtr_alloc_ctrl_packet(QRTR_TYPE_BYE, pkt_len,
301 src_node, qrtr_local_nid);
302 if (!skb)
303 return NULL;
304
305 buf = skb_put_zero(skb, pkt_len);
306 buf[0] = cpu_to_le32(QRTR_TYPE_BYE);
307
308 return skb;
309}
310
311static struct sk_buff *qrtr_alloc_del_client(struct sockaddr_qrtr *sq)
312{
313 const int pkt_len = 20;
314 struct sk_buff *skb;
315 __le32 *buf;
316
317 skb = qrtr_alloc_ctrl_packet(QRTR_TYPE_DEL_CLIENT, pkt_len,
318 sq->sq_node, QRTR_NODE_BCAST);
319 if (!skb)
320 return NULL;
321
322 buf = skb_put_zero(skb, pkt_len);
323 buf[0] = cpu_to_le32(QRTR_TYPE_DEL_CLIENT);
324 buf[1] = cpu_to_le32(sq->sq_node);
325 buf[2] = cpu_to_le32(sq->sq_port);
326 278
327 return skb; 279 return skb;
328} 280}
@@ -337,6 +289,7 @@ static void qrtr_port_put(struct qrtr_sock *ipc);
337static void qrtr_node_rx_work(struct work_struct *work) 289static void qrtr_node_rx_work(struct work_struct *work)
338{ 290{
339 struct qrtr_node *node = container_of(work, struct qrtr_node, work); 291 struct qrtr_node *node = container_of(work, struct qrtr_node, work);
292 struct qrtr_ctrl_pkt *pkt;
340 struct sockaddr_qrtr dst; 293 struct sockaddr_qrtr dst;
341 struct sockaddr_qrtr src; 294 struct sockaddr_qrtr src;
342 struct sk_buff *skb; 295 struct sk_buff *skb;
@@ -372,10 +325,14 @@ static void qrtr_node_rx_work(struct work_struct *work)
372 } 325 }
373 326
374 if (confirm) { 327 if (confirm) {
375 skb = qrtr_alloc_resume_tx(dst_node, node->nid, dst_port); 328 skb = qrtr_alloc_ctrl_packet(&pkt);
376 if (!skb) 329 if (!skb)
377 break; 330 break;
378 331
332 pkt->cmd = cpu_to_le32(QRTR_TYPE_RESUME_TX);
333 pkt->client.node = cpu_to_le32(dst.sq_node);
334 pkt->client.port = cpu_to_le32(dst.sq_port);
335
379 if (qrtr_node_enqueue(node, skb, QRTR_TYPE_RESUME_TX, 336 if (qrtr_node_enqueue(node, skb, QRTR_TYPE_RESUME_TX,
380 &dst, &src)) 337 &dst, &src))
381 break; 338 break;
@@ -429,6 +386,7 @@ void qrtr_endpoint_unregister(struct qrtr_endpoint *ep)
429 struct qrtr_node *node = ep->node; 386 struct qrtr_node *node = ep->node;
430 struct sockaddr_qrtr src = {AF_QIPCRTR, node->nid, QRTR_PORT_CTRL}; 387 struct sockaddr_qrtr src = {AF_QIPCRTR, node->nid, QRTR_PORT_CTRL};
431 struct sockaddr_qrtr dst = {AF_QIPCRTR, qrtr_local_nid, QRTR_PORT_CTRL}; 388 struct sockaddr_qrtr dst = {AF_QIPCRTR, qrtr_local_nid, QRTR_PORT_CTRL};
389 struct qrtr_ctrl_pkt *pkt;
432 struct sk_buff *skb; 390 struct sk_buff *skb;
433 391
434 mutex_lock(&node->ep_lock); 392 mutex_lock(&node->ep_lock);
@@ -436,9 +394,11 @@ void qrtr_endpoint_unregister(struct qrtr_endpoint *ep)
436 mutex_unlock(&node->ep_lock); 394 mutex_unlock(&node->ep_lock);
437 395
438 /* Notify the local controller about the event */ 396 /* Notify the local controller about the event */
439 skb = qrtr_alloc_local_bye(node->nid); 397 skb = qrtr_alloc_ctrl_packet(&pkt);
440 if (skb) 398 if (skb) {
399 pkt->cmd = cpu_to_le32(QRTR_TYPE_BYE);
441 qrtr_local_enqueue(NULL, skb, QRTR_TYPE_BYE, &src, &dst); 400 qrtr_local_enqueue(NULL, skb, QRTR_TYPE_BYE, &src, &dst);
401 }
442 402
443 qrtr_node_release(node); 403 qrtr_node_release(node);
444 ep->node = NULL; 404 ep->node = NULL;
@@ -474,6 +434,7 @@ static void qrtr_port_put(struct qrtr_sock *ipc)
474/* Remove port assignment. */ 434/* Remove port assignment. */
475static void qrtr_port_remove(struct qrtr_sock *ipc) 435static void qrtr_port_remove(struct qrtr_sock *ipc)
476{ 436{
437 struct qrtr_ctrl_pkt *pkt;
477 struct sk_buff *skb; 438 struct sk_buff *skb;
478 int port = ipc->us.sq_port; 439 int port = ipc->us.sq_port;
479 struct sockaddr_qrtr to; 440 struct sockaddr_qrtr to;
@@ -482,8 +443,12 @@ static void qrtr_port_remove(struct qrtr_sock *ipc)
482 to.sq_node = QRTR_NODE_BCAST; 443 to.sq_node = QRTR_NODE_BCAST;
483 to.sq_port = QRTR_PORT_CTRL; 444 to.sq_port = QRTR_PORT_CTRL;
484 445
485 skb = qrtr_alloc_del_client(&ipc->us); 446 skb = qrtr_alloc_ctrl_packet(&pkt);
486 if (skb) { 447 if (skb) {
448 pkt->cmd = cpu_to_le32(QRTR_TYPE_DEL_CLIENT);
449 pkt->client.node = cpu_to_le32(ipc->us.sq_node);
450 pkt->client.port = cpu_to_le32(ipc->us.sq_port);
451
487 skb_set_owner_w(skb, &ipc->sk); 452 skb_set_owner_w(skb, &ipc->sk);
488 qrtr_bcast_enqueue(NULL, skb, QRTR_TYPE_DEL_CLIENT, &ipc->us, 453 qrtr_bcast_enqueue(NULL, skb, QRTR_TYPE_DEL_CLIENT, &ipc->us,
489 &to); 454 &to);