共7条
1/1 1 跳转至页
字节对齐高人请进
[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
[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中去就不会有对齐问题了。
我想这个想法也挺不错的,在数据结构小的时候一点也不影响系统性能,关键是避开了对齐问题,各位认为如何。
共7条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |