OSDN Git Service

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