extern void dvmrp_print(const u_char *, u_int);
extern void egp_print(const u_char *, u_int);
extern u_int enc_if_print(const struct pcap_pkthdr *, const u_char *);
-extern u_int fr_if_print(const struct pcap_pkthdr *, const u_char *);
-extern u_int mfr_if_print(const struct pcap_pkthdr *, const u_char *);
-extern u_int fr_print(register const u_char *, u_int);
-extern u_int mfr_print(register const u_char *, u_int);
extern char *q922_string(const u_char *);
extern u_int ieee802_11_if_print(const struct pcap_pkthdr *, const u_char *);
extern u_int ieee802_11_radio_if_print(const struct pcap_pkthdr *,
extern void rsvp_print(const u_char *, u_int);
extern void ldp_print(const u_char *, u_int);
extern void lldp_print(const u_char *, u_int);
-extern void lmp_print(const u_char *, u_int);
extern void lspping_print(const u_char *, u_int);
extern void lwapp_control_print(const u_char *, u_int, int);
extern void lwapp_data_print(const u_char *, u_int);
extern u_int ppp_hdlc_if_print(const struct pcap_pkthdr *, const u_char *);
extern u_int ppp_bsdos_if_print(const struct pcap_pkthdr *, const u_char *);
extern u_int prism_if_print(const struct pcap_pkthdr *, const u_char *);
-extern void q933_print(const u_char *, u_int);
extern void rip_print(const u_char *, u_int);
extern u_int sl_if_print(const struct pcap_pkthdr *, const u_char *);
extern u_int sl_bsdos_if_print(const struct pcap_pkthdr *, const u_char *);
extern void cfm_print(const u_char *, u_int);
extern void pgm_print(const u_char *, u_int, const u_char *);
extern void cdp_print(const u_char *, u_int, u_int);
-extern void radius_print(const u_char *, u_int);
extern void lwres_print(const u_char *, u_int);
extern void pptp_print(const u_char *);
extern void sctp_print(const u_char *, const u_char *, u_int);
extern void openflow_print(netdissect_options *, const u_char *, const u_int);
extern void telnet_print(netdissect_options *, const u_char *, u_int);
extern void slow_print(netdissect_options *, const u_char *, u_int);
+extern void radius_print(netdissect_options *, const u_char *, u_int);
+extern void lmp_print(netdissect_options *, const u_char *, u_int);
+extern u_int fr_print(netdissect_options *, register const u_char *, u_int);
+extern u_int mfr_print(netdissect_options *, register const u_char *, u_int);
+extern u_int fr_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern u_int mfr_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern void q933_print(netdissect_options *, const u_char *, u_int);
/* stuff that has not yet been rototiled */
extern const u_char * ns_nprint (register const u_char *, register const u_char *);
u_int len, int ttl);
extern void cdp_print(netdissect_options *,const u_char *,
u_int, u_int, const u_char *, const u_char *);
-extern void radius_print(netdissect_options *,const u_char *, u_int);
extern void lwres_print(netdissect_options *,const u_char *, u_int);
extern void pptp_print(netdissect_options *,const u_char *, u_int);
#endif
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
+#define NETDISSECT_REWORKED
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "extract.h"
#include "oui.h"
-static void frf15_print(const u_char *, u_int);
+static void frf15_print(netdissect_options *ndo, const u_char *, u_int);
/*
* the frame relay header has a variable length
}
static void
-fr_hdr_print(int length, u_int addr_len, u_int dlci, u_int8_t *flags, u_int16_t nlpid)
+fr_hdr_print(netdissect_options *ndo,
+ int length, u_int addr_len, u_int dlci, u_int8_t *flags, u_int16_t nlpid)
{
- if (qflag) {
- (void)printf("Q.922, DLCI %u, length %u: ",
+ if (ndo->ndo_qflag) {
+ ND_PRINT((ndo, "Q.922, DLCI %u, length %u: ",
dlci,
- length);
+ length));
} else {
if (nlpid <= 0xff) /* if its smaller than 256 then its a NLPID */
- (void)printf("Q.922, hdr-len %u, DLCI %u, Flags [%s], NLPID %s (0x%02x), length %u: ",
+ ND_PRINT((ndo, "Q.922, hdr-len %u, DLCI %u, Flags [%s], NLPID %s (0x%02x), length %u: ",
addr_len,
dlci,
bittok2str(fr_header_flag_values, "none", EXTRACT_32BITS(flags)),
tok2str(nlpid_values,"unknown", nlpid),
nlpid,
- length);
+ length));
else /* must be an ethertype */
- (void)printf("Q.922, hdr-len %u, DLCI %u, Flags [%s], cisco-ethertype %s (0x%04x), length %u: ",
+ ND_PRINT((ndo, "Q.922, hdr-len %u, DLCI %u, Flags [%s], cisco-ethertype %s (0x%04x), length %u: ",
addr_len,
dlci,
bittok2str(fr_header_flag_values, "none", EXTRACT_32BITS(flags)),
tok2str(ethertype_values, "unknown", nlpid),
nlpid,
- length);
+ length));
}
}
u_int
-fr_if_print(const struct pcap_pkthdr *h, register const u_char *p)
+fr_if_print(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, register const u_char *p)
{
register u_int length = h->len;
register u_int caplen = h->caplen;
- TCHECK2(*p, 4); /* minimum frame header length */
+ ND_TCHECK2(*p, 4); /* minimum frame header length */
- if ((length = fr_print(p, length)) == 0)
+ if ((length = fr_print(ndo, p, length)) == 0)
return (0);
else
return length;
trunc:
- printf("[|fr]");
+ ND_PRINT((ndo, "[|fr]"));
return caplen;
}
u_int
-fr_print(register const u_char *p, u_int length)
+fr_print(netdissect_options *ndo,
+ register const u_char *p, u_int length)
{
u_int16_t extracted_ethertype;
u_int dlci;
u_int8_t flags[4];
if (parse_q922_addr(p, &dlci, &addr_len, flags)) {
- printf("Q.922, invalid address");
+ ND_PRINT((ndo, "Q.922, invalid address"));
return 0;
}
- TCHECK2(*p,addr_len+1+1);
+ ND_TCHECK2(*p, addr_len+1+1);
hdr_len = fr_hdrlen(p, addr_len);
- TCHECK2(*p,hdr_len);
+ ND_TCHECK2(*p, hdr_len);
if (p[addr_len] != 0x03 && dlci != 0) {
/* lets figure out if we have cisco style encapsulation: */
extracted_ethertype = EXTRACT_16BITS(p+addr_len);
- if (eflag)
- fr_hdr_print(length, addr_len, dlci, flags, extracted_ethertype);
+ if (ndo->ndo_eflag)
+ fr_hdr_print(ndo, length, addr_len, dlci, flags, extracted_ethertype);
- if (ethertype_print(gndo, extracted_ethertype,
+ if (ethertype_print(ndo, extracted_ethertype,
p+addr_len+ETHERTYPE_LEN,
length-addr_len-ETHERTYPE_LEN,
length-addr_len-ETHERTYPE_LEN) == 0)
/* ether_type not known, probably it wasn't one */
- printf("UI %02x! ", p[addr_len]);
+ ND_PRINT((ndo, "UI %02x! ", p[addr_len]));
else
return hdr_len;
}
if (!p[addr_len + 1]) { /* pad byte should be used with 3-byte Q.922 */
if (addr_len != 3)
- printf("Pad! ");
+ ND_PRINT((ndo, "Pad! "));
} else if (addr_len == 3)
- printf("No pad! ");
+ ND_PRINT((ndo, "No pad! "));
nlpid = p[hdr_len - 1];
- if (eflag)
- fr_hdr_print(length, addr_len, dlci, flags, nlpid);
+ if (ndo->ndo_eflag)
+ fr_hdr_print(ndo, length, addr_len, dlci, flags, nlpid);
p += hdr_len;
length -= hdr_len;
switch (nlpid) {
case NLPID_IP:
- ip_print(gndo, p, length);
+ ip_print(ndo, p, length);
break;
#ifdef INET6
case NLPID_IP6:
- ip6_print(gndo, p, length);
+ ip6_print(ndo, p, length);
break;
#endif
case NLPID_CLNP:
break;
case NLPID_SNAP:
- if (snap_print(gndo, p, length, length, 0) == 0) {
+ if (snap_print(ndo, p, length, length, 0) == 0) {
/* ether_type not known, print raw packet */
- if (!eflag)
- fr_hdr_print(length + hdr_len, hdr_len,
+ if (!ndo->ndo_eflag)
+ fr_hdr_print(ndo, length + hdr_len, hdr_len,
dlci, flags, nlpid);
- if (!suppress_default_print)
- default_print(p - hdr_len, length + hdr_len);
+ if (!ndo->ndo_suppress_default_print)
+ ndo->ndo_default_print(ndo, p - hdr_len, length + hdr_len);
}
break;
case NLPID_Q933:
- q933_print(p, length);
+ q933_print(ndo, p, length);
break;
case NLPID_MFR:
- frf15_print(p, length);
+ frf15_print(ndo, p, length);
break;
case NLPID_PPP:
break;
default:
- if (!eflag)
- fr_hdr_print(length + hdr_len, addr_len,
+ if (!ndo->ndo_eflag)
+ fr_hdr_print(ndo, length + hdr_len, addr_len,
dlci, flags, nlpid);
- if (!xflag)
- default_print(p, length);
+ if (!ndo->ndo_xflag)
+ ndo->ndo_default_print(ndo, p, length);
}
return hdr_len;
trunc:
- printf("[|fr]");
+ ND_PRINT((ndo, "[|fr]"));
return 0;
}
u_int
-mfr_if_print(const struct pcap_pkthdr *h, register const u_char *p)
+mfr_if_print(netdissect_options *ndo,
+ const struct pcap_pkthdr *h, register const u_char *p)
{
register u_int length = h->len;
register u_int caplen = h->caplen;
- TCHECK2(*p, 2); /* minimum frame header length */
+ ND_TCHECK2(*p, 2); /* minimum frame header length */
- if ((length = mfr_print(p, length)) == 0)
+ if ((length = mfr_print(ndo, p, length)) == 0)
return (0);
else
return length;
trunc:
- printf("[|mfr]");
+ ND_PRINT((ndo, "[|mfr]"));
return caplen;
}
};
u_int
-mfr_print(register const u_char *p, u_int length)
+mfr_print(netdissect_options *ndo,
+ register const u_char *p, u_int length)
{
u_int tlen,idx,hdr_len = 0;
u_int16_t sequence_num;
* +----+----+----+----+----+----+----+----+
*/
- TCHECK2(*p, 4); /* minimum frame header length */
+ ND_TCHECK2(*p, 4); /* minimum frame header length */
if ((p[0] & MFR_BEC_MASK) == MFR_CTRL_FRAME && p[1] == 0) {
- printf("FRF.16 Control, Flags [%s], %s, length %u",
+ ND_PRINT((ndo, "FRF.16 Control, Flags [%s], %s, length %u",
bittok2str(frf_flag_values,"none",(p[0] & MFR_BEC_MASK)),
tok2str(mfr_ctrl_msg_values,"Unknown Message (0x%02x)",p[2]),
- length);
+ length));
tptr = p + 3;
tlen = length -3;
hdr_len = 3;
- if (!vflag)
+ if (!ndo->ndo_vflag)
return hdr_len;
while (tlen>sizeof(struct ie_tlv_header_t)) {
- TCHECK2(*tptr, sizeof(struct ie_tlv_header_t));
+ ND_TCHECK2(*tptr, sizeof(struct ie_tlv_header_t));
ie_type=tptr[0];
ie_len=tptr[1];
- printf("\n\tIE %s (%u), length %u: ",
+ ND_PRINT((ndo, "\n\tIE %s (%u), length %u: ",
tok2str(mfr_ctrl_ie_values,"Unknown",ie_type),
ie_type,
- ie_len);
+ ie_len));
/* infinite loop check */
if (ie_type == 0 || ie_len <= sizeof(struct ie_tlv_header_t))
return hdr_len;
- TCHECK2(*tptr,ie_len);
+ ND_TCHECK2(*tptr, ie_len);
tptr+=sizeof(struct ie_tlv_header_t);
/* tlv len includes header */
ie_len-=sizeof(struct ie_tlv_header_t);
switch (ie_type) {
case MFR_CTRL_IE_MAGIC_NUM:
- printf("0x%08x",EXTRACT_32BITS(tptr));
+ ND_PRINT((ndo, "0x%08x", EXTRACT_32BITS(tptr)));
break;
case MFR_CTRL_IE_BUNDLE_ID: /* same message format */
case MFR_CTRL_IE_CAUSE:
default:
- if (vflag <= 1)
- print_unknown_data(gndo,tptr,"\n\t ",ie_len);
+ if (ndo->ndo_vflag <= 1)
+ print_unknown_data(ndo, tptr, "\n\t ", ie_len);
break;
}
/* do we want to see a hexdump of the IE ? */
- if (vflag > 1 )
- print_unknown_data(gndo,tptr,"\n\t ",ie_len);
+ if (ndo->ndo_vflag > 1 )
+ print_unknown_data(ndo, tptr, "\n\t ", ie_len);
tlen-=ie_len;
tptr+=ie_len;
/* whole packet or first fragment ? */
if ((p[0] & MFR_BEC_MASK) == MFR_FRAG_FRAME ||
(p[0] & MFR_BEC_MASK) == MFR_B_BIT) {
- printf("FRF.16 Frag, seq %u, Flags [%s], ",
+ ND_PRINT((ndo, "FRF.16 Frag, seq %u, Flags [%s], ",
sequence_num,
- bittok2str(frf_flag_values,"none",(p[0] & MFR_BEC_MASK)));
+ bittok2str(frf_flag_values,"none",(p[0] & MFR_BEC_MASK))));
hdr_len = 2;
- fr_print(p+hdr_len,length-hdr_len);
+ fr_print(ndo, p+hdr_len,length-hdr_len);
return hdr_len;
}
/* must be a middle or the last fragment */
- printf("FRF.16 Frag, seq %u, Flags [%s]",
+ ND_PRINT((ndo, "FRF.16 Frag, seq %u, Flags [%s]",
sequence_num,
- bittok2str(frf_flag_values,"none",(p[0] & MFR_BEC_MASK)));
- print_unknown_data(gndo,p,"\n\t",length);
+ bittok2str(frf_flag_values,"none",(p[0] & MFR_BEC_MASK))));
+ print_unknown_data(ndo, p, "\n\t", length);
return hdr_len;
trunc:
- printf("[|mfr]");
+ ND_PRINT((ndo, "[|mfr]"));
return length;
}
#define FR_FRF15_FRAGTYPE 0x01
static void
-frf15_print (const u_char *p, u_int length) {
+frf15_print(netdissect_options *ndo,
+ const u_char *p, u_int length) {
u_int16_t sequence_num, flags;
flags = p[0]&MFR_BEC_MASK;
sequence_num = (p[0]&0x1e)<<7 | p[1];
- printf("FRF.15, seq 0x%03x, Flags [%s],%s Fragmentation, length %u",
+ ND_PRINT((ndo, "FRF.15, seq 0x%03x, Flags [%s],%s Fragmentation, length %u",
sequence_num,
bittok2str(frf_flag_values,"none",flags),
p[0]&FR_FRF15_FRAGTYPE ? "Interface" : "End-to-End",
- length);
+ length));
/* TODO:
* depending on all permutations of the B, E and C bit
NULL
};
-static int fr_q933_print_ie_codeset5(const struct ie_tlv_header_t *ie_p,
- const u_char *p);
+static int fr_q933_print_ie_codeset5(netdissect_options *ndo,
+ const struct ie_tlv_header_t *ie_p, const u_char *p);
-typedef int (*codeset_pr_func_t)(const struct ie_tlv_header_t *ie_p,
- const u_char *p);
+typedef int (*codeset_pr_func_t)(netdissect_options *,
+ const struct ie_tlv_header_t *ie_p, const u_char *p);
/* array of 16 codepages - currently we only support codepage 1,5 */
static const codeset_pr_func_t fr_q933_print_ie_codeset[] = {
};
void
-q933_print(const u_char *p, u_int length)
+q933_print(netdissect_options *ndo,
+ const u_char *p, u_int length)
{
const u_char *ptemp = p;
struct ie_tlv_header_t *ie_p;
u_int ie_is_known = 0;
if (length < 9) { /* shortest: Q.933a LINK VERIFY */
- printf("[|q.933]");
+ ND_PRINT((ndo, "[|q.933]"));
return;
}
is_ansi = 1;
}
- printf("%s", eflag ? "" : "Q.933, ");
+ ND_PRINT((ndo, "%s", ndo->ndo_eflag ? "" : "Q.933, "));
/* printing out header part */
- printf("%s, codeset %u", is_ansi ? "ANSI" : "CCITT", codeset);
+ ND_PRINT((ndo, "%s, codeset %u", is_ansi ? "ANSI" : "CCITT", codeset));
if (p[0]) {
- printf(", Call Ref: 0x%02x", p[0]);
+ ND_PRINT((ndo, ", Call Ref: 0x%02x", p[0]));
}
- if (vflag) {
- printf(", %s (0x%02x), length %u",
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, ", %s (0x%02x), length %u",
tok2str(fr_q933_msg_values,
"unknown message", p[1]),
p[1],
- length);
+ length));
} else {
- printf(", %s",
+ ND_PRINT((ndo, ", %s",
tok2str(fr_q933_msg_values,
- "unknown message 0x%02x", p[1]));
+ "unknown message 0x%02x", p[1])));
}
olen = length; /* preserve the original length for non verbose mode */
if (length < (u_int)(2 - is_ansi)) {
- printf("[|q.933]");
+ ND_PRINT((ndo, "[|q.933]"));
return;
}
length -= 2 + is_ansi;
ie_p = (struct ie_tlv_header_t *)ptemp;
if (length < sizeof(struct ie_tlv_header_t) ||
length < sizeof(struct ie_tlv_header_t) + ie_p->ie_len) {
- if (vflag) { /* not bark if there is just a trailer */
- printf("\n[|q.933]");
+ if (ndo->ndo_vflag) { /* not bark if there is just a trailer */
+ ND_PRINT((ndo, "\n[|q.933]"));
} else {
- printf(", length %u",olen);
+ ND_PRINT((ndo, ", length %u", olen));
}
return;
}
/* lets do the full IE parsing only in verbose mode
* however some IEs (DLCI Status, Link Verify)
* are also interestting in non-verbose mode */
- if (vflag) {
- printf("\n\t%s IE (0x%02x), length %u: ",
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, "\n\t%s IE (0x%02x), length %u: ",
tok2str(fr_q933_ie_codesets[codeset],
"unknown", ie_p->ie_type),
ie_p->ie_type,
- ie_p->ie_len);
+ ie_p->ie_len));
}
/* sanity check */
}
if (fr_q933_print_ie_codeset[codeset] != NULL) {
- ie_is_known = fr_q933_print_ie_codeset[codeset](ie_p, ptemp);
+ ie_is_known = fr_q933_print_ie_codeset[codeset](ndo, ie_p, ptemp);
}
- if (vflag >= 1 && !ie_is_known) {
- print_unknown_data(gndo,ptemp+2,"\n\t",ie_p->ie_len);
+ if (ndo->ndo_vflag >= 1 && !ie_is_known) {
+ print_unknown_data(ndo, ptemp+2, "\n\t", ie_p->ie_len);
}
/* do we want to see a hexdump of the IE ? */
- if (vflag> 1 && ie_is_known) {
- print_unknown_data(gndo,ptemp+2,"\n\t ",ie_p->ie_len);
+ if (ndo->ndo_vflag> 1 && ie_is_known) {
+ print_unknown_data(ndo, ptemp+2, "\n\t ", ie_p->ie_len);
}
length = length - ie_p->ie_len - 2;
ptemp = ptemp + ie_p->ie_len + 2;
}
- if (!vflag) {
- printf(", length %u",olen);
+ if (!ndo->ndo_vflag) {
+ ND_PRINT((ndo, ", length %u", olen));
}
}
static int
-fr_q933_print_ie_codeset5(const struct ie_tlv_header_t *ie_p, const u_char *p)
+fr_q933_print_ie_codeset5(netdissect_options *ndo,
+ const struct ie_tlv_header_t *ie_p, const u_char *p)
{
u_int dlci;
case FR_LMI_ANSI_REPORT_TYPE_IE: /* fall through */
case FR_LMI_CCITT_REPORT_TYPE_IE:
- if (vflag) {
- printf("%s (%u)",
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, "%s (%u)",
tok2str(fr_lmi_report_type_ie_values,"unknown",p[2]),
- p[2]);
+ p[2]));
}
return 1;
case FR_LMI_ANSI_LINK_VERIFY_IE: /* fall through */
case FR_LMI_CCITT_LINK_VERIFY_IE:
case FR_LMI_ANSI_LINK_VERIFY_IE_91:
- if (!vflag) {
- printf(", ");
+ if (!ndo->ndo_vflag) {
+ ND_PRINT((ndo, ", "));
}
- printf("TX Seq: %3d, RX Seq: %3d", p[2], p[3]);
+ ND_PRINT((ndo, "TX Seq: %3d, RX Seq: %3d", p[2], p[3]));
return 1;
case FR_LMI_ANSI_PVC_STATUS_IE: /* fall through */
case FR_LMI_CCITT_PVC_STATUS_IE:
- if (!vflag) {
- printf(", ");
+ if (!ndo->ndo_vflag) {
+ ND_PRINT((ndo, ", "));
}
/* now parse the DLCI information element. */
if ((ie_p->ie_len < 3) ||
!(p[5] & 0x80))) ||
(ie_p->ie_len > 5) ||
!(p[ie_p->ie_len + 1] & 0x80)) {
- printf("Invalid DLCI IE");
+ ND_PRINT((ndo, "Invalid DLCI IE"));
}
dlci = ((p[2] & 0x3F) << 4) | ((p[3] & 0x78) >> 3);
dlci = (dlci << 13) | (p[4] & 0x7F) | ((p[5] & 0x7E) >> 1);
}
- printf("DLCI %u: status %s%s", dlci,
+ ND_PRINT((ndo, "DLCI %u: status %s%s", dlci,
p[ie_p->ie_len + 1] & 0x8 ? "New, " : "",
- p[ie_p->ie_len + 1] & 0x2 ? "Active" : "Inactive");
+ p[ie_p->ie_len + 1] & 0x2 ? "Active" : "Inactive"));
return 1;
}
break;
case NLPID_Q933:
- q933_print(p+1, length-1);
+ q933_print(gndo, p+1, length-1);
break;
case NLPID_IP:
p+=l2info.header_len;
/* this DLT contains nothing but raw frame-relay frames */
- fr_print(p, l2info.length);
+ fr_print(gndo, p, l2info.length);
return l2info.header_len;
}
#endif
/* child-link ? */
if (l2info.cookie_len == 0) {
- mfr_print(p,l2info.length);
+ mfr_print(gndo, p, l2info.length);
return l2info.header_len;
}
*/
+#define NETDISSECT_REWORKED
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <tcpdump-stdinc.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
#include "interface.h"
#include "extract.h"
#include "addrtoname.h"
};
void
-lmp_print(register const u_char *pptr, register u_int len) {
+lmp_print(netdissect_options *ndo,
+ register const u_char *pptr, register u_int len) {
const struct lmp_common_header *lmp_com_header;
const struct lmp_object_header *lmp_obj_header;
tptr=pptr;
lmp_com_header = (const struct lmp_common_header *)pptr;
- TCHECK(*lmp_com_header);
+ ND_TCHECK(*lmp_com_header);
/*
* Sanity checking of the header.
*/
if (LMP_EXTRACT_VERSION(lmp_com_header->version_res[0]) != LMP_VERSION) {
- printf("LMP version %u packet not supported",
- LMP_EXTRACT_VERSION(lmp_com_header->version_res[0]));
+ ND_PRINT((ndo, "LMP version %u packet not supported",
+ LMP_EXTRACT_VERSION(lmp_com_header->version_res[0])));
return;
}
/* in non-verbose mode just lets print the basic Message Type*/
- if (vflag < 1) {
- printf("LMPv%u %s Message, length: %u",
+ if (ndo->ndo_vflag < 1) {
+ ND_PRINT((ndo, "LMPv%u %s Message, length: %u",
LMP_EXTRACT_VERSION(lmp_com_header->version_res[0]),
tok2str(lmp_msg_type_values, "unknown (%u)",lmp_com_header->msg_type),
- len);
+ len));
return;
}
tlen=EXTRACT_16BITS(lmp_com_header->length);
- printf("\n\tLMPv%u, msg-type: %s, Flags: [%s], length: %u",
+ ND_PRINT((ndo, "\n\tLMPv%u, msg-type: %s, Flags: [%s], length: %u",
LMP_EXTRACT_VERSION(lmp_com_header->version_res[0]),
tok2str(lmp_msg_type_values, "unknown, type: %u",lmp_com_header->msg_type),
bittok2str(lmp_header_flag_values,"none",lmp_com_header->flags),
- tlen);
+ tlen));
tptr+=sizeof(const struct lmp_common_header);
tlen-=sizeof(const struct lmp_common_header);
while(tlen>0) {
/* did we capture enough for fully decoding the object header ? */
- if (!TTEST2(*tptr, sizeof(struct lmp_object_header)))
+ if (!ND_TTEST2(*tptr, sizeof(struct lmp_object_header)))
goto trunc;
lmp_obj_header = (const struct lmp_object_header *)tptr;
if(lmp_obj_len % 4 || lmp_obj_len < 4)
return;
- printf("\n\t %s Object (%u), Class-Type: %s (%u) Flags: [%snegotiable], length: %u",
+ ND_PRINT((ndo, "\n\t %s Object (%u), Class-Type: %s (%u) Flags: [%snegotiable], length: %u",
tok2str(lmp_obj_values,
"Unknown",
lmp_obj_header->class_num),
((lmp_obj_header->class_num)<<8)+lmp_obj_ctype),
lmp_obj_ctype,
(lmp_obj_header->ctype)&0x80 ? "" : "non-",
- lmp_obj_len);
+ lmp_obj_len));
obj_tptr=tptr+sizeof(struct lmp_object_header);
obj_tlen=lmp_obj_len-sizeof(struct lmp_object_header);
/* did we capture enough for fully decoding the object ? */
- if (!TTEST2(*tptr, lmp_obj_len))
+ if (!ND_TTEST2(*tptr, lmp_obj_len))
goto trunc;
hexdump=FALSE;
switch(lmp_obj_ctype) {
case LMP_CTYPE_LOC:
case LMP_CTYPE_RMT:
- printf("\n\t Control Channel ID: %u (0x%08x)",
+ ND_PRINT((ndo, "\n\t Control Channel ID: %u (0x%08x)",
EXTRACT_32BITS(obj_tptr),
- EXTRACT_32BITS(obj_tptr));
+ EXTRACT_32BITS(obj_tptr)));
break;
default:
switch(lmp_obj_ctype) {
case LMP_CTYPE_IPV4_LOC:
case LMP_CTYPE_IPV4_RMT:
- printf("\n\t IPv4 Link ID: %s (0x%08x)",
+ ND_PRINT((ndo, "\n\t IPv4 Link ID: %s (0x%08x)",
ipaddr_string(obj_tptr),
- EXTRACT_32BITS(obj_tptr));
+ EXTRACT_32BITS(obj_tptr)));
break;
#ifdef INET6
case LMP_CTYPE_IPV6_LOC:
case LMP_CTYPE_IPV6_RMT:
- printf("\n\t IPv6 Link ID: %s (0x%08x)",
+ ND_PRINT((ndo, "\n\t IPv6 Link ID: %s (0x%08x)",
ip6addr_string(obj_tptr),
- EXTRACT_32BITS(obj_tptr));
+ EXTRACT_32BITS(obj_tptr)));
break;
#endif
case LMP_CTYPE_UNMD_LOC:
case LMP_CTYPE_UNMD_RMT:
- printf("\n\t Link ID: %u (0x%08x)",
+ ND_PRINT((ndo, "\n\t Link ID: %u (0x%08x)",
EXTRACT_32BITS(obj_tptr),
- EXTRACT_32BITS(obj_tptr));
+ EXTRACT_32BITS(obj_tptr)));
break;
default:
hexdump=TRUE;
case LMP_OBJ_MESSAGE_ID:
switch(lmp_obj_ctype) {
case LMP_CTYPE_1:
- printf("\n\t Message ID: %u (0x%08x)",
+ ND_PRINT((ndo, "\n\t Message ID: %u (0x%08x)",
EXTRACT_32BITS(obj_tptr),
- EXTRACT_32BITS(obj_tptr));
+ EXTRACT_32BITS(obj_tptr)));
break;
case LMP_CTYPE_2:
- printf("\n\t Message ID Ack: %u (0x%08x)",
+ ND_PRINT((ndo, "\n\t Message ID Ack: %u (0x%08x)",
EXTRACT_32BITS(obj_tptr),
- EXTRACT_32BITS(obj_tptr));
+ EXTRACT_32BITS(obj_tptr)));
break;
default:
hexdump=TRUE;
switch(lmp_obj_ctype) {
case LMP_CTYPE_LOC:
case LMP_CTYPE_RMT:
- printf("\n\t Node ID: %s (0x%08x)",
+ ND_PRINT((ndo, "\n\t Node ID: %s (0x%08x)",
ipaddr_string(obj_tptr),
- EXTRACT_32BITS(obj_tptr));
+ EXTRACT_32BITS(obj_tptr)));
break;
default:
case LMP_OBJ_CONFIG:
switch(lmp_obj_ctype) {
case LMP_CTYPE_HELLO_CONFIG:
- printf("\n\t Hello Interval: %u\n\t Hello Dead Interval: %u",
+ ND_PRINT((ndo, "\n\t Hello Interval: %u\n\t Hello Dead Interval: %u",
EXTRACT_16BITS(obj_tptr),
- EXTRACT_16BITS(obj_tptr+2));
+ EXTRACT_16BITS(obj_tptr+2)));
break;
default:
case LMP_OBJ_HELLO:
switch(lmp_obj_ctype) {
case LMP_CTYPE_HELLO:
- printf("\n\t Tx Seq: %u, Rx Seq: %u",
+ ND_PRINT((ndo, "\n\t Tx Seq: %u, Rx Seq: %u",
EXTRACT_32BITS(obj_tptr),
- EXTRACT_32BITS(obj_tptr+4));
+ EXTRACT_32BITS(obj_tptr+4)));
break;
default:
break;
case LMP_OBJ_TE_LINK:
- printf("\n\t Flags: [%s]",
+ ND_PRINT((ndo, "\n\t Flags: [%s]",
bittok2str(lmp_obj_te_link_flag_values,
"none",
- EXTRACT_16BITS(obj_tptr)>>8));
+ EXTRACT_16BITS(obj_tptr)>>8)));
switch(lmp_obj_ctype) {
case LMP_CTYPE_IPV4:
- printf("\n\t Local Link-ID: %s (0x%08x)"
+ ND_PRINT((ndo, "\n\t Local Link-ID: %s (0x%08x)"
"\n\t Remote Link-ID: %s (0x%08x)",
ipaddr_string(obj_tptr+4),
EXTRACT_32BITS(obj_tptr+4),
ipaddr_string(obj_tptr+8),
- EXTRACT_32BITS(obj_tptr+8));
+ EXTRACT_32BITS(obj_tptr+8)));
break;
#ifdef INET6
break;
case LMP_OBJ_DATA_LINK:
- printf("\n\t Flags: [%s]",
+ ND_PRINT((ndo, "\n\t Flags: [%s]",
bittok2str(lmp_obj_data_link_flag_values,
"none",
- EXTRACT_16BITS(obj_tptr)>>8));
+ EXTRACT_16BITS(obj_tptr)>>8)));
switch(lmp_obj_ctype) {
case LMP_CTYPE_IPV4:
case LMP_CTYPE_UNMD:
- printf("\n\t Local Interface ID: %s (0x%08x)"
+ ND_PRINT((ndo, "\n\t Local Interface ID: %s (0x%08x)"
"\n\t Remote Interface ID: %s (0x%08x)",
ipaddr_string(obj_tptr+4),
EXTRACT_32BITS(obj_tptr+4),
ipaddr_string(obj_tptr+8),
- EXTRACT_32BITS(obj_tptr+8));
+ EXTRACT_32BITS(obj_tptr+8)));
total_subobj_len = lmp_obj_len - 16;
offset = 12;
while (total_subobj_len > 0 && hexdump == FALSE ) {
subobj_type = EXTRACT_16BITS(obj_tptr+offset)>>8;
subobj_len = EXTRACT_16BITS(obj_tptr+offset)&0x00FF;
- printf("\n\t Subobject, Type: %s (%u), Length: %u",
+ ND_PRINT((ndo, "\n\t Subobject, Type: %s (%u), Length: %u",
tok2str(lmp_data_link_subobj,
"Unknown",
subobj_type),
subobj_type,
- subobj_len);
+ subobj_len));
switch(subobj_type) {
case INT_SWITCHING_TYPE_SUBOBJ:
- printf("\n\t Switching Type: %s (%u)",
+ ND_PRINT((ndo, "\n\t Switching Type: %s (%u)",
tok2str(gmpls_switch_cap_values,
"Unknown",
EXTRACT_16BITS(obj_tptr+offset+2)>>8),
- EXTRACT_16BITS(obj_tptr+offset+2)>>8);
- printf("\n\t Encoding Type: %s (%u)",
+ EXTRACT_16BITS(obj_tptr+offset+2)>>8));
+ ND_PRINT((ndo, "\n\t Encoding Type: %s (%u)",
tok2str(gmpls_encoding_values,
"Unknown",
EXTRACT_16BITS(obj_tptr+offset+2)&0x00FF),
- EXTRACT_16BITS(obj_tptr+offset+2)&0x00FF);
+ EXTRACT_16BITS(obj_tptr+offset+2)&0x00FF));
bw.i = EXTRACT_32BITS(obj_tptr+offset+4);
- printf("\n\t Min Reservable Bandwidth: %.3f Mbps",
- bw.f*8/1000000);
+ ND_PRINT((ndo, "\n\t Min Reservable Bandwidth: %.3f Mbps",
+ bw.f*8/1000000));
bw.i = EXTRACT_32BITS(obj_tptr+offset+8);
- printf("\n\t Max Reservable Bandwidth: %.3f Mbps",
- bw.f*8/1000000);
+ ND_PRINT((ndo, "\n\t Max Reservable Bandwidth: %.3f Mbps",
+ bw.f*8/1000000));
break;
case WAVELENGTH_SUBOBJ:
- printf("\n\t Wavelength: %u",
- EXTRACT_32BITS(obj_tptr+offset+4));
+ ND_PRINT((ndo, "\n\t Wavelength: %u",
+ EXTRACT_32BITS(obj_tptr+offset+4)));
break;
default:
/* Any Unknown Subobject ==> Exit loop */
case LMP_OBJ_VERIFY_BEGIN:
switch(lmp_obj_ctype) {
case LMP_CTYPE_1:
- printf("\n\t Flags: %s",
+ ND_PRINT((ndo, "\n\t Flags: %s",
bittok2str(lmp_obj_begin_verify_flag_values,
"none",
- EXTRACT_16BITS(obj_tptr)));
- printf("\n\t Verify Interval: %u",
- EXTRACT_16BITS(obj_tptr+2));
- printf("\n\t Data links: %u",
- EXTRACT_32BITS(obj_tptr+4));
- printf("\n\t Encoding type: %s",
- tok2str(gmpls_encoding_values, "Unknown", *(obj_tptr+8)));
- printf("\n\t Verify Transport Mechanism: %u (0x%x)%s",
+ EXTRACT_16BITS(obj_tptr))));
+ ND_PRINT((ndo, "\n\t Verify Interval: %u",
+ EXTRACT_16BITS(obj_tptr+2)));
+ ND_PRINT((ndo, "\n\t Data links: %u",
+ EXTRACT_32BITS(obj_tptr+4)));
+ ND_PRINT((ndo, "\n\t Encoding type: %s",
+ tok2str(gmpls_encoding_values, "Unknown", *(obj_tptr+8))));
+ ND_PRINT((ndo, "\n\t Verify Transport Mechanism: %u (0x%x)%s",
EXTRACT_16BITS(obj_tptr+10),
EXTRACT_16BITS(obj_tptr+10),
- EXTRACT_16BITS(obj_tptr+10)&8000 ? " (Payload test messages capable)" : "");
+ EXTRACT_16BITS(obj_tptr+10)&8000 ? " (Payload test messages capable)" : ""));
bw.i = EXTRACT_32BITS(obj_tptr+12);
- printf("\n\t Transmission Rate: %.3f Mbps",bw.f*8/1000000);
- printf("\n\t Wavelength: %u",
- EXTRACT_32BITS(obj_tptr+16));
+ ND_PRINT((ndo, "\n\t Transmission Rate: %.3f Mbps",bw.f*8/1000000));
+ ND_PRINT((ndo, "\n\t Wavelength: %u",
+ EXTRACT_32BITS(obj_tptr+16)));
break;
default:
case LMP_OBJ_VERIFY_BEGIN_ACK:
switch(lmp_obj_ctype) {
case LMP_CTYPE_1:
- printf("\n\t Verify Dead Interval: %u"
+ ND_PRINT((ndo, "\n\t Verify Dead Interval: %u"
"\n\t Verify Transport Response: %u",
EXTRACT_16BITS(obj_tptr),
- EXTRACT_16BITS(obj_tptr+2));
+ EXTRACT_16BITS(obj_tptr+2)));
break;
default:
case LMP_OBJ_VERIFY_ID:
switch(lmp_obj_ctype) {
case LMP_CTYPE_1:
- printf("\n\t Verify ID: %u",
- EXTRACT_32BITS(obj_tptr));
+ ND_PRINT((ndo, "\n\t Verify ID: %u",
+ EXTRACT_32BITS(obj_tptr)));
break;
default:
offset = 0;
/* Decode pairs: <Interface_ID (4 bytes), Channel_status (4 bytes)> */
while (offset < (lmp_obj_len-(int)sizeof(struct lmp_object_header)) ) {
- printf("\n\t Interface ID: %s (0x%08x)",
+ ND_PRINT((ndo, "\n\t Interface ID: %s (0x%08x)",
ipaddr_string(obj_tptr+offset),
- EXTRACT_32BITS(obj_tptr+offset));
+ EXTRACT_32BITS(obj_tptr+offset)));
- printf("\n\t\t Active: %s (%u)", (EXTRACT_32BITS(obj_tptr+offset+4)>>31) ?
+ ND_PRINT((ndo, "\n\t\t Active: %s (%u)", (EXTRACT_32BITS(obj_tptr+offset+4)>>31) ?
"Allocated" : "Non-allocated",
- (EXTRACT_32BITS(obj_tptr+offset+4)>>31));
+ (EXTRACT_32BITS(obj_tptr+offset+4)>>31)));
- printf("\n\t\t Direction: %s (%u)", (EXTRACT_32BITS(obj_tptr+offset+4)>>30)&0x1 ?
+ ND_PRINT((ndo, "\n\t\t Direction: %s (%u)", (EXTRACT_32BITS(obj_tptr+offset+4)>>30)&0x1 ?
"Transmit" : "Receive",
- (EXTRACT_32BITS(obj_tptr+offset+4)>>30)&0x1);
+ (EXTRACT_32BITS(obj_tptr+offset+4)>>30)&0x1));
- printf("\n\t\t Channel Status: %s (%u)",
+ ND_PRINT((ndo, "\n\t\t Channel Status: %s (%u)",
tok2str(lmp_obj_channel_status_values,
"Unknown",
EXTRACT_32BITS(obj_tptr+offset+4)&0x3FFFFFF),
- EXTRACT_32BITS(obj_tptr+offset+4)&0x3FFFFFF);
+ EXTRACT_32BITS(obj_tptr+offset+4)&0x3FFFFFF));
offset+=8;
}
break;
case LMP_CTYPE_UNMD:
offset = 0;
while (offset < (lmp_obj_len-(int)sizeof(struct lmp_object_header)) ) {
- printf("\n\t Interface ID: %s (0x%08x)",
+ ND_PRINT((ndo, "\n\t Interface ID: %s (0x%08x)",
ipaddr_string(obj_tptr+offset),
- EXTRACT_32BITS(obj_tptr+offset));
+ EXTRACT_32BITS(obj_tptr+offset)));
offset+=4;
}
break;
case LMP_OBJ_ERROR_CODE:
switch(lmp_obj_ctype) {
case LMP_CTYPE_BEGIN_VERIFY_ERROR:
- printf("\n\t Error Code: %s",
+ ND_PRINT((ndo, "\n\t Error Code: %s",
bittok2str(lmp_obj_begin_verify_error_values,
"none",
- EXTRACT_32BITS(obj_tptr)));
+ EXTRACT_32BITS(obj_tptr))));
break;
case LMP_CTYPE_LINK_SUMMARY_ERROR:
- printf("\n\t Error Code: %s",
+ ND_PRINT((ndo, "\n\t Error Code: %s",
bittok2str(lmp_obj_link_summary_error_values,
"none",
- EXTRACT_32BITS(obj_tptr)));
+ EXTRACT_32BITS(obj_tptr))));
break;
default:
hexdump=TRUE;
switch (lmp_obj_ctype) {
case LMP_CTYPE_SERVICE_CONFIG_SP:
- printf("\n\t Flags: %s",
+ ND_PRINT((ndo, "\n\t Flags: %s",
bittok2str(lmp_obj_service_config_sp_flag_values,
"none",
- EXTRACT_16BITS(obj_tptr)>>8));
+ EXTRACT_16BITS(obj_tptr)>>8)));
- printf("\n\t UNI Version: %u",
- EXTRACT_16BITS(obj_tptr) & 0x00FF);
+ ND_PRINT((ndo, "\n\t UNI Version: %u",
+ EXTRACT_16BITS(obj_tptr) & 0x00FF));
break;
link_type = EXTRACT_16BITS(obj_tptr)>>8;
- printf("\n\t Link Type: %s (%u)",
+ ND_PRINT((ndo, "\n\t Link Type: %s (%u)",
tok2str(lmp_sd_service_config_cpsa_link_type_values,
"Unknown", link_type),
- link_type);
+ link_type));
if (link_type == LMP_SD_SERVICE_CONFIG_CPSA_LINK_TYPE_SDH) {
- printf("\n\t Signal Type: %s (%u)",
+ ND_PRINT((ndo, "\n\t Signal Type: %s (%u)",
tok2str(lmp_sd_service_config_cpsa_signal_type_sdh_values,
"Unknown",
EXTRACT_16BITS(obj_tptr) & 0x00FF),
- EXTRACT_16BITS(obj_tptr) & 0x00FF);
+ EXTRACT_16BITS(obj_tptr) & 0x00FF));
}
if (link_type == LMP_SD_SERVICE_CONFIG_CPSA_LINK_TYPE_SONET) {
- printf("\n\t Signal Type: %s (%u)",
+ ND_PRINT((ndo, "\n\t Signal Type: %s (%u)",
tok2str(lmp_sd_service_config_cpsa_signal_type_sonet_values,
"Unknown",
EXTRACT_16BITS(obj_tptr) & 0x00FF),
- EXTRACT_16BITS(obj_tptr) & 0x00FF);
+ EXTRACT_16BITS(obj_tptr) & 0x00FF));
}
- printf("\n\t Transparency: %s",
+ ND_PRINT((ndo, "\n\t Transparency: %s",
bittok2str(lmp_obj_service_config_cpsa_tp_flag_values,
"none",
- EXTRACT_16BITS(obj_tptr+2)>>8));
+ EXTRACT_16BITS(obj_tptr+2)>>8)));
- printf("\n\t Contiguous Concatenation Types: %s",
+ ND_PRINT((ndo, "\n\t Contiguous Concatenation Types: %s",
bittok2str(lmp_obj_service_config_cpsa_cct_flag_values,
"none",
- EXTRACT_16BITS(obj_tptr+2)>>8 & 0x00FF));
+ EXTRACT_16BITS(obj_tptr+2)>>8 & 0x00FF)));
- printf("\n\t Minimum NCC: %u",
- EXTRACT_16BITS(obj_tptr+4));
+ ND_PRINT((ndo, "\n\t Minimum NCC: %u",
+ EXTRACT_16BITS(obj_tptr+4)));
- printf("\n\t Maximum NCC: %u",
- EXTRACT_16BITS(obj_tptr+6));
+ ND_PRINT((ndo, "\n\t Maximum NCC: %u",
+ EXTRACT_16BITS(obj_tptr+6)));
- printf("\n\t Minimum NVC:%u",
- EXTRACT_16BITS(obj_tptr+8));
+ ND_PRINT((ndo, "\n\t Minimum NVC:%u",
+ EXTRACT_16BITS(obj_tptr+8)));
- printf("\n\t Maximum NVC:%u",
- EXTRACT_16BITS(obj_tptr+10));
+ ND_PRINT((ndo, "\n\t Maximum NVC:%u",
+ EXTRACT_16BITS(obj_tptr+10)));
- printf("\n\t Local Interface ID: %s (0x%08x)",
+ ND_PRINT((ndo, "\n\t Local Interface ID: %s (0x%08x)",
ipaddr_string(obj_tptr+12),
- EXTRACT_32BITS(obj_tptr+12));
+ EXTRACT_32BITS(obj_tptr+12)));
break;
case LMP_CTYPE_SERVICE_CONFIG_TRANSPARENCY_TCM:
- printf("\n\t Transparency Flags: %s",
+ ND_PRINT((ndo, "\n\t Transparency Flags: %s",
bittok2str(
lmp_obj_service_config_nsa_transparency_flag_values,
"none",
- EXTRACT_32BITS(obj_tptr)));
+ EXTRACT_32BITS(obj_tptr))));
- printf("\n\t TCM Monitoring Flags: %s",
+ ND_PRINT((ndo, "\n\t TCM Monitoring Flags: %s",
bittok2str(
lmp_obj_service_config_nsa_tcm_flag_values,
"none",
- EXTRACT_16BITS(obj_tptr+6) & 0x00FF));
+ EXTRACT_16BITS(obj_tptr+6) & 0x00FF)));
break;
case LMP_CTYPE_SERVICE_CONFIG_NETWORK_DIVERSITY:
- printf("\n\t Diversity: Flags: %s",
+ ND_PRINT((ndo, "\n\t Diversity: Flags: %s",
bittok2str(
lmp_obj_service_config_nsa_network_diversity_flag_values,
"none",
- EXTRACT_16BITS(obj_tptr+2) & 0x00FF));
+ EXTRACT_16BITS(obj_tptr+2) & 0x00FF)));
break;
default:
break;
default:
- if (vflag <= 1)
- print_unknown_data(gndo,obj_tptr,"\n\t ",obj_tlen);
+ if (ndo->ndo_vflag <= 1)
+ print_unknown_data(ndo,obj_tptr,"\n\t ",obj_tlen);
break;
}
/* do we want to see an additionally hexdump ? */
- if (vflag > 1 || hexdump==TRUE)
- print_unknown_data(gndo,tptr+sizeof(struct lmp_object_header),"\n\t ",
+ if (ndo->ndo_vflag > 1 || hexdump==TRUE)
+ print_unknown_data(ndo,tptr+sizeof(struct lmp_object_header),"\n\t ",
lmp_obj_len-sizeof(struct lmp_object_header));
tptr+=lmp_obj_len;
}
return;
trunc:
- printf("\n\t\t packet exceeded snapshot");
+ ND_PRINT((ndo, "\n\t\t packet exceeded snapshot"));
}
/*
* Local Variables:
* TODO: Among other things to print ok MacIntosh and Vendor values
*/
+#define NETDISSECT_REWORKED
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <string.h>
-#include <stdio.h>
-
#include "interface.h"
#include "addrtoname.h"
#include "extract.h"
#define PRINT_HEX(bytes_len, ptr_data) \
while(bytes_len) \
{ \
- printf("%02X", *ptr_data ); \
+ ND_PRINT((ndo, "%02X", *ptr_data )); \
ptr_data++; \
bytes_len--; \
}
/********************************/
-static void print_attr_string(register u_char *, u_int, u_short );
-static void print_attr_num(register u_char *, u_int, u_short );
-static void print_vendor_attr(register u_char *, u_int, u_short );
-static void print_attr_address(register u_char *, u_int, u_short);
-static void print_attr_time(register u_char *, u_int, u_short);
-static void print_attr_strange(register u_char *, u_int, u_short);
+static void print_attr_string(netdissect_options *, register u_char *, u_int, u_short );
+static void print_attr_num(netdissect_options *, register u_char *, u_int, u_short );
+static void print_vendor_attr(netdissect_options *, register u_char *, u_int, u_short );
+static void print_attr_address(netdissect_options *, register u_char *, u_int, u_short);
+static void print_attr_time(netdissect_options *, register u_char *, u_int, u_short);
+static void print_attr_strange(netdissect_options *, register u_char *, u_int, u_short);
struct radius_hdr { u_int8_t code; /* Radius packet code */
const char **subtypes; /* Standard Values (if any) */
u_char siz_subtypes; /* Size of total standard values */
u_char first_subtype; /* First standard value is 0 or 1 */
- void (*print_func)(register u_char *, u_int, u_short );
+ void (*print_func)(netdissect_options *, register u_char *, u_int, u_short);
} attr_type[]=
{
{ NULL, NULL, 0, 0, NULL },
/* Returns nothing. */
/*****************************/
static void
-print_attr_string(register u_char *data, u_int length, u_short attr_code )
+print_attr_string(netdissect_options *ndo,
+ register u_char *data, u_int length, u_short attr_code)
{
register u_int i;
- TCHECK2(data[0],length);
+ ND_TCHECK2(data[0],length);
switch(attr_code)
{
case TUNNEL_PASS:
if (length < 3)
{
- printf("%s", tstr);
+ ND_PRINT((ndo, "%s", tstr));
return;
}
if (*data && (*data <=0x1F) )
- printf("Tag %u, ",*data);
+ ND_PRINT((ndo, "Tag %u, ",*data));
data++;
length--;
- printf("Salt %u ",EXTRACT_16BITS(data) );
+ ND_PRINT((ndo, "Salt %u ", EXTRACT_16BITS(data)));
data+=2;
length-=2;
break;
{
if (length < 1)
{
- printf("%s", tstr);
+ ND_PRINT((ndo, "%s", tstr));
return;
}
- printf("Tag %u",*data);
+ ND_PRINT((ndo, "Tag %u", *data));
data++;
length--;
}
}
for (i=0; *data && i < length ; i++, data++)
- printf("%c",(*data < 32 || *data > 128) ? '.' : *data );
+ ND_PRINT((ndo, "%c", (*data < 32 || *data > 128) ? '.' : *data));
return;
trunc:
- printf("%s", tstr);
+ ND_PRINT((ndo, "%s", tstr));
}
/*
* print vendor specific attributes
*/
-
static void
-print_vendor_attr(register u_char *data, u_int length, u_short attr_code _U_)
+print_vendor_attr(netdissect_options *ndo,
+ register u_char *data, u_int length, u_short attr_code _U_)
{
u_int idx;
u_int vendor_id;
if (length < 4)
goto trunc;
- TCHECK2(*data, 4);
+ ND_TCHECK2(*data, 4);
vendor_id = EXTRACT_32BITS(data);
data+=4;
length-=4;
- printf("Vendor: %s (%u)",
+ ND_PRINT((ndo, "Vendor: %s (%u)",
tok2str(smi_values,"Unknown",vendor_id),
- vendor_id);
+ vendor_id));
while (length >= 2) {
- TCHECK2(*data, 2);
+ ND_TCHECK2(*data, 2);
vendor_type = *(data);
vendor_length = *(data+1);
if (vendor_length < 2)
{
- printf("\n\t Vendor Attribute: %u, Length: %u (bogus, must be >= 2)",
+ ND_PRINT((ndo, "\n\t Vendor Attribute: %u, Length: %u (bogus, must be >= 2)",
vendor_type,
- vendor_length);
+ vendor_length));
return;
}
if (vendor_length > length)
{
- printf("\n\t Vendor Attribute: %u, Length: %u (bogus, goes past end of vendor-specific attribute)",
+ ND_PRINT((ndo, "\n\t Vendor Attribute: %u, Length: %u (bogus, goes past end of vendor-specific attribute)",
vendor_type,
- vendor_length);
+ vendor_length));
return;
}
data+=2;
vendor_length-=2;
length-=2;
- TCHECK2(*data, vendor_length);
+ ND_TCHECK2(*data, vendor_length);
- printf("\n\t Vendor Attribute: %u, Length: %u, Value: ",
+ ND_PRINT((ndo, "\n\t Vendor Attribute: %u, Length: %u, Value: ",
vendor_type,
- vendor_length);
+ vendor_length));
for (idx = 0; idx < vendor_length ; idx++, data++)
- printf("%c",(*data < 32 || *data > 128) ? '.' : *data );
+ ND_PRINT((ndo, "%c", (*data < 32 || *data > 128) ? '.' : *data));
length-=vendor_length;
}
return;
trunc:
- printf("%s", tstr);
+ ND_PRINT((ndo, "%s", tstr));
}
-
-
/******************************/
/* Print an attribute numeric */
/* value pointed by 'data' */
/* Returns nothing. */
/******************************/
static void
-print_attr_num(register u_char *data, u_int length, u_short attr_code )
+print_attr_num(netdissect_options *ndo,
+ register u_char *data, u_int length, u_short attr_code)
{
u_int8_t tag;
u_int32_t timeout;
if (length != 4)
{
- printf("ERROR: length %u != 4", length);
+ ND_PRINT((ndo, "ERROR: length %u != 4", length));
return;
}
- TCHECK2(data[0],4);
+ ND_TCHECK2(data[0],4);
/* This attribute has standard values */
if (attr_type[attr_code].siz_subtypes)
{
if ( (attr_code == TUNNEL_TYPE) || (attr_code == TUNNEL_MEDIUM) )
{
if (!*data)
- printf("Tag[Unused]");
+ ND_PRINT((ndo, "Tag[Unused]"));
else
- printf("Tag[%d]", *data);
+ ND_PRINT((ndo, "Tag[%d]", *data));
data++;
data_value = EXTRACT_24BITS(data);
}
if ( data_value <= (u_int32_t)(attr_type[attr_code].siz_subtypes - 1 +
attr_type[attr_code].first_subtype) &&
data_value >= attr_type[attr_code].first_subtype )
- printf("%s",table[data_value]);
+ ND_PRINT((ndo, "%s", table[data_value]));
else
- printf("#%u",data_value);
+ ND_PRINT((ndo, "#%u", data_value));
}
else
{
{
case FRM_IPX:
if (EXTRACT_32BITS( data) == 0xFFFFFFFE )
- printf("NAS Select");
+ ND_PRINT((ndo, "NAS Select"));
else
- printf("%d",EXTRACT_32BITS( data) );
+ ND_PRINT((ndo, "%d", EXTRACT_32BITS(data)));
break;
case SESSION_TIMEOUT:
case ACCT_INT_INTERVAL:
timeout = EXTRACT_32BITS( data);
if ( timeout < 60 )
- printf( "%02d secs", timeout);
+ ND_PRINT((ndo, "%02d secs", timeout));
else
{
if ( timeout < 3600 )
- printf( "%02d:%02d min",
- timeout / 60, timeout % 60);
+ ND_PRINT((ndo, "%02d:%02d min",
+ timeout / 60, timeout % 60));
else
- printf( "%02d:%02d:%02d hours",
+ ND_PRINT((ndo, "%02d:%02d:%02d hours",
timeout / 3600, (timeout % 3600) / 60,
- timeout % 60);
+ timeout % 60));
}
break;
case FRM_ATALK_LINK:
if (EXTRACT_32BITS(data) )
- printf("%d",EXTRACT_32BITS(data) );
+ ND_PRINT((ndo, "%d", EXTRACT_32BITS(data)));
else
- printf("Unnumbered" );
+ ND_PRINT((ndo, "Unnumbered"));
break;
case FRM_ATALK_NETWORK:
if (EXTRACT_32BITS(data) )
- printf("%d",EXTRACT_32BITS(data) );
+ ND_PRINT((ndo, "%d", EXTRACT_32BITS(data)));
else
- printf("NAS assigned" );
+ ND_PRINT((ndo, "NAS assigned"));
break;
case TUNNEL_PREFERENCE:
tag = *data;
data++;
if (tag == 0)
- printf("Tag (Unused) %d",EXTRACT_24BITS(data) );
+ ND_PRINT((ndo, "Tag (Unused) %d", EXTRACT_24BITS(data)));
else
- printf("Tag (%d) %d", tag, EXTRACT_24BITS(data) );
+ ND_PRINT((ndo, "Tag (%d) %d", tag, EXTRACT_24BITS(data)));
break;
default:
- printf("%d",EXTRACT_32BITS( data) );
+ ND_PRINT((ndo, "%d", EXTRACT_32BITS(data)));
break;
} /* switch */
return;
trunc:
- printf("%s", tstr);
+ ND_PRINT((ndo, "%s", tstr));
}
-
/*****************************/
/* Print an attribute IPv4 */
/* address value pointed by */
/* Returns nothing. */
/*****************************/
static void
-print_attr_address(register u_char *data, u_int length, u_short attr_code )
+print_attr_address(netdissect_options *ndo,
+ register u_char *data, u_int length, u_short attr_code)
{
if (length != 4)
{
- printf("ERROR: length %u != 4", length);
+ ND_PRINT((ndo, "ERROR: length %u != 4", length));
return;
}
- TCHECK2(data[0],4);
+ ND_TCHECK2(data[0],4);
switch(attr_code)
{
case FRM_IPADDR:
case LOG_IPHOST:
if (EXTRACT_32BITS(data) == 0xFFFFFFFF )
- printf("User Selected");
+ ND_PRINT((ndo, "User Selected"));
else
if (EXTRACT_32BITS(data) == 0xFFFFFFFE )
- printf("NAS Select");
+ ND_PRINT((ndo, "NAS Select"));
else
- printf("%s",ipaddr_string(data));
+ ND_PRINT((ndo, "%s",ipaddr_string(data)));
break;
default:
- printf("%s",ipaddr_string(data) );
+ ND_PRINT((ndo, "%s", ipaddr_string(data)));
break;
}
return;
trunc:
- printf("%s", tstr);
+ ND_PRINT((ndo, "%s", tstr));
}
-
/*************************************/
/* Print an attribute of 'secs since */
/* January 1, 1970 00:00 UTC' value */
/*************************************/
/* Returns nothing. */
/*************************************/
-static void print_attr_time(register u_char *data, u_int length, u_short attr_code _U_)
+static void
+print_attr_time(netdissect_options *ndo,
+ register u_char *data, u_int length, u_short attr_code _U_)
{
time_t attr_time;
char string[26];
if (length != 4)
{
- printf("ERROR: length %u != 4", length);
+ ND_PRINT((ndo, "ERROR: length %u != 4", length));
return;
}
- TCHECK2(data[0],4);
+ ND_TCHECK2(data[0],4);
attr_time = EXTRACT_32BITS(data);
strlcpy(string, ctime(&attr_time), sizeof(string));
/* Get rid of the newline */
string[24] = '\0';
- printf("%.24s", string);
+ ND_PRINT((ndo, "%.24s", string));
return;
trunc:
- printf("%s", tstr);
+ ND_PRINT((ndo, "%s", tstr));
}
-
/***********************************/
/* Print an attribute of 'strange' */
/* data format pointed by 'data' */
/***********************************/
/* Returns nothing. */
/***********************************/
-static void print_attr_strange(register u_char *data, u_int length, u_short attr_code)
+static void
+print_attr_strange(netdissect_options *ndo,
+ register u_char *data, u_int length, u_short attr_code)
{
u_short len_data;
case ARAP_PASS:
if (length != 16)
{
- printf("ERROR: length %u != 16", length);
+ ND_PRINT((ndo, "ERROR: length %u != 16", length));
return;
}
- printf("User_challenge (");
- TCHECK2(data[0],8);
+ ND_PRINT((ndo, "User_challenge ("));
+ ND_TCHECK2(data[0],8);
len_data = 8;
PRINT_HEX(len_data, data);
- printf(") User_resp(");
- TCHECK2(data[0],8);
+ ND_PRINT((ndo, ") User_resp("));
+ ND_TCHECK2(data[0],8);
len_data = 8;
PRINT_HEX(len_data, data);
- printf(")");
+ ND_PRINT((ndo, ")"));
break;
case ARAP_FEATURES:
if (length != 14)
{
- printf("ERROR: length %u != 14", length);
+ ND_PRINT((ndo, "ERROR: length %u != 14", length));
return;
}
- TCHECK2(data[0],1);
+ ND_TCHECK2(data[0],1);
if (*data)
- printf("User can change password");
+ ND_PRINT((ndo, "User can change password"));
else
- printf("User cannot change password");
+ ND_PRINT((ndo, "User cannot change password"));
data++;
- TCHECK2(data[0],1);
- printf(", Min password length: %d",*data);
+ ND_TCHECK2(data[0],1);
+ ND_PRINT((ndo, ", Min password length: %d", *data));
data++;
- printf(", created at: ");
- TCHECK2(data[0],4);
+ ND_PRINT((ndo, ", created at: "));
+ ND_TCHECK2(data[0],4);
len_data = 4;
PRINT_HEX(len_data, data);
- printf(", expires in: ");
- TCHECK2(data[0],4);
+ ND_PRINT((ndo, ", expires in: "));
+ ND_TCHECK2(data[0],4);
len_data = 4;
PRINT_HEX(len_data, data);
- printf(", Current Time: ");
- TCHECK2(data[0],4);
+ ND_PRINT((ndo, ", Current Time: "));
+ ND_TCHECK2(data[0],4);
len_data = 4;
PRINT_HEX(len_data, data);
break;
case ARAP_CHALLENGE_RESP:
if (length < 8)
{
- printf("ERROR: length %u != 8", length);
+ ND_PRINT((ndo, "ERROR: length %u != 8", length));
return;
}
- TCHECK2(data[0],8);
+ ND_TCHECK2(data[0],8);
len_data = 8;
PRINT_HEX(len_data, data);
break;
return;
trunc:
- printf("%s", tstr);
+ ND_PRINT((ndo, "%s", tstr));
}
-
-
static void
-radius_attrs_print(register const u_char *attr, u_int length)
+radius_attrs_print(netdissect_options *ndo,
+ register const u_char *attr, u_int length)
{
register const struct radius_attr *rad_attr = (struct radius_attr *)attr;
const char *attr_string;
{
if (length < 2)
goto trunc;
- TCHECK(*rad_attr);
+ ND_TCHECK(*rad_attr);
if (rad_attr->type > 0 && rad_attr->type < TAM_SIZE(attr_type))
attr_string = attr_type[rad_attr->type].name;
attr_string = "Unknown";
if (rad_attr->len < 2)
{
- printf("\n\t %s Attribute (%u), length: %u (bogus, must be >= 2)",
+ ND_PRINT((ndo, "\n\t %s Attribute (%u), length: %u (bogus, must be >= 2)",
attr_string,
rad_attr->type,
- rad_attr->len);
+ rad_attr->len));
return;
}
if (rad_attr->len > length)
{
- printf("\n\t %s Attribute (%u), length: %u (bogus, goes past end of packet)",
+ ND_PRINT((ndo, "\n\t %s Attribute (%u), length: %u (bogus, goes past end of packet)",
attr_string,
rad_attr->type,
- rad_attr->len);
+ rad_attr->len));
return;
}
- printf("\n\t %s Attribute (%u), length: %u, Value: ",
+ ND_PRINT((ndo, "\n\t %s Attribute (%u), length: %u, Value: ",
attr_string,
rad_attr->type,
- rad_attr->len);
+ rad_attr->len));
if (rad_attr->type < TAM_SIZE(attr_type))
{
{
if ( attr_type[rad_attr->type].print_func )
(*attr_type[rad_attr->type].print_func)(
- ((u_char *)(rad_attr+1)),
+ ndo, ((u_char *)(rad_attr+1)),
rad_attr->len - 2, rad_attr->type);
}
}
/* do we also want to see a hex dump ? */
- if (vflag> 1)
- print_unknown_data(gndo,(u_char *)rad_attr+2,"\n\t ",(rad_attr->len)-2);
+ if (ndo->ndo_vflag> 1)
+ print_unknown_data(ndo, (u_char *)rad_attr+2, "\n\t ", (rad_attr->len)-2);
length-=(rad_attr->len);
rad_attr = (struct radius_attr *)( ((char *)(rad_attr))+rad_attr->len);
return;
trunc:
- printf("%s", tstr);
+ ND_PRINT((ndo, "%s", tstr));
}
-
void
-radius_print(const u_char *dat, u_int length)
+radius_print(netdissect_options *ndo,
+ const u_char *dat, u_int length)
{
register const struct radius_hdr *rad;
u_int len, auth_idx;
- TCHECK2(*dat, MIN_RADIUS_LEN);
+ ND_TCHECK2(*dat, MIN_RADIUS_LEN);
rad = (struct radius_hdr *)dat;
len = EXTRACT_16BITS(&rad->len);
if (len < MIN_RADIUS_LEN)
{
- printf("%s", tstr);
+ ND_PRINT((ndo, "%s", tstr));
return;
}
if (len > length)
len = length;
- if (vflag < 1) {
- printf("RADIUS, %s (%u), id: 0x%02x length: %u",
+ if (ndo->ndo_vflag < 1) {
+ ND_PRINT((ndo, "RADIUS, %s (%u), id: 0x%02x length: %u",
tok2str(radius_command_values,"Unknown Command",rad->code),
rad->code,
rad->id,
- len);
+ len));
return;
}
else {
- printf("RADIUS, length: %u\n\t%s (%u), id: 0x%02x, Authenticator: ",
+ ND_PRINT((ndo, "RADIUS, length: %u\n\t%s (%u), id: 0x%02x, Authenticator: ",
len,
tok2str(radius_command_values,"Unknown Command",rad->code),
rad->code,
- rad->id);
+ rad->id));
for(auth_idx=0; auth_idx < 16; auth_idx++)
- printf("%02x", rad->auth[auth_idx] );
+ ND_PRINT((ndo, "%02x", rad->auth[auth_idx]));
}
if (len > MIN_RADIUS_LEN)
- radius_attrs_print( dat + MIN_RADIUS_LEN, len - MIN_RADIUS_LEN);
+ radius_attrs_print(ndo, dat + MIN_RADIUS_LEN, len - MIN_RADIUS_LEN);
return;
trunc:
- printf("%s", tstr);
+ ND_PRINT((ndo, "%s", tstr));
}
case PT_RADIUS:
udpipaddr_print(ndo, ip, sport, dport);
- radius_print(cp, length);
+ radius_print(ndo, cp, length);
break;
case PT_VXLAN:
break;
case PT_LMP:
udpipaddr_print(ndo, ip, sport, dport);
- lmp_print(cp, length);
+ lmp_print(ndo, cp, length);
break;
}
return;
ISPORT(RADIUS_NEW_PORT) ||
ISPORT(RADIUS_ACCOUNTING_PORT) ||
ISPORT(RADIUS_NEW_ACCOUNTING_PORT) )
- radius_print((const u_char *)(up+1), length);
+ radius_print(ndo, (const u_char *)(up+1), length);
else if (dport == HSRP_PORT)
hsrp_print(ndo, (const u_char *)(up + 1), length);
else if (ISPORT(LWRES_PORT))
dport == BFD_ECHO_PORT )
bfd_print(ndo, (const u_char *)(up+1), length, dport);
else if (ISPORT(LMP_PORT))
- lmp_print((const u_char *)(up + 1), length);
+ lmp_print(ndo, (const u_char *)(up + 1), length);
else if (ISPORT(VQP_PORT))
vqp_print(ndo, (const u_char *)(up + 1), length);
else if (ISPORT(SFLOW_PORT))
#ifdef DLT_LTALK
{ ltalk_if_print, DLT_LTALK },
#endif
-#ifdef DLT_FR
- { fr_if_print, DLT_FR },
-#endif
-#ifdef DLT_FRELAY
- { fr_if_print, DLT_FRELAY },
-#endif
#ifdef DLT_SUNATM
{ sunatm_if_print, DLT_SUNATM },
#endif
#endif
#ifdef DLT_JUNIPER_CHDLC
{ juniper_chdlc_print, DLT_JUNIPER_CHDLC },
-#endif
-#ifdef DLT_MFR
- { mfr_if_print, DLT_MFR },
#endif
{ NULL, 0 },
};
{ fddi_if_print, DLT_FDDI },
#ifdef DLT_LINUX_SLL
{ sll_if_print, DLT_LINUX_SLL },
+#endif
+#ifdef DLT_FR
+ { fr_if_print, DLT_FR },
+#endif
+#ifdef DLT_FRELAY
+ { fr_if_print, DLT_FRELAY },
+#endif
+#ifdef DLT_MFR
+ { mfr_if_print, DLT_MFR },
#endif
{ NULL, 0 },
};