@@ -383,6 +383,271 @@ impl RecvFlags {
383
383
}
384
384
}
385
385
386
+ /// Flags for network package timestamping configuration of a socket
387
+ ///
388
+ /// On Unix flags are set at the `SOL_SOCKET` level and the `SO_TIMESTAMPING`
389
+ /// option
390
+ /// On Windows flags are set using `WSAIoctl` and the `SOI_TIMESTAMPING` option
391
+ #[ cfg( not( any(
392
+ target_os = "dragonfly" ,
393
+ target_os = "freebsd" ,
394
+ target_os = "haiku" ,
395
+ target_os = "illumos" ,
396
+ target_os = "ios" ,
397
+ target_os = "macos" ,
398
+ target_os = "netbsd" ,
399
+ target_os = "nto" ,
400
+ target_os = "openbsd" ,
401
+ target_os = "solaris" ,
402
+ target_os = "tvos" ,
403
+ target_os = "watchos" ,
404
+ target_os = "redox" ,
405
+ target_os = "fuchsia" ,
406
+ target_os = "vita" ,
407
+ target_os = "hurd" ,
408
+ ) ) ) ]
409
+ #[ cfg_attr(
410
+ docsrs,
411
+ doc( cfg( not( any(
412
+ target_os = "dragonfly" ,
413
+ target_os = "freebsd" ,
414
+ target_os = "haiku" ,
415
+ target_os = "illumos" ,
416
+ target_os = "ios" ,
417
+ target_os = "macos" ,
418
+ target_os = "netbsd" ,
419
+ target_os = "nto" ,
420
+ target_os = "openbsd" ,
421
+ target_os = "solaris" ,
422
+ target_os = "tvos" ,
423
+ target_os = "watchos" ,
424
+ target_os = "redox" ,
425
+ target_os = "fuchsia" ,
426
+ target_os = "vita" ,
427
+ target_os = "hurd" ,
428
+ ) ) ) )
429
+ ) ]
430
+ #[ derive( Default , Debug , Copy , Clone , Eq , PartialEq ) ]
431
+ pub struct TimestampingFlags ( sys:: c_uint ) ;
432
+
433
+ #[ cfg( not( any(
434
+ target_os = "dragonfly" ,
435
+ target_os = "freebsd" ,
436
+ target_os = "haiku" ,
437
+ target_os = "illumos" ,
438
+ target_os = "ios" ,
439
+ target_os = "macos" ,
440
+ target_os = "netbsd" ,
441
+ target_os = "nto" ,
442
+ target_os = "openbsd" ,
443
+ target_os = "solaris" ,
444
+ target_os = "tvos" ,
445
+ target_os = "watchos" ,
446
+ target_os = "redox" ,
447
+ target_os = "fuchsia" ,
448
+ target_os = "vita" ,
449
+ target_os = "hurd" ,
450
+ ) ) ) ]
451
+ impl TimestampingFlags {
452
+ /// Creates a new instance of `TimestampingFlags` with no flags set
453
+ pub fn new ( ) -> Self {
454
+ Self ( 0 )
455
+ }
456
+
457
+ /// This flags controls if transmit timestamp reception should be enabled
458
+ ///
459
+ /// This flag is only used for datagram-based sockets,
460
+ /// not for stream sockets.
461
+ ///
462
+ /// On Unix this corresponds to the `TIMESTAMPING_FLAG_RX` flag.
463
+ #[ cfg( target_os = "windows" ) ]
464
+ #[ cfg_attr( docsrs, doc( cfg( target_os = "windows" ) ) ) ]
465
+ pub fn set_rx ( & mut self , active : bool ) {
466
+ self . set_flag ( sys:: TIMESTAMPING_FLAG_RX , active) ;
467
+ }
468
+
469
+ /// This flags controls if receive timestamp reception should be enabled
470
+ ///
471
+ /// This flag is only used for datagram-based sockets,
472
+ /// not for stream sockets.
473
+ ///
474
+ /// On Windows this corresponds to the `TIMESTAMPING_FLAG_TX` flag.
475
+ #[ cfg( target_os = "windows" ) ]
476
+ #[ cfg_attr( docsrs, doc( cfg( target_os = "windows" ) ) ) ]
477
+ pub fn set_tx ( & mut self , active : bool ) {
478
+ self . set_flag ( sys:: TIMESTAMPING_FLAG_TX , active) ;
479
+ }
480
+
481
+ /// This flags controls if rx timestamps should be generated by the network
482
+ /// adapter
483
+ ///
484
+ /// On Unix this corresponds to the `SOF_TIMESTAMPING_RX_HARDWARE` flag.
485
+ #[ cfg( not( target_os = "windows" ) ) ]
486
+ #[ cfg_attr( docsrs, doc( cfg( not( target_os = "windows" ) ) ) ) ]
487
+ pub fn set_rx_hardware_gen ( & mut self , active : bool ) {
488
+ self . set_flag ( sys:: SOF_TIMESTAMPING_RX_HARDWARE , active)
489
+ }
490
+
491
+ /// This flags controls if rx timestamps should be generated when a package
492
+ /// enters the kernel. These timestamps are generated just after a device
493
+ /// driver hands a packet to the kernel receive stack.
494
+ ///
495
+ /// On Unix this corresponds to the `SOF_TIMESTAMPING_RX_SOFTWARE` flag.
496
+ #[ cfg( not( target_os = "windows" ) ) ]
497
+ #[ cfg_attr( docsrs, doc( cfg( not( target_os = "windows" ) ) ) ) ]
498
+ pub fn set_rx_software_gen ( & mut self , active : bool ) {
499
+ self . set_flag ( sys:: SOF_TIMESTAMPING_RX_SOFTWARE , active)
500
+ }
501
+
502
+ /// This flags controls if tx timestamps should be generated by the network
503
+ /// adapter
504
+ ///
505
+ /// On Unix this corresponds to the `SOF_TIMESTAMPING_TX_HARDWARE` flag.
506
+ #[ cfg( not( target_os = "windows" ) ) ]
507
+ #[ cfg_attr( docsrs, doc( cfg( not( target_os = "windows" ) ) ) ) ]
508
+ pub fn set_tx_hardware_gen ( & mut self , active : bool ) {
509
+ self . set_flag ( sys:: SOF_TIMESTAMPING_TX_HARDWARE , active)
510
+ }
511
+
512
+ /// This flags controls if tx timestamps should be generated when a package
513
+ /// enters the kernel. These timestamps are generated just after a device
514
+ /// driver hands a packet to the kernel receive stack.
515
+ ///
516
+ /// On Unix this corresponds to the `SOF_TIMESTAMPING_TX_SOFTWARE` flag.
517
+ #[ cfg( not( target_os = "windows" ) ) ]
518
+ #[ cfg_attr( docsrs, doc( cfg( not( target_os = "windows" ) ) ) ) ]
519
+ pub fn set_tx_software_gen ( & mut self , active : bool ) {
520
+ self . set_flag ( sys:: SOF_TIMESTAMPING_TX_SOFTWARE , active)
521
+ }
522
+
523
+ /// This flags controls if tx timestamps should be generated prior to
524
+ /// entering the packet scheduler.
525
+ ///
526
+ /// On Unix this corresponds to the `SOF_TIMESTAMPING_TX_SCHED` flag.
527
+ #[ cfg( not( target_os = "windows" ) ) ]
528
+ #[ cfg_attr( docsrs, doc( cfg( not( target_os = "windows" ) ) ) ) ]
529
+ pub fn set_tx_sched_gen ( & mut self , active : bool ) {
530
+ self . set_flag ( sys:: SOF_TIMESTAMPING_TX_SCHED , active)
531
+ }
532
+
533
+ /// This flag controls if tx timestamps when all data in the send buffer
534
+ /// has been acknowledged
535
+ ///
536
+ /// This flag is only used for stream-based sockets,
537
+ /// not for datagram sockets.
538
+ ///
539
+ /// On Unix this corresponds to the `SOF_TIMESTAMPING_TX_ACK` flag.
540
+ #[ cfg( not( target_os = "windows" ) ) ]
541
+ #[ cfg_attr( docsrs, doc( cfg( not( target_os = "windows" ) ) ) ) ]
542
+ pub fn set_tx_ack_gen ( & mut self , active : bool ) {
543
+ self . set_flag ( sys:: SOF_TIMESTAMPING_TX_ACK , active)
544
+ }
545
+
546
+ /// This flag controls if any software generated timestamps should be
547
+ /// reported when available.
548
+ ///
549
+ /// On Unix this corresponds to the `SOF_TIMESTAMPING_SOFTWARE` flag.
550
+ #[ cfg( not( target_os = "windows" ) ) ]
551
+ #[ cfg_attr( docsrs, doc( cfg( not( target_os = "windows" ) ) ) ) ]
552
+ pub fn set_software_reporting ( & mut self , active : bool ) {
553
+ self . set_flag ( sys:: SOF_TIMESTAMPING_SOFTWARE , active)
554
+ }
555
+
556
+ /// This flag controls if any hardware generated timestamps such as
557
+ /// SOF_TIMESTAMPING_TX_HARDWARE should be reported when available.
558
+ ///
559
+ /// On Unix this corresponds to the `SOF_TIMESTAMPING_RAW_HARDWARE` flag.
560
+ #[ cfg( not( target_os = "windows" ) ) ]
561
+ #[ cfg_attr( docsrs, doc( cfg( not( target_os = "windows" ) ) ) ) ]
562
+ pub fn set_raw_hardware_reporting ( & mut self , active : bool ) {
563
+ self . set_flag ( sys:: SOF_TIMESTAMPING_RAW_HARDWARE , active)
564
+ }
565
+
566
+ /// This flag controls if a unique identifier should be generated for each
567
+ /// packet. For datagram sockets, the counter increments with each sent
568
+ /// packet. For stream sockets, it increments with every byte.
569
+ ///
570
+ /// This option is only implemented for transmit timestamps.
571
+ ///
572
+ /// On Unix this corresponds to the `SOF_TIMESTAMPING_OPT_ID` flag.
573
+ #[ cfg( not( target_os = "windows" ) ) ]
574
+ #[ cfg_attr( docsrs, doc( cfg( not( target_os = "windows" ) ) ) ) ]
575
+ pub fn set_opt_id ( & mut self , active : bool ) {
576
+ self . set_flag ( sys:: SOF_TIMESTAMPING_OPT_ID , active)
577
+ }
578
+
579
+ /// This flag controls if control messages should be supported for all
580
+ /// timestamped packets. This option enables `recv()` `cmsg` support for
581
+ /// IPv4 packets with transmit timestamps.
582
+ ///
583
+ /// On Unix this corresponds to the `SOF_TIMESTAMPING_OPT_CMSG` flag.
584
+ #[ cfg( not( target_os = "windows" ) ) ]
585
+ #[ cfg_attr( docsrs, doc( cfg( not( target_os = "windows" ) ) ) ) ]
586
+ pub fn set_opt_cmsg ( & mut self , active : bool ) {
587
+ self . set_flag ( sys:: SOF_TIMESTAMPING_OPT_CMSG , active)
588
+ }
589
+
590
+ /// This flag controls if the timestamp should be returned as a `cmsg`
591
+ /// alongside an empty packet, as opposed to alognside the original
592
+ /// packet.
593
+ ///
594
+ /// This option is only implemented for transmit timestamps.
595
+ /// This option disables `SOF_TIMESTAMPING_OPT_CMSG` flag set by
596
+ /// `set_opt_cmsg(bool)`
597
+ ///
598
+ /// On Unix this corresponds to the `SOF_TIMESTAMPING_OPT_TSONLY` flag.
599
+ #[ cfg( not( target_os = "windows" ) ) ]
600
+ #[ cfg_attr( docsrs, doc( cfg( not( target_os = "windows" ) ) ) ) ]
601
+ pub fn set_opt_tsonly ( & mut self , active : bool ) {
602
+ self . set_flag ( sys:: SOF_TIMESTAMPING_OPT_TSONLY , active)
603
+ }
604
+
605
+ /// This flag controls if optional stats should be obtained along with the
606
+ /// transmit timestamps.
607
+ ///
608
+ /// This option must be used together with `SOF_TIMESTAMPING_OPT_TSONLY` set
609
+ /// by `set_opt_tsonly(bool)`.
610
+ ///
611
+ /// On Unix this corresponds to the `SOF_TIMESTAMPING_OPT_STATS` flag.
612
+ #[ cfg( not( target_os = "windows" ) ) ]
613
+ #[ cfg_attr( docsrs, doc( cfg( not( target_os = "windows" ) ) ) ) ]
614
+ pub fn set_opt_stats ( & mut self , active : bool ) {
615
+ self . set_flag ( sys:: SOF_TIMESTAMPING_OPT_STATS , active)
616
+ }
617
+
618
+ /// This flag enables the `SCM_TIMESTAMPING_PKTINFO` control message for
619
+ /// incoming packets with hardware timestamps.
620
+ ///
621
+ /// On Unix this corresponds to the `SOF_TIMESTAMPING_OPT_PKTINFO` flag.
622
+ #[ cfg( not( target_os = "windows" ) ) ]
623
+ #[ cfg_attr( docsrs, doc( cfg( not( target_os = "windows" ) ) ) ) ]
624
+ pub fn set_opt_pktinfo ( & mut self , active : bool ) {
625
+ self . set_flag ( sys:: SOF_TIMESTAMPING_OPT_PKTINFO , active)
626
+ }
627
+
628
+ /// This flag enables both hardware and software timestamps for outgoing
629
+ /// packets when `SOF_TIMESTAMPING_TX_HARDWARE` and
630
+ /// `SOF_TIMESTAMPING_TX_SOFTWARE` are enabled at the same time. If both
631
+ /// timestamps are generated, two separate messages will be looped to the
632
+ /// socket’s error queue, each containing just one timestamp.
633
+ ///
634
+ /// On Unix this corresponds to the `SOF_TIMESTAMPING_OPT_TX_SWHW` flag.
635
+ #[ cfg( not( target_os = "windows" ) ) ]
636
+ #[ cfg_attr( docsrs, doc( cfg( not( target_os = "windows" ) ) ) ) ]
637
+ pub fn set_opt_tx_swhw ( & mut self , active : bool ) {
638
+ self . set_flag ( sys:: SOF_TIMESTAMPING_OPT_TX_SWHW , active)
639
+ }
640
+
641
+ #[ inline( always) ]
642
+ fn set_flag ( & mut self , flag : sys:: c_uint , active : bool ) {
643
+ if active {
644
+ self . 0 |= flag;
645
+ } else {
646
+ self . 0 &= !flag;
647
+ }
648
+ }
649
+ }
650
+
386
651
/// A version of [`IoSliceMut`] that allows the buffer to be uninitialised.
387
652
///
388
653
/// [`IoSliceMut`]: std::io::IoSliceMut
0 commit comments