?? tftp_8900
字號:
/******************************
交換高低字節(jié)
********************************/
int low2high(int i)
{
return ((i>>8)&0x00ff)+((i<<8)&0xff00);
}
/******************************
將數(shù)據(jù)報讀取到packetRAM[]中
********************************/
static void readpacket(int i)
{
packetRAM[i]=low2high(CS8900_RTDATA);
}
/******************************
交換以太頭地址
********************************/
void EthResp()
{
packetRAM[1]=packetRAM[4];//packetRAM[pktDest12]=packetRAM[pktSrc12];
packetRAM[2]=packetRAM[5];//packetRAM[pktDest34]=packetRAM[pktSrc34];
packetRAM[3]=packetRAM[6];//packetRAM[pktDest56]=packetRAM[pktSrc56];
packetRAM[4]=0x0123;
packetRAM[5]=0x4567;
packetRAM[6]=0x89AB;
}
/******************************
發(fā)送數(shù)據(jù)報文的函數(shù)
********************************/
void sendpacket()
{
//寫發(fā)送命令字
//CS8900_PP_TxCommand=0x00C0;
io_write(IO_BASE+IO_TX_COMMAND, TxStart | TxCMD_LOW);//TxStart =(3<<6),TxCMD_LOW=(0x09),command=c9h
//寫入發(fā)送數(shù)據(jù)報文的長度
//CS8900_PP_TxLength=packetRAM[pktLen];pktLen=0,讀取數(shù)組中首地址中的值
io_write(IO_BASE+IO_TX_LENGTH, packetRAM[0]);
//CS8900_TxLEN=packetRAM[pktLen];
//等待線路空閑的時候發(fā)送while(!(get_reg(PP_BusSTAT)&PP_BusSTAT_TxRDY));
while(!(reg_read(0x0138)&0x0100));//PP_BusSTAT_TxRDY=0x0100 // Ready for Tx data
//寫入需要發(fā)送的數(shù)據(jù)
for(i=1;i<=packetRAM[pktLen]/2;i++)
//CS8900_(PP_TxBASE+2*i-2)=low2high(packetRAM[i]);
CS8900_RTDATA=low2high(packetRAM[i]);
}
//
void receive()
{
for(;;)
{
while( reg_read(0x0124)&0x0100)//pp_rer為接收幀狀態(tài)寄存器,此句為檢測數(shù)據(jù)無錯接收
{
packetRAM[0]=reg_read(0x0402);//rxlength為接收長,只讀寄存器,當RXOK置位時自動生成接收幀長度,但注意包不包括CRC的長度
//收取前面的74個字節(jié),如果是ICMP正好包括了最后一個字符 14+20+8+32
for (i=1;i<=23; i++)//pktDest12=1,目的地址
{
readpacket(i);
//packetRAM[i]=low2high(CS8900_RTDATA);//交換CS8900_RTDATA即為PORT0口的高低字節(jié),PORT0在16位模式下存放CPU和8900交換的數(shù)據(jù)幀
}//交換是因為大小斷不一樣
//檢查幀的類型 如果是 0806 表示arp
if (packetRAM[7]==0x0806)//pktType =7 幀類型 0800 IP 0806 ARP
{
//*******************************
//發(fā)現(xiàn)ARP數(shù)據(jù)報文就開始發(fā)送RARP
//*********************************
//判斷arp是否合法
/*
if (packetRAM[arp_hwtype]!=0x0001)
return;
if (packetRAM[arp_prtype]!=0x0800)
return;
if (packetRAM[arp_hwlen]!=0x0604)
return;
if (packetRAM[arp_op]!=0x0001)
return;
if (packetRAM[arp_tpa]!=IP12)
return;
if (packetRAM[arp_tpa+1]!=IP34)
return;
*/
//判斷結(jié)束 如果沒有返回說明需要發(fā)送RARP
//******************************
// 發(fā)送arp request
//********************************
//修改arp操作碼為rarp
packetRAM[11]=0x0002; //arp_op=11 ,arp 操作碼 00 01 表示Request 00 02 表示Reply
//交換以太Mac
EthResp();
//源mac 寫到目的mac
packetRAM[17]=packetRAM[12];//packetRAM[arp_tha]=packetRAM[arp_sha];
packetRAM[18]=packetRAM[12+1];//packetRAM[arp_tha+1]=packetRAM[arp_sha+1];
packetRAM[19]=packetRAM[12+2];//packetRAM[arp_tha+2]=packetRAM[arp_sha+2];
//源ip 寫到目的ip
packetRAM[20]=packetRAM[15];//packetRAM[arp_tpa]=packetRAM[arp_spa];
packetRAM[20+1]=packetRAM[15+1];//packetRAM[arp_tpa+1]=packetRAM[arp_spa+1];
//重寫源mac
packetRAM[12]=0x0123;//packetRAM[arp_sha]=MAC12;
packetRAM[12+1]=0x4567;//packetRAM[arp_sha+1]=MAC34;
packetRAM[12+2]=0x89AB;//packetRAM[arp_sha+2]=MAC56;
//重寫源IP
packetRAM[15]=0xCA71;
packetRAM[15+1]=0x1824;
//發(fā)送rarp報文
sendpacket();
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -