OSDN Git Service

2013.10.24
[uclinux-h8/uClinux-dist.git] / lib / Libnet / test / ICMP / icmp_timexceed.c
1 /*
2  *  $Id: icmp_timexceed.c,v 1.1.1.1 2000/05/25 00:28:49 route Exp $
3  *
4  *  libnet
5  *  icmp_timexceed.c - ICMP_TIMEXCEED Packet assembly tester
6  *
7  *  Copyright (c) 1998, 1999, 2000 Mike D. Schiffman <mike@infonexus.com>
8  *  All rights reserved.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  *
31  */
32
33 #if (HAVE_CONFIG_H)
34 #include "../../include/config.h"
35 #endif
36 #include "../libnet_test.h"
37
38 int
39 main(int argc, char **argv)
40 {
41     int sock, c;
42     u_char *buf;
43     u_long src_ip, dst_ip;
44
45     printf("ICMP_TIMEXCEED packet building/writing test\n");
46
47     src_ip = 0;
48     dst_ip = 0;
49     while((c = getopt(argc, argv, "d:s:")) != EOF)
50     {
51         switch (c)
52         {
53             case 'd':
54                 if (!(dst_ip = libnet_name_resolve(optarg, 1)))
55                 {
56                     fprintf(stderr, "Bad destination IP address: %s\n", optarg);
57                     exit(1);
58                 }
59                 break;
60             case 's':
61                 if (!(src_ip = libnet_name_resolve(optarg, 1)))
62                 {
63                     fprintf(stderr, "Bad source IP address: %s\n", optarg);
64                     exit(1);
65                 }
66                 break;
67         }
68     }
69     if (!src_ip || !dst_ip)
70     {
71         usage(argv[0]);
72         exit(EXIT_FAILURE);
73     }
74
75     /*
76      *  Get our block of memory for the packet.  In this case, we only need
77      *  memory for the packet headers.
78      */
79     buf = malloc(IP_MAXPACKET);
80     if (!buf)
81     {
82         perror("No memory for packet header");
83         exit(EXIT_FAILURE);
84     }
85
86     /*
87      *  Open our raw IP socket and set IP_HDRINCL.
88      */
89     sock = libnet_open_raw_sock(IPPROTO_RAW);
90     if (sock == -1)
91     {
92         perror("No socket");
93         exit(EXIT_FAILURE);
94     }
95     
96     /*
97      *  Build the IP header (shown exploded for commenting).
98      */
99     libnet_build_ip(LIBNET_ICMP_TIMXCEED_H + LIBNET_IP_H, /* Size of the payload */
100             IPTOS_LOWDELAY | IPTOS_THROUGHPUT,  /* IP tos */
101             242,                                /* IP ID */
102             0,                                  /* Frag stuff */
103             48,                                 /* TTL */
104             IPPROTO_ICMP,                       /* Transport protocol */
105             src_ip,                             /* Source IP */
106             dst_ip,                             /* Destination IP */
107             NULL,                               /* Pointer to payload (none) */
108             0,
109             buf);                               /* Packet header memory */
110
111     /*
112      *  Build the ICMP header.
113      */
114     libnet_build_icmp_timeexceed(ICMP_TIMXCEED,     /* type */
115                 ICMP_TIMXCEED_INTRANS,              /* code */
116                 0,
117                 IPTOS_LOWDELAY | IPTOS_THROUGHPUT,  /* IP tos */
118                 424,                                /* IP ID */
119                 0,                                  /* Frag stuff */
120                 64,                                 /* TTL */
121                 IPPROTO_ICMP,                       /* Transport protocol */
122                 dst_ip,                             /* Source IP */
123                 src_ip,                             /* Destination IP */
124                 NULL,                               /* pointer to payload */
125                 0,                                  /* size of payload */
126                 buf + LIBNET_IP_H);                 /* packet header memory */
127
128     libnet_do_checksum(buf, IPPROTO_ICMP, LIBNET_ICMP_TIMXCEED_H + LIBNET_IP_H);
129
130     /*
131      *  Write the packet to the network.
132      */
133     c = libnet_write_ip(sock, buf, LIBNET_ICMP_TIMXCEED_H + 2 * LIBNET_IP_H);
134     if (c < LIBNET_ICMP_TIMXCEED_H + 2 * LIBNET_IP_H)
135     {
136         fprintf(stderr, "libnet_write_ip\n");
137     }
138     printf("Completed, wrote %d bytes\n", c);
139     free(buf);
140
141     return (c == -1 ? EXIT_FAILURE : EXIT_SUCCESS);
142 }
143
144
145 void
146 usage(u_char *name)
147 {
148     fprintf(stderr, "usage: %s -s source_ip -d destination_ip\n ", name);
149 }
150
151 /* EOF */