打印

uip 中 arp 请求帧长度为什么是42字节?

[复制链接]
1636|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wyh2011|  楼主 | 2014-12-27 10:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ip, ui, AD, ADDR, DDR
我在学习uip,PC通过交叉网线连接DM9000A,串口打印DM9000A的输入输出数据,发现DM9000A发出去的ARP请求的帧长是42字节,PC发送给路由的ARP请求是64字节,TCP/IP书上说了,以太网的最小帧长是64字节。
查看uip源码,ARP请求和回应的最后数据帧长度确实就一个ARP头部长度,没有填充0,没有CRC校验,接下来立即将这个包提交给DM9000A发出。
查看lwip的ARP请求,情况也是一样的。
ARP请求
if (i == UIP_ARPTAB_SIZE) {
                        /* The destination address was not in our ARP table, so we
                         overwrite the IP packet with an ARP request. */
                        memset(BUF->ethhdr.dest.addr, 0xff, 6);
                        memset(BUF->dhwaddr.addr, 0x00, 6);
                        memcpy(BUF->ethhdr.src.addr, uip_ethaddr.addr, 6);
                        memcpy(BUF->shwaddr.addr, uip_ethaddr.addr, 6);
                        uip_ipaddr_copy(BUF->dipaddr, ipaddr);
                        uip_ipaddr_copy(BUF->sipaddr, uip_hostaddr);
                        BUF->opcode = HTONS(ARP_REQUEST); /* ARP request. */
                        BUF->hwtype = HTONS(ARP_HWTYPE_ETH);
                        BUF->protocol = HTONS(UIP_ETHTYPE_IP);
                        BUF->hwlen = 6;
                        BUF->protolen = 4;
                        BUF->ethhdr.type = HTONS(UIP_ETHTYPE_ARP);
                        uip_appdata = &uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN];
                        uip_len = sizeof(struct arp_hdr);
                        return;
                }

ARP回应
/* ARP request. If it asked for our address, we send out a
                   reply. */
                if (uip_ipaddr_cmp(BUF->dipaddr, uip_hostaddr)) {
                        /* First, we register the one who made the request in our ARP
                         table, since it is likely that we will do more communication
                         with this host in the future. */
                        uip_arp_update(BUF->sipaddr, &BUF->shwaddr);
                        /* The reply opcode is 2. */
                        BUF->opcode = HTONS(2);
                        memcpy(BUF->dhwaddr.addr, BUF->shwaddr.addr, 6);
                        memcpy(BUF->shwaddr.addr, uip_ethaddr.addr, 6);
                        memcpy(BUF->ethhdr.src.addr, uip_ethaddr.addr, 6);
                        memcpy(BUF->ethhdr.dest.addr, BUF->dhwaddr.addr, 6);
                        BUF->dipaddr[0] = BUF->sipaddr[0];
                        BUF->dipaddr[1] = BUF->sipaddr[1];
                        BUF->sipaddr[0] = uip_hostaddr[0];
                        BUF->sipaddr[1] = uip_hostaddr[1];
                        BUF->ethhdr.type = HTONS(UIP_ETHTYPE_ARP);
                        uip_len = sizeof(struct arp_hdr);
                }


DM9000A发出的ARP请求以太网数据帧:
[0]tx: length: 42

tx: 00: ff ff ff ff ff ff 12 34
tx: 08: 56 78 9a bc 08 06 00 01
tx: 10: 08 00 06 04 00 01 12 34
tx: 18: 56 78 9a bc c0 a8 02 20
tx: 20: 00 00 00 00 00 00 c0 a8
tx: 28: 02 20

PC发送给路由的ARP请求以太网数据帧:
[0]rx: length: 64
rx: 00: ff ff ff ff ff ff 00 23
rx: 08: 8b 94 8b 31 08 06 00 01
rx: 10: 08 00 06 04 00 01 00 23
rx: 18: 8b 94 8b 31 c0 a8 02 cf
rx: 20: 00 00 00 00 00 00 c0 a8
rx: 28: 02 01 00 00 00 00 00 00
rx: 30: 00 00 00 00 00 00 00 00
rx: 38: 00 00 00 00 6a bc be 18

相关帖子

沙发
wyh2011|  楼主 | 2014-12-27 14:14 | 只看该作者
原因找到了,dm9000 可以自动填充0及crc

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

43

帖子

1

粉丝