?? 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 + -