All the link-layer dissectors are now void functions.
All the functions were moved to the void_printers[] array.
Rename this array to printers[].
Remove the uint_printers[] array, now empty.
Remove the 'ndo_void_printer' flag field, now useless, from
netdissect_options.
Remove other transitional code.
#define IF_PRINTER_ARGS (netdissect_options *, const struct pcap_pkthdr *, const u_char *)
-typedef u_int (*uint_if_printer) IF_PRINTER_ARGS;
-typedef void (*void_if_printer) IF_PRINTER_ARGS;
-
-/* pointer to the uint_if_printer or the void_if_printer function */
-typedef union {
- uint_if_printer uint_printer;
- void_if_printer void_printer;
- void* printer; /* generic when testing if NULL or not */
-} if_printer_t;
+typedef void (*if_printer) IF_PRINTER_ARGS;
/*
* In case the data in a buffer needs to be processed by being decrypted,
/* stack of saved packet boundary and buffer information */
struct netdissect_saved_packet_info *ndo_packet_info_stack;
- /* pointer to the uint_if_printer or the void_if_printer function */
- if_printer_t ndo_if_printer;
- int ndo_void_printer; /* void_if_printer ? (FALSE/TRUE) */
+ /* pointer to the if_printer function */
+ if_printer ndo_if_printer;
/* pointer to void function to output stuff */
void (*ndo_default_print)(netdissect_options *,
extern const char *tok2strary_internal(const char **, int, const char *, int);
#define tok2strary(a,f,i) tok2strary_internal(a, sizeof(a)/sizeof(a[0]),f,i)
-extern uint_if_printer lookup_uint_printer(int);
-extern void_if_printer lookup_void_printer(int);
-extern if_printer_t lookup_printer(netdissect_options *, int);
+extern if_printer lookup_printer(int);
#define ND_DEBUG {printf(" [%s:%d %s] ", __FILE__, __LINE__, __FUNCTION__); fflush(stdout);}
uint32_t dlt, hdrlen, rectype;
u_int caplen = h->caplen;
u_int length = h->len;
- if_printer_t printer;
+ if_printer printer;
const pktap_header_t *hdr;
struct pcap_pkthdr nhdr;
break;
case PKT_REC_PACKET:
- printer = lookup_printer(ndo, dlt);
- if (printer.printer != NULL) {
+ printer = lookup_printer(dlt);
+ if (printer != NULL) {
nhdr = *h;
nhdr.caplen = caplen;
nhdr.len = length;
- if (ndo->ndo_void_printer == TRUE) {
- printer.void_printer(ndo, &nhdr, p);
- hdrlen += ndo->ndo_ll_hdr_len;
- } else
- hdrlen += printer.uint_printer(ndo, &nhdr, p);
+ printer(ndo, &nhdr, p);
+ hdrlen += ndo->ndo_ll_hdr_len;
} else {
if (!ndo->ndo_eflag)
pktap_header_print(ndo, (const u_char *)hdr,
ppi_if_print(netdissect_options *ndo,
const struct pcap_pkthdr *h, const u_char *p)
{
- if_printer_t printer;
+ if_printer printer;
const ppi_header_t *hdr;
u_int caplen = h->caplen;
u_int length = h->len;
caplen -= len;
p += len;
- printer = lookup_printer(ndo, dlt);
- if (printer.printer != NULL) {
+ printer = lookup_printer(dlt);
+ if (printer != NULL) {
nhdr = *h;
nhdr.caplen = caplen;
nhdr.len = length;
- if (ndo->ndo_void_printer == TRUE) {
- printer.void_printer(ndo, &nhdr, p);
- hdrlen = ndo->ndo_ll_hdr_len;
- } else
- hdrlen = printer.uint_printer(ndo, &nhdr, p);
+ printer(ndo, &nhdr, p);
+ hdrlen = ndo->ndo_ll_hdr_len;
} else {
if (!ndo->ndo_eflag)
ppi_header_print(ndo, (const u_char *)hdr, length + len);
#include "pcap-missing.h"
-struct uint_printer {
- uint_if_printer f;
+struct printer {
+ if_printer f;
int type;
};
-struct void_printer {
- void_if_printer f;
- int type;
-};
-
-static const struct uint_printer uint_printers[] = {
- { NULL, 0 },
-};
-
-static const struct void_printer void_printers[] = {
+static const struct printer printers[] = {
#ifdef DLT_APPLE_IP_OVER_IEEE1394
{ ap1394_if_print, DLT_APPLE_IP_OVER_IEEE1394 },
#endif
init_checksum();
}
-uint_if_printer
-lookup_uint_printer(int type)
-{
- const struct uint_printer *p;
-
- for (p = uint_printers; p->f; ++p)
- if (type == p->type)
- return p->f;
-
-#if defined(DLT_USER2) && defined(DLT_PKTAP)
- /*
- * Apple incorrectly chose to use DLT_USER2 for their PKTAP
- * header.
- *
- * We map DLT_PKTAP, whether it's DLT_USER2 as it is on Darwin-
- * based OSes or the same value as LINKTYPE_PKTAP as it is on
- * other OSes, to LINKTYPE_PKTAP, so files written with
- * this version of libpcap for a DLT_PKTAP capture have a link-
- * layer header type of LINKTYPE_PKTAP.
- *
- * However, files written on OS X Mavericks for a DLT_PKTAP
- * capture have a link-layer header type of LINKTYPE_USER2.
- * If we don't have a printer for DLT_USER2, and type is
- * DLT_USER2, we look up the printer for DLT_PKTAP and use
- * that.
- */
- if (type == DLT_USER2) {
- for (p = uint_printers; p->f; ++p)
- if (DLT_PKTAP == p->type)
- return p->f;
- }
-#endif
-
- return NULL;
- /* NOTREACHED */
-}
-
-void_if_printer
-lookup_void_printer(int type)
+if_printer
+lookup_printer(int type)
{
- const struct void_printer *p;
+ const struct printer *p;
- for (p = void_printers; p->f; ++p)
+ for (p = printers; p->f; ++p)
if (type == p->type)
return p->f;
* that.
*/
if (type == DLT_USER2) {
- for (p = void_printers; p->f; ++p)
+ for (p = printers; p->f; ++p)
if (DLT_PKTAP == p->type)
return p->f;
}
/* NOTREACHED */
}
-if_printer_t
-lookup_printer(netdissect_options *ndo, int type)
-{
- if_printer_t printer;
-
- printer.void_printer = lookup_void_printer(type);
- ndo->ndo_void_printer = TRUE;
- if (printer.void_printer == NULL) {
- printer.uint_printer = lookup_uint_printer(type);
- ndo->ndo_void_printer = FALSE;
- }
- return printer;
-}
-
int
has_printer(int type)
{
- return (lookup_void_printer(type) != NULL ||
- lookup_uint_printer(type) != NULL);
+ return (lookup_printer(type) != NULL);
}
-if_printer_t
-get_if_printer(netdissect_options *ndo, int type)
+if_printer
+get_if_printer(int type)
{
- if_printer_t printer;
+ if_printer printer;
- printer = lookup_printer(ndo, type);
- if (printer.printer == NULL)
- printer.void_printer = unsupported_if_print;
+ printer = lookup_printer(type);
+ if (printer == NULL)
+ printer = unsupported_if_print;
return printer;
}
pretty_print_packet(netdissect_options *ndo, const struct pcap_pkthdr *h,
const u_char *sp, u_int packets_captured)
{
- u_int hdrlen;
+ u_int hdrlen = 0;
int invalid_header = 0;
if (ndo->ndo_packet_number)
ndo->ndo_ll_hdr_len = 0;
if (setjmp(ndo->ndo_truncated) == 0) {
/* Print the packet. */
- if (ndo->ndo_void_printer == TRUE) {
- (ndo->ndo_if_printer.void_printer)(ndo, h, sp);
- hdrlen = ndo->ndo_ll_hdr_len;
- } else
- hdrlen = (ndo->ndo_if_printer.uint_printer)(ndo, h, sp);
+ (ndo->ndo_if_printer)(ndo, h, sp);
} else {
/* A printer quit because the packet was truncated; report it */
ND_PRINT(" [|%s]", ndo->ndo_protocol);
- hdrlen = ndo->ndo_ll_hdr_len;
}
+ hdrlen = ndo->ndo_ll_hdr_len;
/*
* Empty the stack of packet information, freeing all pushed buffers;
int has_printer(int type);
-if_printer_t get_if_printer(netdissect_options *ndo, int type);
+if_printer get_if_printer(int type);
void pretty_print_packet(netdissect_options *ndo,
const struct pcap_pkthdr *h, const u_char *sp,
}
if (print) {
dlt = pcap_datalink(pd);
- ndo->ndo_if_printer = get_if_printer(ndo, dlt);
+ ndo->ndo_if_printer = get_if_printer(dlt);
dumpinfo.ndo = ndo;
} else
dumpinfo.ndo = NULL;
#endif
} else {
dlt = pcap_datalink(pd);
- ndo->ndo_if_printer = get_if_printer(ndo, dlt);
+ ndo->ndo_if_printer = get_if_printer(dlt);
callback = print_packet;
pcap_userdata = (u_char *)ndo;
}
* the new DLT.
*/
dlt = new_dlt;
- ndo->ndo_if_printer = get_if_printer(ndo, dlt);
+ ndo->ndo_if_printer = get_if_printer(dlt);
if (pcap_compile(pd, &fcode, cmdbuf, Oflag, netmask) < 0)
error("%s", pcap_geterr(pd));
}