aboutsummaryrefslogtreecommitdiffstats
path: root/plugins
diff options
context:
space:
mode:
authorUlf Lamping <ulf.lamping@web.de>2008-01-17 18:29:51 +0000
committerUlf Lamping <ulf.lamping@web.de>2008-01-17 18:29:51 +0000
commit6cfbb485bf505404f8aaec5790db7eb255879cb8 (patch)
tree97fc885155e17e4a3ed93420424a640d11cba8cc /plugins
parented88c589b0d43dabd499c5302de33ff4f89e7ddf (diff)
better conformance to the released DCP protocol spec:
- redesign/refactoring the code to support BlockQualifier - fix handling of BlockInfo - rename some display strings for better spec conformance - remove LLDP suboption svn path=/trunk/; revision=24120
Diffstat (limited to 'plugins')
-rw-r--r--plugins/profinet/packet-pn-dcp.c293
1 files changed, 170 insertions, 123 deletions
diff --git a/plugins/profinet/packet-pn-dcp.c b/plugins/profinet/packet-pn-dcp.c
index 6741f2fd25..0152a388f3 100644
--- a/plugins/profinet/packet-pn-dcp.c
+++ b/plugins/profinet/packet-pn-dcp.c
@@ -58,18 +58,18 @@ static int hf_pn_dcp_block_length = -1;
static int hf_pn_dcp_block = -1;
-static int hf_pn_dcp_result = -1;
+static int hf_pn_dcp_block_error = -1;
static int hf_pn_dcp_option = -1;
static int hf_pn_dcp_suboption = -1;
-static int hf_pn_dcp_req_status = -1;
static int hf_pn_dcp_block_info = -1;
+static int hf_pn_dcp_block_qualifier = -1;
static int hf_pn_dcp_suboption_ip = -1;
static int hf_pn_dcp_suboption_ip_block_info = -1;
static int hf_pn_dcp_suboption_ip_ip = -1;
static int hf_pn_dcp_suboption_ip_subnetmask = -1;
-static int hf_pn_dcp_suboption_ip_default_router = -1;
+static int hf_pn_dcp_suboption_ip_standard_gateway = -1;
static int hf_pn_dcp_suboption_device = -1;
static int hf_pn_dcp_suboption_device_typeofstation = -1;
@@ -82,10 +82,8 @@ static int hf_pn_dcp_suboption_device_aliasname = -1;
static int hf_pn_dcp_suboption_dhcp = -1;
static int hf_pn_dcp_suboption_dhcp_device_id = -1;
-static int hf_pn_dcp_suboption_lldp = -1;
-
static int hf_pn_dcp_suboption_control = -1;
-static int hf_pn_dcp_suboption_control_status = -1;
+static int hf_pn_dcp_suboption_control_response = -1;
static int hf_pn_dcp_suboption_deviceinitiative = -1;
static int hf_pn_dcp_deviceinitiative_value = -1;
@@ -129,7 +127,7 @@ static const value_string pn_dcp_service_type[] = {
{ 0, NULL }
};
-static const value_string pn_dcp_result[] = {
+static const value_string pn_dcp_block_error[] = {
{ 0x00, "Ok" },
{ 0x01, "Option unsupp." },
{ 0x02, "Suboption unsupp." },
@@ -141,9 +139,15 @@ static const value_string pn_dcp_result[] = {
{ 0, NULL }
};
-static const value_string pn_dcp_req_status[] = {
- { 0x0000, "Don't save data permanent" },
- { 0x0001, "Save data permanent" },
+static const value_string pn_dcp_block_info[] = {
+ { 0x0000, "Reserved" },
+ /*0x0001 - 0xffff reserved */
+ { 0, NULL }
+};
+
+static const value_string pn_dcp_block_qualifier[] = {
+ { 0x0000, "Use the value temporary" },
+ { 0x0001, "Save the value permanent" },
/*0x0002 - 0xffff reserved */
{ 0, NULL }
};
@@ -152,7 +156,7 @@ static const value_string pn_dcp_req_status[] = {
#define PNDCP_OPTION_IP 0x01
#define PNDCP_OPTION_DEVICE 0x02
#define PNDCP_OPTION_DHCP 0x03
-#define PNDCP_OPTION_LLDP 0x04
+#define PNDCP_OPTION_RESERVED 0x04
#define PNDCP_OPTION_CONTROL 0x05
#define PNDCP_OPTION_DEVICEINITIATIVE 0x06
#define PNDCP_OPTION_MANUF_X80 0x80
@@ -169,7 +173,7 @@ static const value_string pn_dcp_option[] = {
{ PNDCP_OPTION_IP, "IP" },
{ PNDCP_OPTION_DEVICE, "Device properties" },
{ PNDCP_OPTION_DHCP, "DHCP" },
- { PNDCP_OPTION_LLDP, "LLDP" },
+ { PNDCP_OPTION_RESERVED, "Reserved" },
{ PNDCP_OPTION_CONTROL, "Control" },
{ PNDCP_OPTION_DEVICEINITIATIVE, "Device Initiative" },
/*0x07 - 0x7f reserved */
@@ -239,11 +243,6 @@ static const value_string pn_dcp_suboption_dhcp[] = {
{ 0, NULL }
};
-static const value_string pn_dcp_suboption_lldp[] = {
- /* currently unknown */
- { 0, NULL }
-};
-
#define PNDCP_SUBOPTION_CONTROL_START_TRANS 0x01
#define PNDCP_SUBOPTION_CONTROL_END_TRANS 0x02
#define PNDCP_SUBOPTION_CONTROL_SIGNAL 0x03
@@ -313,10 +312,6 @@ dissect_PNDCP_Option(tvbuff_t *tvb, int offset, packet_info *pinfo,
offset = dissect_pn_uint8(tvb, offset, pinfo, tree, hf_pn_dcp_suboption_dhcp, &suboption);
val_str = pn_dcp_suboption_dhcp;
break;
- case(PNDCP_OPTION_LLDP):
- offset = dissect_pn_uint8(tvb, offset, pinfo, tree, hf_pn_dcp_suboption_lldp, &suboption);
- val_str = pn_dcp_suboption_lldp;
- break;
case(PNDCP_OPTION_CONTROL):
offset = dissect_pn_uint8(tvb, offset, pinfo, tree, hf_pn_dcp_suboption_control, &suboption);
val_str = pn_dcp_suboption_control;
@@ -350,20 +345,23 @@ dissect_PNDCP_Option(tvbuff_t *tvb, int offset, packet_info *pinfo,
static int
dissect_PNDCP_Suboption_IP(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree *tree, proto_item *block_item, proto_item *dcp_item,
- gboolean is_response)
+ guint8 service_id, gboolean is_response)
{
guint8 suboption;
guint16 block_length;
- guint16 status;
- guint16 req_status;
+ guint16 block_info;
+ guint16 block_qualifier;
guint32 ip;
-
+
+ /* SuboptionIPParameter */
offset = dissect_pn_uint8 (tvb, offset, pinfo, tree, hf_pn_dcp_suboption_ip, &suboption);
+ /* DCPBlockLength */
offset = dissect_pn_uint16(tvb, offset, pinfo, tree, hf_pn_dcp_block_length, &block_length);
switch(suboption) {
case(PNDCP_SUBOPTION_IP_MAC):
+ /* MACAddressValue? */
pn_append_info(pinfo, dcp_item, ", MAC");
proto_item_append_text(block_item, "IP/MAC");
@@ -373,25 +371,35 @@ dissect_PNDCP_Suboption_IP(tvbuff_t *tvb, int offset, packet_info *pinfo,
pn_append_info(pinfo, dcp_item, ", IP");
proto_item_append_text(block_item, "IP/IP");
- if(is_response) {
- offset = dissect_pn_uint16(tvb, offset, pinfo, tree, hf_pn_dcp_suboption_ip_block_info, &status);
- proto_item_append_text(block_item, ", BlockInfo: %s", val_to_str(status, pn_dcp_suboption_ip_block_info, "Unknown"));
- } else {
- offset = dissect_pn_uint16(tvb, offset, pinfo, tree, hf_pn_dcp_req_status, &req_status);
- proto_item_append_text(block_item, ", Status: %s", val_to_str(req_status, pn_dcp_req_status, "Unknown"));
- }
-
- /* ip address */
+ /* BlockInfo? */
+ if( (service_id == PNDCP_SERVICE_ID_IDENTIFY) && is_response ||
+ (service_id == PNDCP_SERVICE_ID_HELLO) && !is_response ||
+ (service_id == PNDCP_SERVICE_ID_GET) && is_response) {
+ offset = dissect_pn_uint16(tvb, offset, pinfo, tree, hf_pn_dcp_suboption_ip_block_info, &block_info);
+ proto_item_append_text(block_item, ", BlockInfo: %s", val_to_str(block_info, pn_dcp_suboption_ip_block_info, "Undecoded"));
+ block_length -= 2;
+ }
+
+ /* BlockQualifier? */
+ if( (service_id == PNDCP_SERVICE_ID_SET) && !is_response) {
+ offset = dissect_pn_uint16(tvb, offset, pinfo, tree, hf_pn_dcp_block_qualifier, &block_qualifier);
+ proto_item_append_text(block_item, ", BlockQualifier: %s", val_to_str(block_qualifier, pn_dcp_block_qualifier, "Unknown"));
+ block_length -= 2;
+ }
+
+ /* IPParameterValue ... */
+
+ /* IPAddress */
offset = dissect_pn_ipv4(tvb, offset, pinfo, tree, hf_pn_dcp_suboption_ip_ip, &ip);
proto_item_append_text(block_item, ", IP: %s", ip_to_str((guint8*)&ip));
- /* subnetmask */
+ /* Subnetmask */
offset = dissect_pn_ipv4(tvb, offset, pinfo, tree, hf_pn_dcp_suboption_ip_subnetmask, &ip);
proto_item_append_text(block_item, ", Subnet: %s", ip_to_str((guint8*)&ip));
- /* default router */
- offset = dissect_pn_ipv4(tvb, offset, pinfo, tree, hf_pn_dcp_suboption_ip_default_router, &ip);
- proto_item_append_text(block_item, ", Router: %s", ip_to_str((guint8*)&ip));
+ /* StandardGateway */
+ offset = dissect_pn_ipv4(tvb, offset, pinfo, tree, hf_pn_dcp_suboption_ip_standard_gateway, &ip);
+ proto_item_append_text(block_item, ", Gateway: %s", ip_to_str((guint8*)&ip));
break;
default:
offset = dissect_pn_undecoded(tvb, offset, pinfo, tree, block_length);
@@ -405,7 +413,7 @@ dissect_PNDCP_Suboption_IP(tvbuff_t *tvb, int offset, packet_info *pinfo,
static int
dissect_PNDCP_Suboption_Device(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree *tree, proto_item *block_item, proto_item *dcp_item,
- gboolean is_response)
+ guint8 service_id, gboolean is_response)
{
guint8 suboption;
guint16 block_length;
@@ -416,15 +424,32 @@ dissect_PNDCP_Suboption_Device(tvbuff_t *tvb, int offset, packet_info *pinfo,
char *typeofstation;
char *nameofstation;
char *aliasname;
- guint16 status=0;
+ guint16 block_info;
+ guint16 block_qualifier;
+ gboolean have_block_info=FALSE;
+ gboolean have_block_qualifier=FALSE;
+ /* SuboptionDevice... */
offset = dissect_pn_uint8(tvb, offset, pinfo, tree, hf_pn_dcp_suboption_device, &suboption);
+ /* DCPBlockLength */
offset = dissect_pn_uint16(tvb, offset, pinfo, tree, hf_pn_dcp_block_length, &block_length);
- if(is_response) {
- offset = dissect_pn_uint16(tvb, offset, pinfo, tree, hf_pn_dcp_block_info, &status);
- block_length -= 2;
- }
+
+ /* BlockInfo? */
+ if( (service_id == PNDCP_SERVICE_ID_IDENTIFY) && is_response ||
+ (service_id == PNDCP_SERVICE_ID_HELLO) && !is_response ||
+ (service_id == PNDCP_SERVICE_ID_GET) && is_response) {
+ offset = dissect_pn_uint16(tvb, offset, pinfo, tree, hf_pn_dcp_block_info, &block_info);
+ have_block_info=TRUE;
+ block_length -= 2;
+ }
+
+ /* BlockQualifier? */
+ if( (service_id == PNDCP_SERVICE_ID_SET) && !is_response) {
+ offset = dissect_pn_uint16(tvb, offset, pinfo, tree, hf_pn_dcp_block_qualifier, &block_qualifier);
+ have_block_qualifier=TRUE;
+ block_length -= 2;
+ }
switch(suboption) {
case(PNDCP_SUBOPTION_DEVICE_MANUF):
@@ -434,8 +459,10 @@ dissect_PNDCP_Suboption_Device(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree_add_string (tree, hf_pn_dcp_suboption_device_typeofstation, tvb, offset, block_length, typeofstation);
pn_append_info(pinfo, dcp_item, ", TypeOfStation");
proto_item_append_text(block_item, "Device/Manufacturer specific");
- if(is_response)
- proto_item_append_text(block_item, ", Status: %u", status);
+ if(have_block_qualifier)
+ proto_item_append_text(block_item, ", BlockQualifier: %s", val_to_str(block_qualifier, pn_dcp_block_qualifier, "Unknown"));
+ if(have_block_info)
+ proto_item_append_text(block_item, ", BlockInfo: %s", val_to_str(block_info, pn_dcp_block_info, "Unknown"));
proto_item_append_text(block_item, ", TypeOfStation: \"%s\"", typeofstation);
offset += block_length;
break;
@@ -446,8 +473,10 @@ dissect_PNDCP_Suboption_Device(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree_add_string (tree, hf_pn_dcp_suboption_device_nameofstation, tvb, offset, block_length, nameofstation);
pn_append_info(pinfo, dcp_item, ep_strdup_printf(", NameOfStation:\"%s\"", nameofstation));
proto_item_append_text(block_item, "Device/NameOfStation");
- if(is_response)
- proto_item_append_text(block_item, ", Status: %u", status);
+ if(have_block_qualifier)
+ proto_item_append_text(block_item, ", BlockQualifier: %s", val_to_str(block_qualifier, pn_dcp_block_qualifier, "Unknown"));
+ if(have_block_info)
+ proto_item_append_text(block_item, ", BlockInfo: %s", val_to_str(block_info, pn_dcp_block_info, "Unknown"));
proto_item_append_text(block_item, ", \"%s\"", nameofstation);
offset += block_length;
break;
@@ -456,8 +485,10 @@ dissect_PNDCP_Suboption_Device(tvbuff_t *tvb, int offset, packet_info *pinfo,
offset = dissect_pn_uint16(tvb, offset, pinfo, tree, hf_pn_dcp_suboption_device_id, &device_id);
pn_append_info(pinfo, dcp_item, ", Dev-ID");
proto_item_append_text(block_item, "Device/Device ID");
- if(is_response)
- proto_item_append_text(block_item, ", Status: %u", status);
+ if(have_block_qualifier)
+ proto_item_append_text(block_item, ", BlockQualifier: %s", val_to_str(block_qualifier, pn_dcp_block_qualifier, "Unknown"));
+ if(have_block_info)
+ proto_item_append_text(block_item, ", BlockInfo: %s", val_to_str(block_info, pn_dcp_block_info, "Unknown"));
proto_item_append_text(block_item, ", VendorID: 0x%04x / DeviceID: 0x%04x", vendor_id, device_id);
break;
case(PNDCP_SUBOPTION_DEVICE_DEV_ROLE):
@@ -465,8 +496,10 @@ dissect_PNDCP_Suboption_Device(tvbuff_t *tvb, int offset, packet_info *pinfo,
offset = dissect_pn_uint8(tvb, offset, pinfo, tree, hf_pn_dcp_reserved8, NULL);
pn_append_info(pinfo, dcp_item, ", Dev-Role");
proto_item_append_text(block_item, "Device/Device Role");
- if(is_response)
- proto_item_append_text(block_item, ", Status: %u", status);
+ if(have_block_qualifier)
+ proto_item_append_text(block_item, ", BlockQualifier: %s", val_to_str(block_qualifier, pn_dcp_block_qualifier, "Unknown"));
+ if(have_block_info)
+ proto_item_append_text(block_item, ", BlockInfo: %s", val_to_str(block_info, pn_dcp_block_info, "Unknown"));
if(device_role & 0x01)
proto_item_append_text(block_item, ", IO-Device");
if(device_role & 0x02)
@@ -480,8 +513,10 @@ dissect_PNDCP_Suboption_Device(tvbuff_t *tvb, int offset, packet_info *pinfo,
info_str = ep_strdup_printf(", Dev-Options(%u)", block_length/2);
pn_append_info(pinfo, dcp_item, info_str);
proto_item_append_text(block_item, "Device/Device Options");
- if(is_response)
- proto_item_append_text(block_item, ", Status: %u", status);
+ if(have_block_qualifier)
+ proto_item_append_text(block_item, ", BlockQualifier: %s", val_to_str(block_qualifier, pn_dcp_block_qualifier, "Unknown"));
+ if(have_block_info)
+ proto_item_append_text(block_item, ", BlockInfo: %s", val_to_str(block_info, pn_dcp_block_info, "Unknown"));
proto_item_append_text(block_item, ", %u options", block_length/2);
for( ; block_length != 0; block_length -= 2) {
offset = dissect_PNDCP_Option(tvb, offset, pinfo, tree, NULL /*block_item*/, hf_pn_dcp_option,
@@ -495,8 +530,10 @@ dissect_PNDCP_Suboption_Device(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree_add_string (tree, hf_pn_dcp_suboption_device_aliasname, tvb, offset, block_length, aliasname);
pn_append_info(pinfo, dcp_item, ep_strdup_printf(", AliasName:\"%s\"", aliasname));
proto_item_append_text(block_item, "Device/AliasName");
- if(is_response)
- proto_item_append_text(block_item, ", Status: %u", status);
+ if(have_block_qualifier)
+ proto_item_append_text(block_item, ", BlockQualifier: %s", val_to_str(block_qualifier, pn_dcp_block_qualifier, "Unknown"));
+ if(have_block_info)
+ proto_item_append_text(block_item, ", BlockInfo: %s", val_to_str(block_info, pn_dcp_block_info, "Unknown"));
proto_item_append_text(block_item, ", \"%s\"", aliasname);
offset += block_length;
break;
@@ -512,19 +549,43 @@ dissect_PNDCP_Suboption_Device(tvbuff_t *tvb, int offset, packet_info *pinfo,
static int
dissect_PNDCP_Suboption_DHCP(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree *tree, proto_item *block_item, proto_item *dcp_item,
- gboolean is_response _U_)
+ guint8 service_id _U_, gboolean is_response _U_)
{
guint8 suboption;
guint16 block_length;
+ guint16 block_info;
+ guint16 block_qualifier;
+ gboolean have_block_info=FALSE;
+ gboolean have_block_qualifier=FALSE;
offset = dissect_pn_uint8(tvb, offset, pinfo, tree, hf_pn_dcp_suboption_dhcp, &suboption);
offset = dissect_pn_uint16(tvb, offset, pinfo, tree, hf_pn_dcp_block_length, &block_length);
+ /* BlockInfo? */
+ if( (service_id == PNDCP_SERVICE_ID_IDENTIFY) && is_response ||
+ (service_id == PNDCP_SERVICE_ID_HELLO) && !is_response ||
+ (service_id == PNDCP_SERVICE_ID_GET) && is_response) {
+ offset = dissect_pn_uint16(tvb, offset, pinfo, tree, hf_pn_dcp_block_info, &block_info);
+ have_block_info=TRUE;
+ block_length -= 2;
+ }
+
+ /* BlockQualifier? */
+ if( (service_id == PNDCP_SERVICE_ID_SET) && !is_response) {
+ offset = dissect_pn_uint16(tvb, offset, pinfo, tree, hf_pn_dcp_block_qualifier, &block_qualifier);
+ have_block_qualifier=TRUE;
+ block_length -= 2;
+ }
+
switch(suboption) {
case(PNDCP_SUBOPTION_DHCP_CLIENT_ID):
pn_append_info(pinfo, dcp_item, ", DHCP client identifier");
proto_item_append_text(block_item, "DHCP/Client-ID");
+ if(have_block_qualifier)
+ proto_item_append_text(block_item, ", BlockQualifier: %s", val_to_str(block_qualifier, pn_dcp_block_qualifier, "Unknown"));
+ if(have_block_info)
+ proto_item_append_text(block_item, ", BlockInfo: %s", val_to_str(block_info, pn_dcp_block_info, "Unknown"));
proto_tree_add_item(tree, hf_pn_dcp_suboption_dhcp_device_id, tvb, offset, block_length, FALSE);
offset += block_length;
break;
@@ -536,36 +597,17 @@ dissect_PNDCP_Suboption_DHCP(tvbuff_t *tvb, int offset, packet_info *pinfo,
}
-/* dissect the "LLDP" suboption */
-static int
-dissect_PNDCP_Suboption_LLDP(tvbuff_t *tvb, int offset, packet_info *pinfo,
- proto_tree *tree, proto_item *block_item _U_, proto_item *dcp_item _U_,
- gboolean is_response _U_)
-{
- guint8 suboption;
- guint16 block_length;
-
-
- offset = dissect_pn_uint8(tvb, offset, pinfo, tree, hf_pn_dcp_suboption_lldp, &suboption);
- offset = dissect_pn_uint16(tvb, offset, pinfo, tree, hf_pn_dcp_block_length, &block_length);
-
- offset = dissect_pn_undecoded(tvb, offset, pinfo, tree, block_length);
-
- return offset;
-}
-
-
/* dissect the "control" suboption */
static int
dissect_PNDCP_Suboption_Control(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree *tree, proto_item *block_item, proto_item *dcp_item,
- gboolean is_response _U_)
+ guint8 service_id _U_, gboolean is_response _U_)
{
- guint8 result;
guint8 suboption;
guint16 block_length;
+ guint16 block_qualifier;
gchar *info_str;
- guint16 status;
+ guint8 block_error;
offset = dissect_pn_uint8(tvb, offset, pinfo, tree, hf_pn_dcp_suboption_control, &suboption);
@@ -575,30 +617,31 @@ dissect_PNDCP_Suboption_Control(tvbuff_t *tvb, int offset, packet_info *pinfo,
case(PNDCP_SUBOPTION_CONTROL_START_TRANS):
pn_append_info(pinfo, dcp_item, ", Start-Trans");
proto_item_append_text(block_item, "Control/Start-Transaction");
- offset = dissect_pn_uint16(tvb, offset, pinfo, tree, hf_pn_dcp_block_info, &status);
+ offset = dissect_pn_uint16(tvb, offset, pinfo, tree, hf_pn_dcp_block_qualifier, &block_qualifier);
break;
case(PNDCP_SUBOPTION_CONTROL_END_TRANS):
pn_append_info(pinfo, dcp_item, ", End-Trans");
proto_item_append_text(block_item, "Control/End-Transaction");
- offset = dissect_pn_uint16(tvb, offset, pinfo, tree, hf_pn_dcp_block_info, &status);
+ offset = dissect_pn_uint16(tvb, offset, pinfo, tree, hf_pn_dcp_block_qualifier, &block_qualifier);
break;
case(PNDCP_SUBOPTION_CONTROL_SIGNAL):
pn_append_info(pinfo, dcp_item, ", Signal");
proto_item_append_text(block_item, "Control/Signal");
- offset = dissect_pn_uint16(tvb, offset, pinfo, tree, hf_pn_dcp_block_info, &status);
+ offset = dissect_pn_uint16(tvb, offset, pinfo, tree, hf_pn_dcp_block_qualifier, &block_qualifier);
block_length -= 2;
offset = dissect_pn_undecoded(tvb, offset, pinfo, tree, block_length);
break;
case(PNDCP_SUBOPTION_CONTROL_RESPONSE):
proto_item_append_text(block_item, "Control/Response");
- offset = dissect_PNDCP_Option(tvb, offset, pinfo, tree, block_item, hf_pn_dcp_suboption_control_status,
+ offset = dissect_PNDCP_Option(tvb, offset, pinfo, tree, block_item, hf_pn_dcp_suboption_control_response,
FALSE /* append_col */);
- offset = dissect_pn_uint8(tvb, offset, pinfo, tree, hf_pn_dcp_result, &result);
- info_str = ep_strdup_printf(", Response(%s)", val_to_str(result, pn_dcp_result, "Unknown"));
+ offset = dissect_pn_uint8(tvb, offset, pinfo, tree, hf_pn_dcp_block_error, &block_error);
+ info_str = ep_strdup_printf(", Response(%s)", val_to_str(block_error, pn_dcp_block_error, "Unknown"));
pn_append_info(pinfo, dcp_item, info_str);
- proto_item_append_text(block_item, ", Result: %s", val_to_str(result, pn_dcp_result, "Unknown"));
+ proto_item_append_text(block_item, ", BlockError: %s", val_to_str(block_error, pn_dcp_block_error, "Unknown"));
break;
+ /* XXX - add PNDCP_SUBOPTION_CONTROL_FACTORY_RESET */
default:
offset = dissect_pn_undecoded(tvb, offset, pinfo, tree, block_length);
}
@@ -611,29 +654,40 @@ dissect_PNDCP_Suboption_Control(tvbuff_t *tvb, int offset, packet_info *pinfo,
static int
dissect_PNDCP_Suboption_DeviceInitiative(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree *tree, proto_item *block_item, proto_item *dcp_item,
- gboolean is_response _U_)
+ guint8 service_id, gboolean is_response)
{
guint8 suboption;
guint16 block_length;
- guint16 status;
+ guint16 block_info;
+ guint16 block_qualifier;
guint16 value;
offset = dissect_pn_uint8(tvb, offset, pinfo, tree, hf_pn_dcp_suboption_deviceinitiative, &suboption);
offset = dissect_pn_uint16(tvb, offset, pinfo, tree, hf_pn_dcp_block_length, &block_length);
- /* BlockInfo */
- if(is_response) {
- offset = dissect_pn_uint16(tvb, offset, pinfo, tree, hf_pn_dcp_block_info, &status);
+ pn_append_info(pinfo, dcp_item, ", DeviceInitiative");
+ proto_item_append_text(block_item, "DeviceInitiative/DeviceInitiative");
+
+ /* BlockInfo? */
+ if( (service_id == PNDCP_SERVICE_ID_IDENTIFY) && is_response ||
+ (service_id == PNDCP_SERVICE_ID_HELLO) && !is_response ||
+ (service_id == PNDCP_SERVICE_ID_GET) && is_response) {
+ offset = dissect_pn_uint16(tvb, offset, pinfo, tree, hf_pn_dcp_block_info, &block_info);
+ proto_item_append_text(block_item, ", BlockInfo: %s", val_to_str(block_info, pn_dcp_block_info, "Unknown"));
block_length -= 2;
- }
+ }
+
+ /* BlockQualifier? */
+ if( (service_id == PNDCP_SERVICE_ID_SET) && !is_response) {
+ offset = dissect_pn_uint16(tvb, offset, pinfo, tree, hf_pn_dcp_block_qualifier, &block_qualifier);
+ proto_item_append_text(block_item, ", BlockQualifier: %s", val_to_str(block_qualifier, pn_dcp_block_qualifier, "Unknown"));
+ block_length -= 2;
+ }
/* DeviceInitiativeValue */
offset = dissect_pn_uint16(tvb, offset, pinfo, tree, hf_pn_dcp_deviceinitiative_value, &value);
- pn_append_info(pinfo, dcp_item, ", DeviceInitiative");
- proto_item_append_text(block_item, "DeviceInitiative/DeviceInitiative");
-
return offset;
}
@@ -642,7 +696,7 @@ dissect_PNDCP_Suboption_DeviceInitiative(tvbuff_t *tvb, int offset, packet_info
static int
dissect_PNDCP_Suboption_All(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree *tree, proto_item *block_item, proto_item *dcp_item,
- gboolean is_response _U_)
+ guint8 service_id _U_, gboolean is_response _U_)
{
guint8 suboption;
guint16 block_length;
@@ -668,7 +722,7 @@ dissect_PNDCP_Suboption_All(tvbuff_t *tvb, int offset, packet_info *pinfo,
static int
dissect_PNDCP_Suboption_Manuf(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree *tree, proto_item *block_item, proto_item *dcp_item,
- gboolean is_response _U_)
+ guint8 service_id _U_, gboolean is_response _U_)
{
guint8 suboption;
guint16 block_length;
@@ -692,7 +746,7 @@ dissect_PNDCP_Suboption_Manuf(tvbuff_t *tvb, int offset, packet_info *pinfo,
static int
dissect_PNDCP_Block(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree *tree, proto_item *dcp_item,
- gboolean is_response)
+ guint8 service_id, gboolean is_response)
{
guint8 option;
proto_item *block_item;
@@ -709,30 +763,27 @@ dissect_PNDCP_Block(tvbuff_t *tvb, int offset, packet_info *pinfo,
switch(option) {
case(PNDCP_OPTION_IP):
- offset = dissect_PNDCP_Suboption_IP(tvb, offset, pinfo, block_tree, block_item, dcp_item, is_response);
+ offset = dissect_PNDCP_Suboption_IP(tvb, offset, pinfo, block_tree, block_item, dcp_item, service_id, is_response);
break;
case(PNDCP_OPTION_DEVICE):
- offset = dissect_PNDCP_Suboption_Device(tvb, offset, pinfo, block_tree, block_item, dcp_item, is_response);
+ offset = dissect_PNDCP_Suboption_Device(tvb, offset, pinfo, block_tree, block_item, dcp_item, service_id, is_response);
break;
case(PNDCP_OPTION_DHCP):
- offset = dissect_PNDCP_Suboption_DHCP(tvb, offset, pinfo, block_tree, block_item, dcp_item, is_response);
- break;
- case(PNDCP_OPTION_LLDP):
- offset = dissect_PNDCP_Suboption_LLDP(tvb, offset, pinfo, block_tree, block_item, dcp_item, is_response);
+ offset = dissect_PNDCP_Suboption_DHCP(tvb, offset, pinfo, block_tree, block_item, dcp_item, service_id, is_response);
break;
case(PNDCP_OPTION_CONTROL):
- offset = dissect_PNDCP_Suboption_Control(tvb, offset, pinfo, block_tree, block_item, dcp_item, is_response);
+ offset = dissect_PNDCP_Suboption_Control(tvb, offset, pinfo, block_tree, block_item, dcp_item, service_id, is_response);
break;
case(PNDCP_OPTION_DEVICEINITIATIVE):
- offset = dissect_PNDCP_Suboption_DeviceInitiative(tvb, offset, pinfo, block_tree, block_item, dcp_item, is_response);
+ offset = dissect_PNDCP_Suboption_DeviceInitiative(tvb, offset, pinfo, block_tree, block_item, dcp_item, service_id, is_response);
break;
case(PNDCP_OPTION_ALLSELECTOR):
- offset = dissect_PNDCP_Suboption_All(tvb, offset, pinfo, block_tree, block_item, dcp_item, is_response);
+ offset = dissect_PNDCP_Suboption_All(tvb, offset, pinfo, block_tree, block_item, dcp_item, service_id, is_response);
break;
case(PNDCP_OPTION_MANUF_X80):
case(PNDCP_OPTION_MANUF_X81):
default:
- offset = dissect_PNDCP_Suboption_Manuf(tvb, offset, pinfo, block_tree, block_item, dcp_item, is_response);
+ offset = dissect_PNDCP_Suboption_Manuf(tvb, offset, pinfo, block_tree, block_item, dcp_item, service_id, is_response);
}
proto_item_set_len(block_item, offset-ori_offset);
@@ -785,7 +836,6 @@ dissect_PNDCP_PDU(tvbuff_t *tvb,
break;
case(PNDCP_SERVICE_ID_HELLO):
pn_append_info(pinfo, dcp_item, "Hello");
- is_response = TRUE;
break;
default:
offset = dissect_pn_undecoded(tvb, offset, pinfo, tree, tvb_length_remaining(tvb, offset));
@@ -821,7 +871,7 @@ dissect_PNDCP_PDU(tvbuff_t *tvb,
offset = dissect_PNDCP_Option(tvb, offset, pinfo,
tree, dcp_item, hf_pn_dcp_option, TRUE /* append_col */);
} else {
- offset = dissect_PNDCP_Block(tvb, offset, pinfo, tree, dcp_item, is_response);
+ offset = dissect_PNDCP_Block(tvb, offset, pinfo, tree, dcp_item, service_id, is_response);
}
/* prevent an infinite loop */
if(offset <= ori_offset || data_length < (offset - ori_offset)) {
@@ -894,14 +944,14 @@ proto_register_pn_dcp (void)
{ "Option", "pn_dcp.option", FT_UINT8, BASE_DEC, VALS(pn_dcp_option), 0x0, "", HFILL }},
{ &hf_pn_dcp_suboption,
{ "Suboption", "pn_dcp.suboption", FT_UINT8, BASE_DEC, NULL, 0x0, "", HFILL }},
- { &hf_pn_dcp_result,
- { "Result", "pn_dcp.result", FT_UINT8, BASE_DEC, VALS(pn_dcp_result), 0x0, "", HFILL }},
+ { &hf_pn_dcp_block_error,
+ { "BlockError", "pn_dcp.block_error", FT_UINT8, BASE_DEC, VALS(pn_dcp_block_error), 0x0, "", HFILL }},
{ &hf_pn_dcp_block,
{ "Block", "pn_dcp.block", FT_NONE, BASE_NONE, NULL, 0x0, "", HFILL }},
- { &hf_pn_dcp_req_status,
- { "Status", "pn_dcp.req_status", FT_UINT16, BASE_DEC, VALS(pn_dcp_req_status), 0x0, "", HFILL }},
{ &hf_pn_dcp_block_info,
- { "BlockInfo", "pn_dcp.block_info", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
+ { "BlockInfo", "pn_dcp.block_info", FT_UINT16, BASE_DEC, VALS(pn_dcp_block_info), 0x0, "", HFILL }},
+ { &hf_pn_dcp_block_qualifier,
+ { "BlockQualifier", "pn_dcp.block_qualifier", FT_UINT16, BASE_DEC, VALS(pn_dcp_block_qualifier), 0x0, "", HFILL }},
{ &hf_pn_dcp_suboption_ip,
{ "Suboption", "pn_dcp.suboption_ip", FT_UINT8, BASE_DEC, VALS(pn_dcp_suboption_ip), 0x0, "", HFILL }},
{ &hf_pn_dcp_suboption_ip_block_info,
@@ -910,8 +960,8 @@ proto_register_pn_dcp (void)
{ "IPaddress", "pn_dcp.subobtion_ip_ip", FT_IPv4, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_dcp_suboption_ip_subnetmask,
{ "Subnetmask", "pn_dcp.subobtion_ip_subnetmask", FT_IPv4, BASE_NONE, NULL, 0x0, "", HFILL }},
- { &hf_pn_dcp_suboption_ip_default_router,
- { "Default-router", "pn_dcp.subobtion_ip_default_router", FT_IPv4, BASE_NONE, NULL, 0x0, "", HFILL }},
+ { &hf_pn_dcp_suboption_ip_standard_gateway,
+ { "StandardGateway", "pn_dcp.suboption_ip_standard_gateway", FT_IPv4, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_dcp_suboption_device,
{ "Suboption", "pn_dcp.suboption_device", FT_UINT8, BASE_DEC, VALS(pn_dcp_suboption_device), 0x0, "", HFILL }},
@@ -924,7 +974,7 @@ proto_register_pn_dcp (void)
{ &hf_pn_dcp_suboption_device_id,
{ "DeviceID", "pn_dcp.suboption_device_id", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_dcp_suboption_device_role,
- { "Device-role", "pn_dcp.suboption_device_role", FT_UINT8, BASE_HEX, NULL, 0x0, "", HFILL }},
+ { "DeviceRoleDetails", "pn_dcp.suboption_device_role", FT_UINT8, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_dcp_suboption_device_aliasname,
{ "AliasName", "pn_dcp.suboption_device_aliasname", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL }},
@@ -933,13 +983,10 @@ proto_register_pn_dcp (void)
{ &hf_pn_dcp_suboption_dhcp_device_id,
{ "Device ID", "pn_dcp.suboption_dhcp_device_id", FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL }},
- { &hf_pn_dcp_suboption_lldp,
- { "Suboption", "pn_dcp.suboption_lldp", FT_UINT8, BASE_DEC, VALS(pn_dcp_suboption_lldp), 0x0, "", HFILL }},
-
{ &hf_pn_dcp_suboption_control,
{ "Suboption", "pn_dcp.suboption_control", FT_UINT8, BASE_DEC, VALS(pn_dcp_suboption_control), 0x0, "", HFILL }},
- { &hf_pn_dcp_suboption_control_status,
- { "ResponseStatus", "pn_dcp.suboption_control_status", FT_UINT8, BASE_DEC, VALS(pn_dcp_option), 0x0, "", HFILL }},
+ { &hf_pn_dcp_suboption_control_response,
+ { "Response", "pn_dcp.suboption_control_response", FT_UINT8, BASE_DEC, VALS(pn_dcp_option), 0x0, "", HFILL }},
{ &hf_pn_dcp_suboption_deviceinitiative,
{ "Suboption", "pn_dcp.suboption_deviceinitiative", FT_UINT8, BASE_DEC, VALS(pn_dcp_suboption_deviceinitiative), 0x0, "", HFILL }},