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

📄 net_head.c

📁 TI的2812控制交通灯
💻 C
字号:
void HEAD_Ethernet (void) //以太网头,14个字节
{
   u16 i,Len=Start_Ethernet;
   for (i=0;i<6;i++)
      Send_Buffer[Len++]=MAC_O_Addr[i];  //外部MAC地址
   for (i=0;i<6;i++)
      Send_Buffer[Len++]=MAC_Addr[i];  //本地MAC地址
   //printf("PACK_Type = %4x\n",PACK_Type);
   Send_Buffer[Len++]=PACK_Type>>8;        //帧类型
   Send_Buffer[Len++]=PACK_Type&0xff;
}

void SumCheck(u8 *Addr,u16 len);

void HEAD_IP(void)  //IP头,20字节
{
   u16 i,Len=Start_IP;
   u32 Data_SUM;
   for (i=0;i<2;i++)    //4位版本好,4位首部长度,8位服务类型
      Send_Buffer[Len++]=Receive_Buffer[Len];
   Send_Buffer[Len++]=IP_PACK_Len>>8;  //IP数据总长度
   Send_Buffer[Len++]=IP_PACK_Len%256;
   for(i=0;i<6;i++)
      Send_Buffer[Len++]=Receive_Buffer[Len];   //16位标识,3位标志,13位片偏移,8位成存时间,8位协议
   Send_Buffer[Len++]=0;    //校验和,先设置为0
   Send_Buffer[Len++]=0;
   for (i=0;i<4;i++)
      Send_Buffer[Len++]=IP_Addr[i];  //本地IP地址
   for (i=0;i<4;i++)
      Send_Buffer[Len++]=IP_O_Addr[i];  //外部IP地址
   Data_SUM=CHECK_SUM(Send_Buffer,14,20)&0xffff; //IP首部校验和
   Send_Buffer[14+10]=Data_SUM/0x100;
   Send_Buffer[14+11]=Data_SUM&0xff;
   
   SumCheck(&Send_Buffer[14],20);
   
}

void SumCheck(u8 *Addr,u16 len)
{
	u16 temp;
	temp=CHECK_SUM(Addr,0,len);
	if(temp==0)
		asm("	nop");
	else
		asm("	nop");

}


void HEAD_TCP(void)  //TCP头,20字节
{
   u16 Len=Start_TCP,Bogus_Len=0;
   u16 i;//Data_Len;
   u32 Data_SUM;
   u8 TCP_Bogus_Head[12];
   for(i=0;i<2;i++)
      Send_Buffer[Len++]=Receive_Buffer[Len+2];  //16位源端口号
   for(i=0;i<2;i++)
      Send_Buffer[Len++]=Receive_Buffer[Len-2];  //16位目的端口号

   Change_u32_u8(Send_Buffer,Len,TCP_ISN);  //32位序号
   Len+=4;

   Change_u32_u8(Send_Buffer,Len,TCP_ISN_A); //32位确认序号
   Len+=4;

   /*Send_Buffer[Len++]=(TCP_ISN/0x1000000)&0xff;  //32位序号
   Send_Buffer[Len++]=(TCP_ISN/0x10000)&0xff;
   Send_Buffer[Len++]=(TCP_ISN/0x100)&0xff;
   Send_Buffer[Len++]=TCP_ISN&0xff;

   Send_Buffer[Len++]=(TCP_ISN_O/0x1000000)&0xff; //32位确认序号
   Send_Buffer[Len++]=(TCP_ISN_O/0x10000)&0xff;
   Send_Buffer[Len++]=(TCP_ISN_O/0x100)&0xff;
   Send_Buffer[Len++]=TCP_ISN_O&0xff;*/

   Send_Buffer[Len++]=0x50;  //4位首部长度和前4位保留
   Send_Buffer[Len++]=TCP_Symbol_Send;  //后2位保留,6个标志位
   for(i=0;i<2;i++)
   {
      Send_Buffer[Len++]=Receive_Buffer[Len];  //16位窗口大小
   	 //Len++;
   }
   for(i=0;i<2;i++)
      Send_Buffer[Len++]=0;  //16位校验和,先设置为0
   for(i=0;i<2;i++)
      Send_Buffer[Len++]=0;  //16位紧急指针

   Data_SUM=CHECK_SUM(Send_Buffer,Start_TCP,HEAD_Len_TCP+DATA_Len_HTTP);  //第一步校验和


   //设置TCP的伪首部
   for(i=0;i<4;i++)
      TCP_Bogus_Head[Bogus_Len++]=IP_Addr[i];
   for(i=0;i<4;i++)
      TCP_Bogus_Head[Bogus_Len++]=IP_O_Addr[i];
   TCP_Bogus_Head[Bogus_Len++]=0;
   TCP_Bogus_Head[Bogus_Len++]=6;
   DATA_Len_TCP=DATA_Len_HTTP+20;
   TCP_Bogus_Head[Bogus_Len++]=DATA_Len_TCP/0x100;
   TCP_Bogus_Head[Bogus_Len++]=DATA_Len_TCP&0xff;
   Data_SUM+=CHECK_SUM(TCP_Bogus_Head,0,12)&0xffff;       //伪首部的校验和

   Data_SUM=(Data_SUM/0x10000)+(Data_SUM&0xffff);
   Data_SUM+=Data_SUM/0x10000;

   Send_Buffer[Start_TCP+16]=(Data_SUM>>8)&0xff;
   Send_Buffer[Start_TCP+17]=Data_SUM&0xff;

	SumCheck(&Send_Buffer[Start_TCP],HEAD_Len_TCP+DATA_Len_HTTP+12);
}


⌨️ 快捷键说明

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