OSDN Git Service

2013.10.24
[uclinux-h8/uClinux-dist.git] / lib / Libnet / test / ICMP / icmp_timestamp.c
1 /*
2  *  $Id: icmp_timestamp.c,v 1.1.1.1 2000/05/25 00:28:49 route Exp $
3  *
4  *  libnet
5  *  icmp_timestamp.c - ICMP_TSTAMP 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_TSTAMP 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, but we'll all we can!
78      */
79     if (libnet_init_packet(IP_MAXPACKET, &buf) == -1)
80     {
81         perror("No memory for packet header");
82         exit(EXIT_FAILURE);
83     }
84
85     /*
86      *  Open our raw IP socket and set IP_HDRINCL.
87      */
88     sock = libnet_open_raw_sock(IPPROTO_RAW);
89     if (sock == -1)
90     {
91         perror("No socket");
92         exit(EXIT_FAILURE);
93     }
94     
95     /*
96      *  Build the IP header (shown exploded for commenting).
97      */
98     libnet_build_ip(LIBNET_ICMP_TS_H,           /* Size of the payload */
99             IPTOS_LOWDELAY | IPTOS_THROUGHPUT,  /* IP tos */
100             242,                                /* IP ID */
101             0,                                  /* Frag stuff */
102             48,                                 /* TTL */
103             IPPROTO_ICMP,                       /* Transport protocol */
104             src_ip,                             /* Source IP */
105             dst_ip,                             /* Destination IP */
106             NULL,                               /* Pointer to payload (none) */
107             0,
108             buf);                               /* Packet header memory */
109
110     /*
111      *  Build the ICMP header.
112      */
113     libnet_build_icmp_timestamp(ICMP_TSTAMP, /* type */
114                 0,                                  /* code */
115                 242,                                /* id */
116                 424,                                /* seq */                
117                 1000,
118                 2000,
119                 3000,
120                 NULL,                               /* pointer to payload */
121                 0,                                  /* size of payload */
122                 buf + LIBNET_IP_H);                 /* packet header memory */
123
124     if (libnet_do_checksum(buf, IPPROTO_ICMP, LIBNET_ICMP_TS_H) == -1)
125     {
126         fprintf(stderr, "Can't do checksum!\n");
127     }
128
129     /*
130      *  Write the packet to the network.
131      */
132     c = libnet_write_ip(sock, buf, LIBNET_ICMP_TS_H + LIBNET_IP_H);
133     if (c < LIBNET_ICMP_TS_H + LIBNET_IP_H)
134     {
135         fprintf(stderr, "write_ip\n");
136     }
137     printf("Completed, wrote %d bytes\n", c);
138     libnet_destroy_packet(&buf);
139
140     return (c == -1 ? EXIT_FAILURE : EXIT_SUCCESS);
141 }
142
143
144 void
145 usage(u_char *name)
146 {
147     fprintf(stderr, "usage: %s -s source_ip -d destination_ip\n ", name);
148 }
149
150 /* EOF */