OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4578|回复: 1

请问为何ENC28J60例程里面接受的IP包还要判断是不是ARP请求包?难道IP包也可能是ARP请求包吗?

[复制链接]

11

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2013-6-20
在线时间
3 小时
发表于 2013-10-23 07:44:40 | 显示全部楼层 |阅读模式
主程序中不停调用下列程序:
        uip_len=tapdev_read();    //从网络设备读取一个IP包,得到数据长度.uip_len在uip.c中定义
    if(uip_len>0)             //有数据
    {   
        //处理IP数据包(只有校验通过的IP包才会被接收) 
        if(BUF->type == htons(UIP_ETHTYPE_IP))//是否是IP包? 
        {
            uip_arp_arpin();    //去除以太网头结构,更新ARP表
            uip_input();       //IP包处理
            //当上面的函数执行后,如果需要发送数据,则全局变量 uip_len > 0
            //需要发送的数据在uip_buf, 长度是uip_len  (这是2个全局变量)            
            if(uip_len>0)//需要回应数据
            {
                uip_arp_out();//加以太网头结构,在主动连接时可能要构造ARP请求
                tapdev_send();//发送数据到以太网
            }
        }else if (BUF->type==htons(UIP_ETHTYPE_ARP))//处理arp报文,是否是ARP请求包?
        {
            uip_arp_arpin();
             //当上面的函数执行后,如果需要发送数据,则全局变量uip_len>0
            //需要发送的数据在uip_buf, 长度是uip_len(这是2个全局变量)
             if(uip_len>0)tapdev_send();//需要发送数据,则通过tapdev_send发送     
        }
    }

//这个是上面调用的程序,里面还有判断是否是ARP请求的程序
void uip_arp_arpin(void)
{
  
  if(uip_len < sizeof(struct arp_hdr)) {
    uip_len = 0;
    return;
  }
  uip_len = 0;
  
  switch(BUF->opcode) {
  case HTONS(ARP_REQUEST):           //=1 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);
    }
    break;
  case HTONS(ARP_REPLY):
    /* ARP reply. We insert or update the ARP table if it was meant
       for us. */
    if(uip_ipaddr_cmp(BUF->dipaddr, uip_hostaddr)) {
      uip_arp_update(BUF->sipaddr, &BUF->shwaddr);
    }
    break;
  }

  return;
}

不明白的是,为何主程序中不管判断是IP包还是ARP后,都调用这个程序?如果是IP包也有可能是ARP请求吗?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-10-23 10:38:47 | 显示全部楼层
这里我也不太理解,还请高手赐教。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-11 02:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表