Code:
char *build_tcp_timestamp(uint32_t tsval, uint32_t tsecr)
{
struct tcp_timestamp time;
char *ret = malloc(s_tme + 1);
memset(&time, TCPOPT_NOP, s_tme);
if (!tsval) {
struct timeval now;
gettimeofday(&now, NULL);
time.tsval = htonl((uint32_t) now.tv_sec);
}
time.tsecr = htonl(tsecr);
time.kind = TCPOPT_TIMESTAMP;
time.length = TCPOLEN_TIMESTAMP;
memcpy(ret, &time, s_tme);
return ret;
}
Code:
{
if (syn->p_flags & TH_SYN) {
syn->opts = build_syn_ops();
syn->opt_len = 24;
} else if (syn->p_flags & TH_ACK) {
syn->opts = build_ack_ops(syn->p_tsval, syn->p_tsecr);
syn->opt_len = 12;
}
struct iovec *pio = malloc(s_iov);
pio->iov_len = s_eth + s_iph + s_tcp + syn->opt_len + syn->data_len;
pio->iov_base = calloc(1, pio->iov_len);
build_eth_hdr(pio, syn->p_src_mac, syn->p_dst_mac);
build_ip_hdr(pio, (uint32_t) pio->iov_len, syn->p_src_ip,
syn->p_dst_ip);
build_tcp_hdr(pio, syn->p_src_port, syn->p_dst_port,
syn->p_seq, syn->p_ack, syn->opt_len,
syn->p_flags, syn->opts, syn->data,
syn->opt_len, syn->data_len);
memcpy((char *)pio->iov_base + s_eth + s_iph + s_tcp,
syn->opts, syn->opt_len);
memcpy((char *)pio->iov_base + s_eth + s_iph + s_tcp + syn->opt_len,
syn->data, syn->data_len);
return pio;
}