Задача определить время получения определённого IP пакета сетевой картой.
Время относительное по любым часам (не абсолютное), для сравнения с временем других таких-же пакетов.
Требуемая точность определения времени 1мкс.
ОС Linux Cent OS 7
Сетевая карта одна Intel на чипсете 82574L (вроде бы поддерживает Precision Time protocol).
Сетевая карта другая Intel на чипсете e1000_i210 (точно поддерживает Precision Time protocol).
IP пакет формируется своим оборудованием и может быть любого заданного содержания,
который Вы предложите.
Пробовали решить задачу 'в лоб' засечь время срабатывания IRQ прерывания в драйвере сетевой карты,
но точность оказалась ниже требуемой 60 мкс, а нужна 1 мкс.
Предполагаемый путь решения взять время пакета из внутри сетевой карты (там есть свой таймер),
в драйвере сетевой карты есть такая функция, которая берёт время из сетевой карты:
/**
* e1000e_rx_hwtstamp utility function which checks for Rx time stamp
* @adapter: board private structure
* @status: descriptor extended error and status field
* @skb: particular skb to include time stamp
*
* If the time stamp is valid, convert it into the timecounter ns value
* and store that result into the shhwtstamps structure which is passed
* up the network stack.
**/
static void e1000e_rx_hwtstamp(struct e1000_adapter *adapter, u32 status,
struct sk_buff *skb)
{
struct e1000_hw *hw = &adapter->hw;
u64 rxstmp;
if (!(adapter->flags & FLAG_HAS_HW_TIMESTAMP) ||
!(status & E1000_RXDEXT_STATERR_TST) ||
!(er32(TSYNCRXCTL) & E1000_TSYNCRXCTL_VALID))
return;
/* The Rx time stamp registers contain the time stamp. No other
* received packet will be time stamped until the Rx time stamp
* registers are read. Because only one packet can be time stamped
* at a time, the register values must belong to this packet and
* therefore none of the other additional attributes need to be
* compared.
*/
rxstmp = (u64)er32(RXSTMPL);
rxstmp |= (u64)er32(RXSTMPH) <<>flags2 &= ~FLAG2_CHECK_RX_HWTSTAMP;
}
Но срабатывает return (вторые два условия из трёх не выполнены) и время не определяется,
вероятно пакет должен быть не любым, а конкретным из спецификации:
PTPd implements the Precision Time protocol (PTP) as defined by the IEEE 1588.
Есть полезная статься на эту тему на форуме habrhabr, она так и называется "IEEE 1588 Precision Time Protocol (PTP)",
возможно она поможет.
Решением задачи будет является конкретный IP пакет (массив байт), который можно отправить с оборудования или с другого компьютера, при условии, что Линукс 'увидит' его относительное время по любым часам с точностью до 1 мкс.
Возможны и другие пути решения, которые дадут точность определения относительного времени пакета 1 мкс.
Опубликован 24.02.2016 в 20:14
Заказ находится в архиве