Как определить, какие поля iphdr следует преобразовать в порядок байтов хоста на Linux - PullRequest
0 голосов
/ 02 мая 2020

Я запрограммировал необработанные сокеты и столкнулся с проблемой преобразования поля структуры iphdr в порядок байтов хоста. Кажется, некоторые поля необходимо преобразовать, а другие нет.

Вот мой код, который я пытаюсь понять:)

printf("%s -> %s (size: %u, id: %u, ttl: %u, hlen: %u, ver: %u, proto: %u)\n",
               source, destination,
               ntohs(ip_packet->tot_len), ntohs(ip_packet->id),
               ip_packet->ttl, ip_packet->ihl,
               ip_packet->version, ip_packet->protocol);

Как видите, tot_len и id должны быть преобразован в порядок байтов хоста. Другие поля в порядке, если я не использую htons (). Как я вижу, поля uint8 не преобразуются.

Как определить, какие поля следует преобразовать в байты хоста, чтобы заставить код работать на разных ядрах Linux?

Вот структура iphdr у меня есть:

struct iphdr
  {
#if __BYTE_ORDER == __LITTLE_ENDIAN
    unsigned int ihl:4;
    unsigned int version:4;
#elif __BYTE_ORDER == __BIG_ENDIAN
    unsigned int version:4;
    unsigned int ihl:4;
#else
# error "Please fix <bits/endian.h>"
#endif
    uint8_t tos;
    uint16_t tot_len;
    uint16_t id;
    uint16_t frag_off;
    uint8_t ttl;
    uint8_t protocol;
    uint16_t check;
    uint32_t saddr;
    uint32_t daddr;
    /*The options start here. */
  };
...