841 ec_datagram_t *datagram /**< datagram */ |
841 ec_datagram_t *datagram /**< datagram */ |
842 ) |
842 ) |
843 { |
843 { |
844 ec_datagram_t *queued_datagram; |
844 ec_datagram_t *queued_datagram; |
845 |
845 |
846 if (datagram->state == EC_DATAGRAM_SENT) |
846 switch (datagram->state) { |
847 return; |
847 case EC_DATAGRAM_QUEUED: |
848 // check, if the datagram is already queued |
848 datagram->skip_count++; |
|
849 EC_MASTER_DBG(master, 1, "Skipping already queued datagram %p.\n", |
|
850 datagram); |
|
851 break; |
|
852 |
|
853 case EC_DATAGRAM_SENT: |
|
854 datagram->skip_count++; |
|
855 EC_MASTER_DBG(master, 1, "Skipping already sent datagram %p.\n", |
|
856 datagram); |
|
857 break; |
|
858 |
|
859 default: |
|
860 break; |
|
861 } |
|
862 |
|
863 /* It is possible, that a datagram in the queue is re-initialized with the |
|
864 * ec_datagram_<type>() methods and then shall be queued with this method. |
|
865 * In that case, the state is already reset to EC_DATAGRAM_INIT. Check if |
|
866 * the datagram is queued to avoid duplicate queuing (which results in an |
|
867 * infinite loop!). Set the state to EC_DATAGRAM_QUEUED again, probably |
|
868 * causing an unmatched datagram. */ |
849 list_for_each_entry(queued_datagram, &master->datagram_queue, queue) { |
869 list_for_each_entry(queued_datagram, &master->datagram_queue, queue) { |
850 if (queued_datagram == datagram) { |
870 if (queued_datagram == datagram) { |
851 datagram->skip_count++; |
871 datagram->skip_count++; |
852 EC_MASTER_DBG(master, 1, "skipping datagram %p.\n", datagram); |
872 EC_MASTER_DBG(master, 1, "Skipping re-initialized datagram %p.\n", |
|
873 datagram); |
853 datagram->state = EC_DATAGRAM_QUEUED; |
874 datagram->state = EC_DATAGRAM_QUEUED; |
854 return; |
875 return; |
855 } |
876 } |
856 } |
877 } |
857 |
878 |
858 list_add_tail(&datagram->queue, &master->datagram_queue); |
879 list_add_tail(&datagram->queue, &master->datagram_queue); |
859 datagram->state = EC_DATAGRAM_QUEUED; |
880 datagram->state = EC_DATAGRAM_QUEUED; |
860 } |
881 } |
861 |
|
862 |
882 |
863 /*****************************************************************************/ |
883 /*****************************************************************************/ |
864 |
884 |
865 /** Sends the datagrams in the queue. |
885 /** Sends the datagrams in the queue. |
866 * |
886 * |