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

📄 tcpip.c

📁 S3C4510B的例程
💻 C
字号:
/***********************************************************************
 *  MODULE:        tcp_ip.c     
 *  Description:   TCPIP Min Stack
 *  Runtime Env:   ARM7TDMI - KS32C50100
 *  Company:       
 *  Change History:
 *     03-28-02   Create (Yadong Wang)
 ***********************************************************************/
#include "common_types.h"
#include "samsung4510.h"
#include "main.h"

#define EthUdpPortHwTest	0x0007
#define EthUdpPortLookBack	0x0008

static void ARP_Process(tU8 *buf, tU16 size);
static void IP_Process(tU8 *buf, tU16 size);
static void IP_ICMP(tU8 *buf, tU16 size);
static void WriteIP(tU8 *sptr, tU8 * dptr, tU16 size);

static tU8 TxBuf[1500], *RxBuf;
static tU8 IpAddr[4] = {192,168,1,18};


/***********************************************************************
 *  Call Back by Ethernet Rx Interrupt
 ***********************************************************************/
void ReceivePackets(tU8 *buf, tU16 size)
{
	if (buf[12] == 0x08 && buf[13] == 0x06)
		ARP_Process(buf, size);
	else if (buf[12] == 0x08 && buf[13] == 0x00)
		IP_Process(buf, size);
	else
		EthData[EthNoArpIpCnt]++;
}


/***********************************************************************
 *  ARP Rx Message processing
 ***********************************************************************/
void ARP_Process(tU8 *buf, tU16 size)
{
	tU8 error = 0, i, *sptr, *dptr;
	
	EthData[EthArpCnt]++;

	sptr = &buf[14];

	if (sptr[0] != 0 || sptr[1] != 0x01)
		error = 1;

	if (!error && (sptr[2] != 0x08 || sptr[3] != 0x00))
		error = 1;

	if (!error && sptr[4] != 0x06)
		error = 1;

	if (!error && sptr[5] != 0x04)
		error = 1;

	if (!error && (sptr[6] != 0x00 || sptr[7] != 0x01))
		error = 1;

	if (!error && (sptr[24]!=IpAddr[0] || sptr[25]!=IpAddr[1] ||
		           sptr[26]!=IpAddr[2] || sptr[27]!=IpAddr[3]))
		error = 1;

	if(error)
	{
		EthData[EthArpErrCnt]++;
		return;
	}

	sptr = buf;
	dptr = TxBuf;

	for(i=0; i<6; i++)
		*dptr++ = sptr[i];

	for(i=0; i<6; i++)
		*dptr++ = dev_addr[i];

	*dptr++ = 0x08;
	*dptr++ = 0x06;

	*dptr++ = 0x00;
	*dptr++ = 0x01;

	*dptr++ = 0x08;
	*dptr++ = 0x00;

	*dptr++ = 0x06;

	*dptr++ = 0x04;

	*dptr++ = 0x00;
	*dptr++ = 0x02;

	for(i=0; i<6; i++)
		*dptr++ = dev_addr[i];

	for(i=0; i<4; i++)
		*dptr++ = IpAddr[i];

	for(i=0; i<6; i++)
		*dptr++ = sptr[i+6];

	for(i=0; i<4; i++)
		*dptr++ = sptr[i+28];

	DrvEthWrite(TxBuf, 42);
}


/***********************************************************************
 *  IP Rx Message processing
 ***********************************************************************/
void IP_Process(tU8 *buf, tU16 size)
{
	tU8 *ptr;
	tU16 Frag, ReqSize;

	ptr = &buf[14];

	// Check the Data Length
	ReqSize = (ptr[2] << 8) | ptr[3];
	if (size < ReqSize)
	{
//		Print("Error: IP Length\n");
		return;
	}

	// Check the Fragment, will be support later
	Frag = (ptr[6] << 8) | ptr[7];
	if (Frag & 0x3FFF)
	{
		EthData[EthIpFragCnt]++;
		return;
	}

	// Check Protocol
	if (ptr[9] == 0x01)
	{
		EthData[EthIpIcmpCnt]++;
		IP_ICMP(buf, ReqSize);
	}
	else if (ptr[9] == 0x11)
	{
		EthData[EthIpUdpCnt]++;
	}
	else
	{
		EthData[EthIpOtherCnt]++;
	}
}


/***********************************************************************
 *  ICMP Rx Message processing
 ***********************************************************************/
void IP_ICMP(tU8 *buf, tU16 size)
{
	tU8  y, *ptr;
	tU16 x0, x, i;

	ptr = &TxBuf[14+20];

	// Copy the Data
	ptr[0] = 0x00;	// Type
	ptr[1] = 0x00;	// Code
	ptr[2] = 0x00;	// CheckSumHi
	ptr[3] = 0x00;	// CheckSumLo
	for(i=4; i<(size-20); i++)
		ptr[i] = buf[14+20+i];

	// Data Checksum
	for(x=0, y=0, i=0; i<(size-20); i+=2)
	{
		x0 = x;
		x += (ptr[i]<<8) + ptr[i+1];
		if (x<x0)
			y++;
	}
	x += y;
	x = 0xFFFF - x;
	ptr[2] = x>>8;
	ptr[3] = x;

	WriteIP(buf, TxBuf, size);
}



/***********************************************************************
 *  IP Tx Routines
 ***********************************************************************/
void WriteIP(tU8 *sptr, tU8 *dptr, tU16 size)
{
	tU8 y, *dptr0;
	tU16 x0, x, i;

	dptr0 = dptr;

	for (i=0; i<6; i++)
		dptr[i] = sptr[i+6];

	for (i=0; i<6; i++)
		dptr[6+i] = dev_addr[i];

	// Ethernet Type
	dptr[12] = sptr[12];
	dptr[13] = sptr[13];

	// IP version, header length, TOS
	dptr[14] = sptr[14];
	dptr[15] = sptr[15];

	// IP length
	dptr[16] = size >> 8; 
	dptr[17] = size & 0xFF;

	// Datagram ID
	dptr[18] = sptr[18];
	dptr[19] = sptr[19];

	// Fragment Offset
	dptr[20] = 0x40; //sptr[i];
	dptr[21] = 0x00; //sptr[i];

	dptr[22] = 128;

	dptr[23] = sptr[23];

	dptr[14+10] = 0x00;
	dptr[14+11] = 0x00;

	for (i=0; i<4; i++)
		dptr[14+16+i] = sptr[14+12+i];

	for (i=0; i<4; i++)
		dptr[14+12+i] = IpAddr[i];

	x=0;
	y=0;
	for(i=0; i<20; i+=2)
	{
		x0 = x;
		x += (dptr[14+i]<<8) + dptr[14+i+1];
		if (x < x0)
			y++;
	}
	x +=y;
	x = 0xFFFF - x;
	dptr[14+10] = x >> 8;
	dptr[14+11] = x;

	if (DrvEthWrite(dptr0, size + 14) == 0)
		Print("Error: Send Packet\n");
}

⌨️ 快捷键说明

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