Note that there are some explanatory texts on larger screens.

plurals
  1. POHow can I set the TCP options for sending packets?
    primarykey
    data
    text
    <p>I'm programming software which can send tcp packets to an host.</p> <p>I'm able to create a packet with IP header, TCP Headers and data but I can't manage how to add TCP options like MSS, NOP, STACK, Window scaling or Timestamp.</p> <p>I mean i'm not able to add options to the TCP header, calculate the correct checksum to send a good TCP packet to the host.</p> <p>I can just send correct TCP packets without TCP options.</p> <p>Do you think I'm on the correct patch? Could somebody please help me?</p> <pre><code>/* TCP Header structure */ struct tcphdr { u_int16_t th_sport; /* source port */ u_int16_t th_dport; /* destination port */ u_int32_t th_seq; /* sequence number */ u_int32_t th_ack; /* acknowledgement number */ #if __BYTE_ORDER == __LITTLE_ENDIAN u_int8_t th_x2:4; /* (unused) */ u_int8_t th_off:4; /* data offset */ #endif #if __BYTE_ORDER == __BIG_ENDIAN u_int8_t th_off:4; /* data offset */ u_int8_t th_x2:4; /* (unused) */ #endif u_int8_t th_flags; # define TH_FIN 0x01 # define TH_SYN 0x02 # define TH_RST 0x04 # define TH_PUSH 0x08 # define TH_ACK 0x10 # define TH_URG 0x20 # define TH_ECE 0x40 # define TH_CWR 0x80 u_int16_t th_win; /* window */ u_int16_t th_sum; /* checksum */ u_int16_t th_urp; /* urgent pointer */ }; struct tcp_option_mss { uint8_t kind; /* 2 */ uint8_t len; /* 4 */ uint16_t mss; } __attribute__((packed)); struct tcphdr_mss { struct tcphdr tcphdr; struct tcp_option_mss mss; }; /* IP Header structure */ struct ip { #if __BYTE_ORDER == __LITTLE_ENDIAN unsigned int ip_hl:4; /* header length */ unsigned int ip_v:4; /* version */ #endif #if __BYTE_ORDER == __BIG_ENDIAN unsigned int ip_v:4; /* version */ unsigned int ip_hl:4; /* header length */ #endif u_int8_t ip_tos; /* type of service */ u_short ip_len; /* total length */ u_short ip_id; /* identification */ u_short ip_off; /* fragment offset field */ # define IP_RF 0x8000 /* reserved fragment flag */ # define IP_DF 0x4000 /* dont fragment flag */ # define IP_MF 0x2000 /* more fragments flag */ # define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ u_int8_t ip_ttl; /* time to live */ u_int8_t ip_p; /* protocol */ u_short ip_sum; /* checksum */ struct in_addr ip_src, ip_dst; /* source and dest address */ }; int send_packet(int sock, long dest_ip , long source_ip, long port, u_int8_t th_flags, unsigned long seq, unsigned long ack, unsigned long port1, unsigned char * data, unsigned long data_i) { char * packet; struct ip * pkt_ip; struct tcphdr * pkt_tcp; struct tcphdr_mss * tcp_header; struct sockaddr_in sin; packet = malloc(sizeof(struct ip) + sizeof(struct tcphdr_mss) + data_i); if (packet == NULL) { if (ECHO) fprintf(stderr, "Error in allocating memory\n"); exit(EXIT_FAILURE); } memset(packet, 0, sizeof(struct ip) + sizeof(struct tcphdr_mss)); pkt_ip = (struct ip *) packet; pkt_tcp = (struct tcphdr *) (packet + sizeof(struct ip)); pkt_tcp-&gt;th_sport = htons(port1); pkt_tcp-&gt;th_dport = htons(port); pkt_tcp-&gt;th_seq = htonl(seq); pkt_tcp-&gt;th_ack = htonl(ack); pkt_tcp-&gt;th_off = sizeof(struct tcphdr) / 4 + 1; pkt_tcp-&gt;th_flags = th_flags; pkt_tcp-&gt;th_win = htons(32768); pkt_tcp-&gt;th_sum = 0; tcp_header = malloc(sizeof(struct tcphdr)); tcp_header-&gt;tcphdr = *pkt_tcp; tcp_header-&gt;mss.kind = 2; tcp_header-&gt;mss.len = 4; tcp_header-&gt;mss.mss = htons(32000); pkt_ip-&gt;ip_v = 4; pkt_ip-&gt;ip_hl = sizeof(struct ip) &gt;&gt; 2; pkt_ip-&gt;ip_tos = 0; pkt_ip-&gt;ip_len = htons(sizeof(struct ip) + sizeof(struct tcphdr) + data_i); if (ipid &gt; 65000) ipid = 0; ipid++; pkt_ip-&gt;ip_id = ipid; pkt_ip-&gt;ip_off = 0; pkt_ip-&gt;ip_ttl = 64; pkt_ip-&gt;ip_p = IPPROTO_TCP ; pkt_ip-&gt;ip_sum = 0; pkt_ip-&gt;ip_src.s_addr = source_ip; pkt_ip-&gt;ip_dst.s_addr = dest_ip; pkt_ip-&gt;ip_sum = checksum((unsigned short*)pkt_ip, sizeof( struct ip) ); pkt_tcp-&gt;th_sum = in_cksum_tcp(pkt_ip-&gt;ip_src.s_addr, pkt_ip-&gt;ip_dst.s_addr, (unsigned short *) pkt_tcp, sizeof(struct tcphdr_mss), data, data_i); memcpy(((char *)pkt_tcp + sizeof(struct tcphdr_mss)), data, data_i); memset(&amp;sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = pkt_ip-&gt;ip_dst.s_addr; if (sendto(sock, packet, sizeof(struct ip) + sizeof(struct tcphdr_mss) + data_i, 0, (struct sockaddr *) &amp;sin, sizeof(sin)) &lt; 0) { perror("sendto"); free(packet); return -1; } free(packet); return 0; } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload