diff options
author | Bjorn Andersson <bjorn.andersson@linaro.org> | 2017-10-11 02:45:21 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-10-11 18:28:38 -0400 |
commit | 1a7959c76641674991ba3a49f25432f1e105391e (patch) | |
tree | c8a52ea573b8159676b2fa7f7d7efbc831e67c4d /net/qrtr | |
parent | e7044482c8ac5081f4775063995647787d5082a4 (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.c | 93 |
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 | } |
256 | EXPORT_SYMBOL_GPL(qrtr_endpoint_post); | 256 | EXPORT_SYMBOL_GPL(qrtr_endpoint_post); |
257 | 257 | ||
258 | static 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 | */ | ||
267 | static 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. */ | ||
273 | static 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 */ | ||
294 | static 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 | |||
311 | static 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); | |||
337 | static void qrtr_node_rx_work(struct work_struct *work) | 289 | static 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. */ |
475 | static void qrtr_port_remove(struct qrtr_sock *ipc) | 435 | static 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); |