aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>1999-01-05 08:48:40 +0000
committerGuy Harris <guy@alum.mit.edu>1999-01-05 08:48:40 +0000
commitbc21c7a2c7fa098c3ec318bc732b990425476edb (patch)
treea16a17e83782cbc4e732fb7a1306cdc864707aaf
parente808e2a73344f8a9beeae76bcae728b429f41f4b (diff)
Decode the various flag fields in resource records in NBNS replies.
svn path=/trunk/; revision=159
-rw-r--r--packet-nbns.c301
-rw-r--r--packet.h4
2 files changed, 218 insertions, 87 deletions
diff --git a/packet-nbns.c b/packet-nbns.c
index e6ca278528..5fee2f077a 100644
--- a/packet-nbns.c
+++ b/packet-nbns.c
@@ -3,7 +3,7 @@
* Gilbert Ramirez <gram@verdict.uthscsa.edu>
* Much stuff added by Guy Harris <guy@netapp.com>
*
- * $Id: packet-nbns.c,v 1.11 1999/01/04 09:13:46 guy Exp $
+ * $Id: packet-nbns.c,v 1.12 1999/01/05 08:48:39 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -116,6 +116,45 @@ struct nbdgm_header {
#define RCODE_ACTIVE (6<<0)
#define RCODE_CONFLICT (7<<0)
+/* Values for the "NB_FLAGS" field of RR data. From RFC 1001 and 1002,
+ * except for NB_FLAGS_ONT_H_NODE, which was discovered by looking at
+ * packet traces. */
+#define NB_FLAGS_ONT (3<<(15-2)) /* bits for node type */
+#define NB_FLAGS_ONT_B_NODE (0<<(15-2)) /* B-mode node */
+#define NB_FLAGS_ONT_P_NODE (1<<(15-2)) /* P-mode node */
+#define NB_FLAGS_ONT_M_NODE (2<<(15-2)) /* M-mode node */
+#define NB_FLAGS_ONT_H_NODE (3<<(15-2)) /* H-mode node */
+
+#define NB_FLAGS_G (1<<(15-0)) /* group name */
+
+/* Values for the "NAME_FLAGS" field of a NODE_NAME entry in T_NBSTAT
+ * RR data. From RFC 1001 and 1002, except for NAME_FLAGS_ONT_H_NODE,
+ * which was discovered by looking at packet traces. */
+#define NAME_FLAGS_PRM (1<<(15-6)) /* name is permanent node name */
+
+#define NAME_FLAGS_ACT (1<<(15-5)) /* name is active */
+
+#define NAME_FLAGS_CNF (1<<(15-4)) /* name is in conflict */
+
+#define NAME_FLAGS_DRG (1<<(15-3)) /* name is being deregistered */
+
+#define NAME_FLAGS_ONT (3<<(15-2)) /* bits for node type */
+#define NAME_FLAGS_ONT_B_NODE (0<<(15-2)) /* B-mode node */
+#define NAME_FLAGS_ONT_P_NODE (1<<(15-2)) /* P-mode node */
+#define NAME_FLAGS_ONT_M_NODE (2<<(15-2)) /* M-mode node */
+
+#define NAME_FLAGS_G (1<<(15-0)) /* group name */
+
+static const value_string opcode_vals[] = {
+ { OPCODE_QUERY, "Name query" },
+ { OPCODE_REGISTRATION, "Registration" },
+ { OPCODE_RELEASE, "Release" },
+ { OPCODE_WACK, "Wait for acknowledgment" },
+ { OPCODE_REFRESH, "Refresh" },
+ { OPCODE_REFRESHALT, "Refresh (alternate opcode)" },
+ { OPCODE_MHREGISTRATION, "Multi-homed registration" },
+ { 0, NULL }
+};
static char *
nbns_type_name (int type)
@@ -307,6 +346,176 @@ dissect_nbns_query(const u_char *nbns_data_ptr, const u_char *pd, int offset,
return dptr - data_start;
}
+static void
+nbns_add_nbns_flags(GtkWidget *nbns_tree, int offset, u_short flags,
+ int is_wack)
+{
+ char buf[128+1];
+ GtkWidget *field_tree, *tf;
+ static const value_string rcode_vals[] = {
+ { RCODE_NOERROR, "No error" },
+ { RCODE_FMTERROR, "Format error" },
+ { RCODE_SERVFAIL, "Server failure" },
+ { RCODE_NAMEERROR, "Name error" },
+ { RCODE_NOTIMPL, "Not implemented" },
+ { RCODE_REFUSED, "Refused" },
+ { RCODE_ACTIVE, "Name is active" },
+ { RCODE_CONFLICT, "Name is in conflict" },
+ { 0, NULL }
+ };
+
+ strcpy(buf, val_to_str(flags & F_OPCODE, opcode_vals,
+ "Unknown (%x)"));
+ if (flags & F_RESPONSE && !is_wack) {
+ strcat(buf, " response");
+ strcat(buf, ", ");
+ strcat(buf, val_to_str(flags & F_RCODE, rcode_vals,
+ "Unknown error (%x)"));
+ }
+ tf = add_item_to_tree(nbns_tree, offset, 2,
+ "Flags: 0x%04x (%s)", flags, buf);
+ field_tree = gtk_tree_new();
+ add_subtree(tf, field_tree, ETT_NBNS_FLAGS);
+ add_item_to_tree(field_tree, offset, 2, "%s",
+ decode_boolean_bitfield(flags, F_RESPONSE,
+ 2*8, "Response", "Query"));
+ add_item_to_tree(field_tree, offset, 2, "%s",
+ decode_enumerated_bitfield(flags, F_OPCODE,
+ 2*8, opcode_vals, "%s"));
+ if (flags & F_RESPONSE) {
+ add_item_to_tree(field_tree, offset, 2,
+ "%s",
+ decode_boolean_bitfield(flags, F_AUTHORITATIVE,
+ 2*8,
+ "Server is an authority for domain",
+ "Server isn't an authority for domain"));
+ }
+ add_item_to_tree(field_tree, offset, 2, "%s",
+ decode_boolean_bitfield(flags, F_TRUNCATED,
+ 2*8,
+ "Message is truncated",
+ "Message is not truncated"));
+ add_item_to_tree(field_tree, offset, 2, "%s",
+ decode_boolean_bitfield(flags, F_RECDESIRED,
+ 2*8,
+ "Do query recursively",
+ "Don't do query recursively"));
+ if (flags & F_RESPONSE) {
+ add_item_to_tree(field_tree, offset, 2,
+ "%s",
+ decode_boolean_bitfield(flags, F_RECAVAIL,
+ 2*8,
+ "Server can do recursive queries",
+ "Server can't do recursive queries"));
+ }
+ add_item_to_tree(field_tree, offset, 2, "%s",
+ decode_boolean_bitfield(flags, F_BROADCAST,
+ 2*8,
+ "Broadcast packet",
+ "Not a broadcast packet"));
+ if (flags & F_RESPONSE && !is_wack) {
+ add_item_to_tree(field_tree, offset, 2,
+ "%s",
+ decode_enumerated_bitfield(flags, F_RCODE,
+ 2*8,
+ rcode_vals, "%s"));
+ }
+}
+
+static void
+nbns_add_nb_flags(GtkWidget *rr_tree, int offset, u_short flags)
+{
+ char buf[128+1];
+ GtkWidget *field_tree, *tf;
+ static const value_string nb_flags_ont_vals[] = {
+ { NB_FLAGS_ONT_B_NODE, "B-node" },
+ { NB_FLAGS_ONT_P_NODE, "P-node" },
+ { NB_FLAGS_ONT_M_NODE, "M-node" },
+ { NB_FLAGS_ONT_H_NODE, "H-node" },
+ { 0, NULL }
+ };
+
+ strcpy(buf, val_to_str(flags & NB_FLAGS_ONT, nb_flags_ont_vals,
+ "Unknown"));
+ strcat(buf, ", ");
+ if (flags & NB_FLAGS_G)
+ strcat(buf, "group");
+ else
+ strcat(buf, "unique");
+ tf = add_item_to_tree(rr_tree, offset, 2, "Flags: 0x%x (%s)", flags,
+ buf);
+ field_tree = gtk_tree_new();
+ add_subtree(tf, field_tree, ETT_NBNS_NB_FLAGS);
+ add_item_to_tree(field_tree, offset, 2, "%s",
+ decode_boolean_bitfield(flags, NB_FLAGS_G,
+ 2*8,
+ "Group name",
+ "Unique name"));
+ add_item_to_tree(field_tree, offset, 2, "%s",
+ decode_enumerated_bitfield(flags, NB_FLAGS_ONT,
+ 2*8, nb_flags_ont_vals, "%s"));
+}
+
+static void
+nbns_add_name_flags(GtkWidget *rr_tree, int offset, u_short flags)
+{
+ char buf[128+1];
+ GtkWidget *field_tree, *tf;
+ static const value_string name_flags_ont_vals[] = {
+ { NAME_FLAGS_ONT_B_NODE, "B-node" },
+ { NAME_FLAGS_ONT_P_NODE, "P-node" },
+ { NAME_FLAGS_ONT_M_NODE, "M-node" },
+ { 0, NULL }
+ };
+
+ strcpy(buf, val_to_str(flags & NAME_FLAGS_ONT, name_flags_ont_vals,
+ "Unknown"));
+ strcat(buf, ", ");
+ if (flags & NAME_FLAGS_G)
+ strcat(buf, "group");
+ else
+ strcat(buf, "unique");
+ if (flags & NAME_FLAGS_DRG)
+ strcat(buf, ", being deregistered");
+ if (flags & NAME_FLAGS_CNF)
+ strcat(buf, ", in conflict");
+ if (flags & NAME_FLAGS_ACT)
+ strcat(buf, ", active");
+ if (flags & NAME_FLAGS_PRM)
+ strcat(buf, ", permanent node name");
+ tf = add_item_to_tree(rr_tree, offset, 2, "Name flags: 0x%x (%s)",
+ flags, buf);
+ field_tree = gtk_tree_new();
+ add_subtree(tf, field_tree, ETT_NBNS_NAME_FLAGS);
+ add_item_to_tree(field_tree, offset, 2, "%s",
+ decode_boolean_bitfield(flags, NAME_FLAGS_G,
+ 2*8,
+ "Group name",
+ "Unique name"));
+ add_item_to_tree(field_tree, offset, 2, "%s",
+ decode_enumerated_bitfield(flags, NAME_FLAGS_ONT,
+ 2*8, name_flags_ont_vals, "%s"));
+ add_item_to_tree(field_tree, offset, 2, "%s",
+ decode_boolean_bitfield(flags, NAME_FLAGS_DRG,
+ 2*8,
+ "Name is being deregistered",
+ "Name is not being deregistered"));
+ add_item_to_tree(field_tree, offset, 2, "%s",
+ decode_boolean_bitfield(flags, NAME_FLAGS_CNF,
+ 2*8,
+ "Name is in conflict",
+ "Name is not in conflict"));
+ add_item_to_tree(field_tree, offset, 2, "%s",
+ decode_boolean_bitfield(flags, NAME_FLAGS_ACT,
+ 2*8,
+ "Name is active",
+ "Name is not active"));
+ add_item_to_tree(field_tree, offset, 2, "%s",
+ decode_boolean_bitfield(flags, NAME_FLAGS_PRM,
+ 2*8,
+ "Permanent node name",
+ "Not permanent node name"));
+}
static int
dissect_nbns_answer(const u_char *nbns_data_ptr, const u_char *pd, int offset,
@@ -362,8 +571,7 @@ dissect_nbns_answer(const u_char *nbns_data_ptr, const u_char *pd, int offset,
}
flags = pntohs(dptr);
dptr += 2;
- add_item_to_tree(rr_tree, offset, 2,
- "Flags: 0x%x", flags);
+ nbns_add_nbns_flags(rr_tree, offset, flags, 1);
offset += 2;
data_len -= 2;
} else {
@@ -374,8 +582,7 @@ dissect_nbns_answer(const u_char *nbns_data_ptr, const u_char *pd, int offset,
}
flags = pntohs(dptr);
dptr += 2;
- add_item_to_tree(rr_tree, offset, 2,
- "Flags: 0x%x", flags);
+ nbns_add_nb_flags(rr_tree, offset, flags);
offset += 2;
data_len -= 2;
@@ -439,8 +646,7 @@ dissect_nbns_answer(const u_char *nbns_data_ptr, const u_char *pd, int offset,
}
name_flags = pntohs(dptr);
dptr += 2;
- add_item_to_tree(rr_tree, offset, 2,
- "Name flags: 0x%x", name_flags);
+ nbns_add_name_flags(rr_tree, offset, name_flags);
offset += 2;
data_len -= 2;
@@ -703,31 +909,9 @@ void
dissect_nbns(const u_char *pd, int offset, frame_data *fd, GtkTree *tree)
{
const u_char *nbns_data_ptr;
- GtkWidget *nbns_tree, *ti, *field_tree, *tf;
+ GtkWidget *nbns_tree, *ti;
guint16 id, flags, quest, ans, auth, add;
- char buf[128+1];
int cur_off;
- static const value_string opcode_vals[] = {
- { OPCODE_QUERY, "Name query" },
- { OPCODE_REGISTRATION, "Registration" },
- { OPCODE_RELEASE, "Release" },
- { OPCODE_WACK, "Wait for acknowledgment" },
- { OPCODE_REFRESH, "Refresh" },
- { OPCODE_REFRESHALT, "Refresh (alternate opcode)" },
- { OPCODE_MHREGISTRATION, "Multi-homed registration" },
- { 0, NULL }
- };
- static const value_string rcode_vals[] = {
- { RCODE_NOERROR, "No error" },
- { RCODE_FMTERROR, "Format error" },
- { RCODE_SERVFAIL, "Server failure" },
- { RCODE_NAMEERROR, "Name error" },
- { RCODE_NOTIMPL, "Not implemented" },
- { RCODE_REFUSED, "Refused" },
- { RCODE_ACTIVE, "Name is active" },
- { RCODE_CONFLICT, "Name is in conflict" },
- { 0, NULL }
- };
nbns_data_ptr = &pd[offset];
@@ -757,62 +941,7 @@ dissect_nbns(const u_char *pd, int offset, frame_data *fd, GtkTree *tree)
add_item_to_tree(nbns_tree, offset + NBNS_ID, 2,
"Transaction ID: 0x%04X", id);
- strcpy(buf, val_to_str(flags & F_OPCODE, opcode_vals,
- "Unknown (%x)"));
- if (flags & F_RESPONSE) {
- strcat(buf, " response");
- strcat(buf, ", ");
- strcat(buf, val_to_str(flags & F_RCODE, rcode_vals,
- "Unknown error (%x)"));
- }
- tf = add_item_to_tree(nbns_tree, offset + NBNS_FLAGS, 2,
- "Flags: 0x%04x (%s)", flags, buf);
- field_tree = gtk_tree_new();
- add_subtree(tf, field_tree, ETT_NBNS_FLAGS);
- add_item_to_tree(field_tree, offset + NBNS_FLAGS, 2, "%s",
- decode_boolean_bitfield(flags, F_RESPONSE,
- 2*8, "Response", "Query"));
- add_item_to_tree(field_tree, offset + NBNS_FLAGS, 2, "%s",
- decode_enumerated_bitfield(flags, F_OPCODE,
- 2*8, opcode_vals, "%s"));
- if (flags & F_RESPONSE) {
- add_item_to_tree(field_tree, offset + NBNS_FLAGS, 2,
- "%s",
- decode_boolean_bitfield(flags, F_AUTHORITATIVE,
- 2*8,
- "Server is an authority for domain",
- "Server isn't an authority for domain"));
- }
- add_item_to_tree(field_tree, offset + NBNS_FLAGS, 2, "%s",
- decode_boolean_bitfield(flags, F_TRUNCATED,
- 2*8,
- "Message is truncated",
- "Message is not truncated"));
- add_item_to_tree(field_tree, offset + NBNS_FLAGS, 2, "%s",
- decode_boolean_bitfield(flags, F_RECDESIRED,
- 2*8,
- "Do query recursively",
- "Don't do query recursively"));
- if (flags & F_RESPONSE) {
- add_item_to_tree(field_tree, offset + NBNS_FLAGS, 2,
- "%s",
- decode_boolean_bitfield(flags, F_RECAVAIL,
- 2*8,
- "Server can do recursive queries",
- "Server can't do recursive queries"));
- }
- add_item_to_tree(field_tree, offset + NBNS_FLAGS, 2, "%s",
- decode_boolean_bitfield(flags, F_BROADCAST,
- 2*8,
- "Broadcast packet",
- "Not a broadcast packet"));
- if (flags & F_RESPONSE) {
- add_item_to_tree(field_tree, offset + NBNS_FLAGS, 2,
- "%s",
- decode_enumerated_bitfield(flags, F_RCODE,
- 2*8,
- rcode_vals, "%s"));
- }
+ nbns_add_nbns_flags(nbns_tree, offset + NBNS_FLAGS, flags, 0);
add_item_to_tree(nbns_tree, offset + NBNS_QUEST, 2,
"Questions: %d",
quest);
diff --git a/packet.h b/packet.h
index 3cf8b7e00d..ed67f6b4b4 100644
--- a/packet.h
+++ b/packet.h
@@ -1,7 +1,7 @@
/* packet.h
* Definitions for packet disassembly structures and routines
*
- * $Id: packet.h,v 1.32 1999/01/05 07:33:38 guy Exp $
+ * $Id: packet.h,v 1.33 1999/01/05 08:48:40 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -445,6 +445,8 @@ enum {
ETT_IPXSAP_SERVER,
ETT_NBNS,
ETT_NBNS_FLAGS,
+ ETT_NBNS_NB_FLAGS,
+ ETT_NBNS_NAME_FLAGS,
ETT_NBNS_QRY,
ETT_NBNS_QD,
ETT_NBNS_ANS,