@@ -169,10 +169,10 @@ mod recvfrom {
169
169
170
170
const MSG : & ' static [ u8 ] = b"Hello, World!" ;
171
171
172
- fn sendrecv < Fs , Fr > ( rsock : RawFd , ssock : RawFd , f_send : Fs , f_recv : Fr ) -> Option < SockAddr >
172
+ fn sendrecv < Fs , Fr > ( rsock : RawFd , ssock : RawFd , f_send : Fs , mut f_recv : Fr ) -> Option < SockAddr >
173
173
where
174
174
Fs : Fn ( RawFd , & [ u8 ] , MsgFlags ) -> Result < usize > + Send + ' static ,
175
- Fr : Fn ( usize , Option < SockAddr > ) ,
175
+ Fr : FnMut ( usize , Option < SockAddr > ) ,
176
176
{
177
177
let mut buf: [ u8 ; 13 ] = [ 0u8 ; 13 ] ;
178
178
let mut l = 0 ;
@@ -240,6 +240,11 @@ mod recvfrom {
240
240
pub fn gso ( ) {
241
241
require_kernel_version ! ( udp_offload:: gso, ">= 4.18" ) ;
242
242
243
+ // In this test, we send the data and provide a GSO segment size.
244
+ // Since we are sending the buffer of size 13, six UDP packets
245
+ // with size 2 and two UDP packet with size 1 will be sent.
246
+ let segment_size: u16 = 2 ;
247
+
243
248
let std_sa = SocketAddr :: from_str ( "127.0.0.1:6791" ) . unwrap ( ) ;
244
249
let inet_addr = InetAddr :: from_std ( & std_sa) ;
245
250
let sock_addr = SockAddr :: new_inet ( inet_addr) ;
@@ -249,9 +254,8 @@ mod recvfrom {
249
254
None
250
255
) . unwrap ( ) ;
251
256
252
- let segment_size = 2 ;
253
-
254
- setsockopt ( rsock, UdpGsoSegment , & segment_size) . expect ( "setsockopt UDP_SEGMENT failed" ) ;
257
+ setsockopt ( rsock, UdpGsoSegment , & ( segment_size as _ ) )
258
+ . expect ( "setsockopt UDP_SEGMENT failed" ) ;
255
259
256
260
bind ( rsock, & sock_addr) . unwrap ( ) ;
257
261
let ssock = socket (
@@ -261,48 +265,45 @@ mod recvfrom {
261
265
None ,
262
266
) . expect ( "send socket failed" ) ;
263
267
264
- let from = sendrecv ( rsock, ssock, move |s, m, flags| {
268
+ let mut num_packets_received: i32 = 0 ;
269
+
270
+ sendrecv ( rsock, ssock, move |s, m, flags| {
265
271
let iov = [ IoVec :: from_slice ( m) ] ;
266
- let cmsg = ControlMessage :: UdpGsoSegments ( & 2 ) ;
272
+ let cmsg = ControlMessage :: UdpGsoSegments ( & segment_size ) ;
267
273
sendmsg ( s, & iov, & [ cmsg] , flags, Some ( & sock_addr) )
268
- } , |len, _| {
269
- assert ! ( len <= segment_size as usize ) ;
274
+ } , {
275
+ let num_packets_received_ref = & mut num_packets_received;
276
+
277
+ move |len, _| {
278
+ // check that we receive UDP packets with payload size
279
+ // less or equal to segment size
280
+ assert ! ( len <= segment_size as usize ) ;
281
+ * num_packets_received_ref += 1 ;
282
+ }
270
283
} ) ;
271
- // UDP sockets should set the from address
272
- assert_eq ! ( AddressFamily :: Inet , from. unwrap( ) . family( ) ) ;
284
+
285
+ // Buffer size is 13, we will receive six packets of size 2,
286
+ // and one packet of size 1.
287
+ assert_eq ! ( 7 , num_packets_received) ;
273
288
}
274
289
275
290
#[ test]
276
291
pub fn gro ( ) {
277
292
require_kernel_version ! ( udp_offload:: gro, ">= 5.3" ) ;
278
293
294
+ // It's hard to guarantee receiving GRO packets. Just checking
295
+ // that `setsockopt` doesn't fail with error
296
+
279
297
let std_sa = SocketAddr :: from_str ( "127.0.0.1:6792" ) . unwrap ( ) ;
280
298
let inet_addr = InetAddr :: from_std ( & std_sa) ;
281
- let sock_addr = SockAddr :: new_inet ( inet_addr) ;
282
299
let rsock = socket ( AddressFamily :: Inet ,
283
300
SockType :: Datagram ,
284
301
SockFlag :: empty ( ) ,
285
302
None
286
- ) . unwrap ( ) ;
287
-
288
- setsockopt ( rsock, UdpGroSegment , & true ) . expect ( "setsockopt UDP_GRO failed" ) ;
289
-
290
- bind ( rsock, & sock_addr) . unwrap ( ) ;
291
- let ssock = socket (
292
- AddressFamily :: Inet ,
293
- SockType :: Datagram ,
294
- SockFlag :: empty ( ) ,
295
- None ,
296
- ) . expect ( "send socket failed" ) ;
297
-
298
- let from = sendrecv ( rsock, ssock, move |s, m, flags| {
299
- let iov = [ IoVec :: from_slice ( m) ] ;
300
- let cmsg = ControlMessage :: UdpGsoSegments ( & 2 ) ;
301
- sendmsg ( s, & iov, & [ cmsg] , flags, Some ( & sock_addr) )
302
- } , |_, _| { } ) ;
303
+ ) . unwrap ( ) ; I
303
304
304
- // UDP sockets should set the from address
305
- assert_eq ! ( AddressFamily :: Inet , from . unwrap ( ) . family ( ) ) ;
305
+ setsockopt ( rsock , UdpGroSegment , & true )
306
+ . expect ( "setsockopt UDP_GRO failed" ) ;
306
307
}
307
308
}
308
309
}
0 commit comments