Home | History | Annotate | Download | only in missing
      1 /*
      2  * Copyright (c) 1993, 1994, 1995, 1996, 1997, 1998
      3  *	The Regents of the University of California.  All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  * 1. Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  * 2. Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in the
     12  *    documentation and/or other materials provided with the distribution.
     13  * 3. All advertising materials mentioning features or use of this software
     14  *    must display the following acknowledgement:
     15  *	This product includes software developed by the Computer Systems
     16  *	Engineering Group at Lawrence Berkeley Laboratory.
     17  * 4. Neither the name of the University nor of the Laboratory may be used
     18  *    to endorse or promote products derived from this software without
     19  *    specific prior written permission.
     20  *
     21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     31  * SUCH DAMAGE.
     32  */
     33 
     34 #ifdef HAVE_CONFIG_H
     35 #include "config.h"
     36 #endif
     37 
     38 #include <netdissect-stdinc.h>
     39 
     40 #include <pcap.h>
     41 #include <string.h>
     42 
     43 #include "pcap-missing.h"
     44 #include "ascii_strcasecmp.h"
     45 
     46 struct dlt_choice {
     47 	const char *name;
     48 	const char *description;
     49 	int	dlt;
     50 };
     51 
     52 #define DLT_CHOICE(code, description) { #code, description, code }
     53 #define DLT_CHOICE_SENTINEL { NULL, NULL, 0 }
     54 
     55 static struct dlt_choice dlt_choices[] = {
     56 	DLT_CHOICE(DLT_NULL, "BSD loopback"),
     57 	DLT_CHOICE(DLT_EN10MB, "Ethernet"),
     58 	DLT_CHOICE(DLT_IEEE802, "Token ring"),
     59 	DLT_CHOICE(DLT_ARCNET, "ARCNET"),
     60 	DLT_CHOICE(DLT_SLIP, "SLIP"),
     61 	DLT_CHOICE(DLT_PPP, "PPP"),
     62 	DLT_CHOICE(DLT_FDDI, "FDDI"),
     63 	DLT_CHOICE(DLT_ATM_RFC1483, "RFC 1483 IP-over-ATM"),
     64 	DLT_CHOICE(DLT_RAW, "Raw IP"),
     65 #ifdef DLT_SLIP_BSDOS
     66 	DLT_CHOICE(DLT_SLIP_BSDOS, "BSD/OS SLIP"),
     67 #endif
     68 #ifdef DLT_PPP_BSDOS
     69 	DLT_CHOICE(DLT_PPP_BSDOS, "BSD/OS PPP"),
     70 #endif
     71 #ifdef DLT_ATM_CLIP
     72 	DLT_CHOICE(DLT_ATM_CLIP, "Linux Classical IP-over-ATM"),
     73 #endif
     74 #ifdef DLT_PPP_SERIAL
     75 	DLT_CHOICE(DLT_PPP_SERIAL, "PPP over serial"),
     76 #endif
     77 #ifdef DLT_PPP_ETHER
     78 	DLT_CHOICE(DLT_PPP_ETHER, "PPPoE"),
     79 #endif
     80 #ifdef DLT_C_HDLC
     81 	DLT_CHOICE(DLT_C_HDLC, "Cisco HDLC"),
     82 #endif
     83 #ifdef DLT_IEEE802_11
     84 	DLT_CHOICE(DLT_IEEE802_11, "802.11"),
     85 #endif
     86 #ifdef DLT_FRELAY
     87 	DLT_CHOICE(DLT_FRELAY, "Frame Relay"),
     88 #endif
     89 #ifdef DLT_LOOP
     90 	DLT_CHOICE(DLT_LOOP, "OpenBSD loopback"),
     91 #endif
     92 #ifdef DLT_ENC
     93 	DLT_CHOICE(DLT_ENC, "OpenBSD encapsulated IP"),
     94 #endif
     95 #ifdef DLT_LINUX_SLL
     96 	DLT_CHOICE(DLT_LINUX_SLL, "Linux cooked"),
     97 #endif
     98 #ifdef DLT_LTALK
     99 	DLT_CHOICE(DLT_LTALK, "Localtalk"),
    100 #endif
    101 #ifdef DLT_PFLOG
    102 	DLT_CHOICE(DLT_PFLOG, "OpenBSD pflog file"),
    103 #endif
    104 #ifdef DLT_PRISM_HEADER
    105 	DLT_CHOICE(DLT_PRISM_HEADER, "802.11 plus Prism header"),
    106 #endif
    107 #ifdef DLT_IP_OVER_FC
    108 	DLT_CHOICE(DLT_IP_OVER_FC, "RFC 2625 IP-over-Fibre Channel"),
    109 #endif
    110 #ifdef DLT_SUNATM
    111 	DLT_CHOICE(DLT_SUNATM, "Sun raw ATM"),
    112 #endif
    113 #ifdef DLT_IEEE802_11_RADIO
    114 	DLT_CHOICE(DLT_IEEE802_11_RADIO, "802.11 plus radio information header"),
    115 #endif
    116 #ifdef DLT_ARCNET_LINUX
    117 	DLT_CHOICE(DLT_ARCNET_LINUX, "Linux ARCNET"),
    118 #endif
    119 #ifdef DLT_LINUX_IRDA
    120 	DLT_CHOICE(DLT_LINUX_IRDA, "Linux IrDA"),
    121 #endif
    122 #ifdef DLT_LANE8023
    123 	DLT_CHOICE(DLT_LANE8023, "Linux 802.3 LANE"),
    124 #endif
    125 #ifdef DLT_CIP
    126 	DLT_CHOICE(DLT_CIP, "Linux Classical IP-over-ATM"),
    127 #endif
    128 #ifdef DLT_HDLC
    129 	DLT_CHOICE(DLT_HDLC, "Cisco HDLC"),
    130 #endif
    131 	DLT_CHOICE_SENTINEL
    132 };
    133 
    134 #ifndef HAVE_PCAP_DATALINK_NAME_TO_VAL
    135 int
    136 pcap_datalink_name_to_val(const char *name)
    137 {
    138 	int i;
    139 
    140 	for (i = 0; dlt_choices[i].name != NULL; i++) {
    141 		if (ascii_strcasecmp(dlt_choices[i].name + sizeof("DLT_") - 1,
    142 		    name) == 0)
    143 			return (dlt_choices[i].dlt);
    144 	}
    145 	return (-1);
    146 }
    147 
    148 const char *
    149 pcap_datalink_val_to_name(int dlt)
    150 {
    151 	int i;
    152 
    153 	for (i = 0; dlt_choices[i].name != NULL; i++) {
    154 		if (dlt_choices[i].dlt == dlt)
    155 			return (dlt_choices[i].name + sizeof("DLT_") - 1);
    156 	}
    157 	return (NULL);
    158 }
    159 #endif
    160 
    161 const char *
    162 pcap_datalink_val_to_description(int dlt)
    163 {
    164 	int i;
    165 
    166 	for (i = 0; dlt_choices[i].name != NULL; i++) {
    167 		if (dlt_choices[i].dlt == dlt)
    168 			return (dlt_choices[i].description);
    169 	}
    170 	return (NULL);
    171 }
    172