@@ -588,11 +588,10 @@ typedef struct tx_transfer_t
588588 /// The transmission iface set is indicated by which head[] entries are non-NULL.
589589 tx_frame_t * head [UDPARD_IFACE_COUNT_MAX ];
590590 tx_frame_t * cursor [UDPARD_IFACE_COUNT_MAX ];
591- uint32_t epoch : 8 ; ///< Does not overflow due to exponential backoff; e.g. 1us with epoch=48 => 9 years.
592591
593592 /// Constant transfer properties supplied by the client.
594- uint32_t priority : 3 ;
595593 void * user ;
594+ udpard_prio_t priority ;
596595 udpard_us_t deadline ;
597596 udpard_udpip_ep_t endpoints [UDPARD_IFACE_COUNT_MAX ];
598597} tx_transfer_t ;
@@ -786,13 +785,14 @@ static bool tx_push(udpard_tx_t* const tx,
786785 const udpard_us_t now ,
787786 const udpard_us_t deadline ,
788787 const meta_t meta ,
789- const uint16_t iface_bitmap ,
790788 const udpard_udpip_ep_t endpoints [UDPARD_IFACE_COUNT_MAX ],
791789 const udpard_bytes_scattered_t payload ,
792790 void * const user )
793791{
794792 UDPARD_ASSERT (now <= deadline );
795793 UDPARD_ASSERT (tx != NULL );
794+
795+ const uint16_t iface_bitmap = valid_ep_bitmap (endpoints );
796796 UDPARD_ASSERT ((iface_bitmap & UDPARD_IFACE_BITMAP_ALL ) != 0 );
797797 UDPARD_ASSERT ((iface_bitmap & UDPARD_IFACE_BITMAP_ALL ) == iface_bitmap );
798798
@@ -806,10 +806,9 @@ static bool tx_push(udpard_tx_t* const tx,
806806 return false;
807807 }
808808 mem_zero (sizeof (* tr ), tr );
809- tr -> epoch = 0 ;
810- tr -> priority = ((byte_t )meta .priority ) & UDPARD_PRIORITY_MASK ;
811- tr -> deadline = deadline ;
812809 tr -> user = user ;
810+ tr -> priority = meta .priority ;
811+ tr -> deadline = deadline ;
813812 for (size_t i = 0 ; i < UDPARD_IFACE_COUNT_MAX ; i ++ ) {
814813 tr -> head [i ] = tr -> cursor [i ] = NULL ;
815814 tr -> endpoints [i ] = endpoints [i ];
@@ -907,7 +906,6 @@ bool udpard_tx_new(udpard_tx_t* const self,
907906 self -> p2p_transfer_id = p2p_transfer_id_seed + local_uid ; // extra entropy
908907 self -> enqueued_frames_limit = enqueued_frames_limit ;
909908 self -> enqueued_frames_count = 0 ;
910- self -> next_seq_no = 0 ;
911909 self -> memory = memory ;
912910 self -> index_deadline = NULL ;
913911 self -> agewise = (udpard_list_t ){ NULL , NULL };
@@ -929,18 +927,27 @@ bool udpard_tx_push(udpard_tx_t* const self,
929927 const uint16_t iface_bitmap ,
930928 const udpard_prio_t priority ,
931929 const uint64_t transfer_id ,
930+ const udpard_udpip_ep_t endpoint ,
932931 const udpard_bytes_scattered_t payload ,
933932 void * const user )
934933{
935934 bool ok = (self != NULL ) && (deadline >= now ) && (now >= 0 ) && (self -> local_uid != 0 ) &&
936935 ((iface_bitmap & UDPARD_IFACE_BITMAP_ALL ) != 0 ) && (priority < UDPARD_PRIORITY_COUNT ) &&
937- ((payload .bytes .data != NULL ) || (payload .bytes .size == 0U ));
936+ udpard_is_valid_endpoint ( endpoint ) && ((payload .bytes .data != NULL ) || (payload .bytes .size == 0U ));
938937 if (ok ) {
939- const meta_t meta = { .priority = priority ,
940- .transfer_payload_size = (uint32_t )bytes_scattered_size (payload ),
941- .transfer_id = transfer_id ,
942- .sender_uid = self -> local_uid };
943- ok = tx_push (self , now , deadline , meta , iface_bitmap & UDPARD_IFACE_BITMAP_ALL , NULL , payload , user );
938+ const meta_t meta = {
939+ .priority = priority ,
940+ .transfer_payload_size = (uint32_t )bytes_scattered_size (payload ),
941+ .transfer_id = transfer_id ,
942+ .sender_uid = self -> local_uid ,
943+ };
944+ udpard_udpip_ep_t eps [UDPARD_IFACE_COUNT_MAX ] = { 0 };
945+ for (size_t i = 0 ; i < UDPARD_IFACE_COUNT_MAX ; i ++ ) {
946+ if ((iface_bitmap & (1U << i )) != 0 ) {
947+ eps [i ] = endpoint ;
948+ }
949+ }
950+ ok = tx_push (self , now , deadline , meta , eps , payload , user );
944951 }
945952 return ok ;
946953}
@@ -953,15 +960,17 @@ bool udpard_tx_push_p2p(udpard_tx_t* const self,
953960 const udpard_bytes_scattered_t payload ,
954961 void * const user )
955962{
956- const uint16_t iface_bitmap = valid_ep_bitmap ( endpoints );
957- bool ok = ( self != NULL ) && ( deadline >= now ) && ( now >= 0 ) && ( self -> local_uid != 0 ) && (iface_bitmap != 0 ) &&
958- (priority < UDPARD_PRIORITY_COUNT ) && ( (payload .bytes .data != NULL ) || (payload .bytes .size == 0U ));
963+ bool ok = ( self != NULL ) && ( deadline >= now ) && ( now >= 0 ) && ( self -> local_uid != 0 ) &&
964+ ( valid_ep_bitmap ( endpoints ) != 0 ) && (priority < UDPARD_PRIORITY_COUNT ) &&
965+ ((payload .bytes .data != NULL ) || (payload .bytes .size == 0U ));
959966 if (ok ) {
960- const meta_t meta = { .priority = priority ,
961- .transfer_payload_size = (uint32_t )bytes_scattered_size (payload ),
962- .transfer_id = self -> p2p_transfer_id ++ ,
963- .sender_uid = self -> local_uid };
964- ok = tx_push (self , now , deadline , meta , iface_bitmap , endpoints , payload , user ); // --------------
967+ const meta_t meta = {
968+ .priority = priority ,
969+ .transfer_payload_size = (uint32_t )bytes_scattered_size (payload ),
970+ .transfer_id = self -> p2p_transfer_id ++ ,
971+ .sender_uid = self -> local_uid ,
972+ };
973+ ok = tx_push (self , now , deadline , meta , endpoints , payload , user );
965974 }
966975 return ok ;
967976}
@@ -993,6 +1002,7 @@ static void tx_eject_pending_frames(udpard_tx_t* const self, const udpard_us_t n
9931002 {
9941003 udpard_tx_ejection_t ejection = { .now = now ,
9951004 .deadline = tr -> deadline ,
1005+ .destination = tr -> endpoints [ifindex ],
9961006 .iface_index = ifindex ,
9971007 .dscp = self -> dscp_value_per_priority [tr -> priority ],
9981008 .datagram = tx_frame_view (frame ),
0 commit comments