Было бы неприлично, если бы не читал. Ан нет :) Вы же сами сказали что у вас валятся ошибки этого модуля. Т.е. он заведомо написан неверно. Я посмотрел, там действительно все структуры объявляются с атрбиутом packed. НО этот атрибут делает заведомо наоборот от того что мне нужно, поэтому там все так и работает.
В качестве док-ва прилагаю тестовую програмку и ЛОГ, в котором видно что работает она неправильно, можете сравнить ее вывод с тем, что даст вам хостовый компутер. Видно так же, почему мне не подходят все эти манипуляции с атрибутами структуры
К сожалению загружать файлы мне запрещено, вставляю в тело
И, отвечая частично на свой вопрос - сообщения не вываливались, потому что есть такой файл как /proc/cpu/alignment, По дефолту ничего не делается. Если записать туда 1 - будет лог. Если 2 - то будет фиксить. В логе видно, что это действительно работает.
Програмка:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
typedef struct bpdu_body_y {
unsigned char flags;
unsigned char root_id[8];
unsigned char root_path_cost[4];
unsigned char bridge_id[8];
unsigned char port_id[2];
unsigned char message_age[2];
unsigned char max_age[2];
unsigned char hello_time[2];
unsigned char forward_delay[2];
} BPDU_BODY_Y;
typedef struct bpdu_body_t {
unsigned char flags;
unsigned char root_id[8];
unsigned char root_path_cost[4] __attribute__ ((__aligned__(4)));
unsigned char bridge_id[8];
unsigned char port_id[2];
unsigned char message_age[2];
unsigned char max_age[2];
unsigned char hello_time[2];
unsigned char forward_delay[2];
} __attribute__ ((__aligned__(4))) BPDU_BODY_T;
int main(int argc, char *argv[])
{
int i;
volatile char *memo;
volatile u32 *imemo;
BPDU_BODY_T *bmemo;
BPDU_BODY_Y *ymemo;
printf ("sizeof unaligned struct = %d; sizeof aligned struct = %d\n", sizeof(BPDU_BODY_Y), sizeof(BPDU_BODY_T));
memo = (char *)malloc(sizeof (BPDU_BODY_T));
for (i = 0; i < sizeof (BPDU_BODY_T); i++) {
memo[i] = i;
}
printf ("------------------------------------------------------------------------------------------------------\n\t");
bmemo = memo;
ymemo = memo;
printf ("\tMemory contents: \n\n");
for (i = 0; i < sizeof(BPDU_BODY_T); i++) {
printf("%02X", memo[i]);
if (!((i+1)%4)) {
printf ("|");
}
}
printf ("\n----------------------------------------------------------------\n");
printf ("It should be %02X%02X%02X%02X\n\n",
ymemo->root_path_cost[3], ymemo->root_path_cost[2],
ymemo->root_path_cost[1], ymemo->root_path_cost[0]);
memo = memo + 9;
printf ("Addr of unaligned root_path_cost is %p; Addr of aligned root_path_cost is %p; \n",
&ymemo->root_path_cost, &bmemo->root_path_cost);
printf("\tUnaligned root_path_cost %08X\n\t", *((int *)(ymemo->root_path_cost)));
printf("Aligned root_path_cost %08X\n", *((int *)(bmemo->root_path_cost)));
return 0;
}
ЛОГ:
root@OpenWrt:/# tst1
sizeof unaligned struct = 31; sizeof aligned struct = 36
------------------------------------------------------------------------------------------------------
Memory contents:
00010203|04050607|08090A0B|0C0D0E0F|10111213|14151617|18191A1B|1C1D1E1F|20212223
|
----------------------------------------------------------------
It should be 0C0B0A09
Addr of unaligned root_path_cost is 0x11011; Addr of aligned root_path_cost is 0x11014;
Unaligned root_path_cost 080B0A09
Aligned root_path_cost 0F0E0D0C
root@OpenWrt:/# echo 2 > /proc/cpu/alignment
root@OpenWrt:/# tst1
sizeof unaligned struct = 31; sizeof aligned struct = 36
------------------------------------------------------------------------------------------------------
Memory contents:
00010203|04050607|08090A0B|0C0D0E0F|10111213|14151617|18191A1B|1C1D1E1F|20212223
|
----------------------------------------------------------------
It should be 0C0B0A09
Addr of unaligned root_path_cost is 0x11011; Addr of aligned root_path_cost is 0x11014;
Unaligned root_path_cost 0C0B0A09
Aligned root_path_cost 0F0E0D0C