785
社区成员




typedef struct ip_hdr
{
/*unsigned char
version:4,
ihl:4;*/
unsigned char h_ver;
unsigned char tos;
unsigned short tot_len;
unsigned short id;
unsigned short
zero:1,
frag:1,
more_frag:1,
frag_off:13;
unsigned char ttl;
unsigned char protocol;
unsigned short checkSum;
unsigned long saddr;
unsigned long daddr;
/*The options start here. */
}IP_HEADER;
unsigned short checkSum(unsigned char * buff, int wlen)
{
unsigned long sum = 0;
if (wlen) {
unsigned long bogus;
__asm__("clc\n"
"1:\t"
"lodsl\n\t"
"adcl %3, %0\n\t"
"decl %2\n\t"
"jne 1b\n\t"
"adcl $0, %0\n\t"
"movl %0, %3\n\t"
"shrl $16, %3\n\t"
"addw %w3, %w0\n\t"
"adcw $0, %w0"
: "=r" (sum), "=S" (buff), "=r" (wlen), "=a" (bogus)
: "0" (sum), "1" (buff), "2" (wlen));
}
return (~sum) & 0xffff;
}
int IPGen(ip_hdr *hdr,unsigned long srcIP,unsigned long dstIP)
{
/*hdr->version=4;
hdr->ihl=5;//= =?*/
hdr->h_ver=(4<<4 | sizeof(ip_hdr)/sizeof(unsigned int));
hdr->tos=0;
hdr->tot_len=sizeof(ip_hdr)+sizeof(tcp_hdr);
hdr->id=0;
hdr->zero=0;
hdr->frag=0;
hdr->more_frag=0;
hdr->frag_off=0;
hdr->ttl=64;
hdr->protocol=IP_TCP;
hdr->saddr=srcIP,
hdr->daddr=dstIP;
hdr->saddr=htonl(hdr->saddr);
hdr->daddr=htonl(hdr->daddr);
hdr->tot_len=htons(hdr->tot_len);
hdr->checkSum=0;
hdr->checkSum=checkSum((char*)hdr,sizeof(ip_hdr));
return 0;
}