@@ -48,6 +48,16 @@ struct qrtr_hdr {
48
48
__le32 dst_port_id ;
49
49
} __packed ;
50
50
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
+
51
61
#define QRTR_HDR_SIZE sizeof(struct qrtr_hdr)
52
62
53
63
struct qrtr_sock {
@@ -216,6 +226,7 @@ int qrtr_endpoint_post(struct qrtr_endpoint *ep, const void *data, size_t len)
216
226
struct qrtr_node * node = ep -> node ;
217
227
const struct qrtr_hdr * phdr = data ;
218
228
struct sk_buff * skb ;
229
+ struct qrtr_cb * cb ;
219
230
unsigned int psize ;
220
231
unsigned int size ;
221
232
unsigned int type ;
@@ -245,8 +256,15 @@ int qrtr_endpoint_post(struct qrtr_endpoint *ep, const void *data, size_t len)
245
256
if (!skb )
246
257
return - ENOMEM ;
247
258
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 );
250
268
251
269
skb_queue_tail (& node -> rx_queue , skb );
252
270
schedule_work (& node -> work );
@@ -295,26 +313,20 @@ static void qrtr_node_rx_work(struct work_struct *work)
295
313
struct sk_buff * skb ;
296
314
297
315
while ((skb = skb_dequeue (& node -> rx_queue )) != NULL ) {
298
- const struct qrtr_hdr * phdr ;
299
- u32 dst_node , dst_port ;
300
316
struct qrtr_sock * ipc ;
301
- u32 src_node ;
317
+ struct qrtr_cb * cb ;
302
318
int confirm ;
303
319
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 ;
309
326
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 );
314
328
315
- qrtr_node_assign (node , src_node );
316
-
317
- ipc = qrtr_port_lookup (dst_port );
329
+ ipc = qrtr_port_lookup (cb -> dst_port );
318
330
if (!ipc ) {
319
331
kfree_skb (skb );
320
332
} else {
@@ -604,19 +616,17 @@ static int qrtr_local_enqueue(struct qrtr_node *node, struct sk_buff *skb,
604
616
struct sockaddr_qrtr * to )
605
617
{
606
618
struct qrtr_sock * ipc ;
607
- struct qrtr_hdr * phdr ;
619
+ struct qrtr_cb * cb ;
608
620
609
621
ipc = qrtr_port_lookup (to -> sq_port );
610
622
if (!ipc || & ipc -> sk == skb -> sk ) { /* do not send to self */
611
623
kfree_skb (skb );
612
624
return - ENODEV ;
613
625
}
614
626
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 ;
620
630
621
631
if (sock_queue_rcv_skb (& ipc -> sk , skb )) {
622
632
qrtr_port_put (ipc );
@@ -750,9 +760,9 @@ static int qrtr_recvmsg(struct socket *sock, struct msghdr *msg,
750
760
size_t size , int flags )
751
761
{
752
762
DECLARE_SOCKADDR (struct sockaddr_qrtr * , addr , msg -> msg_name );
753
- const struct qrtr_hdr * phdr ;
754
763
struct sock * sk = sock -> sk ;
755
764
struct sk_buff * skb ;
765
+ struct qrtr_cb * cb ;
756
766
int copied , rc ;
757
767
758
768
lock_sock (sk );
@@ -769,22 +779,22 @@ static int qrtr_recvmsg(struct socket *sock, struct msghdr *msg,
769
779
return rc ;
770
780
}
771
781
772
- phdr = (const struct qrtr_hdr * )skb_transport_header (skb );
773
- copied = le32_to_cpu (phdr -> size );
782
+ copied = skb -> len ;
774
783
if (copied > size ) {
775
784
copied = size ;
776
785
msg -> msg_flags |= MSG_TRUNC ;
777
786
}
778
787
779
- rc = skb_copy_datagram_msg (skb , QRTR_HDR_SIZE , msg , copied );
788
+ rc = skb_copy_datagram_msg (skb , 0 , msg , copied );
780
789
if (rc < 0 )
781
790
goto out ;
782
791
rc = copied ;
783
792
784
793
if (addr ) {
794
+ cb = (struct qrtr_cb * )skb -> cb ;
785
795
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 ;
788
798
msg -> msg_namelen = sizeof (* addr );
789
799
}
790
800
@@ -877,7 +887,7 @@ static int qrtr_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
877
887
case TIOCINQ :
878
888
skb = skb_peek (& sk -> sk_receive_queue );
879
889
if (skb )
880
- len = skb -> len - QRTR_HDR_SIZE ;
890
+ len = skb -> len ;
881
891
rc = put_user (len , (int __user * )argp );
882
892
break ;
883
893
case SIOCGIFADDR :
0 commit comments