这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 字节对齐高人请进

共7条 1/1 1 跳转至

字节对齐高人请进

菜鸟
2003-06-12 18:50:04     打赏
[color=#006400]在dot1x客户端的发包代码中定义了以下的结构。[/color]/** Ethernet Header */ typedef struct eapol_ether_header_s { uchar_t ether_dhost[MY_ETHER_ADDR_LEN]; uchar_t ether_shost[MY_ETHER_ADDR_LEN]; ushort_t ether_type; }eapol_ether_header_t; /** EAPOL Header */ typedef struct eapol_hdr_s { uchar_t version; /* EAPOL proto version */ uchar_t eaptype; /* EAPOL Packet type */ ushort_t len; /* Packet body length */ }eapol_hdr_t ; /* EAP Private patch */ typedef struct eap_private_field_s{ uchar_t linkageId[8]; /* string "linkage" */ ushort_t version; /* version number */ ushort_t build; /* build number */ ulong_t msgType; /* message type */ }eap_private_field_t; [color=#DC143C]这里是组包代码[/color] void eapol_create_start_stop_frame(DOT1X_T *client, char *buffer, char stst) { eapol_ether_header_t *eather_hdr; eapol_hdr_t *eapol_hdr; eap_private_field_t *eap_private_field; eather_hdr = (eapol_ether_header_t *)buffer; eapol_hdr = (eapol_hdr_t *)(buffer + sizeof(eapol_ether_header_t)); eap_private_field = (eap_private_field_t *)(buffer + sizeof(eapol_ether_header_t) + sizeof(eapol_hdr_t)); /* copy eather header to packet */ memcpy(eather_hdr->ether_dhost, eapol_dst, sizeof(eather_hdr->ether_dhost)); memcpy(eather_hdr->ether_shost, client->srcMac, sizeof(eather_hdr->ether_shost)); eather_hdr->ether_type = ntohs(PAE_ETHER_TYPE); /* copy eapol header to packet */ eapol_hdr->version = PAE_PROTOCOL_V1; eapol_hdr->eaptype = stst; eapol_hdr->len = 0; /* copy linkage private field to packet */ memset(eap_private_field->linkageId, 0, sizeof(eap_private_field->linkageId)); memcpy(eap_private_field->linkageId, EAP_LINKAGE_IDENTIFIER, strlen(EAP_LINKAGE_IDENTIFIER)); eap_private_field->version = htons(EAP_LINKAGE_VERSION); eap_private_field->build = htons(EAP_LINKAGE_BUILD); [color=#DC143C]eap_private_field->msgType = 0x12345678;[/color] [color=#006400]/* 用Tornado跟踪调试发现这句代码运行完后msgType值仍为0x00000000,用下面的eapol_debug函数dump出内存也是msgType字段为0。后来经人点拨发现是字节对齐问题(这种问题终于被我撞到了),在eap_private_field_t结构中加入了__attribute__ ((packed))便好了,但还是有老大的疑惑,这是dot1x客户端的代码,在认证端(另一个设备)也有相同的eap_private_field_t结构,为什么那个组包就好好的?既然在客户端出现了字节对齐的问题,是不是在另一个设备迟早也会出这个问题的?各位达人说说你们怎么避免这个问题的。另:客户端用的是ARM芯片,认证端用的是PPC。 */[/color] eapol_debug("eapol_create_start_stop_frame", buffer, DEFAULT_PACKET_LEN, NULL); return; }



关键词: 字节     对齐     高人     请进     eapol     ether     p    

菜鸟
2003-06-12 23:59:00     打赏
2楼
你的结构定义得很好, 已经考虑了结构成员字节对齐的问题 有可能出问题在于结构的起始地址和buffer的值

菜鸟
2003-06-13 02:38:00     打赏
3楼
[quote][b]以下是引用[i]amine在2003-6-12 15:59:00[/i]的发言:[/b] 你的结构定义得很好, 已经考虑了结构成员字节对齐的问题 有可能出问题在于结构的起始地址和buffer的值 [/quote] 大侠此言怎讲? 漏了一点,昨天我将msgType换成两个ushort_t就能正常赋值了,不过这个方法也太呆了。若是您会怎么做?

菜鸟
2003-06-13 16:55:00     打赏
4楼
[quote][b]以下是引用[i]xiaohuang在2003-6-12 19:32:00[/i]的发言:[/b] 当需要放置msgType时,恰好处于2字节对齐而不是4字节,于是系统就填充了2字节的Pad。 [/quote] 我也是这样想, 所以我说结构的起始地址有问题, 恰好处于2字节对齐而不是4字节

菜鸟
2003-06-13 21:46:00     打赏
5楼
[quote][b]以下是引用[i]amine在2003-6-13 8:55:00[/i]的发言:[/b] [quote][b]以下是引用[i]xiaohuang在2003-6-12 19:32:00[/i]的发言:[/b] 当需要放置msgType时,恰好处于2字节对齐而不是4字节,于是系统就填充了2字节的Pad。 [/quote] 我也是这样想, 所以我说结构的起始地址有问题, 恰好处于2字节对齐而不是4字节 [/quote] 正如大家所说的,msgType在设值的时候剩2个字节,还有两个字节在内存中换到下一行了。 刚才我在回复的时候,一个同事看到了我的帖子说:你这样用指针是实现了零字节拷贝,但也可以定义几个结构而不是结构指针,然后把结构中的值memcpy到buff中去就不会有对齐问题了。 我想这个想法也挺不错的,在数据结构小的时候一点也不影响系统性能,关键是避开了对齐问题,各位认为如何。

菜鸟
2003-12-26 02:27:00     打赏
6楼
buffer是我调用eapol_create_start_stop_frame函数的函数中的静态数组,不是分配出来的。

菜鸟
2003-12-26 02:29:00     打赏
7楼
TO badvssun: 这种情况下,我就只能__attribute__ ((packed))了。

共7条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]