00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "includes.h"
00010
00011 #define EthernetIpIdleState 0
00012
00013 IP_CONTROL IpCtrl;
00014 void F_EthernetIpInit(void);
00015 INT8U F_EthernetIpInUseCheck(void);
00016 INT8U F_EthernetIpAllocate(INT16U UserId);
00017 INT8U F_EthernetIpRelease(INT16U UserId);
00018 INT8U F_EthernetIpPacketReceive(ETHBUFFER *pBuffer);
00019 INT8U F_EthernetIpSend(ETHBUFFER *pBuffer,INT8U *pIpAddress,INT8U Protocol);
00020 void F_EthernetIpBufferReserve(ETHBUFFER *pBuffer);
00021 INT8U* F_EthernetIpSourceIpGet(ETHBUFFER *pBuffer);
00022 INT16U F_EthernetIpFastCheckSum(INT8U *pIph,INT32U Ihl);
00023
00024 void F_EthernetIpInit(void){
00025 IpCtrl.IpAddress[0]=0x00;
00026 IpCtrl.IpAddress[1]=0x00;
00027 IpCtrl.IpAddress[2]=0x00;
00028 IpCtrl.IpAddress[3]=0x00;
00029
00030 IpCtrl.InUse=FALSE;
00031 IpCtrl.State=EthernetIpIdleState;
00032 }
00033 void F_EthernetIpSvc(void){}
00034 INT8U F_EthernetIpInUseCheck(void){
00035 if(IpCtrl.InUse==TRUE) return TRUE;
00036 else return FALSE;
00037 }
00038 INT8U F_EthernetIpAllocate(INT16U UserId){
00039 if(IpCtrl.InUse==FALSE){
00040 IpCtrl.InUse=TRUE;
00041 IpCtrl.UserId=UserId;
00042 return TRUE;
00043 }
00044 else return FALSE;
00045 }
00046 INT8U F_EthernetIpRelease(INT16U UserId){
00047 if((IpCtrl.InUse==TRUE)&&(IpCtrl.UserId==UserId)){
00048 IpCtrl.InUse=FALSE;
00049 return TRUE;
00050 }
00051 else return FALSE;
00052 }
00053 INT8U F_EthernetIpIpAddressSet(INT16U UserId,INT8U *pIpAddress){
00054 if((IpCtrl.InUse==TRUE)&&(IpCtrl.UserId==UserId)){
00055 IpCtrl.IpAddress[0]=pIpAddress[0];
00056 IpCtrl.IpAddress[1]=pIpAddress[1];
00057 IpCtrl.IpAddress[2]=pIpAddress[2];
00058 IpCtrl.IpAddress[3]=pIpAddress[3];
00059 return TRUE;
00060 }
00061 else return FALSE;
00062 }
00063 INT16U F_EthernetIpFastCheckSum(INT8U *pIph,INT32U Ihl){
00064 INT32U Sum;
00065
00066 Sum=0;
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089 return Sum;
00090 }
00091 INT8U F_EthernetIpPacketReceive(ETHBUFFER *pBuffer){
00092 IP_HEAD *pIpHead=(IP_HEAD *)pBuffer->pData;
00093
00094 #if(DEBUG_ETHERNET_IP==1)
00095 printf("\n IP receive");
00096
00097
00098
00099
00100 #endif
00101 if((pIpHead->DestiAddress[0]==IpCtrl.IpAddress[0])&&
00102 (pIpHead->DestiAddress[1]==IpCtrl.IpAddress[1])&&
00103 (pIpHead->DestiAddress[2]==IpCtrl.IpAddress[2])&&
00104 (pIpHead->DestiAddress[3]==IpCtrl.IpAddress[3])){
00105 pBuffer->Length=F_EthernetUnsignedShortN2H(pIpHead->TotalLength);
00106 #if(DEBUG_ETHERNET_IP==1)
00107 printf("\n data length %4x ",pBuffer->Length);
00108 #endif
00109 F_EthernetBufferPull(pBuffer,sizeof(IP_HEAD));
00110 if(pIpHead->Protocol==UDP){
00111 #if(DEBUG_ETHERNET_IP==1)
00112 printf(" UDP ");
00113 #endif
00114 F_EthernetUdpPacketReceive(pBuffer);
00115 }
00116 else if(pIpHead->Protocol==ICMP){
00117 #if(DEBUG_ETHERNET_IP==1)
00118 printf(" ICMP ");
00119 #endif
00120 F_EthernetIcmpPacketReceive(pBuffer);
00121 }
00122
00123
00124
00125
00126
00127
00128 else{
00129 #if(DEBUG_ETHERNET_IP==1)
00130 printf(" none ");
00131 #endif
00132 }
00133
00134 }
00135 else{
00136 #if(DEBUG_ETHERNET_IP==1)
00137 printf("\n address no match ");
00138 #endif
00139 }
00140 return TRUE;
00141 }
00142 INT8U F_EthernetIpSend(ETHBUFFER *pBuffer,INT8U *pIpAddress,INT8U Protocol){
00143 IP_HEAD *pIpHead;
00144 INT16U Id=32;
00145 INT8U DestiAddress[ETHERNET_MAC_LENGTH];
00146
00147 if(F_EthernetArpAddressGet(pIpAddress,DestiAddress)==FALSE) return FALSE;
00148 pIpHead=(IP_HEAD *)F_EthernetBufferPush(pBuffer,sizeof(IP_HEAD));
00149 pIpHead->Ihl=5;
00150 pIpHead->Version=4;
00151 pIpHead->Tos=0;
00152 pIpHead->TotalLength=F_EthernetUnsignedShortH2N(pBuffer->Length);
00153 pIpHead->Id=F_EthernetUnsignedShortH2N(Id++);
00154 pIpHead->FlagOff=0;
00155 pIpHead->Ttl=20;
00156 pIpHead->Protocol=Protocol;
00157 pIpHead->Checksum=0;
00158 pIpHead->SourceAddress[0]=IpCtrl.IpAddress[0];
00159 pIpHead->SourceAddress[1]=IpCtrl.IpAddress[1];
00160 pIpHead->SourceAddress[2]=IpCtrl.IpAddress[2];
00161 pIpHead->SourceAddress[3]=IpCtrl.IpAddress[3];
00162 pIpHead->DestiAddress[0]=pIpAddress[0];
00163 pIpHead->DestiAddress[1]=pIpAddress[1];
00164 pIpHead->DestiAddress[2]=pIpAddress[2];
00165 pIpHead->DestiAddress[3]=pIpAddress[3];
00166 pIpHead->Checksum=F_EthernetIpFastCheckSum((INT8U *)pIpHead,pIpHead->Ihl);
00167 #if(DEBUG_ETHERNET_IP==1)
00168 printf("\n LengthIp %4x",pBuffer->Length);
00169 #endif
00170 F_EthernetSend(pBuffer,DestiAddress,ETHERNET_P_IP);
00171 return TRUE;
00172 }
00173 void F_EthernetIpBufferReserve(ETHBUFFER *pBuffer){
00174 F_EthernetBufferReserve(pBuffer,sizeof(ETHERNET_HEAD));
00175 F_EthernetBufferReserve(pBuffer,sizeof(IP_HEAD));
00176 }
00177 INT8U* F_EthernetIpSourceIpGet(ETHBUFFER *pBuffer){
00178 IP_HEAD *pIpHead;
00179
00180 pIpHead=(IP_HEAD *)(pBuffer->Data+ETHERNET_HEAD_LENGTH);
00181 return pIpHead->SourceAddress;
00182 }
00183