共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电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 | |
【我踩过的那些坑】电感选型错误导致的处理器连接不上被打赏50分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏10分 | |
【我踩过的那些坑】DRC使用位置错误导致的问题被打赏100分 | |
我踩过的那些坑之混合OTL功放与落地音箱被打赏50分 | |
汽车电子中巡航控制系统的使用被打赏10分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏100分 | |
分享汽车电子中巡航控制系统知识被打赏10分 | |
分享安全气囊系统的检修注意事项被打赏10分 |