共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 跳转至页
回复
有奖活动 | |
---|---|
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
【有奖活动】震撼来袭!这场直播将直击工程师的心灵! | |
“我想要一部加热台”活动,不花钱赢取开发好工具!活动开始了哦 | |
【有奖活动】伙伴们:您的“需求”解决了吗? | |
抽奖了,抽奖了,金升阳医疗电源 |
打赏帖 | |
---|---|
【换取手持数字示波器】+与同事对定时器输出相位可调PWM移相全桥控制分享被打赏50分 | |
【换取手持数字示波器】+LP-MSPM0L1306开发板试用体验+串口被打赏40分 | |
CC-RL编译器相关问题求助被打赏10分 | |
【换取手持数字示波器】+与同事对ESP-12开发调试经验分享被打赏50分 | |
【换取手持数字示波器】+同事tek示波器调试spi解析被打赏50分 | |
【换取手持数字示波器】+2.6寸墨水屏调试经验被打赏50分 | |
换取手持数字示波器+个人开关电源的设计经验被打赏50分 | |
【换取手持数字示波器】+【APT32F173测评】+URAT被打赏20分 | |
【换取手持数字示波器】CH32X035的定时器以及外部中断体验被打赏50分 | |
【换取手持数字示波器】CH32X035搭建开发环境(RISC-V)被打赏50分 |