⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 arp.c

📁 很好的网络编程协议源码
💻 C
字号:
/*
+FHDR------------------------------------------------------------------
Copyright (c),
Tony Yang –51,AVR,ARM firmware developer  
Contact:qq 292942278  e-mail:tony_yang123@sina.com.cn

Abstract:
$Id: arp.c,v 1.5 2006/12/31 16:08:21 tony Exp $
-FHDR-------------------------------------------------------------------
*/ 

#include "config.h"
#include "tcp_ip_cfg.h"
#include "hardware.h"
#include "ethernet.h"
#include  "uart0\uart0.h"	
u8 broadcast[6] ={0xff,0xff,0xff,0xff,0xff,0xff};
struct ARP_PACKED
{
   u16 HARD_TYPE;
   u16 PROTOCOL_TYPE;
   u8  hard_add_len;
   u8  PROTOCOL_add_len;
   u16 op;  
   u8  MAC_ADD_SRC[6];
   u8  IP_ADD_SRC[4];
   u8  MAC_ADD_DEST[6];
   u8  IP_ADD_DEST[4];  
}ARP_PACKED;

  static struct ARP_PACKED  *Arp_packed;
  static struct _pkst pkts;
  
struct MAC_IP_MAPTABLE
{
  u8 ip[4];
  u8 MAC[6]; 

};

static struct MAC_IP_MAPTABLE Mac_IP_MapTable[Maximum_Item_for_MAC_IP_MAPTABLE];

/****************************************************************************
* 名称:DISPLAY_Mac_IP_Table
* 功能:显示MAC——IP地址映射表
* 入口: 无
* 出口: 无
****************************************************************************/
void DISPLAY_Mac_IP_Table(void)
{
  u16 i,j,d,e;
  u8 MSG0[] = "IP_MAC_AddressTable";
  u8 MSG1[] = "(IP ADDRESS)   (MAC ADDRESS)";
  SendStr(MSG0);
  SendByte(0xd);  
  SendByte(0xa);
  SendStr(MSG1);
  SendByte(0xd);  
  SendByte(0xa);
 for(i = 0;i <Maximum_Item_for_MAC_IP_MAPTABLE;i++ )
 { 
   
   for(j = 0;j < 4;j++)
   { 
     d = Mac_IP_MapTable[i].ip[j] / 16;
     e = Mac_IP_MapTable[i].ip[j] % 16;
     (d >= 10) ? SendByte(d + 55) : SendByte(d + 48); 
     (e >= 10) ? SendByte(e + 55) : SendByte(e + 48);
     SendByte(0x20);  
   }
   SendByte('-');
   SendByte('-'); 
   SendByte(0x20);  
   for(j = 0;j < 6;j++)
   { 
   
     d = Mac_IP_MapTable[i].MAC[j] / 16;
     e = Mac_IP_MapTable[i].MAC[j] % 16;
     (d >= 10) ? SendByte(d + 55) : SendByte(d + 48); 
     (e >= 10) ? SendByte(e + 55) : SendByte(e + 48); 
     SendByte(0x20); 
   } 
   SendByte(0xd);  
   SendByte(0xa); 
 
 } 

}

/****************************************************************************
* 名称:IP_CONVERT_TO_MACaddress()
* 功能:基于MAC——IP地址映射表,实现IP到MAC的转换
* 入口: *IP--存入IP地址的首地址,mac--存放MAC地址的首地址
* 出口: SUCC,FAIL
****************************************************************************/

u8 IP_CONVERT_TO_MACaddress(u8 *IP,u8 *mac)
{
 u16 i;
 u8 j,flag;
 for(i = 0;i <Maximum_Item_for_MAC_IP_MAPTABLE;i++ )
 {
   flag = SUCC;
   for(j = 0 ;j < 4 ;j++)
     if(Mac_IP_MapTable[i].ip[j] != IP[j])
     {
        flag = FAIL;
        break;  
     }
   if(flag == SUCC)
   {  
     for(j = 0;j  < 6;j++)
       mac[j] = Mac_IP_MapTable[i].MAC[j];
       return(SUCC);
   
   } 
 
 }

  return(FAIL);
}

