Заказ закрыт
Программист, Linux, точное время прихода IP пакета.

Бюджет: 10 000 руб
140.27 $ – 120.79 €
Заказчик выбрал исполнителя:
Алексей Цургаев  
Задача определить время получения определённого 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
Заказ находится в архиве

Выберите способ верификации:

Обновите страницу после прохождения верификации.