Annotation of embedaddon/libnet/src/libnet_raw.c, revision 1.1.1.1
1.1 misho 1: /*
2: * $Id: libnet_raw.c,v 1.9 2004/02/18 18:19:00 mike Exp $
3: *
4: * libnet
5: * libnet_raw.c - raw sockets routines
6: *
7: * Copyright (c) 1998 - 2004 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: #if (!(_WIN32) || (__CYGWIN__))
37: #include "../include/libnet.h"
38: #else
39: #include "../include/win32/libnet.h"
40: #endif
41:
42: #if defined (__WIN32__)
43: int
44: libnet_open_raw4(libnet_t *l)
45: {
46: return (libnet_open_link(l));
47: }
48:
49: int
50: libnet_open_raw6(libnet_t *l)
51: {
52: return (libnet_open_link(l));
53: }
54:
55: int
56: libnet_close_raw4(libnet_t *l)
57: {
58: return (libnet_close_link_interface(l));
59: }
60:
61: int
62: libnet_close_raw6(libnet_t *l)
63: {
64: return (libnet_close_link_interface(l));
65: }
66: #else
67: int
68: libnet_open_raw4(libnet_t *l)
69: {
70: int len;
71:
72: #if !(__WIN32__)
73: int n = 1;
74: #if (__svr4__)
75: void *nptr = &n;
76: #else
77: int *nptr = &n;
78: #endif /* __svr4__ */
79: #else
80: BOOL n;
81: #endif
82:
83: if (l == NULL)
84: {
85: return (-1);
86: }
87:
88: l->fd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
89: if (l->fd == -1)
90: {
91: snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
92: "%s(): SOCK_RAW allocation failed: %s\n",
93: __func__, strerror(errno));
94: goto bad;
95: }
96:
97: #ifdef IP_HDRINCL
98: /*
99: * man raw
100: *
101: * The IPv4 layer generates an IP header when sending a packet unless
102: * the IP_HDRINCL socket option is enabled on the socket. When it
103: * is enabled, the packet must contain an IP header. For
104: * receiving the IP header is always included in the packet.
105: */
106: #if !(__WIN32__)
107: if (setsockopt(l->fd, IPPROTO_IP, IP_HDRINCL, nptr, sizeof(n)) == -1)
108: #else
109: n = TRUE;
110: if (setsockopt(l->fd, IPPROTO_IP, IP_HDRINCL, (int8_t *)&n,
111: sizeof(n)) == -1)
112: #endif
113:
114: {
115: snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
116: "%s(): set IP_HDRINCL failed: %s\n",
117: __func__, strerror(errno));
118: goto bad;
119: }
120: #endif /* IP_HDRINCL */
121:
122: #ifdef SO_SNDBUF
123:
124: /*
125: * man 7 socket
126: *
127: * Sets and gets the maximum socket send buffer in bytes.
128: *
129: * Taken from libdnet by Dug Song
130: */
131: len = sizeof(n);
132: if (getsockopt(l->fd, SOL_SOCKET, SO_SNDBUF, &n, &len) < 0)
133: {
134: snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
135: "%s(): get SO_SNDBUF failed: %s\n",
136: __func__, strerror(errno));
137: goto bad;
138: }
139:
140: for (n += 128; n < 1048576; n += 128)
141: {
142: if (setsockopt(l->fd, SOL_SOCKET, SO_SNDBUF, &n, len) < 0)
143: {
144: if (errno == ENOBUFS)
145: {
146: break;
147: }
148: snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
149: "%s(): set SO_SNDBUF failed: %s\n",
150: __func__, strerror(errno));
151: goto bad;
152: }
153: }
154: #endif
155:
156: #ifdef SO_BROADCAST
157: /*
158: * man 7 socket
159: *
160: * Set or get the broadcast flag. When enabled, datagram sockets
161: * receive packets sent to a broadcast address and they are allowed
162: * to send packets to a broadcast address. This option has no
163: * effect on stream-oriented sockets.
164: */
165: if (setsockopt(l->fd, SOL_SOCKET, SO_BROADCAST, nptr, sizeof(n)) == -1)
166: {
167: snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
168: "%s(): set SO_BROADCAST failed: %s\n",
169: __func__, strerror(errno));
170: goto bad;
171: }
172: #endif /* SO_BROADCAST */
173: return (l->fd);
174:
175: bad:
176: return (-1);
177: }
178:
179:
180: int
181: libnet_close_raw4(libnet_t *l)
182: {
183: if (l == NULL)
184: {
185: return (-1);
186: }
187:
188: return (close(l->fd));
189: }
190:
191: #if ((defined HAVE_SOLARIS && !defined HAVE_SOLARIS_IPV6) || defined (__WIN32__))
192: int libnet_open_raw6(libnet_t *l)
193: {
194: return (-1);
195: }
196:
197: #else
198: int
199: libnet_open_raw6(libnet_t *l)
200: {
201: #if !(__WIN32__)
202: #if (__svr4__)
203: int one = 1;
204: void *oneptr = &one;
205: #else
206: #if (__linux__)
207: int one = 1;
208: int *oneptr = &one;
209: #endif
210: #endif /* __svr4__ */
211: #else
212: BOOL one;
213: #endif
214:
215: /* Solaris IPv6 stuff */
216:
217: if (l == NULL)
218: {
219: return (-1);
220: }
221:
222: l->fd = socket(PF_INET6, SOCK_RAW, IPPROTO_RAW);
223: if (l->fd == -1)
224: {
225: snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
226: "%s(): SOCK_RAW allocation failed: %s\n", __func__,
227: strerror(errno));
228: goto bad;
229: }
230:
231: #if (__linux__)
232: if (setsockopt(l->fd, SOL_SOCKET, SO_BROADCAST, oneptr, sizeof(one)) == -1)
233: {
234: snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
235: "%s(): set SO_BROADCAST failed: %s\n", __func__,
236: strerror(errno));
237: goto bad;
238: }
239: #endif /* __linux__ */
240: return (l->fd);
241:
242: bad:
243: return (-1);
244: }
245: #endif
246:
247: int
248: libnet_close_raw6(libnet_t *l)
249: {
250: if (l == NULL)
251: {
252: return (-1);
253: }
254: return (close(l->fd));
255: }
256: #endif
257: /* EOF */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>