📄 net_head.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 + -