13
13
#include <linux/export.h>
14
14
#include <net/sock.h>
15
15
#include <net/af_rxrpc.h>
16
+ #include <net/udp.h>
16
17
#include "ar-internal.h"
17
18
18
19
struct rxrpc_ack_buffer {
@@ -23,6 +24,19 @@ struct rxrpc_ack_buffer {
23
24
struct rxrpc_ackinfo ackinfo ;
24
25
};
25
26
27
+ extern int udpv6_sendmsg (struct sock * sk , struct msghdr * msg , size_t len );
28
+
29
+ static ssize_t do_udp_sendmsg (struct socket * sk , struct msghdr * msg , size_t len )
30
+ {
31
+ #if IS_ENABLED (CONFIG_AF_RXRPC_IPV6 )
32
+ struct sockaddr * sa = msg -> msg_name ;
33
+
34
+ if (sa -> sa_family == AF_INET6 )
35
+ return udpv6_sendmsg (sk -> sk , msg , len );
36
+ #endif
37
+ return udp_sendmsg (sk -> sk , msg , len );
38
+ }
39
+
26
40
struct rxrpc_abort_buffer {
27
41
struct rxrpc_wire_header whdr ;
28
42
__be32 abort_code ;
@@ -258,8 +272,10 @@ int rxrpc_send_ack_packet(struct rxrpc_call *call, bool ping,
258
272
rtt_slot = rxrpc_begin_rtt_probe (call , serial , rxrpc_rtt_tx_ping );
259
273
260
274
rxrpc_inc_stat (call -> rxnet , stat_tx_ack_send );
261
- ret = kernel_sendmsg (conn -> params .local -> socket , & msg , iov , 2 , len );
262
- conn -> params .peer -> last_tx_at = ktime_get_seconds ();
275
+
276
+ iov_iter_kvec (& msg .msg_iter , WRITE , iov , 2 , len );
277
+ ret = do_udp_sendmsg (conn -> params .local -> socket , & msg , len );
278
+ call -> peer -> last_tx_at = ktime_get_seconds ();
263
279
if (ret < 0 )
264
280
trace_rxrpc_tx_fail (call -> debug_id , serial , ret ,
265
281
rxrpc_tx_point_call_ack );
@@ -336,8 +352,8 @@ int rxrpc_send_abort_packet(struct rxrpc_call *call)
336
352
serial = atomic_inc_return (& conn -> serial );
337
353
pkt .whdr .serial = htonl (serial );
338
354
339
- ret = kernel_sendmsg ( conn -> params . local -> socket ,
340
- & msg , iov , 1 , sizeof (pkt ));
355
+ iov_iter_kvec ( & msg . msg_iter , WRITE , iov , 1 , sizeof ( pkt ));
356
+ ret = do_udp_sendmsg ( conn -> params . local -> socket , & msg , sizeof (pkt ));
341
357
conn -> params .peer -> last_tx_at = ktime_get_seconds ();
342
358
if (ret < 0 )
343
359
trace_rxrpc_tx_fail (call -> debug_id , serial , ret ,
@@ -397,6 +413,7 @@ int rxrpc_send_data_packet(struct rxrpc_call *call, struct sk_buff *skb,
397
413
iov [1 ].iov_base = skb -> head ;
398
414
iov [1 ].iov_len = skb -> len ;
399
415
len = iov [0 ].iov_len + iov [1 ].iov_len ;
416
+ iov_iter_kvec (& msg .msg_iter , WRITE , iov , 2 , len );
400
417
401
418
msg .msg_name = & call -> peer -> srx .transport ;
402
419
msg .msg_namelen = call -> peer -> srx .transport_len ;
@@ -469,7 +486,7 @@ int rxrpc_send_data_packet(struct rxrpc_call *call, struct sk_buff *skb,
469
486
* message and update the peer record
470
487
*/
471
488
rxrpc_inc_stat (call -> rxnet , stat_tx_data_send );
472
- ret = kernel_sendmsg (conn -> params .local -> socket , & msg , iov , 2 , len );
489
+ ret = do_udp_sendmsg (conn -> params .local -> socket , & msg , len );
473
490
conn -> params .peer -> last_tx_at = ktime_get_seconds ();
474
491
475
492
up_read (& conn -> params .local -> defrag_sem );
@@ -545,8 +562,7 @@ int rxrpc_send_data_packet(struct rxrpc_call *call, struct sk_buff *skb,
545
562
ip_sock_set_mtu_discover (conn -> params .local -> socket -> sk ,
546
563
IP_PMTUDISC_DONT );
547
564
rxrpc_inc_stat (call -> rxnet , stat_tx_data_send_frag );
548
- ret = kernel_sendmsg (conn -> params .local -> socket , & msg ,
549
- iov , 2 , len );
565
+ ret = do_udp_sendmsg (conn -> params .local -> socket , & msg , len );
550
566
conn -> params .peer -> last_tx_at = ktime_get_seconds ();
551
567
552
568
ip_sock_set_mtu_discover (conn -> params .local -> socket -> sk ,
@@ -632,8 +648,8 @@ void rxrpc_reject_packets(struct rxrpc_local *local)
632
648
whdr .flags ^= RXRPC_CLIENT_INITIATED ;
633
649
whdr .flags &= RXRPC_CLIENT_INITIATED ;
634
650
635
- ret = kernel_sendmsg ( local -> socket , & msg ,
636
- iov , ioc , size );
651
+ iov_iter_kvec ( & msg . msg_iter , WRITE , iov , ioc , size );
652
+ ret = do_udp_sendmsg ( local -> socket , & msg , size );
637
653
if (ret < 0 )
638
654
trace_rxrpc_tx_fail (local -> debug_id , 0 , ret ,
639
655
rxrpc_tx_point_reject );
@@ -688,7 +704,8 @@ void rxrpc_send_keepalive(struct rxrpc_peer *peer)
688
704
689
705
_proto ("Tx VERSION (keepalive)" );
690
706
691
- ret = kernel_sendmsg (peer -> local -> socket , & msg , iov , 2 , len );
707
+ iov_iter_kvec (& msg .msg_iter , WRITE , iov , 2 , len );
708
+ ret = do_udp_sendmsg (peer -> local -> socket , & msg , len );
692
709
if (ret < 0 )
693
710
trace_rxrpc_tx_fail (peer -> debug_id , 0 , ret ,
694
711
rxrpc_tx_point_version_keepalive );
0 commit comments