Skip to content

Commit f507a9b

Browse files
anderssondavem330
authored andcommitted
net: qrtr: Use sk_buff->cb in receive path
Rather than parsing the header of incoming messages throughout the implementation do it once when we retrieve the message and store the relevant information in the "cb" member of the sk_buff. This allows us to, in a later commit, decode version 2 messages into this same structure. Signed-off-by: Bjorn Andersson <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 1a7959c commit f507a9b

File tree

1 file changed

+40
-30
lines changed

1 file changed

+40
-30
lines changed

net/qrtr/qrtr.c

Lines changed: 40 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,16 @@ struct qrtr_hdr {
4848
__le32 dst_port_id;
4949
} __packed;
5050

51+
struct qrtr_cb {
52+
u32 src_node;
53+
u32 src_port;
54+
u32 dst_node;
55+
u32 dst_port;
56+
57+
u8 type;
58+
u8 confirm_rx;
59+
};
60+
5161
#define QRTR_HDR_SIZE sizeof(struct qrtr_hdr)
5262

5363
struct qrtr_sock {
@@ -216,6 +226,7 @@ int qrtr_endpoint_post(struct qrtr_endpoint *ep, const void *data, size_t len)
216226
struct qrtr_node *node = ep->node;
217227
const struct qrtr_hdr *phdr = data;
218228
struct sk_buff *skb;
229+
struct qrtr_cb *cb;
219230
unsigned int psize;
220231
unsigned int size;
221232
unsigned int type;
@@ -245,8 +256,15 @@ int qrtr_endpoint_post(struct qrtr_endpoint *ep, const void *data, size_t len)
245256
if (!skb)
246257
return -ENOMEM;
247258

248-
skb_reset_transport_header(skb);
249-
skb_put_data(skb, data, len);
259+
cb = (struct qrtr_cb *)skb->cb;
260+
cb->src_node = le32_to_cpu(phdr->src_node_id);
261+
cb->src_port = le32_to_cpu(phdr->src_port_id);
262+
cb->dst_node = le32_to_cpu(phdr->dst_node_id);
263+
cb->dst_port = le32_to_cpu(phdr->dst_port_id);
264+
cb->type = type;
265+
cb->confirm_rx = !!phdr->confirm_rx;
266+
267+
skb_put_data(skb, data + QRTR_HDR_SIZE, size);
250268

251269
skb_queue_tail(&node->rx_queue, skb);
252270
schedule_work(&node->work);
@@ -295,26 +313,20 @@ static void qrtr_node_rx_work(struct work_struct *work)
295313
struct sk_buff *skb;
296314

297315
while ((skb = skb_dequeue(&node->rx_queue)) != NULL) {
298-
const struct qrtr_hdr *phdr;
299-
u32 dst_node, dst_port;
300316
struct qrtr_sock *ipc;
301-
u32 src_node;
317+
struct qrtr_cb *cb;
302318
int confirm;
303319

304-
phdr = (const struct qrtr_hdr *)skb_transport_header(skb);
305-
src_node = le32_to_cpu(phdr->src_node_id);
306-
dst_node = le32_to_cpu(phdr->dst_node_id);
307-
dst_port = le32_to_cpu(phdr->dst_port_id);
308-
confirm = !!phdr->confirm_rx;
320+
cb = (struct qrtr_cb *)skb->cb;
321+
src.sq_node = cb->src_node;
322+
src.sq_port = cb->src_port;
323+
dst.sq_node = cb->dst_node;
324+
dst.sq_port = cb->dst_port;
325+
confirm = !!cb->confirm_rx;
309326

310-
src.sq_node = src_node;
311-
src.sq_port = le32_to_cpu(phdr->src_port_id);
312-
dst.sq_node = dst_node;
313-
dst.sq_port = dst_port;
327+
qrtr_node_assign(node, cb->src_node);
314328

315-
qrtr_node_assign(node, src_node);
316-
317-
ipc = qrtr_port_lookup(dst_port);
329+
ipc = qrtr_port_lookup(cb->dst_port);
318330
if (!ipc) {
319331
kfree_skb(skb);
320332
} else {
@@ -604,19 +616,17 @@ static int qrtr_local_enqueue(struct qrtr_node *node, struct sk_buff *skb,
604616
struct sockaddr_qrtr *to)
605617
{
606618
struct qrtr_sock *ipc;
607-
struct qrtr_hdr *phdr;
619+
struct qrtr_cb *cb;
608620

609621
ipc = qrtr_port_lookup(to->sq_port);
610622
if (!ipc || &ipc->sk == skb->sk) { /* do not send to self */
611623
kfree_skb(skb);
612624
return -ENODEV;
613625
}
614626

615-
phdr = skb_push(skb, QRTR_HDR_SIZE);
616-
skb_reset_transport_header(skb);
617-
618-
phdr->src_node_id = cpu_to_le32(from->sq_node);
619-
phdr->src_port_id = cpu_to_le32(from->sq_port);
627+
cb = (struct qrtr_cb *)skb->cb;
628+
cb->src_node = from->sq_node;
629+
cb->src_port = from->sq_port;
620630

621631
if (sock_queue_rcv_skb(&ipc->sk, skb)) {
622632
qrtr_port_put(ipc);
@@ -750,9 +760,9 @@ static int qrtr_recvmsg(struct socket *sock, struct msghdr *msg,
750760
size_t size, int flags)
751761
{
752762
DECLARE_SOCKADDR(struct sockaddr_qrtr *, addr, msg->msg_name);
753-
const struct qrtr_hdr *phdr;
754763
struct sock *sk = sock->sk;
755764
struct sk_buff *skb;
765+
struct qrtr_cb *cb;
756766
int copied, rc;
757767

758768
lock_sock(sk);
@@ -769,22 +779,22 @@ static int qrtr_recvmsg(struct socket *sock, struct msghdr *msg,
769779
return rc;
770780
}
771781

772-
phdr = (const struct qrtr_hdr *)skb_transport_header(skb);
773-
copied = le32_to_cpu(phdr->size);
782+
copied = skb->len;
774783
if (copied > size) {
775784
copied = size;
776785
msg->msg_flags |= MSG_TRUNC;
777786
}
778787

779-
rc = skb_copy_datagram_msg(skb, QRTR_HDR_SIZE, msg, copied);
788+
rc = skb_copy_datagram_msg(skb, 0, msg, copied);
780789
if (rc < 0)
781790
goto out;
782791
rc = copied;
783792

784793
if (addr) {
794+
cb = (struct qrtr_cb *)skb->cb;
785795
addr->sq_family = AF_QIPCRTR;
786-
addr->sq_node = le32_to_cpu(phdr->src_node_id);
787-
addr->sq_port = le32_to_cpu(phdr->src_port_id);
796+
addr->sq_node = cb->src_node;
797+
addr->sq_port = cb->src_port;
788798
msg->msg_namelen = sizeof(*addr);
789799
}
790800

@@ -877,7 +887,7 @@ static int qrtr_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
877887
case TIOCINQ:
878888
skb = skb_peek(&sk->sk_receive_queue);
879889
if (skb)
880-
len = skb->len - QRTR_HDR_SIZE;
890+
len = skb->len;
881891
rc = put_user(len, (int __user *)argp);
882892
break;
883893
case SIOCGIFADDR:

0 commit comments

Comments
 (0)