diff -uNr ethereal-0.10.0a/packet-enip.c my-dir/packet-enip.c
--- ethereal-0.10.0a/packet-enip.c	2003-10-08 17:44:33.000000000 -0500
+++ my-dir/packet-enip.c	2004-01-16 10:11:33.000000000 -0600
@@ -2061,98 +2061,105 @@
 
    /* In the interest of speed, if "tree" is NULL, don't do any work not
       necessary to generate protocol tree items. */
-   if (tree) {
+   if( tree )
+   {
+      int   encap_cmd_offset = 0;
 
       /* create display subtree for the protocol */
       ti = proto_tree_add_item(tree, proto_cipencap, tvb, 0, -1, FALSE);
 
       cipencap_tree = proto_item_add_subtree(ti, ett_cipencap);
 
-      /* Add encapsulation header tree */
-      encaph     = proto_tree_add_text( cipencap_tree, tvb, 0, 24, "Encapsulation Header");
-      headertree = proto_item_add_subtree(encaph, ett_cipencaph);
+      while( tvb_reported_length( tvb ) > encap_cmd_offset )
+      {
 
-      /* CIP header information */
-      proto_tree_add_uint(headertree, hf_enip_command, tvb, 0, 2, encap_cmd);
+         /* Add encapsulation header tree */
+         encaph     = proto_tree_add_text( cipencap_tree, tvb, 0 + encap_cmd_offset, 24, "Encapsulation Header");
+         headertree = proto_item_add_subtree(encaph, ett_cipencaph);
 
-      encap_data_length = tvb_get_letohs( tvb, 2 );
-      proto_tree_add_text( headertree, tvb, 2, 2, "Length: %u", encap_data_length );
+         /* CIP header information */
+         proto_tree_add_uint( headertree, hf_enip_command, tvb, 0 + encap_cmd_offset, 2, encap_cmd );
 
-      proto_tree_add_text( headertree, tvb, 4, 4, "Session Handle: 0x%08X",
-                          tvb_get_letohl( tvb, 4 ) );
+         encap_data_length = tvb_get_letohs( tvb, 2 + encap_cmd_offset );
+         proto_tree_add_text( headertree, tvb, 2 + encap_cmd_offset, 2, "Length: %u", encap_data_length );
 
-      status = tvb_get_letohl( tvb, 8 );
-      proto_tree_add_text( headertree, tvb, 8, 4, "Status: %s (0x%08X)",
-                          val_to_str( status, encap_status_vals,
-                                     "Unknown Status Code" ),
-                          status);
+         proto_tree_add_text( headertree, tvb, 4 + encap_cmd_offset, 4, "Session Handle: 0x%08X",
+                              tvb_get_letohl( tvb, 4 + encap_cmd_offset ) );
 
-      add_byte_array_text_to_proto_tree( headertree, tvb, 12, 8, "Sender context: " );
+         status = tvb_get_letohl( tvb, 8 + encap_cmd_offset );
+         proto_tree_add_text( headertree, tvb, 8 + encap_cmd_offset, 4, "Status: %s (0x%08X)",
+                             val_to_str( status, encap_status_vals,
+                                        "Unknown Status Code" ),
+                             status);
 
-      proto_tree_add_text( headertree, tvb, 20, 4, "Options: 0x%08X",
-                          tvb_get_letohl( tvb, 20 ) );
+         add_byte_array_text_to_proto_tree( headertree, tvb, 12 + encap_cmd_offset, 8, "Sender context: " );
 
-      /* Command specific data - create tree */
-      if( encap_data_length )
-      {
-         /* The packet have some command specific data, buid a sub tree for it */
+         proto_tree_add_text( headertree, tvb, 20 + encap_cmd_offset, 4, "Options: 0x%08X",
+                              tvb_get_letohl( tvb, 20 + encap_cmd_offset ) );
+
+         /* Command specific data - create tree */
+         if( encap_data_length )
+         {
+            /* The packet have some command specific data, buid a sub tree for it */
 
-         csf = proto_tree_add_text( cipencap_tree, tvb, 24, encap_data_length,
-                                   "Command Specific Data");
+            csf = proto_tree_add_text( cipencap_tree, tvb, 24 + encap_cmd_offset, encap_data_length,
+                                      "Command Specific Data");
 
-         csftree = proto_item_add_subtree(csf, ett_csf);
+            csftree = proto_item_add_subtree(csf, ett_csf);
 
-         switch( encap_cmd )
-         {
-            case NOP:
-               show_cdf( encap_cmd, tvb, pinfo, csftree, 24 );
-               break;
+            switch( encap_cmd )
+            {
+               case LIST_SERVICES:
+                  show_cdf( encap_cmd, tvb, pinfo, csftree, 24 + encap_cmd_offset );
+                  break;
+
+               case LIST_IDENTITY:
+                  show_cdf( encap_cmd, tvb, pinfo, csftree, 24 + encap_cmd_offset );
+                  break;
 
-            case LIST_SERVICES:
-               show_cdf( encap_cmd, tvb, pinfo, csftree, 24 );
-               break;
+               case LIST_INTERFACES:
+                  show_cdf( encap_cmd, tvb, pinfo, csftree, 24 + encap_cmd_offset );
+                  break;
 
-            case LIST_IDENTITY:
-               show_cdf( encap_cmd, tvb, pinfo, csftree, 24 );
-               break;
+               case REGISTER_SESSION:
+                  proto_tree_add_text( csftree, tvb, 24 + encap_cmd_offset, 2, "Protocol Version: 0x%04X",
+                                      tvb_get_letohs( tvb, 24 + encap_cmd_offset ) );
 
-            case LIST_INTERFACES:
-               show_cdf( encap_cmd, tvb, pinfo, csftree, 24 );
-               break;
+                  proto_tree_add_text( csftree, tvb, 26 + encap_cmd_offset, 2, "Option Flags: 0x%04X",
+                                      tvb_get_letohs( tvb, 26 + encap_cmd_offset ) );
 
-            case REGISTER_SESSION:
-               proto_tree_add_text( csftree, tvb, 24, 2, "Protocol Version: 0x%04X",
-                                   tvb_get_letohs( tvb, 24 ) );
+                  break;
 
-               proto_tree_add_text( csftree, tvb, 26, 2, "Option Flags: 0x%04X",
-                                   tvb_get_letohs( tvb, 26 ) );
+               case UNREGISTER_SESSION:
+                  break;
 
-               break;
+               case SEND_RR_DATA:
+               case SEND_UNIT_DATA:
+                  proto_tree_add_item(csftree, hf_enip_ifacehnd, tvb, 24 + encap_cmd_offset, 4, TRUE);
 
-            case UNREGISTER_SESSION:
-               break;
+                  proto_tree_add_text( csftree, tvb, 28 + encap_cmd_offset, 2, "Timeout: %u",
+                                      tvb_get_letohs( tvb, 28 + encap_cmd_offset ) );
 
-            case SEND_RR_DATA:
-            case SEND_UNIT_DATA:
-               proto_tree_add_item(csftree, hf_enip_ifacehnd, tvb, 24, 4, TRUE);
+                  show_cdf( encap_cmd, tvb, pinfo, csftree, 30 + encap_cmd_offset );
+                  break;
 
-               proto_tree_add_text( csftree, tvb, 28, 2, "Timeout: %u",
-                                   tvb_get_letohs( tvb, 28 ) );
+               case NOP:
+               case INDICATE_STATUS:
+               case CANCEL:
+               default:
 
-               show_cdf( encap_cmd, tvb, pinfo, csftree, 30 );
-               break;
+                  /* Can not decode - Just show the data */
+                  add_byte_array_text_to_proto_tree( csftree, tvb, 24 + encap_cmd_offset, encap_data_length, "Encap Command Data: " );
+                  break;
 
-            case INDICATE_STATUS:
-            case CANCEL:
-            default:
+            } /* end of switch() */
 
-               /* Can not decode - Just show the data */
-               add_byte_array_text_to_proto_tree( headertree, tvb, 24, encap_data_length, "Encap Data: " );
-               break;
+         } /* end of if( encapsulated data ) */
 
-         } /* end of switch() */
+         /* Next encap command */
+         encap_cmd_offset += encap_data_length + 24;
 
-      } /* end of if( encapsulated data ) */
+      } /* end of while() */
 
    }
 
