Ticket #21225: patch-tcpnice.c.diff

File patch-tcpnice.c.diff, 5.8 KB (added by hsivank@…, 15 years ago)
  • tcpnice.c

    old new  
    4141}
    4242
    4343static void
    44 send_tcp_window_advertisement(int sock, struct libnet_ip_hdr *ip,
     44send_tcp_window_advertisement(libnet_t *l, struct libnet_ipv4_hdr *ip,
    4545                             struct libnet_tcp_hdr *tcp)
    4646{
    4747        int len;
    4848       
    4949        ip->ip_hl = 5;
    50         ip->ip_len = htons(IP_H + TCP_H);
    51         ip->ip_id = libnet_get_prand(PRu16);
    52         memcpy(buf, (u_char *)ip, IP_H);
     50        ip->ip_len = htons(LIBNET_IPV4_H + LIBNET_TCP_H);
     51        ip->ip_id = libnet_get_prand(LIBNET_PRu16);
     52        memcpy(buf, (u_char *)ip, LIBNET_IPV4_H);
    5353       
    5454        tcp->th_off = 5;
    5555        tcp->th_win = htons(MIN_WIN);
    56         memcpy(buf + IP_H, (u_char *)tcp, TCP_H);
     56        memcpy(buf + LIBNET_IPV4_H, (u_char *)tcp, LIBNET_TCP_H);
    5757       
    58         libnet_do_checksum(buf, IPPROTO_TCP, TCP_H);
     58        libnet_do_checksum(l, buf, IPPROTO_TCP, LIBNET_TCP_H);
    5959       
    60         len = IP_H + TCP_H;
     60        len = LIBNET_IPV4_H + LIBNET_TCP_H;
    6161       
    62         if (libnet_write_ip(sock, buf, len) != len)
     62        if (libnet_write_raw_ipv4(l, buf, len) != len)
    6363                warn("write");
    6464       
    6565        fprintf(stderr, "%s:%d > %s:%d: . ack %lu win %d\n",
    66                 libnet_host_lookup(ip->ip_src.s_addr, 0), ntohs(tcp->th_sport),
    67                 libnet_host_lookup(ip->ip_dst.s_addr, 0), ntohs(tcp->th_dport),
     66                libnet_addr2name4(ip->ip_src.s_addr, 0), ntohs(tcp->th_sport),
     67                libnet_addr2name4(ip->ip_dst.s_addr, 0), ntohs(tcp->th_dport),
    6868                ntohl(tcp->th_ack), 1);
    6969}
    7070
    7171static void
    72 send_icmp_source_quench(int sock, struct libnet_ip_hdr *ip)
     72send_icmp_source_quench(libnet_t *l, struct libnet_ipv4_hdr *ip)
    7373{
    74         struct libnet_icmp_hdr *icmp;
     74        struct libnet_icmpv4_hdr *icmp;
    7575        int len;
    7676       
    7777        len = (ip->ip_hl * 4) + 8;
    7878
    79         libnet_build_ip(ICMP_ECHO_H + len, 0, libnet_get_prand(PRu16),
    80                         0, 64, IPPROTO_ICMP, ip->ip_dst.s_addr,
    81                         ip->ip_src.s_addr, NULL, 0, buf);
    82        
    83         icmp = (struct libnet_icmp_hdr *)(buf + IP_H);
     79        icmp = (struct libnet_icmpv4_hdr *)(buf + LIBNET_IPV4_H);
    8480        icmp->icmp_type = ICMP_SOURCEQUENCH;
    8581        icmp->icmp_code = 0;
    86         memcpy((u_char *)icmp + ICMP_ECHO_H, (u_char *)ip, len);
     82        memcpy((u_char *)icmp + LIBNET_ICMPV4_ECHO_H, (u_char *)ip, len);
    8783       
    88         libnet_do_checksum(buf, IPPROTO_ICMP, ICMP_ECHO_H + len);
     84        len += LIBNET_ICMPV4_ECHO_H;
    8985       
    90         len += (IP_H + ICMP_ECHO_H);
     86        libnet_build_ipv4(LIBNET_IPV4_H + len, 0,
     87                          libnet_get_prand(LIBNET_PRu16), 0, 64, IPPROTO_ICMP,
     88                          0, ip->ip_dst.s_addr, ip->ip_src.s_addr,
     89                          (u_int8_t *) icmp, len, l, 0);
    9190       
    92         if (libnet_write_ip(sock, buf, len) != len)
     91        if (libnet_write(l) != len)
    9392                warn("write");
    9493       
    9594        fprintf(stderr, "%s > %s: icmp: source quench\n",
    96                 libnet_host_lookup(ip->ip_dst.s_addr, 0),
    97                 libnet_host_lookup(ip->ip_src.s_addr, 0));
     95                libnet_addr2name4(ip->ip_dst.s_addr, 0),
     96                libnet_addr2name4(ip->ip_src.s_addr, 0));
    9897}
    9998
    10099static void
    101 send_icmp_frag_needed(int sock, struct libnet_ip_hdr *ip)
     100send_icmp_frag_needed(libnet_t *l, struct libnet_ipv4_hdr *ip)
    102101{
    103         struct libnet_icmp_hdr *icmp;
     102        struct libnet_icmpv4_hdr *icmp;
    104103        int len;
    105104
    106105        len = (ip->ip_hl * 4) + 8;
    107106       
    108         libnet_build_ip(ICMP_MASK_H + len, 4, libnet_get_prand(PRu16),
    109                         0, 64, IPPROTO_ICMP, ip->ip_dst.s_addr,
    110                         ip->ip_src.s_addr, NULL, 0, buf);
    111 
    112         icmp = (struct libnet_icmp_hdr *)(buf + IP_H);
     107        icmp = (struct libnet_icmpv4_hdr *)(buf + LIBNET_IPV4_H);
    113108        icmp->icmp_type = ICMP_UNREACH;
    114109        icmp->icmp_code = ICMP_UNREACH_NEEDFRAG;
    115110        icmp->hun.frag.pad = 0;
    116111        icmp->hun.frag.mtu = htons(MIN_MTU);
    117         memcpy((u_char *)icmp + ICMP_MASK_H, (u_char *)ip, len);
     112        memcpy((u_char *)icmp + LIBNET_ICMPV4_MASK_H, (u_char *)ip, len);
    118113
    119         libnet_do_checksum(buf, IPPROTO_ICMP, ICMP_MASK_H + len);
    120        
    121         len += (IP_H + ICMP_MASK_H);
     114        len += LIBNET_ICMPV4_MASK_H;
     115
     116        libnet_build_ipv4(LIBNET_IPV4_H + len, 4,
     117                          libnet_get_prand(LIBNET_PRu16), 0, 64, IPPROTO_ICMP,
     118                          0, ip->ip_dst.s_addr, ip->ip_src.s_addr,
     119                          (u_int8_t *) icmp, len, l, 0);
    122120       
    123         if (libnet_write_ip(sock, buf, len) != len)
     121        if (libnet_write(l) != len)
    124122                warn("write");
    125123       
    126124        fprintf(stderr, "%s > %s: icmp: ",
    127                 libnet_host_lookup(ip->ip_dst.s_addr, 0),
    128                 libnet_host_lookup(ip->ip_src.s_addr, 0));
     125                libnet_addr2name4(ip->ip_dst.s_addr, 0),
     126                libnet_addr2name4(ip->ip_src.s_addr, 0));
    129127        fprintf(stderr, "%s unreachable - need to frag (mtu %d)\n",
    130                 libnet_host_lookup(ip->ip_src.s_addr, 0), MIN_MTU);
     128                libnet_addr2name4(ip->ip_src.s_addr, 0), MIN_MTU);
    131129}
    132130
    133131static void
    134132tcp_nice_cb(u_char *user, const struct pcap_pkthdr *pcap, const u_char *pkt)
    135133{
    136         struct libnet_ip_hdr *ip;
     134        struct libnet_ipv4_hdr *ip;
    137135        struct libnet_tcp_hdr *tcp;
    138         int *sock, len;
     136        int len;
     137        libnet_t *l;
    139138
    140         sock = (int *)user;
     139        l = (libnet_t *)user;
    141140        pkt += pcap_off;
    142141        len = pcap->caplen - pcap_off;
    143142
    144         ip = (struct libnet_ip_hdr *)pkt;
     143        ip = (struct libnet_ipv4_hdr *)pkt;
    145144        if (ip->ip_p != IPPROTO_TCP)
    146145                return;
    147146       
     
    151150       
    152151        if (ntohs(ip->ip_len) > (ip->ip_hl << 2) + (tcp->th_off << 2)) {
    153152                if (Opt_icmp)
    154                         send_icmp_source_quench(*sock, ip);
     153                        send_icmp_source_quench(l, ip);
    155154                if (Opt_win)
    156                         send_tcp_window_advertisement(*sock, ip, tcp);
     155                        send_tcp_window_advertisement(l, ip, tcp);
    157156                if (Opt_pmtu)
    158                         send_icmp_frag_needed(*sock, ip);
     157                        send_icmp_frag_needed(l, ip);
    159158        }
    160159}
    161160
     
    164163{
    165164        extern char *optarg;
    166165        extern int optind;
    167         int c, sock;
     166        int c;
    168167        char *intf, *filter, ebuf[PCAP_ERRBUF_SIZE];
     168        char libnet_ebuf[LIBNET_ERRBUF_SIZE];
     169        libnet_t *l;
    169170        pcap_t *pd;
    170171       
    171172        intf = NULL;
     
    209210        if ((pcap_off = pcap_dloff(pd)) < 0)
    210211                errx(1, "couldn't determine link layer offset");
    211212       
    212         if ((sock = libnet_open_raw_sock(IPPROTO_RAW)) == -1)
     213        if ((l = libnet_init(LIBNET_RAW4, intf, libnet_ebuf)) == NULL)
    213214                errx(1, "couldn't initialize sending");
    214215       
    215         libnet_seed_prand();
     216        libnet_seed_prand(l);
    216217       
    217218        warnx("listening on %s [%s]", intf, filter);
    218219       
    219         pcap_loop(pd, -1, tcp_nice_cb, (u_char *)&sock);
     220        pcap_loop(pd, -1, tcp_nice_cb, (u_char *)l);
    220221       
    221222        /* NOTREACHED */
    222223