📄 arp.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 + -