File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / hping2 / sendip.c
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Nov 2 11:15:52 2016 UTC (7 years, 7 months ago) by misho
Branches: hping2, MAIN
CVS tags: v2_0_0rc3p7, v2_0_0rc3p5, v2_0_0rc3p4, HEAD
hping2 2.0.0rc3

    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.1.1.2 2016/11/02 11:15:52 misho 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_NETBSD || defined OSTYPE_BSDI
   52: /* NetBSD */
   53: 	ip->tot_len	= packetsize;
   54: #else
   55: /* Linux */
   56: /* FreeBSD */
   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_NETBSD | defined OSTYPE_BSDI
   77: /* NetBSD */
   78: 	ip->frag_off	|= more_fragments;
   79: 	ip->frag_off	|= fragoff >> 3;
   80: #else
   81: /* Linux */
   82: /* FreeBSD */
   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>