Всем привет.
Есть вопрос к структуре, которая сама объединяет другие структуры. А точнее, к выравниванию полей между структурами, при таком объединении.
Вот, например, две структуры, Ethernet-заголовок и ARP-заголовок:
typedef struct ether_header { //14 bytes
u_char ether_dhost[6];
u_char ether_shost[6];
u_short ether_type;
} ETHERHDR;
typedef struct ether_arp { //28 bytes
u_short arp_hrd;
u_short arp_pro;
u_char arp_hln;
u_char arp_pln;
u_short arp_op;
u_char arp_sha[6];
u_long arp_spa;
u_char arp_tha[6];
u_long arp_tpa;
} ETHERARP;
Эти структуры объединяются в структуре, условно названной sss:
struct ARPFRAME {
ETHERHDR eth_hdr;
ETHERARP eth_arp;
}sss;
Я ожидаю, что поля в sss идут без вставок, но на границе между eth_hdr и eth_arp появилась ненужная вставка из 2-х байт. Это видно, если прогнать следующий короткий тест:
ps= (u_char*) &sss; printf("ffm=%04x\n", ps-pd); pd=ps;
ps= (u_char*) &sss.eth_hdr.ether_dhost; printf("ether_dhost=%04x\n", ps-pd);
ps= (u_char*) &sss.eth_hdr.ether_shost; printf("ether_shost=%04x\n", ps-pd);
ps= (u_char*) &sss.eth_hdr.ether_type; printf("ether_type =%04x\n", ps-pd);
ps= (u_char*) &sss.eth_arp.arp_hrd; printf("arp_hrd =%04x\n", ps-pd);
ps= (u_char*) &sss.eth_arp.arp_pro; printf("arp_pro =%04x\n", ps-pd);
ps= (u_char*) &sss.eth_arp.arp_hln; printf("arp_hln =%04x\n", ps-pd);
ps= (u_char*) &sss.eth_arp.arp_pln; printf("arp_pln =%04x\n", ps-pd);
ps= (u_char*) &sss.eth_arp.arp_op; printf("arp_op =%04x\n", ps-pd);
ps= (u_char*) &sss.eth_arp.arp_sha; printf("arp_sha =%04x\n", ps-pd);
ps= (u_char*) &sss.eth_arp.arp_spa; printf("arp_spa =%04x\n", ps-pd);
ps= (u_char*) &sss.eth_arp.arp_tha; printf("arp_tha =%04x\n", ps-pd);
ps= (u_char*) &sss.eth_arp.arp_tpa; printf("arp_pln =%04x\n", ps-pd);
В результате на консоль выводится:
ffm=05cc
ether_dhost=0000
ether_shost=0006
ether_type =000c
arp_hrd =0010
arp_pro =0012
arp_hln =0014
arp_pln =0015
arp_op =0016
arp_sha =0018
arp_spa =0020
arp_tha =0024
arp_pln =002c
Где явно видно, что на стыке между полями ether_type и arp_hrd четыре байта, а должно быть два, т.к. u_short ether_type имеет 2 байта.
Теперь вопрос: Как от этого избавиться, наверное, нужны дополнительные опции? Где их ставить?
В общем пока ступор…
Если кто-то интересуется, то в атаче коды с подобными структурами и функциями для Ethernet-приложений для NiosII под LAN91C111 из далекой Германии, а точнее из Ethernut_de.