- ip_pkt.pkt_len = (sizeof (ip_pkt) + sizeof (icmp_pkt)) << 8;
- ip_pkt.id = 1; /* kernel sets proper value htons(ip_id_counter); */
- ip_pkt.flags_frag_offset = 0;
- ip_pkt.ttl = 1; /* real TTL would be 1 on a time exceeded packet */
- ip_pkt.proto = IPPROTO_UDP;
- ip_pkt.src_ip = other->s_addr;
- ip_pkt.dst_ip = dummy.s_addr;
- ip_pkt.checksum = 0;
- ip_pkt.checksum = htons(calc_checksum((uint16_t*)&ip_pkt, sizeof (ip_pkt)));
- memcpy (&packet[off], &ip_pkt, sizeof (ip_pkt));
- off += sizeof (ip_pkt);
-
- memset(&udp_pkt, 0, sizeof (udp_pkt));
- udp_pkt.source_port = htons (target_port_number);
- udp_pkt.dst_port = htons (NAT_TRAV_PORT);
- fprintf (stderr,
- "** Generating ICMP with rpm %u\n",
- target_port_number);
- udp_pkt.mlen_aka_reply_port_magic = htons (source_port_number);
- udp_pkt.checksum_aka_my_magic = htons (target_port_number);
- memcpy (&packet[off], &udp_pkt, sizeof (udp_pkt));
- off += sizeof (udp_pkt);
+ icmp_pkt.ip.pkt_len = (sizeof (ip_pkt) + sizeof (icmp_pkt)) << 8;
+ icmp_pkt.ip.id = 1; /* kernel sets proper value htons(ip_id_counter); */
+ icmp_pkt.ip.flags_frag_offset = 0;
+ icmp_pkt.ip.ttl = 1; /* real TTL would be 1 on a time exceeded packet */
+ icmp_pkt.ip.proto = IPPROTO_UDP;
+ icmp_pkt.ip.src_ip = other->s_addr;
+ icmp_pkt.ip.dst_ip = dummy.s_addr;
+ icmp_pkt.ip.checksum = 0;
+ icmp_pkt.ip.checksum = htons(calc_checksum((uint16_t*)&icmp_pkt.ip, sizeof (icmp_pkt.ip)));
+ icmp_pkt.udp.source_port = htons (target_port_number);
+ icmp_pkt.udp.dst_port = htons (NAT_TRAV_PORT);
+ icmp_pkt.udp.mlen_aka_reply_port_magic = htons (source_port_number);
+ icmp_pkt.udp.checksum_aka_my_magic = htons (target_port_number);
+ icmp_pkt.checksum = htons(calc_checksum((uint16_t*)&icmp_pkt, sizeof (icmp_pkt)));
+ memcpy (&packet[off], &icmp_pkt, sizeof (icmp_pkt));
+ off += sizeof (icmp_pkt);