Создание необработанного пакета, в результате чего поля IP имеют неправильный порядок

0

Проще говоря, у меня возникают проблемы с долговечностью и сырыми пакетами внутри IP-протокола, когда я имею дело с флагами и полями смещения.

Я пытаюсь создать свои собственные пакеты с использованием пакетов UDP raw. Я использую структуры стиля C с битовыми полями.

У меня возникают проблемы с IP-флагами и полями Fragment Offset IP-протокола. Это связано с тем, что порядок байтов отличается. Я думаю, что хочу использовать функцию htons(), чтобы изменить порядок бит, но когда я это сделаю, я считаю, что все испортил.

Вот быстрый вывод пакета, который я создаю. Нам интересны байты 6 и байт 7. (Жирные и курсивные биты).

0 0100 0101 0001 0000 0001 1100 0000 0000 1101 0100 0011 0001 0000 0001 0000 1000

8 0100 0000 0001 0001 0110 0111 1000 1010 0000 0001 0000 0001 0000 0001 0000 0001

16 0000 0011 0000 0011 0000 0011 0000 0011 0000 1000 1010 1110 0001 0001 0101 1100

24 0000 0000 0000 1000 0000 0000 0000 0000

У меня есть следующая структура внутри... (Обратите внимание на битовые поля для трех флагов и смещения.

struct IPHeader
{
    unsigned char iph_ihl:4, iph_ver:4;     
    unsigned char iph_tos;                  
    unsigned short int iph_len;             
    unsigned short int iph_ident;           
    unsigned char iph_flag_X:1;                
    unsigned char iph_flag_D:1;
    unsigned char iph_flag_M:1;
    unsigned short int iph_offset:13;         
    unsigned char iph_ttl;                 
    unsigned char iph_protocol;            
    unsigned short int iph_chksum;          
    unsigned int iph_sourceip;              
    unsigned int iph_destip;                
};

В моем коде я пытаюсь установить смещение на значение 1, имея установленный флаг D. (только для примера) Можно было бы подумать, что тогда мой код мог бы быть...

ipheader->iph_flag_X = 1;
ipheader->iph_flag_M = 0;
ipheader->iph_flag_D = 0;
ipheader->iph_offset = htons(1);

Это приводит к следующей распечатке для байтов 6 и 7.... 0000 0001 0000 0001

То, что я хотел бы увидеть для этого кода, следующее... 1000 0000 0000 0001

Второй набор byteam пытается создать мои собственные пакеты с использованием пакетов UDP raw. Я использую структуры стиля C с битовыми полями. s точно отражает набор флагов X и смещение фрагмента к значению 1. Помните, что смещение фрагмента занимает 13 бит, а три флага - 1 бит.

  • 0
    Так что же вы получите, 0000 0001 0000 1000 как описано вверху, или 0000 0001 0000 0001 как описано ниже?
Теги:
sockets
packet
endianness

1 ответ

0

Поведение бит-полей определяется реализацией. Согласно K & R

"fields are assigned left to right on some machines and right to left on others"

Таким образом, ваше определение структуры должно учитывать это. Хотя вы можете или не можете развиваться на машине Little-Endian, загляните в определение UBUNTU IP Header, чтобы вы могли начать работу на более переносном курсе (и решить вашу проблему на этом пути):

struct ip
  {
#if __BYTE_ORDER == __LITTLE_ENDIAN
    unsigned int ip_hl:4;               /* header length */
    unsigned int ip_v:4;                /* version */
#endif
#if __BYTE_ORDER == __BIG_ENDIAN
    unsigned int ip_v:4;                /* version */
    unsigned int ip_hl:4;               /* header length */
#endif
    u_int8_t ip_tos;                    /* type of service */
    u_short ip_len;                     /* total length */
    u_short ip_id;                      /* identification */
    u_short ip_off;                     /* fragment offset field */
#define IP_RF 0x8000                    /* reserved fragment flag */
#define IP_DF 0x4000                    /* dont fragment flag */
#define IP_MF 0x2000                    /* more fragments flag */
#define IP_OFFMASK 0x1fff               /* mask for fragmenting bits */
    u_int8_t ip_ttl;                    /* time to live */
    u_int8_t ip_p;                      /* protocol */
    u_short ip_sum;                     /* checksum */
    struct in_addr ip_src, ip_dst;      /* source and dest address */
  };

Ещё вопросы

Сообщество Overcoder
Наверх
Меню