Захват пакетов с использованием библиотеки PCAP - PullRequest
1 голос
/ 02 апреля 2019

У меня есть сценарий, когда ноутбук подключен к внешнему оборудованию через Ethernet.

Портативный компьютер может просматривать аппаратное обеспечение, то есть отправлять пакет запроса на аппаратное обеспечение, которое генерирует ответный пакет из аппаратного обеспечения, которое ноутбук принимает и интерпретирует.

Все это происходит на уровне LLC, то есть на достаточно низком уровне. Я собираю байты, составляющие пакет запроса вручную, а также читаю байты ответного пакета вручную.

Моя проблема в том, что я не всегда «вижу» ответный пакет. Параллельно с запуском wireshark я всегда могу видеть пакеты запроса / ответа на проводе, но иногда мой код «получает» ответный пакет, а иногда нет - кажется недетерминированным, является ли получение успешным или неудачным.

Это соответствующий фрагмент кода, описывающий то, что я делаю:

/* send packet */
if (pcap_sendpacket(pdw_io->pcap, buf, LEN_ETH_REQ_PKT)==-1) {
    pcap_perror(pdw_io->pcap, 0);
    print_err_log(ERR_LOG, "Error: pcap_sendpacket failed", __FILE__, __LINE__);
    ret = 0;
}
free(buf);

/* logic here is that the next pkt after a request pkt is sent is *always*
 * the corresponding response pkt */
ret = pcap_next_ex(pdw_io->pcap, &hdr, &response_buf);

Отправка всегда работает, т.е. я всегда вижу пакет в wireshark. Я всегда вижу ответный пакет, сгенерированный внешним оборудованием, его отметка времени составляет около 10us после запроса. Но pcap_next_ex () возвращает успех (и заполняет response_buf байтами) примерно половину времени.

Я полностью озадачен, почему это так. Обратите внимание, что во время этого теста на проводе нет других LLC-пакетов, только пара ответа на запрос (как наблюдается через wireshark)

...