Annotation of embedaddon/hping2/sendudp.c, revision 1.1.1.1

1.1       misho       1: /* 
                      2:  * $smu-mark$ 
                      3:  * $name: sendudp.c$ 
                      4:  * $author: Salvatore Sanfilippo <antirez@invece.org>$ 
                      5:  * $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$ 
                      6:  * $license: This software is under GPL version 2 of license$ 
                      7:  * $date: Fri Nov  5 11:55:49 MET 1999$ 
                      8:  * $rev: 8$ 
                      9:  */ 
                     10: 
                     11: #include <stdio.h>
                     12: #include <string.h>
                     13: #include <stdlib.h>
                     14: #include <time.h>
                     15: #include <sys/time.h>
                     16: #include <unistd.h>
                     17: #include <signal.h>
                     18: 
                     19: #include "hping2.h"
                     20: #include "globals.h"
                     21: 
                     22: /* void hexdumper(unsigned char *packet, int size); */
                     23: 
                     24: void send_udp(void)
                     25: {
                     26:        int                     packet_size;
                     27:        char                    *packet, *data;
                     28:        struct myudphdr         *udp;
                     29:        struct pseudohdr *pseudoheader;
                     30: 
                     31:        packet_size = UDPHDR_SIZE + data_size;
                     32:        packet = malloc(PSEUDOHDR_SIZE + packet_size);
                     33:        if (packet == NULL) {
                     34:                perror("[send_udphdr] malloc()");
                     35:                return;
                     36:        }
                     37:        pseudoheader = (struct pseudohdr*) packet;
                     38:        udp =  (struct myudphdr*) (packet+PSEUDOHDR_SIZE);
                     39:        data = (char*) (packet+PSEUDOHDR_SIZE+UDPHDR_SIZE);
                     40:        
                     41:        memset(packet, 0, PSEUDOHDR_SIZE+packet_size);
                     42: 
                     43:        /* udp pseudo header */
                     44:        memcpy(&pseudoheader->saddr, &local.sin_addr.s_addr, 4);
                     45:        memcpy(&pseudoheader->daddr, &remote.sin_addr.s_addr, 4);
                     46:        pseudoheader->protocol          = 17; /* udp */
                     47:        pseudoheader->lenght            = htons(packet_size);
                     48: 
                     49:        /* udp header */
                     50:        udp->uh_dport   = htons(dst_port);
                     51:        udp->uh_sport   = htons(src_port);
                     52:        udp->uh_ulen    = htons(packet_size);
                     53: 
                     54:        /* data */
                     55:        data_handler(data, data_size);
                     56: 
                     57:        /* compute checksum */
                     58: #ifdef STUPID_SOLARIS_CHECKSUM_BUG
                     59:        udp->uh_sum = packet_size;
                     60: #else
                     61:        udp->uh_sum = cksum((__u16*) packet, PSEUDOHDR_SIZE +
                     62:                      packet_size);
                     63: #endif
                     64: 
                     65:        /* adds this pkt in delaytable */
                     66:        delaytable_add(sequence, src_port, time(NULL), get_usec(), S_SENT);
                     67: 
                     68:        /* send packet */
                     69:        send_ip_handler(packet+PSEUDOHDR_SIZE, packet_size);
                     70:        free(packet);
                     71: 
                     72:        sequence++;     /* next sequence number */
                     73: 
                     74:        if (!opt_keepstill)
                     75:                src_port = (sequence + initsport) % 65536;
                     76: 
                     77:        if (opt_force_incdport)
                     78:                dst_port++;
                     79: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>