/****************************************************************************
* 名称:ADD_MAC_IPitems_to_Mac_IP_MapTable()
* 功能:向MAC——IP地址映射表加入一人MAC_ip item
* 入口: *IP--存入IP地址的首地址,mac--存放MAC地址的首地址
* 出口: SUCC
****************************************************************************/
u8 ADD_MAC_IPitems_to_Mac_IP_MapTable(u8 *IP,u8 *mac)
{
 u16 i;
 u8 j,flag;
 
 if(IP_CONVERT_TO_MACaddress(IP,mac) == SUCC)
   return(SUCC);
 for(i = 0;i <Maximum_Item_for_MAC_IP_MAPTABLE;i++ )
 {
   flag = SUCC;
   for(j = 0;j  <6;j++)
     if(Mac_IP_MapTable[i].MAC[j] != 0)
     {
       flag = FAIL;
       break;
     } 
   if(flag== SUCC)
   {
      for(j=0 ;j < 4 ;j++)
      if(Mac_IP_MapTable[i].ip[j] != 0)
      {
         flag = FAIL;
         break;  
      } 
   }
   else
      continue;  
   if(flag == SUCC)
     break;
 } 
 if(i >= Maximum_Item_for_MAC_IP_MAPTABLE)
    i = 0;
 for(j = 0;j  < 6;j++)
    Mac_IP_MapTable[i].MAC[j] = mac[j];
 for(j=0 ;j < 4 ;j++)
    Mac_IP_MapTable[i].ip[j] = IP[j];
          
  return(SUCC);

}

/****************************************************************************
* 名称:CLR_Mac_IP_MapTable()
* 功能:将MAC——IP地址映射表全部清除
* 入口:无
* 出口: 无
****************************************************************************/
void CLR_Mac_IP_MapTable(void) 
{
 u16 i;
 u8 j;
 for(i = 0;i <Maximum_Item_for_MAC_IP_MAPTABLE;i++ )
 {
    for(j = 0;j  < 6;j++)
      Mac_IP_MapTable[i].MAC[j] = 0;
    for(j = 0 ;j < 4 ;j++)
     Mac_IP_MapTable[i].ip[j] = 0;
 }
}


/****************************************************************************
* 名称:Rec_ARP_Packed(u8 *pkt)
* 功能:接收ARP请求数据包,发送ARM应答
* 入口:pkt--ARP数据包首地址
* 出口:无
****************************************************************************/

