Annotation of embedaddon/hping2/sendip.c, revision 1.1

1.1     ! misho       1: /* 
        !             2:  * $smu-mark$ 
        !             3:  * $name: sendip.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: /* $Id: sendip.c,v 1.7 2003/08/01 13:28:07 njombart Exp $ */
        !            12: 
        !            13: #include <stdio.h>
        !            14: #include <sys/types.h>
        !            15: #include <sys/socket.h>
        !            16: #include <string.h>
        !            17: #include <errno.h>
        !            18: #include <stdlib.h>
        !            19: #include <unistd.h>
        !            20: 
        !            21: #include "hping2.h"
        !            22: #include "globals.h"
        !            23: 
        !            24: void send_ip (char* src, char *dst, char *data, unsigned int datalen,
        !            25:                int more_fragments, unsigned short fragoff, char *options,
        !            26:                char optlen)
        !            27: {
        !            28:        char            *packet;
        !            29:        int             result,
        !            30:                        packetsize;
        !            31:        struct myiphdr  *ip;
        !            32: 
        !            33:        packetsize = IPHDR_SIZE + optlen + datalen;
        !            34:        if ( (packet = malloc(packetsize)) == NULL) {
        !            35:                perror("[send_ip] malloc()");
        !            36:                return;
        !            37:        }
        !            38: 
        !            39:        memset(packet, 0, packetsize);
        !            40:        ip = (struct myiphdr*) packet;
        !            41: 
        !            42:        /* copy src and dst address */
        !            43:        memcpy(&ip->saddr, src, sizeof(ip->saddr));
        !            44:        memcpy(&ip->daddr, dst, sizeof(ip->daddr));
        !            45: 
        !            46:        /* build ip header */
        !            47:        ip->version     = 4;
        !            48:        ip->ihl         = (IPHDR_SIZE + optlen + 3) >> 2;
        !            49:        ip->tos         = ip_tos;
        !            50: 
        !            51: #if defined OSTYPE_FREEBSD || defined OSTYPE_NETBSD || defined OSTYPE_BSDI
        !            52: /* FreeBSD */
        !            53: /* NetBSD */
        !            54:        ip->tot_len     = packetsize;
        !            55: #else
        !            56: /* Linux */
        !            57: /* OpenBSD */
        !            58:        ip->tot_len     = htons(packetsize);
        !            59: #endif
        !            60: 
        !            61:        if (!opt_fragment)
        !            62:        {
        !            63:                ip->id          = (src_id == -1) ?
        !            64:                        htons((unsigned short) rand()) :
        !            65:                        htons((unsigned short) src_id);
        !            66:        }
        !            67:        else /* if you need fragmentation id must not be randomic */
        !            68:        {
        !            69:                /* FIXME: when frag. enabled sendip_handler shold inc. ip->id */
        !            70:                /*        for every frame sent */
        !            71:                ip->id          = (src_id == -1) ?
        !            72:                        htons(getpid() & 255) :
        !            73:                        htons((unsigned short) src_id);
        !            74:        }
        !            75: 
        !            76: #if defined OSTYPE_FREEBSD || defined OSTYPE_NETBSD | defined OSTYPE_BSDI
        !            77: /* FreeBSD */
        !            78: /* NetBSD */
        !            79:        ip->frag_off    |= more_fragments;
        !            80:        ip->frag_off    |= fragoff >> 3;
        !            81: #else
        !            82: /* Linux */
        !            83: /* OpenBSD */
        !            84:        ip->frag_off    |= htons(more_fragments);
        !            85:        ip->frag_off    |= htons(fragoff >> 3); /* shift three flags bit */
        !            86: #endif
        !            87: 
        !            88:        ip->ttl         = src_ttl;
        !            89:        if (opt_rawipmode)      ip->protocol = raw_ip_protocol;
        !            90:        else if (opt_icmpmode)  ip->protocol = 1;       /* icmp */
        !            91:        else if (opt_udpmode)   ip->protocol = 17;      /* udp  */
        !            92:        else                    ip->protocol = 6;       /* tcp  */
        !            93:        ip->check       = 0; /* always computed by the kernel */
        !            94: 
        !            95:        /* copies options */
        !            96:        if (options != NULL)
        !            97:                memcpy(packet+IPHDR_SIZE, options, optlen);
        !            98: 
        !            99:        /* copies data */
        !           100:        memcpy(packet + IPHDR_SIZE + optlen, data, datalen);
        !           101:        
        !           102:     if (opt_debug == TRUE)
        !           103:     {
        !           104:         unsigned int i;
        !           105: 
        !           106:         for (i=0; i<packetsize; i++)
        !           107:             printf("%.2X ", packet[i]&255);
        !           108:         printf("\n");
        !           109:     }
        !           110:        result = sendto(sockraw, packet, packetsize, 0,
        !           111:                (struct sockaddr*)&remote, sizeof(remote));
        !           112:        
        !           113:        if (result == -1 && errno != EINTR && !opt_rand_dest && !opt_rand_source) {
        !           114:                perror("[send_ip] sendto");
        !           115:                if (close(sockraw) == -1)
        !           116:                        perror("[ipsender] close(sockraw)");
        !           117: #if (!defined OSTYPE_LINUX) || (defined FORCE_LIBPCAP)
        !           118:                if (close_pcap() == -1)
        !           119:                        printf("[ipsender] close_pcap failed\n");
        !           120: #else
        !           121:                if (close_sockpacket(sockpacket) == -1)
        !           122:                        perror("[ipsender] close(sockpacket)");
        !           123: #endif /* ! OSTYPE_LINUX || FORCE_LIBPCAP */
        !           124:                exit(1);
        !           125:        }
        !           126: 
        !           127:        free(packet);
        !           128: 
        !           129:        /* inc packet id for safe protocol */
        !           130:        if (opt_safe && !eof_reached)
        !           131:                src_id++;
        !           132: }

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