@@ -276,47 +276,73 @@ static const struct udpopt {
276
276
__u16 dyn_ports ;
277
277
__u16 threads ;
278
278
__u16 interval ;
279
+ __u16 pkt_size ;
279
280
} defaults_udp = {
280
281
.interval = 1 ,
281
282
.threads = 1 ,
283
+ .pkt_size = 64 ,
282
284
};
283
285
284
- static int prepare_udp_pkt (const struct udpopt * cfg )
286
+ static struct udp_packet * prepare_udp_pkt (const struct udpopt * cfg )
285
287
{
286
288
struct mac_addr src_mac = cfg -> src_mac ;
289
+ struct udp_packet * pkt = NULL ;
290
+ __u16 payload_len ;
287
291
int err ;
288
292
289
293
if (macaddr_is_null (& src_mac )) {
290
294
err = get_mac_addr (cfg -> iface .ifindex , & src_mac );
291
295
if (err )
292
- return err ;
296
+ goto err ;
297
+ }
298
+
299
+ if (cfg -> pkt_size < sizeof (* pkt )) {
300
+ pr_warn ("Mininum packet size is %zu bytes\n" , sizeof (* pkt ));
301
+ goto err ;
293
302
}
294
- memcpy (pkt_udp .eth .h_source , & src_mac , sizeof (src_mac ));
303
+
304
+
305
+ pkt = calloc (1 , cfg -> pkt_size );
306
+ if (!pkt )
307
+ goto err ;
308
+
309
+ memcpy (pkt , & pkt_udp , sizeof (* pkt ));
310
+
311
+ payload_len = cfg -> pkt_size - offsetof(struct udp_packet , udp );
312
+ pkt -> iph .payload_len = bpf_htons (payload_len );
313
+ pkt -> udp .len = bpf_htons (payload_len );
314
+
315
+ memcpy (pkt -> eth .h_source , & src_mac , sizeof (src_mac ));
295
316
if (!macaddr_is_null (& cfg -> dst_mac ))
296
- memcpy (pkt_udp . eth .h_dest , & cfg -> dst_mac , sizeof (cfg -> dst_mac ));
317
+ memcpy (pkt -> eth .h_dest , & cfg -> dst_mac , sizeof (cfg -> dst_mac ));
297
318
298
319
if (!ipaddr_is_null (& cfg -> src_ip )) {
299
320
if (cfg -> src_ip .af != AF_INET6 ) {
300
321
pr_warn ("Only IPv6 is supported\n" );
301
- return 1 ;
322
+ goto err ;
302
323
}
303
- pkt_udp . iph .saddr = cfg -> src_ip .addr .addr6 ;
324
+ pkt -> iph .saddr = cfg -> src_ip .addr .addr6 ;
304
325
}
305
326
306
327
if (!ipaddr_is_null (& cfg -> dst_ip )) {
307
328
if (cfg -> dst_ip .af != AF_INET6 ) {
308
329
pr_warn ("Only IPv6 is supported\n" );
309
- return 1 ;
330
+ goto err ;
310
331
}
311
- pkt_udp . iph .daddr = cfg -> dst_ip .addr .addr6 ;
332
+ pkt -> iph .daddr = cfg -> dst_ip .addr .addr6 ;
312
333
}
313
334
314
335
if (cfg -> src_port )
315
- pkt_udp . udp .source = bpf_htons (cfg -> src_port );
336
+ pkt -> udp .source = bpf_htons (cfg -> src_port );
316
337
if (cfg -> dst_port )
317
- pkt_udp .udp .dest = bpf_htons (cfg -> dst_port );
318
- pkt_udp .udp .check = calc_udp_cksum (& pkt_udp );
319
- return 0 ;
338
+ pkt -> udp .dest = bpf_htons (cfg -> dst_port );
339
+ pkt -> udp .check = calc_udp_cksum (pkt );
340
+
341
+ return pkt ;
342
+
343
+ err :
344
+ free (pkt );
345
+ return NULL ;
320
346
}
321
347
322
348
static struct prog_option udp_options [] = {
@@ -352,6 +378,10 @@ static struct prog_option udp_options[] = {
352
378
.short_opt = 'n' ,
353
379
.metavar = "<port>" ,
354
380
.help = "Number of packets to send" ),
381
+ DEFINE_OPTION ("pkt-size" , OPT_U16 , struct udpopt , pkt_size ,
382
+ .short_opt = 's' ,
383
+ .metavar = "<bytes>" ,
384
+ .help = "Packet size. Default 64." ),
355
385
DEFINE_OPTION ("threads" , OPT_U16 , struct udpopt , threads ,
356
386
.short_opt = 't' ,
357
387
.metavar = "<threads>" ,
@@ -374,12 +404,12 @@ int do_udp(const void *opt, __unused const char *pin_root_path)
374
404
375
405
DECLARE_LIBXDP_OPTS (xdp_program_opts , opts );
376
406
struct thread_config * t = NULL , tcfg = {
377
- .pkt = & pkt_udp ,
378
- .pkt_size = sizeof (pkt_udp ),
407
+ .pkt_size = cfg -> pkt_size ,
379
408
.num_pkts = cfg -> num_pkts ,
380
409
};
381
410
struct trafficgen_state bpf_state = {};
382
411
struct xdp_trafficgen * skel = NULL ;
412
+ struct udp_packet * payload = NULL ;
383
413
pthread_t * runner_threads = NULL ;
384
414
struct xdp_program * prog = NULL ;
385
415
int err = 0 , i ;
@@ -390,9 +420,12 @@ int do_udp(const void *opt, __unused const char *pin_root_path)
390
420
if (err )
391
421
return err ;
392
422
393
- err = prepare_udp_pkt (cfg );
394
- if (err )
423
+ payload = prepare_udp_pkt (cfg );
424
+ if (!payload ) {
425
+ err = - ENOMEM ;
395
426
goto out ;
427
+ }
428
+ tcfg .pkt = payload ;
396
429
397
430
skel = xdp_trafficgen__open ();
398
431
if (!skel ) {
@@ -463,6 +496,7 @@ int do_udp(const void *opt, __unused const char *pin_root_path)
463
496
xdp_program__close (prog );
464
497
xdp_trafficgen__destroy (skel );
465
498
free (runner_threads );
499
+ free (payload );
466
500
free (t );
467
501
return err ;
468
502
}
0 commit comments