1	
     2	struct sp_data_exchange {
     3	  int fd;
     4	  char *data;
     5	  int datalen;
     6	  _32_bit source; unsigned short source_port;
     7	  _32_bit dest;   unsigned short dest_port;
     8	  _32_bit seq, ack;
     9	  unsigned short flags;
    10	  char *buffer;               /* work buffer */
    11	  int IP_optlen;             /* IP options length in bytes  */
    12	  int TCP_optlen;            /* TCP options length in bytes */
    13	};  
    14	
    15	struct TCP_header                       /* The TCP header (without options) */
    16	{
    17	  unsigned short source, destination;
    18	  _32_bit seq_nr, ACK_nr;
    19	  unsigned short offset_flag, window, checksum, urgent; 
    20	};
    21	
    22	struct pseudo_IP_header 
    23	{
    24	  _32_bit source, destination;
    25	  char zero_byte, protocol;
    26	  unsigned short TCP_UDP_len;
    27	}; 
    28	
    29	void sp_fix_TCP_packet(struct sp_data_exchange *sp)
    30	{ 
    31	  char sp_pseudo_ip_construct[MTU];
    32	  struct TCP_header *sp_help_tcp;
    33	  struct pseudo_IP_header *sp_help_pseudo;
    34	  int i;
    35	
    36	  for(i=0;ibuffer+SP_IP_HEAD_BASE+sp->IP_optlen);
    40	  sp_help_pseudo = (struct pseudo_IP_header *) sp_pseudo_ip_construct;
    41	
    42	  sp_help_tcp->offset_flag = htons( (((SP_TCP_HEAD_BASE+sp->TCP_optlen)/4)<<12) | sp->flags); 
    43	  sp_help_tcp->seq_nr = htonl(sp->seq);
    44	  sp_help_tcp->ACK_nr = htonl(sp->ack);
    45	  sp_help_tcp->source = htons(sp->source_port);
    46	  sp_help_tcp->destination = htons(sp->dest_port);
    47	  sp_help_tcp->window = htons(0x7c00);             /* dummy for now 'wujx' */
    48	
    49	  sp_help_pseudo->source = sp->source;
    50	  sp_help_pseudo->destination =  sp->dest;
    51	  sp_help_pseudo->zero_byte = 0;
    52	  sp_help_pseudo->protocol = 6;
    53	  sp_help_pseudo->TCP_UDP_len = htons(sp->datalen+SP_TCP_HEAD_BASE+sp->TCP_optlen);
    54	
    55	  memcpy(sp_pseudo_ip_construct+12, sp_help_tcp, sp->TCP_optlen+sp->datalen+SP_TCP_HEAD_BASE);
    56	  sp_help_tcp->checksum=in_cksum((unsigned short *) sp_pseudo_ip_construct, 
    57					 sp->datalen+12+SP_TCP_HEAD_BASE+sp->TCP_optlen);
    58	#ifdef DEBUG
    59	  printf("TCP header fixed...\n");
    60	#endif
    61	}