Some updates
authorjmayer <jmayer@f5534014-38df-0310-8fa8-9805f1628bb7>
Fri, 16 Dec 2005 17:52:05 +0000 (17:52 +0000)
committerjmayer <jmayer@f5534014-38df-0310-8fa8-9805f1628bb7>
Fri, 16 Dec 2005 17:52:05 +0000 (17:52 +0000)
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@16825 f5534014-38df-0310-8fa8-9805f1628bb7

epan/dissectors/packet-3com-njack.c

index 34fef53b30f8ae03b8aaf1d05a55607f522ebe7d..b5db11ba3e30eeb94a23ef625575ac111f062989 100644 (file)
 /*
   TODO:
   - Find out lots more values :-)
-  - Create common code for set and get response tlv decoding
+  - Find out set authentication mechanism, offer verification option
   - Support for other 3com devices that use the same protocol
   - Do any devices use TCP or different ports?
   - Sanity checks for tlv_length depending on tlv_type
+  - Replace numbers by their enum-values
+  - Consistent nameing of tfs elements
 
 Specs:
        No specs available. All knowledge gained by looking at traffic dumps
-       Packets to Managementstation: PORT_NJACK1
-       Packets to Switch: PORT_NJACK2
+       Packets to Managementstation: PORT_NJACK1 (5264)
+       Packets to Switch: PORT_NJACK2 (5265)
 
        Type 0x07 (set):      M -> S, Magic, type, length (16 bit be)
        Type 0x08 (set resp): S -> M, Magic, type, net length (8 bit), result status
        Type 0x0b (get):      M -> S, Magic, type, 00 00 63 ff
        Type 0x0c (get resp): S -> M, Magic, type, T(8 bit) L(8 bit) V(L bytes)
+       Type 0x0d (dhcpinfo): S -> M, Magic, type, tlv, t=00 = last (no length)
+       Type 0x10 (clear counters):      M -> S, Magic, type, 0400
+       Type 0x10 (clear counters resp): M -> S, Magic, type, 00
  */
 
 #ifdef HAVE_CONFIG_H
@@ -55,35 +60,31 @@ static int proto_njack = -1;
 
 /* ett handles */
 static int ett_njack = -1;
-static int ett_njack_getresp_tlv_header = -1;
-static int ett_njack_set_tlv_header = -1;
+static int ett_njack_tlv_header = -1;
 
 /* hf elements */
 static int hf_njack_magic = -1;
 static int hf_njack_type = -1;
+/* type set/get response */
+static int hf_njack_auth_data = -1;
+static int hf_njack_tlv_length = -1;
+static int hf_njack_tlv_data = -1;
+static int hf_njack_tlv_type = -1;
+static int hf_njack_tlv_typeip = -1;
+static int hf_njack_tlv_typemac = -1;
+static int hf_njack_tlv_typestring = -1;
+static int hf_njack_tlv_typeyesno = -1;
+static int hf_njack_tlv_typecountermode = -1;
+static int hf_njack_tlv_typescheduling = -1;
 /* type 07: set */
 static int hf_njack_set_length = -1;
 static int hf_njack_set_unknown1 = -1;
 static int hf_njack_set_seqno = -1;
-static int hf_njack_set_unknown2 = -1;
-static int hf_njack_set_data = -1;
-static int hf_njack_set_tlv_type = -1;
-static int hf_njack_set_tlv_length = -1;
-static int hf_njack_set_tlv_data = -1;
-static int hf_njack_set_tlv_typeip = -1;
-static int hf_njack_set_tlv_typestring = -1;
-static int hf_njack_set_tlv_typeyesno = -1;
 /* type 08: set result */
 static int hf_njack_setresult = -1;
 /* type 0b: get */
-static int hf_njack_get_data = -1;
 /* type 0c: get response */
