📄 ip.c
字号:
/*
+FHDR------------------------------------------------------------------
Copyright (c),
Tony Yang –51,AVR,ARM firmware developer
Contact:qq 292942278 e-mail:tony_yang123@sina.com.cn
Abstract:
$Id: ip.c,v 1.4 2006/12/31 16:08:53 tony Exp $
-FHDR-------------------------------------------------------------------
*/
#include "config.h"
#include "tcp_ip_cfg.h"
#include "hardware.h"
#include "ethernet.h"
#include "uart0\uart0.h"
#include "icmp.h"
#include "arp.h"
#include "udp.h"
#include "tcp.h"
u8 data_offset;
u16 length;
u16 ID;
u8 IP_header[20];
/****************************************************************************
* 名称:IP_INIT(void)
* 功能:IP协议层初始化
* 入口:无
* 出口:无
****************************************************************************/
void IP_INIT(void)
{
ID = 0;
CLR_Mac_IP_MapTable();
}
/****************************************************************************
* 名称:Rec_IP_Packed
* 功能:接收IP数据包
* 入口:pkt--IP数据包的首地址
* 出口: 无
****************************************************************************/
void Rec_IP_Packed(u8 * pkt)
{
u16 checksum;//,i;
/*计算首部检验和*/
checksum = CheckSumUdp(pkt,20);
//UART0_SendByte(0x88);UART0_SendByte(0x88);
//UART0_SendByte((u8)(checksum / 256));
//UART0_SendByte((u8)checksum & 0xff);
//for(i = 0;i < 20;i++)
// IP_header[i] = pkt[i];
if(checksum != 0x0)
return;
//UART0_SendByte(0x66);UART0_SendByte(0x66);
//UART0_SendByte(sum / 256);
//UART0_SendByte(sum & 0xff);
data_offset = (pkt[0] & 0xf) * 4;
length = pkt[2] * 256 + pkt[3] - data_offset;
/* 检查IP目的地址 */
if(MY_IP_ADD[0] == pkt[16] &&
MY_IP_ADD[1] == pkt[17] &&
MY_IP_ADD[2] == pkt[18] &&
MY_IP_ADD[3] == pkt[19])
{
/* I P在首部中存入一个长度为
8 b i t的数值,称作协议域。1表示为I C M P协议,2表示为I G M P协议,6表示为T C P协议,1 7表
示为U D P协议*/
switch(pkt[9])
{
case ICMP:{ /*源IP地址*/
Rcv_ICMP_PKT(pkt + data_offset, length,pkt + 12/*源IP地址*/);
break;}
case IGMP:{ break;}
case TCP :{
Rcv_TCP_PKT(pkt + data_offset,length,pkt + 12/*IP地址*/);
break;}
case UDP :{
Rcv_UDP_PKT(pkt + data_offset, length,pkt + 12/*IP地址*/);
break;}
default: break;
}
}
}
/****************************************************************************
* 名称:Send_IP_PKT
* 功能:发送IP数据包
* 入口:struct _pkst *TxdData--IP数据包的首地址,
* dest_ip_add:接收端的IP地址,PROTOCOL-协议类型
* 出口: 无
****************************************************************************/
void Send_IP_PKT(struct _pkst *TxdData,
u8 *dest_ip_add,u8 PROTOCOL)
{
struct _pkst TxdData_,*temp_ptr;
u16 len;
u8 dest_mac_add[6];
u16 checksum;
IP_header[0] = 0x45;//4位版本4位首部长度
IP_header[1] = 0x0;//8位服务类型(TOS)
temp_ptr = TxdData;
len = 20;
do{
len = len + temp_ptr->length;
if(temp_ptr->STPTR == NULL)
break;
else
{
temp_ptr = temp_ptr->STPTR;
}
}while(1);
IP_header[2] = len >> 8;
IP_header[3] = len & 0xff;
IP_header[4] = 0xfd;//16位标识
IP_header[5] = 0xe2;
IP_header[6] = 0x40; //13位片偏移 3位标志
IP_header[7] = 0x0;
IP_header[8] = 0x40;//--; //8位生存时间
IP_header[9] = PROTOCOL; //8位协议
IP_header[10] = 0;//16位首部检验和
IP_header[11] = 0;
IP_header[12] = MY_IP_ADD[0];
IP_header[13] = MY_IP_ADD[1];
IP_header[14] = MY_IP_ADD[2];
IP_header[15] = MY_IP_ADD[3];
IP_header[16] = dest_ip_add[0];
IP_header[17] = dest_ip_add[1];
IP_header[18] = dest_ip_add[2];
IP_header[19] = dest_ip_add[3];
checksum = CheckSumUdp(IP_header,20);
//UART0_SendByte((u8)(checksum / 256));
//UART0_SendByte((u8)checksum & 0xff);
IP_header[11] = checksum & 0xff;
IP_header[10] = checksum >> 8;
if(IP_CONVERT_TO_MACaddress(dest_ip_add,dest_mac_add) != SUCC)
{
if(Send_ARP_PACKED(dest_ip_add)== FAIL)
return;
else
IP_CONVERT_TO_MACaddress(dest_ip_add,dest_mac_add);
}
TxdData_.STPTR = TxdData;
TxdData_.DAPTR = IP_header;
TxdData_.length = 20;
Send_ethernet_frame(&TxdData_,dest_mac_add,0x8);
}
/*
+FFTR--------------------------------------------------------------------
$Log: ip.c,v $
Revision 1.4 2006/12/31 16:08:53 tony
由于write_file慢(1KB/S)导致FTP服务器put file失序,不写file时序正常
Revision 1.3 2006/12/31 16:12:47 tony
SOCKET API函数connect()测试成功
Revision 1.2 2006/12/31 16:05:00 tony
增加FTP代码,SOCKET_status字段
-FFTR--------------------------------------------------------------------
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -