File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / libnet / src / libnet_raw.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 22:14:23 2012 UTC (12 years, 5 months ago) by misho
Branches: libnet, MAIN
CVS tags: v1_1_2_1, HEAD
libnet

    1: /*
    2:  *  $Id: libnet_raw.c,v 1.1.1.1 2012/02/21 22:14:23 misho 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>