void Rec_ARP_Packed(u8 *pkt)
{ u8 i;
  Arp_packed = (struct ARP_PACKED *)(pkt);
  //SendByte('x');
  //SendByte(Arp_packed->op);
  /*检查OP=0x100--ARP请求*/
  if(Arp_packed->op == 0x100)
  {SendByte('y');
    /* 检查目的IP地址*/  
    if(MY_IP_ADD[0] == Arp_packed->IP_ADD_DEST[0] &&
       MY_IP_ADD[1] == Arp_packed->IP_ADD_DEST[1] &&
       MY_IP_ADD[2] == Arp_packed->IP_ADD_DEST[2] &&
       MY_IP_ADD[3] == Arp_packed->IP_ADD_DEST[3]) 
       { 
          SendByte('z');
          Arp_packed->op = 0x200;/*ARP应答*/
          for(i = 0;i < 4;i++)
          {
            pkt[i+24] = pkt[i+14];
            pkt[i+14] = MY_IP_ADD[i];

          }        
          for(i = 0;i < 6;i++)
          {
            pkt[i+18] = pkt[i+8];
            pkt[i+8] = MY_MAC_1ID[i];
          }
          //SendByte(0xff);SendByte(0xff);
          //for(i = 0;i < 60;i++)
          //  SendByte(pkt[i]);

               
          pkts.DAPTR = pkt;
          pkts.length = sizeof(struct ARP_PACKED);
          pkts.STPTR = NULL;

          
          Send_ethernet_frame(&pkts,
                    Arp_packed->MAC_ADD_DEST,ARP_PACKET);
          /*将ARP发送端的源地址(MAC,IP)--加入IP_MAC地址映射表中*/
          ADD_MAC_IPitems_to_Mac_IP_MapTable(pkt+ 24,pkt+18);           
       
       } 
  
  }
  else if(Arp_packed->op == 0x200)
  {
    ADD_MAC_IPitems_to_Mac_IP_MapTable(pkt+ 14,pkt+8);
  
  
  }
  
}
/****************************************************************************
* 名称:Send_ARP_Request
* 功能:发送ARP请求包
* 入口:IP_ADDr--被解释的IP地址
* 出口: 无
****************************************************************************/
void Send_ARP_Request(u8 *IP_ADDr)
{

 u8 i;
   ARP_PACKED.HARD_TYPE = 0x100;
   ARP_PACKED.PROTOCOL_TYPE = 0x8;
   ARP_PACKED.hard_add_len = 6;
   ARP_PACKED.PROTOCOL_add_len = 4;
   ARP_PACKED.op = 0x100;
   for(i = 0;i < 4;i++)
   {
     ARP_PACKED.IP_ADD_SRC[i] = MY_IP_ADD[i];
     ARP_PACKED.IP_ADD_DEST[i] = IP_ADDr[i];  
   }
   
   
   for(i = 0;i<6;i++)
   {
    ARP_PACKED.MAC_ADD_SRC[i] = MY_MAC_1ID[i];
    ARP_PACKED.MAC_ADD_DEST[i] = 0xff ;
   }   
   pkts.length = sizeof(struct ARP_PACKED);
   pkts.DAPTR = (u8 *)( & ARP_PACKED.HARD_TYPE);
   pkts.STPTR = NULL;
   Send_ethernet_frame(&pkts,ARP_PACKED.MAC_ADD_DEST,ARP_PACKET);   
 
}

/****************************************************************************
* 名称:delay()
* 功能:延时程序
* 入口:无
* 出口: 无
****************************************************************************/

void delay(void)
{
  u32 i;
  for(i = 0;i<2000;i++)
    Rec_Packet();

}

/****************************************************************************
* 名称:Send_ARP_PACKED()
* 功能:发送ARP请求,由IP地址求得MAC地址
* 入口:IP_ADR--被解释的IP地址
* 出口:无
****************************************************************************/


u8 Send_ARP_PACKED(u8 *IP_ADR)
{
 u8 mac[6]; 
 u16 retry;
 retry = 0;
 do{ 
     
     Send_ARP_Request(IP_ADR);
     delay();
     
     if(retry == 1000)
      {
         return(FAIL);
      }
      retry++;
     
     if(IP_CONVERT_TO_MACaddress(IP_ADR,mac) == SUCC)
     {
       return(SUCC); 
     };
      
 }while(1);
 
} 

/*
+FFTR--------------------------------------------------------------------
$Log: arp.c,v $
Revision 1.5  2006/12/31 16:08:21  tony
由于write_file慢(1KB/S)导致FTP服务器put file失序,不写file时序正常

Revision 1.4  2007/01/01 00:11:15  tony
完成了与FTP.EXE兼容,如命令dir,ls,get;
与IE(Internet Explorer)已完成了目录查看,
拷贝小于80k的文件

Revision 1.3  2006/12/31 16:12:31  tony
SOCKET API函数connect()测试成功

Revision 1.2  2006/12/31 16:05:31  tony
增加FTP代码,SOCKET_status字段


-FFTR--------------------------------------------------------------------
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -