Annotation of embedaddon/libnet/src/libnet_link_snoop.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  *  $Id: libnet_link_snoop.c,v 1.5 2004/01/03 20:31:02 mike Exp $
        !             3:  *
        !             4:  *  libnet
        !             5:  *  libnet_snoop.c - snoop routines
        !             6:  *
        !             7:  *  Copyright (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
        !             8:  *  All rights reserved.
        !             9:  *
        !            10:  * Copyright (c) 1993, 1994, 1995, 1996, 1997
        !            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: #include <sys/param.h>
        !            31: #include <sys/file.h>
        !            32: 
        !            33: #if (HAVE_CONFIG_H)
        !            34: #include "../include/config.h"
        !            35: #endif
        !            36: #include "../include/libnet.h"
        !            37: 
        !            38: #include <net/raw.h>
        !            39: #include <net/if.h>
        !            40: 
        !            41: #include <netinet/ip_var.h>
        !            42: #include <netinet/if_ether.h>
        !            43: #include <netinet/udp_var.h>
        !            44: #include <netinet/tcpip.h>
        !            45: 
        !            46: #include "../include/gnuc.h"
        !            47: #include "../include/bpf.h"
        !            48: #ifdef HAVE_OS_PROTO_H
        !            49: #include "../include/os-proto.h"
        !            50: #endif
        !            51: 
        !            52: 
        !            53: struct libnet_link_int *
        !            54: libnet_open_link_interface(int8_t *device, int8_t *ebuf)
        !            55: {
        !            56:     int fd;
        !            57:     struct sockaddr_raw sr;
        !            58:     u_int v;
        !            59:     struct libnet_link_int *l;
        !            60: 
        !            61:     l = (struct libnet_link_int *)malloc(sizeof(*l));
        !            62:     if (l == NULL)
        !            63:     {
        !            64:         sprintf(ebuf, "malloc: %s", strerror(errno));
        !            65:         return (NULL);
        !            66:     }
        !            67:     memset(l, 0, sizeof(*l));
        !            68:     l->fd = socket(PF_RAW, SOCK_RAW, RAWPROTO_DRAIN);
        !            69:     if (l->fd < 0)
        !            70:     {
        !            71:         sprintf(ebuf, "drain socket: %s", strerror(errno));
        !            72:         goto bad;
        !            73:     }
        !            74: 
        !            75:     memset(&sr, 0, sizeof(sr));
        !            76:     sr.sr_family = AF_RAW;
        !            77:        strncpy(sr.sr_ifname, device, sizeof(sr.sr_ifname) - 1);
        !            78:     sr.sr_name[sizeof(sr.sr_name) - 1] = '\0';
        !            79: 
        !            80:     if (bind(l->fd, (struct sockaddr *)&sr, sizeof(sr)))
        !            81:     {
        !            82:         sprintf(ebuf, "drain bind: %s", strerror(errno));
        !            83:         goto bad;
        !            84:     }
        !            85: 
        !            86:     /*
        !            87:      * XXX hack - map device name to link layer type
        !            88:      */
        !            89:     if (strncmp("et", device, 2) == 0      ||    /* Challenge 10 Mbit */
        !            90:            strncmp("ec", device, 2) == 0  ||    /* Indigo/Indy 10 Mbit, O2 10/100 */
        !            91:             strncmp("ef", device, 2) == 0 ||    /* O200/2000 10/100 Mbit */
        !            92:             strncmp("gfe", device, 3) == 0 ||   /* GIO 100 Mbit */
        !            93:             strncmp("fxp", device, 3) == 0 ||   /* Challenge VME Enet */
        !            94:             strncmp("ep", device, 2) == 0 ||    /* Challenge 8x10 Mbit EPLEX */
        !            95:             strncmp("vfe", device, 3) == 0 ||   /* Challenge VME 100Mbit */
        !            96:             strncmp("fa", device, 2) == 0 ||
        !            97:             strncmp("qaa", device, 3) == 0)
        !            98:     {
        !            99:         l->linktype = DLT_EN10MB;
        !           100:     }
        !           101:     else if (strncmp("ipg", device, 3) == 0 ||
        !           102:             strncmp("rns", device, 3) == 0 ||  /* O2/200/2000 FDDI */
        !           103:             strncmp("xpi", device, 3) == 0)
        !           104:         {
        !           105:             l->linktype = DLT_FDDI;
        !           106:        }
        !           107:     else if (strncmp("ppp", device, 3) == 0) {
        !           108:                l->linktype = DLT_RAW;
        !           109:        } else if (strncmp("lo", device, 2) == 0) {
        !           110:                l->linktype = DLT_NULL;
        !           111:        } else {
        !           112:                sprintf(ebuf, "drain: unknown physical layer type");
        !           113:                goto bad;
        !           114:        }
        !           115: 
        !           116:        return (l);
        !           117:  bad:
        !           118:        close(fd);
        !           119:        free(l);
        !           120:        return (NULL);
        !           121: }
        !           122: 
        !           123: 
        !           124: int
        !           125: libnet_close_link_interface(struct libnet_link_int *l)
        !           126: {
        !           127:     if (close(l->fd) == 0)
        !           128:     {
        !           129:         free(l);
        !           130:         return (1);
        !           131:     }
        !           132:     else
        !           133:     {
        !           134:         free(l);
        !           135:         return (-1);
        !           136:     }
        !           137: }
        !           138: 
        !           139: 
        !           140: int
        !           141: libnet_write_link_layer(struct libnet_link_int *l, const int8_t *device,
        !           142:             u_int8_t *buf, int len)
        !           143: {
        !           144:     int c;
        !           145:     struct ifreq ifr;
        !           146:     struct ether_header *eh = (struct ether_header *)buf;
        !           147:   
        !           148:     memset(&ifr, 0, sizeof(ifr));
        !           149:     strncpy(ifr.ifr_name, device, sizeof(ifr.ifr_name));
        !           150:   
        !           151:     if (ioctl(l->fd, SIOCGIFADDR, &ifr) == -1)
        !           152:     {
        !           153:         perror("ioctl SIOCGIFADDR");
        !           154:         return (-1);
        !           155:     }
        !           156:   
        !           157:     memcpy(eh->ether_shost, ifr.ifr_addr.sa_data, sizeof(eh->ether_shost));
        !           158:   
        !           159:     if (write(l->fd, buf, len) == -1)
        !           160:     {
        !           161:         /* err */
        !           162:         return (-1);
        !           163:     }
        !           164: 
        !           165:     return (len);
        !           166: }

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