-static int hf_njack_getresp_tlv_type = -1;
-static int hf_njack_getresp_tlv_length = -1;
-static int hf_njack_getresp_tlv_data = -1;
-static int hf_njack_getresp_tlv_typeip = -1;
-static int hf_njack_getresp_tlv_typestring = -1;
-static int hf_njack_getresp_tlv_typeyesno = -1;
+static int hf_njack_getresp_unknown1 = -1;
 
 #define PROTO_SHORT_NAME "NJACK"
 #define PROTO_LONG_NAME "3com Network Jack"
@@ -96,22 +97,34 @@ typedef enum {
        NJACK_TYPE_SETRESULT    = 0x08,
 
        NJACK_TYPE_GET          = 0x0b,
-       NJACK_TYPE_GETRESP      = 0x0c
+       NJACK_TYPE_GETRESP      = 0x0c,
+
+       NJACK_TYPE_DHCPINFO     = 0x0d,
+
+       NJACK_TYPE_CLEARCOUNTER = 0x10,
+       NJACK_TYPE_COUNTERRESP  = 0x11
 } njack_type_t;
 
 static const value_string njack_type_vals[] = {
-       { NJACK_TYPE_SET,       "Set"},
-       { NJACK_TYPE_SETRESULT, "Set result"},
-       { NJACK_TYPE_GET,       "Get"},
-       { NJACK_TYPE_GETRESP,   "Get response"},
+       { NJACK_TYPE_SET,               "Set"},
+       { NJACK_TYPE_SETRESULT,         "Set result"},
+       { NJACK_TYPE_GET,               "Get"},
+       { NJACK_TYPE_GETRESP,           "Get response"},
+       { NJACK_TYPE_DHCPINFO,          "DHCP info\?\?"},
+       { NJACK_TYPE_CLEARCOUNTER,      "Clear counters\?\?"},
+       { NJACK_TYPE_COUNTERRESP,       "Clear counters response\?\?"},
 
        { 0,    NULL }
 };
 
 typedef enum {
+       NJACK_CMD_STARTOFPARAMS         = 0x00,
+       NJACK_CMD_MACADDRESS            = 0x01,
        NJACK_CMD_IPADDRESS             = 0x02,
        NJACK_CMD_NETWORK               = 0x03,
        NJACK_CMD_MASK                  = 0x04,
+       NJACK_CMD_COUNTERMODE           = 0x06,
+       NJACK_CMD_QUEUEING              = 0x0a,
        NJACK_CMD_REMOVETAG             = 0x0c,
        NJACK_CMD_GROUP                 = 0x0d,
        NJACK_CMD_LOCATION              = 0x0e,
@@ -120,43 +133,53 @@ typedef enum {
        NJACK_CMD_PORT3                 = 0x15,
        NJACK_CMD_PORT4                 = 0x16,
        NJACK_CMD_PASSWORD              = 0x19,
+       NJACK_CMD_ENABLESNMPWRITE       = 0x1a,
        NJACK_CMD_ROCOMMUNITY           = 0x1b,
+       NJACK_CMD_RWCOMMUNITY           = 0x1c,
+       NJACK_CMD_DHCPCONTROL           = 0x1f,
        NJACK_CMD_IPGATEWAY             = 0x20,
-       NJACK_CMD_RWCOMMUNITY           = 0x25,
-       NJACK_CMD_DEVICETYPE            = 0x2a,
+       NJACK_CMD_PRODUCTNAME           = 0x2a,
        NJACK_CMD_SERIALNO              = 0x2b,
+       NJACK_CMD_GETALLPARMAMS         = 0x63,
        NJACK_CMD_ENDOFPACKET           = 0xff
 } njack_cmd_type_t;
 
 static const value_string njack_cmd_vals[] = {
+       { NJACK_CMD_STARTOFPARAMS,      "Start of Parameters" },
+       { NJACK_CMD_MACADDRESS,         "MAC address" },
        { NJACK_CMD_IPADDRESS,          "IP address" },
        { NJACK_CMD_NETWORK,            "IP network" },
        { NJACK_CMD_MASK,               "IP netmask" },
+       { NJACK_CMD_COUNTERMODE,        "Countermode" },
+       { NJACK_CMD_QUEUEING,           "Priority scheduling policy" },
        { NJACK_CMD_REMOVETAG,          "Remove tag" },
        { NJACK_CMD_GROUP,              "Device group" },
        { NJACK_CMD_LOCATION,           "Location" },
-       { NJACK_CMD_PORT1,              "Port 1 (\?\?)" },
-       { NJACK_CMD_PORT2,              "Port 2 (\?\?)" },
-       { NJACK_CMD_PORT3,              "Port 3 (\?\?)" },
-       { NJACK_CMD_PORT4,              "Port 4 (\?\?)" },
+       { NJACK_CMD_PORT1,              "Port 1" },
+       { NJACK_CMD_PORT2,              "Port 2" },
+       { NJACK_CMD_PORT3,              "Port 3" },
+       { NJACK_CMD_PORT4,              "Port 4" },
        { NJACK_CMD_PASSWORD,           "Device password" },
-       { NJACK_CMD_ROCOMMUNITY,        "RO community (\?\?)" },
+       { NJACK_CMD_ENABLESNMPWRITE,    "SNMP write enable" },
+       { NJACK_CMD_ROCOMMUNITY,        "RO community" },
+       { NJACK_CMD_RWCOMMUNITY,        "RW community" },
+       { NJACK_CMD_DHCPCONTROL,        "DHCP control" },
        { NJACK_CMD_IPGATEWAY,          "IP gateway" },
-       { NJACK_CMD_RWCOMMUNITY,        "RW community (\?\?)" },
-       { NJACK_CMD_DEVICETYPE,         "Device type(\?\?)" },
-       { NJACK_CMD_SERIALNO,           "Serial no(\?\?)" },
+       { NJACK_CMD_PRODUCTNAME,        "Product name" },
+       { NJACK_CMD_SERIALNO,           "Serial no" },
+       { NJACK_CMD_GETALLPARMAMS,      "Get all parameters" },
        { NJACK_CMD_ENDOFPACKET,        "End of packet" },
 
        { 0,    NULL }
 };
 
 typedef enum {
-       NJACK_SETRESULT_SUCCESS = 0x01,
+       NJACK_SETRESULT_SUCCESS         = 0x01,
        NJACK_SETRESULT_FAILAUTH        = 0xFD
 } njack_setresult_t;
 
 static const value_string njack_setresult_vals[] = {
-       { NJACK_SETRESULT_SUCCESS,              "Success" },
+       { NJACK_SETRESULT_SUCCESS,      "Success" },
        { NJACK_SETRESULT_FAILAUTH,     "Failauth" },
 
        { 0,    NULL }
@@ -167,20 +190,142 @@ static const true_false_string tfs_yes_no = {
        "No"
 };
 
+static const true_false_string tfs_good_errors = {
+       "Good frames",
+       "RX errors, TX collisions"
+};
+
+static const true_false_string tfs_scheduling = {
+       "Weighted fair",
+       "Priority"
+};
+
+static int
+dissect_portsettings(tvbuff_t *tvb, proto_tree *port_tree, guint32 offset)
+{
+       proto_tree_add_item(port_tree, hf_njack_tlv_data,
+               tvb, offset, 8, FALSE);
+       return offset;
+}
+
+static int
+dissect_tlvs(tvbuff_t *tvb, proto_tree *njack_tree, guint32 offset, gboolean is_set)
+{
+       guint8 tlv_type;
+       guint8 tlv_length;
+       proto_item *tlv_item;
+       proto_item *tlv_tree;
+
+       for (;;) {
+               tlv_type = tvb_get_guint8(tvb, offset);
+               /* Special cases that don't have a length field */
+               if (tlv_type == NJACK_CMD_ENDOFPACKET) {
+                       proto_tree_add_item(njack_tree, hf_njack_tlv_type,
+                               tvb, offset, 1, FALSE);
+                       offset += 1;
+                       break;
+               }
+               if (tlv_type == NJACK_CMD_GETALLPARMAMS) {
+                       proto_tree_add_item(njack_tree, hf_njack_tlv_type,
+                               tvb, offset, 1, FALSE);
+                       offset += 1;
+                       continue;
+               }
+               tlv_length = tvb_get_guint8(tvb, offset + 1);
+               tlv_item = proto_tree_add_text(njack_tree, tvb,
+                       offset, tlv_length + 2,
+                       "T %02x, L %02x: %s",
+                       tlv_type,
+                       tlv_length,
+                       val_to_str(tlv_type, njack_cmd_vals, "Unknown"));
+               tlv_tree = proto_item_add_subtree(tlv_item,
+                       ett_njack_tlv_header);
+               proto_tree_add_item(tlv_tree, hf_njack_tlv_type,
+                       tvb, offset, 1, FALSE);
+               offset += 1;
+               proto_tree_add_item(tlv_tree, hf_njack_tlv_length,
+                       tvb, offset, 1, FALSE);
+               offset += 1;
+               switch (tlv_type) {
+               case NJACK_CMD_STARTOFPARAMS:
+                       if (is_set) { /* followed by authdata? in case of set */
+                               proto_tree_add_item(njack_tree, hf_njack_auth_data, tvb,
+                                       offset, 16, FALSE);
+                               offset += 16;
+                       }
+                       break;
+               case 0x06: /* Counter mode */
+                       proto_tree_add_item(tlv_tree, hf_njack_tlv_typecountermode,
+                               tvb, offset, 1, FALSE);
+                       offset += 1;
+                       break;
+               case 0x0a: /* Scheduling */
+                       proto_tree_add_item(tlv_tree, hf_njack_tlv_typescheduling,
+                               tvb, offset, 1, FALSE);
+                       offset += 1;
+                       break;
+               case 0x0c: /* Strip tags */
+               case 0x1a: /* Enable SNMP write */
+               case 0x1f: /* DHCP control (disabled/enabled) */
+                       proto_tree_add_item(tlv_tree, hf_njack_tlv_typeyesno,
+                               tvb, offset, 1, FALSE);
+                       offset += 1;
+                       break;
+               case 0x01: /* MAC address */
+                       proto_tree_add_item(tlv_tree, hf_njack_tlv_typemac,
+                               tvb, offset, 6, FALSE);
+                       offset += 6;
+                       break;
+               case 0x02: /* IP address */
+               case 0x03: /* Network address */
+               case 0x04: /* Network mask */
+               case 0x20: /* Default gateway */
+                       proto_tree_add_item(tlv_tree, hf_njack_tlv_typeip,
+                               tvb, offset, 4, FALSE);
+                       offset += 4;
+                       break;
+               case 0x0d: /* group name */
+               case 0x0e: /* location */
+               case 0x19: /* password */
+               case 0x1b: /* ro community */
+               case 0x1c: /* rw community */
+               case 0x25: /* ? */
+               case 0x2a: /* Product name */
+               case 0x2b: /* Serialno - ending in last 3 bytes of MAC address */
+                       proto_tree_add_item(tlv_tree, hf_njack_tlv_typestring,
+                               tvb, offset, tlv_length, FALSE);
+                       offset += tlv_length;
+                       break;
+               case NJACK_CMD_PORT1:
+               case NJACK_CMD_PORT2:
+               case NJACK_CMD_PORT3:
+               case NJACK_CMD_PORT4:
+                       if (tlv_length == 8) {
+                               dissect_portsettings(tvb, tlv_tree, offset);
+                       }
+                       offset += tlv_length;
+                       break;
+               default:
+                       if (tlv_length > 0) {
+                               proto_tree_add_item(tlv_tree, hf_njack_tlv_data,
+                                       tvb, offset, tlv_length, FALSE);
+                               offset += tlv_length;
+                       }
+                       break;
+               }
+       }
+       return offset;
+}
+
 static int
 dissect_njack(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 {
        proto_item *ti;
-       proto_item *tlv_item;
        proto_tree *njack_tree = NULL;
-       proto_item *tlv_tree;
        guint32 offset = 0;
        guint8 packet_type;
        guint8 setresult;
-       guint8 tlv_type;
-       guint8 tlv_length;
-       guint16 total_length;
-       gboolean last = FALSE;
+       gint remaining;
 
        packet_type = tvb_get_guint8(tvb, 5);
        if (check_col(pinfo->cinfo, COL_PROTOCOL))
@@ -204,7 +349,6 @@ dissect_njack(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                switch (packet_type) {
                case NJACK_TYPE_SET:
                        /* Type 0x07: S -> M, Magic, type, length (16 bit be) */
-                       total_length = tvb_get_ntohs(tvb, offset);
                        proto_tree_add_item(njack_tree, hf_njack_set_length, tvb, offset,
                                2, FALSE);
                        offset += 2;
@@ -214,69 +358,7 @@ dissect_njack(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                        proto_tree_add_item(njack_tree, hf_njack_set_seqno, tvb, offset,
                                1, FALSE);
                        offset += 1;
-                       proto_tree_add_item(njack_tree, hf_njack_set_unknown2, tvb, offset,
-                               2, FALSE);
-                       offset += 2;
-                       proto_tree_add_item(njack_tree, hf_njack_set_data, tvb, offset,
-                               16, FALSE);
-                       offset += 16;
-                       for (;;) {
-                               tlv_type = tvb_get_guint8(tvb, offset);
-                               if (tlv_type == 0xff) {
-                                       proto_tree_add_item(njack_tree, hf_njack_set_tlv_type,
-                                               tvb, offset, 1, FALSE);
-                                       offset += 1;
-                                       break;
-                               }
-                               tlv_length = tvb_get_guint8(tvb, offset + 1);
-                               tlv_item = proto_tree_add_text(njack_tree, tvb,
-                                       offset, tlv_length + 2,
-                                       "T %02x, L %02x: %s",
-                                       tlv_type,
-                                       tlv_length,
-                                       val_to_str(tlv_type, njack_cmd_vals, "Unknown"));
-                               tlv_tree = proto_item_add_subtree(tlv_item,
-                                       ett_njack_set_tlv_header);
-                               proto_tree_add_item(tlv_tree, hf_njack_set_tlv_type,
-                                       tvb, offset, 1, FALSE);
-                               offset += 1;
-                               proto_tree_add_item(tlv_tree, hf_njack_set_tlv_length,
-                                       tvb, offset, 1, FALSE);
-                               offset += 1;
-                               switch (tlv_type) {
-                               case 0x0c: /* Strip tags */
-                                       proto_tree_add_item(tlv_tree, hf_njack_set_tlv_typeyesno,
-                                               tvb, offset, 1, FALSE);
-                                       offset += 1;
-                                       break;
-                               case 0x02: /* IP address */
-                               case 0x03: /* Network address */
-                               case 0x04: /* Network mask */
-                               case 0x20: /* Default gateway */
-                                       proto_tree_add_item(tlv_tree, hf_njack_set_tlv_typeip,
-                                               tvb, offset, 4, FALSE);
-                                       offset += 4;
-                                       break;
-                               case 0x0d: /* group name */
-                               case 0x0e: /* location */
-                               case 0x19: /* password */
-                               case 0x1b: /* ro community ? */
-                               case 0x25: /* rw community ? */
-                               case 0x2a: /* Device string ? */
-                               case 0x2b: /* Serialno ? */
-                                       proto_tree_add_item(tlv_tree, hf_njack_set_tlv_typestring,
-                                               tvb, offset, tlv_length, FALSE);
-                                       offset += tlv_length;
-                                       break;
-                               default:
-                                       if (tlv_length > 0) {
-                                               proto_tree_add_item(tlv_tree, hf_njack_set_tlv_data,
-                                                       tvb, offset, tlv_length, FALSE);
-                                               offset += tlv_length;
-                                       }
-                                       break;
-                               }
-                       }
+                       offset = dissect_tlvs(tvb, njack_tree, offset, TRUE);
                        break;
                case NJACK_TYPE_SETRESULT:
                        /* Type 0x08: M -> S, Magic, type, setresult (8 bit) */
@@ -290,69 +372,24 @@ dissect_njack(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                        break;
                case NJACK_TYPE_GET:
                        /* Type 0x0b: S -> M, Magic, type, 00 00 63 ff */
-                       proto_tree_add_item(njack_tree, hf_njack_get_data, tvb, offset,
-                               4, FALSE);
-                       offset += 4;
+                       offset = dissect_tlvs(tvb, njack_tree, offset, FALSE);
                        break;
                case NJACK_TYPE_GETRESP:
                        /* Type 0x0c: M -> S, Magic, type, T(8 bit) L(8 bit) V(L bytes) */
-                       while (!last) {
-                               tlv_type = tvb_get_guint8(tvb, offset);
-                               tlv_length = tvb_get_guint8(tvb, offset + 1);
-                               tlv_item = proto_tree_add_text(njack_tree, tvb,
-                                       offset, tlv_length + 2,
-                                       "T %02x, L %02x: %s",
-                                       tlv_type,
-                                       tlv_length,
-                                       val_to_str(tlv_type, njack_cmd_vals, "Unknown"));
-                               tlv_tree = proto_item_add_subtree(tlv_item,
-                                       ett_njack_getresp_tlv_header);
-                               proto_tree_add_item(tlv_tree, hf_njack_getresp_tlv_type,
-                                       tvb, offset, 1, FALSE);
-                               offset += 1;
-                               proto_tree_add_item(tlv_tree, hf_njack_getresp_tlv_length,
-                                       tvb, offset, 1, FALSE);
-                               offset += 1;
-                               switch (tlv_type) {
-                               case 0x0c: /* Strip tags */
-                                       proto_tree_add_item(tlv_tree, hf_njack_getresp_tlv_typeyesno,
-                                               tvb, offset, 1, FALSE);
-                                       offset += 1;
-                                       break;
-                               case 0x02: /* IP address */
-                               case 0x03: /* Network address */
-                               case 0x04: /* Network mask */
-                               case 0x20: /* Default gateway */
-                                       proto_tree_add_item(tlv_tree, hf_njack_getresp_tlv_typeip,
-                                               tvb, offset, 4, FALSE);
-                                       offset += 4;
-                                       break;
-                               case 0x0d: /* group name */
-                               case 0x0e: /* location */
-                               case 0x19: /* password */
-                               case 0x1b: /* ro community ? */
-                               case 0x25: /* rw community ? */
-                               case 0x2a: /* Device string ? */
-                               case 0x2b: /* Serialno ? */
-                                       proto_tree_add_item(tlv_tree, hf_njack_getresp_tlv_typestring,
-                                               tvb, offset, tlv_length, FALSE);
-                                       offset += tlv_length;
-                                       break;
-                               case 0xff: /* End of packet */
-                                       last = TRUE;
-                                       break;
-                               default:
-                                       if (tlv_length > 0) {
-                                               proto_tree_add_item(tlv_tree, hf_njack_getresp_tlv_data,
-                                                       tvb, offset, tlv_length, FALSE);
-                                               offset += tlv_length;
-                                       }
-                                       break;
-                               }
-                       }
+                       offset = dissect_tlvs(tvb, njack_tree, offset, FALSE);
+                       proto_tree_add_item(njack_tree, hf_njack_getresp_unknown1, tvb, offset,
+                               1, FALSE);
+                       offset += 1;
                        break;
+               case NJACK_TYPE_DHCPINFO: /* not completely understood */
                default:
                        /* Unknown type */
+                       remaining = tvb_reported_length_remaining(tvb, offset);
+                       if (remaining > 0) {
+                               proto_tree_add_item(njack_tree, hf_njack_tlv_data,
+                                       tvb, offset, remaining, FALSE);
+                               offset += remaining;
+                       }
                        break;
                }
        }
@@ -403,89 +440,76 @@ proto_register_njack(void)
                { "Type",       "njack.type", FT_UINT8, BASE_HEX, NULL,
                        0x0, "", HFILL }},
 
-       /* Type 0x07: set */
-               { &hf_njack_set_length,
-               { "SetLength",  "njack.set.length", FT_UINT16, BASE_HEX, NULL,
-                       0x0, "", HFILL }},
-
-               { &hf_njack_set_unknown1,
-               { "Unknown1",   "njack.set.unknown1", FT_UINT8, BASE_HEX, NULL,
-                       0x0, "", HFILL }},
+       /* TLV fields */
+                { &hf_njack_auth_data,
+                { "Authdata\?\?",   "njack.tlv.authdata", FT_BYTES, BASE_NONE, NULL,
+                        0x0, "", HFILL }},
 
-               { &hf_njack_set_seqno,
-               { "Seqno",      "njack.set.seqno", FT_UINT8, BASE_HEX, NULL,
+               { &hf_njack_tlv_type,
+               { "TlvType",    "njack.tlv.type", FT_UINT8, BASE_HEX, VALS(njack_cmd_vals),
                        0x0, "", HFILL }},
 
-               { &hf_njack_set_unknown2,
-               { "Unknown2",   "njack.set.unknown2", FT_UINT16, BASE_HEX, NULL,
+               { &hf_njack_tlv_length,
+               { "TlvLength",  "njack.tlv.length", FT_UINT8, BASE_HEX, NULL,
                        0x0, "", HFILL }},
 
-                { &hf_njack_set_data,
-                { "Authdata\?\?",   "njack.set.data", FT_BYTES, BASE_NONE, NULL,
+                { &hf_njack_tlv_data,
+                { "TlvData",   "njack.tlv.data", FT_BYTES, BASE_NONE, NULL,
                         0x0, "", HFILL }},
 
-               { &hf_njack_set_tlv_type,
-               { "SetTlvType", "njack.set.tlv.type", FT_UINT8, BASE_HEX, VALS(njack_cmd_vals),
-                       0x0, "", HFILL }},
-
-               { &hf_njack_set_tlv_length,
-               { "SetTlvLength",       "njack.set.tlv.length", FT_UINT8, BASE_HEX, NULL,
-                       0x0, "", HFILL }},
-
-                { &hf_njack_set_tlv_data,
-                { "SetTlvData",   "njack.set.tlv.data", FT_BYTES, BASE_NONE, NULL,
+                { &hf_njack_tlv_typeip,
+                { "TlvTypeIP",   "njack.tlv.typeip", FT_IPv4, BASE_NONE, NULL,
                         0x0, "", HFILL }},
 
-                { &hf_njack_set_tlv_typeip,
-                { "SetTlvTypeIP",   "njack.set.tlv.typeip", FT_IPv4, BASE_NONE, NULL,
+                { &hf_njack_tlv_typemac,
+                { "TlvTypeMAC",   "njack.tlv.typemac", FT_ETHER, BASE_NONE, NULL,
                         0x0, "", HFILL }},
 
-                { &hf_njack_set_tlv_typestring,
-                { "SetTlvTypeString",   "njack.set.tlv.typestring", FT_STRING, BASE_DEC, NULL,
+                { &hf_njack_tlv_typestring,
+                { "TlvTypeString",   "njack.tlv.typestring", FT_STRING, BASE_DEC, NULL,
                         0x0, "", HFILL }},
 
-                { &hf_njack_set_tlv_typeyesno,
-                { "SetTlvTypeYesNo",   "njack.set.tlv.typeyesno", FT_BOOLEAN, 8, TFS(&tfs_yes_no),
+                { &hf_njack_tlv_typecountermode,
+                { "TlvTypeCountermode",   "njack.tlv.typecontermode", FT_BOOLEAN, 8, TFS(&tfs_good_errors),
                         0xff, "", HFILL }},
 
-       /* Type 0x08: set result */
-                { &hf_njack_setresult,
-                { "SetResult",   "njack.setresult", FT_UINT8, BASE_HEX, VALS(njack_setresult_vals),
-                        0x0, "", HFILL }},
-       /* Type 0x0b get */
-                { &hf_njack_get_data,
-                { "GetData",   "njack.get.data", FT_BYTES, BASE_NONE, NULL,
-                        0x0, "", HFILL }},
-       /* Type 0x0c get response */
-               { &hf_njack_getresp_tlv_type,
-               { "TlvType",    "njack.getresp.tlv.type", FT_UINT8, BASE_HEX, VALS(njack_cmd_vals),
+                { &hf_njack_tlv_typescheduling,
+                { "TlvTypeScheduling",   "njack.tlv.typescheduling", FT_BOOLEAN, 8, TFS(&tfs_scheduling),
+                        0xff, "", HFILL }},
+
+                { &hf_njack_tlv_typeyesno,
+                { "TlvTypeYesNo",   "njack.tlv.typeyesno", FT_BOOLEAN, 8, TFS(&tfs_yes_no),
+                        0xff, "", HFILL }},
+
+       /* Type 0x07: set */
+               { &hf_njack_set_length,
+               { "SetLength",  "njack.set.length", FT_UINT16, BASE_HEX, NULL,
                        0x0, "", HFILL }},
 
-               { &hf_njack_getresp_tlv_length,
-               { "TlvLength",  "njack.getresp.tlv.length", FT_UINT8, BASE_HEX, NULL,
+               { &hf_njack_set_unknown1,
+               { "Unknown1",   "njack.set.unknown1", FT_UINT8, BASE_HEX, NULL,
                        0x0, "", HFILL }},
 
-                { &hf_njack_getresp_tlv_data,
-                { "GetResponeTlvData",   "njack.getresp.tlv.data", FT_BYTES, BASE_NONE, NULL,
-                        0x0, "", HFILL }},
+               { &hf_njack_set_seqno,
+               { "Seqno",      "njack.set.seqno", FT_UINT8, BASE_HEX, NULL,
+                       0x0, "", HFILL }},
 
-                { &hf_njack_getresp_tlv_typeip,
-                { "GetResponeTlvTypeIP",   "njack.getresp.tlv.typeip", FT_IPv4, BASE_NONE, NULL,
+       /* Type 0x08: set result */
+                { &hf_njack_setresult,
+                { "SetResult",   "njack.setresult", FT_UINT8, BASE_HEX, VALS(njack_setresult_vals),
                         0x0, "", HFILL }},
 
-                { &hf_njack_getresp_tlv_typestring,
-                { "GetResponeTlvTypeString",   "njack.getresp.tlv.typestring", FT_STRING, BASE_DEC, NULL,
-                        0x0, "", HFILL }},
+       /* Type 0x0b get */
 
-                { &hf_njack_getresp_tlv_typeyesno,
-                { "GetTlvTypeYesNo",   "njack.getresp.tlv.typeyesno", FT_BOOLEAN, 8, TFS(&tfs_yes_no),
-                        0xff, "", HFILL }},
+       /* Type 0x0c get response */
+               { &hf_njack_getresp_unknown1,
+               { "Unknown1",   "njack.getresp.unknown1", FT_UINT8, BASE_HEX, NULL,
+                       0x0, "", HFILL }},
 
         };
        static gint *ett[] = {
                &ett_njack,
-               &ett_njack_getresp_tlv_header,
-               &ett_njack_set_tlv_header,
+               &ett_njack_tlv_header,
        };
 
         proto_njack = proto_register_protocol(PROTO_LONG_NAME,