* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * @(#) $Header: /tcpdump/master/tcpdump/interface.h,v 1.258 2005-07-10 14:41:35 hannes Exp $ (LBL)
+ * @(#) $Header: /tcpdump/master/tcpdump/interface.h,v 1.259 2005-07-20 22:12:39 hannes Exp $ (LBL)
*/
#ifndef tcpdump_interface_h
extern u_int fddi_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 fr_print(register const u_char *, u_int);
+extern u_int mfr_print(register const u_char *, u_int);
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 *,
const u_char *);
#ifndef lint
static const char rcsid[] _U_ =
- "@(#)$Header: /tcpdump/master/tcpdump/print-fr.c,v 1.37 2005-07-07 01:22:18 guy Exp $ (LBL)";
+ "@(#)$Header: /tcpdump/master/tcpdump/print-fr.c,v 1.38 2005-07-20 22:12:38 hannes Exp $ (LBL)";
#endif
#ifdef HAVE_CONFIG_H
}
+#define MFR_B_BIT 0x80
+#define MFR_E_BIT 0x40
+#define MFR_C_BIT 0x20
+#define MFR_BEC_MASK (MFR_B_BIT | MFR_E_BIT | MFR_C_BIT)
+#define MFR_CTRL_FRAME (MFR_B_BIT | MFR_E_BIT | MFR_C_BIT)
+#define MFR_FRAG_FRAME (MFR_B_BIT | MFR_E_BIT )
+
+#define MFR_CTRL_MSG_ADD_LINK 1
+#define MFR_CTRL_MSG_ADD_LINK_ACK 2
+#define MFR_CTRL_MSG_ADD_LINK_REJ 3
+#define MFR_CTRL_MSG_HELLO 4
+#define MFR_CTRL_MSG_HELLO_ACK 5
+#define MFR_CTRL_MSG_REMOVE_LINK 6
+#define MFR_CTRL_MSG_REMOVE_LINK_ACK 7
+
+struct tok mfr_ctrl_msg_values[] = {
+ { MFR_CTRL_MSG_ADD_LINK, "Add Link" },
+ { MFR_CTRL_MSG_ADD_LINK_ACK, "Add Link ACK" },
+ { MFR_CTRL_MSG_ADD_LINK_REJ, "Add Link Reject" },
+ { MFR_CTRL_MSG_HELLO, "Hello" },
+ { MFR_CTRL_MSG_HELLO_ACK, "Hello ACK" },
+ { MFR_CTRL_MSG_REMOVE_LINK, "Remove Link" },
+ { MFR_CTRL_MSG_REMOVE_LINK_ACK, "Remove Link ACK" },
+ { 0, NULL }
+};
+
+u_int
+mfr_print(register const u_char *p, u_int length)
+{
+ u_int hdr_len = 0;
+ u_int16_t sequence_num;
+
+/*
+ * FRF.16 Link Integrity Control Frame
+ *
+ * 7 6 5 4 3 2 1 0
+ * +----+----+----+----+----+----+----+----+
+ * | B | E | C=1| 0 0 0 0 | EA |
+ * +----+----+----+----+----+----+----+----+
+ * | 0 0 0 0 0 0 0 0 |
+ * +----+----+----+----+----+----+----+----+
+ * | message type |
+ * +----+----+----+----+----+----+----+----+
+ */
+
+ if ((p[0] & MFR_BEC_MASK) == MFR_CTRL_FRAME && p[1] == 0) {
+ printf("FRF.16 Control, %s, length %u",
+ tok2str(mfr_ctrl_msg_values,"Unknown Message (0x%02x)",p[2]),
+ length);
+ switch (p[2]) {
+ /* no decoder yet - so fall through */
+ case MFR_CTRL_MSG_ADD_LINK:
+ case MFR_CTRL_MSG_ADD_LINK_ACK:
+ case MFR_CTRL_MSG_ADD_LINK_REJ:
+ case MFR_CTRL_MSG_HELLO:
+ case MFR_CTRL_MSG_HELLO_ACK:
+ case MFR_CTRL_MSG_REMOVE_LINK:
+ case MFR_CTRL_MSG_REMOVE_LINK_ACK:
+ default:
+ if (vflag >= 1)
+ print_unknown_data(p+3,"\n\t",length-3);
+ break;
+ }
+ return hdr_len;
+ }
+/*
+ * FRF.16 Fragmentation Frame
+ *
+ * 7 6 5 4 3 2 1 0
+ * +----+----+----+----+----+----+----+----+
+ * | B | E | C=0|seq. (high 4 bits) | EA |
+ * +----+----+----+----+----+----+----+----+
+ * | sequence (low 8 bits) |
+ * +----+----+----+----+----+----+----+----+
+ * | DLCI (6 bits) | CR | EA |
+ * +----+----+----+----+----+----+----+----+
+ * | DLCI (4 bits) |FECN|BECN| DE | EA |
+ * +----+----+----+----+----+----+----+----+
+ */
+
+ if ((p[0] & MFR_BEC_MASK) == MFR_FRAG_FRAME) {
+ sequence_num = (p[0]&0x1e)<<7 | p[1];
+ if (eflag)
+ printf("FRF.16 Frag, seq %u, ", sequence_num);
+ hdr_len = 2;
+ fr_print(p+hdr_len,length-hdr_len);
+ }
+
+ return hdr_len;
+}
+
/* an NLPID of 0xb1 indicates a 2-byte
* FRF.15 header
*
int olen;
int is_ansi = 0;
u_int codeset;
+ u_int ie_is_known = 0;
if (length < 9) { /* shortest: Q.933a LINK VERIFY */
printf("[|q.933]");
tok2str(fr_q933_ie_codesets[codeset],"unknown",ie_p->ie_id),
ie_p->ie_id,
ie_p->ie_len);
-
- if (!fr_q933_print_ie_codeset[codeset] ||
- (*fr_q933_print_ie_codeset[codeset])(ie_p, ptemp)) {
- if (vflag <= 1)
- print_unknown_data(ptemp+2,"\n\t",ie_p->ie_len);
- }
+
+ if (fr_q933_print_ie_codeset[codeset] != NULL)
+ ie_is_known = fr_q933_print_ie_codeset[codeset](ie_p, ptemp);
+
+ if (vflag >= 1 && !ie_is_known)
+ print_unknown_data(ptemp+2,"\n\t",ie_p->ie_len);
/* do we want to see a hexdump of the IE ? */
- if (vflag> 1)
+ if (vflag> 1 && ie_is_known)
print_unknown_data(ptemp+2,"\n\t ",ie_p->ie_len);
length = length - ie_p->ie_len - 2;