ip4h->s_ip_src.s_addr = p->src.addr_data32[0];
ip4h->s_ip_dst.s_addr = p->dst.addr_data32[0];
ip4h->ip_proto = ipproto;
- ip4h->ip_verhl = sizeof(IPV4Hdr);
+ ip4h->ip_verhl = 0x40 | (sizeof(IPV4Hdr) / 4);
p->proto = ipproto;
int hdr_offset = sizeof(IPV4Hdr);
switch (ipproto) {
case IPPROTO_UDP: {
- UDPHdr *udph = PacketSetUDP(p, (GET_PKT_DATA(p) + sizeof(IPV4Hdr)));
+ UDPHdr *udph = PacketSetUDP(p, (GET_PKT_DATA(p) + hdr_offset));
if (udph == NULL)
goto error;
- udph->uh_sport = sport;
- udph->uh_dport = dport;
+ udph->uh_sport = htons(sport);
+ udph->uh_dport = htons(dport);
+ udph->uh_len = htons(payload_len + sizeof(UDPHdr));
+ ip4h->ip_len = htons(payload_len + sizeof(IPV4Hdr) + sizeof(UDPHdr));
hdr_offset += sizeof(UDPHdr);
break;
}
case IPPROTO_TCP: {
- TCPHdr *tcph = PacketSetTCP(p, GET_PKT_DATA(p) + sizeof(IPV4Hdr));
+ TCPHdr *tcph = PacketSetTCP(p, GET_PKT_DATA(p) + hdr_offset);
if (tcph == NULL)
goto error;
tcph->th_sport = htons(sport);
tcph->th_dport = htons(dport);
+ tcph->th_offx2 = (sizeof(TCPHdr) / 4) << 4;
+ tcph->th_win = 0x4444; // non-zero window
+ tcph->th_flags = TH_ACK;
+ ip4h->ip_len = htons(payload_len + sizeof(IPV4Hdr) + sizeof(TCPHdr));
hdr_offset += sizeof(TCPHdr);
break;
}
case IPPROTO_ICMP: {
- ICMPV4Hdr *icmpv4h = PacketSetICMPv4(p, (GET_PKT_DATA(p) + sizeof(IPV4Hdr)));
+ ICMPV4Hdr *icmpv4h = PacketSetICMPv4(p, (GET_PKT_DATA(p) + hdr_offset));
if (icmpv4h == NULL)
goto error;
const UDPHdr *udph = PacketGetUDP(p);
if (udph == NULL)
return 0;
- if (udph->uh_sport != sport)
+ if (SCNtohs(udph->uh_sport) != sport)
return 0;
- if (udph->uh_dport != dport)
+ if (SCNtohs(udph->uh_dport) != dport)
return 0;
break;
}