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

📄 ip.c

📁 很好的网络编程协议源码
💻 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 + -