mirror of
https://github.com/the-tcpdump-group/tcpdump.git
synced 2024-11-23 10:04:05 +08:00
Apply the last step of the new way to update the link-layer header length
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.
This commit is contained in:
parent
0c93b15d38
commit
b30f3843b9
19
netdissect.h
19
netdissect.h
@ -166,15 +166,7 @@ typedef struct netdissect_options netdissect_options;
|
||||
|
||||
#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,
|
||||
@ -246,9 +238,8 @@ struct netdissect_options {
|
||||
/* 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 *,
|
||||
@ -457,9 +448,7 @@ extern int unaligned_memcmp(const void *, const void *, size_t);
|
||||
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);}
|
||||
|
||||
|
@ -102,7 +102,7 @@ pktap_if_print(netdissect_options *ndo,
|
||||
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;
|
||||
|
||||
@ -148,16 +148,13 @@ pktap_if_print(netdissect_options *ndo,
|
||||
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,
|
||||
|
13
print-ppi.c
13
print-ppi.c
@ -67,7 +67,7 @@ void
|
||||
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;
|
||||
@ -111,16 +111,13 @@ ppi_if_print(netdissect_options *ndo,
|
||||
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);
|
||||
|
101
print.c
101
print.c
@ -42,21 +42,12 @@
|
||||
|
||||
#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
|
||||
@ -278,12 +269,12 @@ init_print(netdissect_options *ndo, uint32_t localnet, uint32_t mask)
|
||||
init_checksum();
|
||||
}
|
||||
|
||||
uint_if_printer
|
||||
lookup_uint_printer(int type)
|
||||
if_printer
|
||||
lookup_printer(int type)
|
||||
{
|
||||
const struct uint_printer *p;
|
||||
const struct printer *p;
|
||||
|
||||
for (p = uint_printers; p->f; ++p)
|
||||
for (p = printers; p->f; ++p)
|
||||
if (type == p->type)
|
||||
return p->f;
|
||||
|
||||
@ -305,7 +296,7 @@ lookup_uint_printer(int type)
|
||||
* that.
|
||||
*/
|
||||
if (type == DLT_USER2) {
|
||||
for (p = uint_printers; p->f; ++p)
|
||||
for (p = printers; p->f; ++p)
|
||||
if (DLT_PKTAP == p->type)
|
||||
return p->f;
|
||||
}
|
||||
@ -315,72 +306,20 @@ lookup_uint_printer(int type)
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
void_if_printer
|
||||
lookup_void_printer(int type)
|
||||
{
|
||||
const struct void_printer *p;
|
||||
|
||||
for (p = void_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 = void_printers; p->f; ++p)
|
||||
if (DLT_PKTAP == p->type)
|
||||
return p->f;
|
||||
}
|
||||
#endif
|
||||
|
||||
return NULL;
|
||||
/* 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;
|
||||
}
|
||||
|
||||
@ -388,7 +327,7 @@ void
|
||||
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)
|
||||
@ -461,16 +400,12 @@ pretty_print_packet(netdissect_options *ndo, const struct pcap_pkthdr *h,
|
||||
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;
|
||||
|
2
print.h
2
print.h
@ -32,7 +32,7 @@ void init_print(netdissect_options *ndo, uint32_t localnet, uint32_t mask);
|
||||
|
||||
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,
|
||||
|
@ -2410,7 +2410,7 @@ DIAG_ON_CLANG(assign-enum)
|
||||
}
|
||||
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;
|
||||
@ -2421,7 +2421,7 @@ DIAG_ON_CLANG(assign-enum)
|
||||
#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;
|
||||
}
|
||||
@ -2594,7 +2594,7 @@ DIAG_ON_CLANG(assign-enum)
|
||||
* 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));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user