У меня есть сценарий, когда ноутбук подключен к внешнему оборудованию через 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)