?? arp.bak
字號:
#ifndef _ARP_H_
#define _ARP_H_
#include <iptcp.h>
#include <time.h>
#define ARP_KEEP_TIME 100000
/*物理地址可以保存在緩存中最多的時間*/
void arp_request(ulong dest_ip);
int arp_resolve( ulong ina );
void arp_handler(arp_Header xdata *arp);
/*
*arp_resolve - 解析IP地址對應的硬件MAC地址
*/
extern eth_address xdata card_mac;
extern ulong xdata gateip;
extern ulong xdata local_ip;
extern ulong xdata mask;
bit arpok;
/*ARP如果要物理地址的話,把不知道的物理地址空起來,目標地址只好是廣播抵制了*/
int arp_resolve( ulong ina )
{
uint xdata timeout;
if(ina==0)return(FALSE);
if(curr_conf.timer!=0)return(TRUE);
curr_conf.dst_ip=ina;
/* 發送ARP請求 */
arp_request( ina );
timeout = set_timeout( 25);/* 250 ms */
/* 等待解析結果 */
while (chk_timeout( timeout ))
{
tick();
if ( arpok)
return ( TRUE );
}
fail:
return ( FALSE );
}
void arp_handler(arp_Header xdata *arp)
{
uchar temp;
eth_Header xdata *peth,*eth;
arp_Header xdata *parp;
eth=(eth_Header xdata *)((uchar xdata *)arp-sizeof(eth_Header));
peth=ETH_SEND_ADDR;
parp=ETH_SEND_ADDR+(sizeof(eth_Header));
/*我ARP一個物理地址, 它給我一個返回,看看和不合適*/
if(arp.opcode==ARP_REPLY)
{
if((arp.dstIPAddr==local_ip)&&(arp.srcIPAddr==curr_conf.dst_ip))
{
curr_conf.dst_mac=arp.srcEthAddr;
curr_conf.timer=ARP_KEEP_TIME;
arpok=TRUE;
}
}
/*別人要我的物理地址,給它把,不要小氣*/
if(arp.opcode==ARP_REQUEST)
{
if(arp.dstIPAddr==local_ip)
{
peth.destination=eth.source;
peth.source=card_mac;
peth.type=0x0806;
curr_conf.dst_mac = eth.source;
curr_conf.dst_ip = arp.srcIPAddr;
curr_conf.timer = ARP_KEEP_TIME;
parp.hwType=0x01;
parp.protType=0x0800;
parp.hwProtAddrLen=0x0604;
parp.opcode=ARP_REPLY;
parp.srcEthAddr=card_mac;
parp.srcIPAddr=local_ip;
parp.dstEthAddr=arp.srcEthAddr;
parp.dstIPAddr=arp.srcIPAddr;
eth_send(42);
}
}
}
void arp_request(ulong dest_ip)//request mac of a ip
{
uchar temp;
eth_Header xdata *peth;
arp_Header xdata *parp;
peth=ETH_SEND_ADDR;
parp=ETH_SEND_ADDR+sizeof(eth_Header);
peth.destination=MULTI_ADDR;
peth.source=card_mac;
peth.type=0x0806;
parp.hwType=0x01;
parp.protType=0x0800;
parp.hwProtAddrLen=0x0604;
parp.opcode=ARP_REQUEST;
parp.srcEthAddr=card_mac;
parp.srcIPAddr=local_ip;
parp.dstEthAddr=UNKOWN_ADDR;
if((s->myaddr&mask)!=(dest_ip&mask))/*子網掩碼不相同,需要將數據通過網關送出去*/
parp.dstIPAddr=gate_ip;
else
parp.dstIPAddr=dest_ip;
eth_send(42);
}
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -