File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / libnet / src / libnet_link_nit.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, 4 months ago) by misho
Branches: libnet, MAIN
CVS tags: v1_1_2_1, HEAD
libnet

    1: /*
    2:  *  $Id: libnet_link_nit.c,v 1.1.1.1 2012/02/21 22:14:23 misho Exp $
    3:  *
    4:  *  libnet
    5:  *  libnet_nit.c - network interface tap routines
    6:  *
    7:  *  Copyright (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
    8:  *  All rights reserved.
    9:  *
   10:  * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996
   11:  *	The Regents of the University of California.  All rights reserved.
   12:  *
   13:  * Redistribution and use in source and binary forms, with or without
   14:  * modification, are permitted provided that: (1) source code distributions
   15:  * retain the above copyright notice and this paragraph in its entirety, (2)
   16:  * distributions including binary code include the above copyright notice and
   17:  * this paragraph in its entirety in the documentation or other materials
   18:  * provided with the distribution, and (3) all advertising materials mentioning
   19:  * features or use of this software display the following acknowledgement:
   20:  * ``This product includes software developed by the University of California,
   21:  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
   22:  * the University nor the names of its contributors may be used to endorse
   23:  * or promote products derived from this software without specific prior
   24:  * written permission.
   25:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
   26:  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
   27:  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   28:  */
   29: 
   30: #if (HAVE_CONFIG_H)
   31: #include "../include/config.h"
   32: #endif
   33: #if (!(_WIN32) || (__CYGWIN__)) 
   34: #include "../include/libnet.h"
   35: #else
   36: #include "../include/win32/libnet.h"
   37: #endif
   38: 
   39: #include "../include/gnuc.h"
   40: #ifdef HAVE_OS_PROTO_H
   41: #include "../include/os-proto.h"
   42: #endif
   43: 
   44: struct libnet_link_int *
   45: libnet_open_link_interface(int8_t *device, int8_t *ebuf)
   46: {
   47:     struct sockaddr_nit snit;
   48:     register struct libnet_link_int *l;
   49: 
   50:     l = (struct libnet_link_int *)malloc(sizeof(*p));
   51:     if (l == NULL)
   52:     {
   53:         strcpy(ebuf, strerror(errno));
   54:         return (NULL);
   55:     }
   56: 
   57:     memset(l, 0, sizeof(*l));
   58: 
   59:     l->fd = socket(AF_NIT, SOCK_RAW, NITPROTO_RAW);
   60:     if (l->fd < 0)
   61:     {
   62:         sprintf(ebuf, "socket: %s", strerror(errno));
   63:         goto bad;
   64:     }
   65:     snit.snit_family = AF_NIT;
   66: 	strncpy(snit.snit_ifname, device, NITIFSIZ -1);
   67:     snit.snit_ifname[NITIFSIZ] = '\0';
   68: 
   69:     if (bind(l->fd, (struct sockaddr *)&snit, sizeof(snit)))
   70:     {
   71:         sprintf(ebuf, "bind: %s: %s", snit.snit_ifname, strerror(errno));
   72:         goto bad;
   73:     }
   74: 
   75:     /*
   76:      * NIT supports only ethernets.
   77:      */
   78:     l->linktype = DLT_EN10MB;
   79: 
   80:     return (l);
   81: 
   82: bad:
   83:     if (l->fd >= 0)
   84:     {
   85:         close(l->fd);
   86:     }
   87:     free(l);
   88:     return (NULL);
   89: }
   90: 
   91: 
   92: int
   93: libnet_close_link_interface(struct libnet_link_int *l)
   94: {
   95:     if (close(l->fd) == 0)
   96:     {
   97:         free(l);
   98:         return (1);
   99:     }
  100:     else
  101:     {
  102:         free(l);
  103:         return (-1);
  104:     }
  105: }
  106: 
  107: 
  108: int
  109: write_link_layer(struct libnet_link_int *l, const int8_t *device,
  110:             u_int8_t *buf, int len)
  111: {
  112:     int c;
  113:     struct sockaddr sa;
  114: 
  115:     memset(&sa, 0, sizeof(sa));
  116:     strncpy(sa.sa_data, device, sizeof(sa.sa_data));
  117: 
  118:     c = sendto(l->fd, buf, len, 0, &sa, sizeof(sa));
  119:     if (c != len)
  120:     {
  121:         /* error */
  122:     }
  123:     return (c);
  124: }
  125: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>