@@ -338,7 +338,7 @@ EXPORT_SYMBOL(rxrpc_kernel_abort_call);
338
338
/*
339
339
* send a packet through the transport endpoint
340
340
*/
341
- int rxrpc_send_packet (struct rxrpc_transport * trans , struct sk_buff * skb )
341
+ int rxrpc_send_data_packet (struct rxrpc_connection * conn , struct sk_buff * skb )
342
342
{
343
343
struct kvec iov [1 ];
344
344
struct msghdr msg ;
@@ -349,52 +349,59 @@ int rxrpc_send_packet(struct rxrpc_transport *trans, struct sk_buff *skb)
349
349
iov [0 ].iov_base = skb -> head ;
350
350
iov [0 ].iov_len = skb -> len ;
351
351
352
- msg .msg_name = & trans -> peer -> srx .transport . sin ;
353
- msg .msg_namelen = sizeof ( trans -> peer -> srx .transport . sin ) ;
352
+ msg .msg_name = & conn -> params . peer -> srx .transport ;
353
+ msg .msg_namelen = conn -> params . peer -> srx .transport_len ;
354
354
msg .msg_control = NULL ;
355
355
msg .msg_controllen = 0 ;
356
356
msg .msg_flags = 0 ;
357
357
358
358
/* send the packet with the don't fragment bit set if we currently
359
359
* think it's small enough */
360
- if (skb -> len - sizeof (struct rxrpc_wire_header ) < trans -> peer -> maxdata ) {
361
- down_read (& trans -> local -> defrag_sem );
360
+ if (skb -> len - sizeof (struct rxrpc_wire_header ) < conn -> params . peer -> maxdata ) {
361
+ down_read (& conn -> params . local -> defrag_sem );
362
362
/* send the packet by UDP
363
363
* - returns -EMSGSIZE if UDP would have to fragment the packet
364
364
* to go out of the interface
365
365
* - in which case, we'll have processed the ICMP error
366
366
* message and update the peer record
367
367
*/
368
- ret = kernel_sendmsg (trans -> local -> socket , & msg , iov , 1 ,
368
+ ret = kernel_sendmsg (conn -> params . local -> socket , & msg , iov , 1 ,
369
369
iov [0 ].iov_len );
370
370
371
- up_read (& trans -> local -> defrag_sem );
371
+ up_read (& conn -> params . local -> defrag_sem );
372
372
if (ret == - EMSGSIZE )
373
373
goto send_fragmentable ;
374
374
375
- _leave (" = %d [%u]" , ret , trans -> peer -> maxdata );
375
+ _leave (" = %d [%u]" , ret , conn -> params . peer -> maxdata );
376
376
return ret ;
377
377
}
378
378
379
379
send_fragmentable :
380
380
/* attempt to send this message with fragmentation enabled */
381
381
_debug ("send fragment" );
382
382
383
- down_write (& trans -> local -> defrag_sem );
384
- opt = IP_PMTUDISC_DONT ;
385
- ret = kernel_setsockopt (trans -> local -> socket , SOL_IP , IP_MTU_DISCOVER ,
386
- (char * ) & opt , sizeof (opt ));
387
- if (ret == 0 ) {
388
- ret = kernel_sendmsg (trans -> local -> socket , & msg , iov , 1 ,
389
- iov [0 ].iov_len );
390
-
391
- opt = IP_PMTUDISC_DO ;
392
- kernel_setsockopt (trans -> local -> socket , SOL_IP ,
393
- IP_MTU_DISCOVER , (char * ) & opt , sizeof (opt ));
383
+ down_write (& conn -> params .local -> defrag_sem );
384
+
385
+ switch (conn -> params .local -> srx .transport .family ) {
386
+ case AF_INET :
387
+ opt = IP_PMTUDISC_DONT ;
388
+ ret = kernel_setsockopt (conn -> params .local -> socket ,
389
+ SOL_IP , IP_MTU_DISCOVER ,
390
+ (char * )& opt , sizeof (opt ));
391
+ if (ret == 0 ) {
392
+ ret = kernel_sendmsg (conn -> params .local -> socket , & msg , iov , 1 ,
393
+ iov [0 ].iov_len );
394
+
395
+ opt = IP_PMTUDISC_DO ;
396
+ kernel_setsockopt (conn -> params .local -> socket , SOL_IP ,
397
+ IP_MTU_DISCOVER ,
398
+ (char * )& opt , sizeof (opt ));
399
+ }
400
+ break ;
394
401
}
395
402
396
- up_write (& trans -> local -> defrag_sem );
397
- _leave (" = %d [frag %u]" , ret , trans -> peer -> maxdata );
403
+ up_write (& conn -> params . local -> defrag_sem );
404
+ _leave (" = %d [frag %u]" , ret , conn -> params . peer -> maxdata );
398
405
return ret ;
399
406
}
400
407
@@ -506,7 +513,7 @@ static void rxrpc_queue_packet(struct rxrpc_call *call, struct sk_buff *skb,
506
513
if (try_to_del_timer_sync (& call -> ack_timer ) >= 0 ) {
507
514
/* the packet may be freed by rxrpc_process_call() before this
508
515
* returns */
509
- ret = rxrpc_send_packet (call -> conn -> trans , skb );
516
+ ret = rxrpc_send_data_packet (call -> conn , skb );
510
517
_net ("sent skb %p" , skb );
511
518
} else {
512
519
_debug ("failed to delete ACK timer" );
0 commit comments