OSDN Git Service

2013.10.24
[uclinux-h8/uClinux-dist.git] / lib / Libnet / test / UDP / udp+data.c
1 /*
2  *  $Id: udp+data.c,v 1.1.1.1 2000/05/25 00:28:49 route Exp $
3  *
4  *  libnet
5  *  UDP + payload 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_long src_ip, dst_ip;
43     u_short src_prt, dst_prt;
44     u_char *cp, *buf;
45     u_char *payload = "hello world";
46     int payload_s = strlen(payload);
47
48     printf("UDP + payload packet building/writing test\n");
49
50     src_ip  = 0;
51     dst_ip  = 0;
52     src_prt = 0;
53     dst_prt = 0;
54     while((c = getopt(argc, argv, "d:s:")) != EOF)
55     {
56         switch (c)
57         {
58             /*
59              *  We expect the input to be of the form `ip.ip.ip.ip.port`.  We
60              *  point cp to the last dot of the IP address/port string and
61              *  then seperate them with a NULL byte.  The optarg now points to
62              *  just the IP address, and cp points to the port.
63              */
64             case 'd':
65                 if (!(cp = strrchr(optarg, '.')))
66                 {
67                     usage(argv[0]);
68                 }
69                 *cp++ = 0;
70                 dst_prt = (u_short)atoi(cp);
71                 if (!(dst_ip = libnet_name_resolve(optarg, 1)))
72                 {
73                     fprintf(stderr, "Bad destination IP address: %s\n", optarg);
74                     exit(1);
75                 }
76                 break;
77             case 's':
78                 if (!(cp = strrchr(optarg, '.')))
79                 {
80                     usage(argv[0]);
81                 }
82                 *cp++ = 0;
83                 src_prt = (u_short)atoi(cp);
84                 if (!(src_ip = libnet_name_resolve(optarg, 1)))
85                 {
86                     fprintf(stderr, "Bad source IP address: %s\n", optarg);
87                     exit(1);
88                 }
89                 break;
90         }
91     }
92     if (!src_ip || !src_prt || !dst_ip || !dst_prt)
93     {
94         usage(argv[0]);
95         exit(EXIT_FAILURE);
96     }
97
98     buf = malloc(LIBNET_UDP_H + LIBNET_IP_H + payload_s);
99     if (!buf)
100     {
101         perror("No memory for packet");
102         exit(EXIT_FAILURE);
103     }
104
105     sock = libnet_open_raw_sock(IPPROTO_RAW);
106     if (sock == -1)
107     {
108         perror("No socket");
109         exit(EXIT_FAILURE);
110     }
111     
112     libnet_build_ip(LIBNET_UDP_H + payload_s,
113             0,
114             242,
115             0,
116             64,
117             IPPROTO_UDP,
118             src_ip,
119             dst_ip,
120             NULL,
121             0,
122             buf);
123
124     libnet_build_udp(src_prt, dst_prt, payload, payload_s, buf + LIBNET_IP_H);
125
126     libnet_do_checksum(buf, IPPROTO_UDP, LIBNET_UDP_H + payload_s);
127
128     c = libnet_write_ip(sock, buf, LIBNET_UDP_H + LIBNET_IP_H + payload_s);
129     if (c < LIBNET_UDP_H + LIBNET_IP_H + payload_s)
130     {
131         fprintf(stderr, "libnet_write_ip\n");
132     }
133     printf("Completed, wrote %d bytes\n", c);
134
135     free(buf);
136
137     return (c == -1 ? EXIT_FAILURE : EXIT_SUCCESS);
138 }
139
140
141 void
142 usage(u_char *name)
143 {
144     fprintf(stderr,
145         "usage: %s -s source_ip.source_port -d destination_ip.destination_port\n",
146         name);
147 }
148
149 /* EOF */