From Jared Renzullo:
[obnox/wireshark/wip.git] / epan / dissectors / packet-cops.c
index e6ca6e5f26c096b2b2ddd302fda6fda60988689e..3ea72137886d21de70818f4e7548636cecc370ad 100644 (file)
@@ -14,7 +14,7 @@
  *    Based on PKT-SP-DQOS-I09-040402 (April 2, 2004)
  *
  *    PacketCable Multimedia Specification
- *    Based on PKT-SP-MM-I02-040930
+ *    Based on PKT-SP-MM-I04-080522
  *
  *    www.packetcable.com
  *
@@ -712,12 +712,17 @@ static gint hf_cops_pcmm_max_sustained_traffic_rate = -1;
 static gint hf_cops_pcmm_max_traffic_burst = -1;
 static gint hf_cops_pcmm_min_reserved_traffic_rate = -1;
 static gint hf_cops_pcmm_ass_min_rtr_packet_size = -1;
+static gint hf_cops_pcmm_max_concat_burst = -1;
+static gint hf_cops_pcmm_req_att_mask = -1;
+static gint hf_cops_pcmm_forbid_att_mask = -1;
 static gint hf_cops_pcmm_nominal_polling_interval = -1;
 static gint hf_cops_pcmm_tolerated_poll_jitter = -1;
 static gint hf_cops_pcmm_unsolicited_grant_size = -1;
 static gint hf_cops_pcmm_grants_per_interval = -1;
 static gint hf_cops_pcmm_nominal_grant_interval = -1;
 static gint hf_cops_pcmm_tolerated_grant_jitter = -1;
+static gint hf_cops_pcmm_down_resequencing = -1;
+static gint hf_cops_pcmm_down_peak_traffic_rate = -1;
 static gint hf_cops_pcmm_max_downstream_latency = -1;
 static gint hf_cops_pcmm_volume_based_usage_limit = -1;
 static gint hf_cops_pcmm_time_based_usage_limit = -1;
@@ -733,6 +738,7 @@ static gint hf_cops_pcmm_psid = -1;
 static gint hf_cops_pcmm_synch_options_report_type = -1;
 static gint hf_cops_pcmm_synch_options_synch_type = -1;
 static gint hf_cops_pcmm_msg_receipt_key = -1;
+static gint hf_cops_pcmm_userid = -1;
 
 
 /* Initialize the subtree pointers */
@@ -890,10 +896,8 @@ dissect_cops_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
   guint16 client_type;
   int object_len;
 
-  if (check_col(pinfo->cinfo, COL_PROTOCOL))
-    col_set_str(pinfo->cinfo, COL_PROTOCOL, "COPS");
-  if (check_col(pinfo->cinfo, COL_INFO))
-    col_clear(pinfo->cinfo, COL_INFO);
+  col_set_str(pinfo->cinfo, COL_PROTOCOL, "COPS");
+  col_clear(pinfo->cinfo, COL_INFO);
 
   op_code = tvb_get_guint8(tvb, 1);
   if (check_col(pinfo->cinfo, COL_INFO))
@@ -1650,22 +1654,22 @@ void proto_register_cops(void)
     },
     { &hf_cops_in_int_ipv4,
       { "IPv4 address",           "cops.in-int.ipv4",
-      FT_IPv4, 0, NULL, 0,
+      FT_IPv4, BASE_NONE, NULL, 0,
       "IPv4 address in COPS IN-Int object", HFILL }
     },
     { &hf_cops_in_int_ipv6,
       { "IPv6 address",           "cops.in-int.ipv6",
-      FT_IPv6, 0, NULL, 0,
+      FT_IPv6, BASE_NONE, NULL, 0,
       "IPv6 address in COPS IN-Int object", HFILL }
     },
     { &hf_cops_out_int_ipv4,
       { "IPv4 address",           "cops.out-int.ipv4",
-      FT_IPv4, 0, NULL, 0,
+      FT_IPv4, BASE_NONE, NULL, 0,
       "IPv4 address in COPS OUT-Int object", HFILL }
     },
     { &hf_cops_out_int_ipv6,
       { "IPv6 address",           "cops.out-int.ipv6",
-      FT_IPv6, 0, NULL, 0,
+      FT_IPv6, BASE_NONE, NULL, 0,
       "IPv6 address in COPS OUT-Int", HFILL }
     },
     { &hf_cops_int_ifindex,
@@ -1720,22 +1724,22 @@ void proto_register_cops(void)
     },
     { &hf_cops_pdprediraddr_ipv4,
       { "IPv4 address",           "cops.pdprediraddr.ipv4",
-      FT_IPv4, 0, NULL, 0,
+      FT_IPv4, BASE_NONE, NULL, 0,
       "IPv4 address in COPS PDPRedirAddr object", HFILL }
     },
     { &hf_cops_pdprediraddr_ipv6,
       { "IPv6 address",           "cops.pdprediraddr.ipv6",
-      FT_IPv6, 0, NULL, 0,
+      FT_IPv6, BASE_NONE, NULL, 0,
       "IPv6 address in COPS PDPRedirAddr object", HFILL }
     },
     { &hf_cops_lastpdpaddr_ipv4,
       { "IPv4 address",           "cops.lastpdpaddr.ipv4",
-      FT_IPv4, 0, NULL, 0,
+      FT_IPv4, BASE_NONE, NULL, 0,
       "IPv4 address in COPS LastPDPAddr object", HFILL }
     },
     { &hf_cops_lastpdpaddr_ipv6,
       { "IPv6 address",           "cops.lastpdpaddr.ipv6",
-      FT_IPv6, 0, NULL, 0,
+      FT_IPv6, BASE_NONE, NULL, 0,
       "IPv6 address in COPS LastPDPAddr object", HFILL }
     },
     { &hf_cops_pdp_tcp_port,
@@ -1778,262 +1782,262 @@ void proto_register_cops(void)
       FT_UINT16, BASE_HEX, NULL, 0,
       "Error Sub-code in Error object", HFILL }
     },
-  { &hf_cops_prid_oid, { "PRID Instance Identifier", "cops.prid.instance_id", FT_OID, BASE_NONE, NULL, 0, "", HFILL } },
-  { &hf_cops_pprid_oid, { "Prefix Identifier", "cops.pprid.prefix_id", FT_OID, BASE_NONE, NULL, 0, "", HFILL } },
-  { &hf_cops_errprid_oid, { "ErrorPRID Instance Identifier", "cops.errprid.instance_id", FT_OID, BASE_NONE, NULL, 0, "", HFILL } },
-  { &hf_cops_epd_unknown, { "EPD Unknown Data", "cops.epd.unknown", FT_BYTES, BASE_NONE, NULL, 0, "", HFILL } },
-  { &hf_cops_epd_null, { "EPD Null Data", "cops.epd.null", FT_BYTES, BASE_NONE, NULL, 0, "", HFILL } },
-  { &hf_cops_epd_int, { "EPD Integer Data", "cops.epd.int", FT_INT64, BASE_DEC, NULL, 0, "", HFILL } },
-  { &hf_cops_epd_octets, { "EPD Octet String Data", "cops.epd.octets", FT_BYTES, BASE_NONE, NULL, 0, "", HFILL } },
-  { &hf_cops_epd_oid, { "EPD OID Data", "cops.epd.oid", FT_OID, BASE_NONE, NULL, 0, "", HFILL } },
-  { &hf_cops_epd_ipv4, { "EPD IPAddress Data", "cops.epd.ipv4", FT_IPv4, BASE_NONE, NULL, 0, "", HFILL } },
-  { &hf_cops_epd_u32, { "EPD Unsigned32 Data", "cops.epd.unsigned32", FT_UINT64, BASE_DEC, NULL, 0, "", HFILL } },
-  { &hf_cops_epd_ticks, { "EPD TimeTicks Data", "cops.epd.timeticks", FT_UINT64, BASE_DEC, NULL, 0, "", HFILL } },
-  { &hf_cops_epd_opaque, { "EPD Opaque Data", "cops.epd.opaque", FT_BYTES, BASE_NONE, NULL, 0, "", HFILL } },
-  { &hf_cops_epd_i64, { "EPD Inetger64 Data", "cops.epd.integer64", FT_INT64, BASE_DEC, NULL, 0, "", HFILL } },
-  { &hf_cops_epd_u64, { "EPD Unsigned64 Data", "cops.epd.unsigned64", FT_UINT64, BASE_DEC, NULL, 0, "", HFILL } },
+  { &hf_cops_prid_oid, { "PRID Instance Identifier", "cops.prid.instance_id", FT_OID, BASE_NONE, NULL, 0, NULL, HFILL } },
+  { &hf_cops_pprid_oid, { "Prefix Identifier", "cops.pprid.prefix_id", FT_OID, BASE_NONE, NULL, 0, NULL, HFILL } },
+  { &hf_cops_errprid_oid, { "ErrorPRID Instance Identifier", "cops.errprid.instance_id", FT_OID, BASE_NONE, NULL, 0, NULL, HFILL } },
+  { &hf_cops_epd_unknown, { "EPD Unknown Data", "cops.epd.unknown", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } },
+  { &hf_cops_epd_null, { "EPD Null Data", "cops.epd.null", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } },
+  { &hf_cops_epd_int, { "EPD Integer Data", "cops.epd.int", FT_INT64, BASE_DEC, NULL, 0, NULL, HFILL } },
+  { &hf_cops_epd_octets, { "EPD Octet String Data", "cops.epd.octets", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } },
+  { &hf_cops_epd_oid, { "EPD OID Data", "cops.epd.oid", FT_OID, BASE_NONE, NULL, 0, NULL, HFILL } },
+  { &hf_cops_epd_ipv4, { "EPD IPAddress Data", "cops.epd.ipv4", FT_IPv4, BASE_NONE, NULL, 0, NULL, HFILL } },
+  { &hf_cops_epd_u32, { "EPD Unsigned32 Data", "cops.epd.unsigned32", FT_UINT64, BASE_DEC, NULL, 0, NULL, HFILL } },
+  { &hf_cops_epd_ticks, { "EPD TimeTicks Data", "cops.epd.timeticks", FT_UINT64, BASE_DEC, NULL, 0, NULL, HFILL } },
+  { &hf_cops_epd_opaque, { "EPD Opaque Data", "cops.epd.opaque", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } },
+  { &hf_cops_epd_i64, { "EPD Inetger64 Data", "cops.epd.integer64", FT_INT64, BASE_DEC, NULL, 0, NULL, HFILL } },
+  { &hf_cops_epd_u64, { "EPD Unsigned64 Data", "cops.epd.unsigned64", FT_UINT64, BASE_DEC, NULL, 0, NULL, HFILL } },
 
     /* Added for PacketCable */
 
     { &hf_cops_subtree,
       { "Object Subtree", "cops.pc_subtree",
         FT_NONE, BASE_NONE, NULL, 0,
-        "Object Subtree", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_ds_field,
       { "DS Field (DSCP or TOS)", "cops.pc_ds_field",
         FT_UINT8, BASE_HEX, NULL, 0x00,
-        "DS Field (DSCP or TOS)", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_direction,
       { "Direction", "cops.pc_direction",
         FT_UINT8, BASE_HEX, NULL, 0x00,
-        "Direction", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_gate_spec_flags,
       { "Flags", "cops.pc_gate_spec_flags",
         FT_UINT8, BASE_HEX, NULL, 0x00,
-        "Flags", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_protocol_id,
       { "Protocol ID", "cops.pc_protocol_id",
         FT_UINT8, BASE_HEX, NULL, 0x00,
-        "Protocol ID", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_session_class,
       { "Session Class", "cops.pc_session_class",
         FT_UINT8, BASE_HEX, NULL, 0x00,
-        "Session Class", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_algorithm,
       { "Algorithm", "cops.pc_algorithm",
         FT_UINT16, BASE_HEX, NULL, 0x00,
-        "Algorithm", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_cmts_ip_port,
       { "CMTS IP Port", "cops.pc_cmts_ip_port",
         FT_UINT16, BASE_HEX, NULL, 0x00,
-        "CMTS IP Port", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_prks_ip_port,
       { "PRKS IP Port", "cops.pc_prks_ip_port",
         FT_UINT16, BASE_HEX, NULL, 0x00,
-        "PRKS IP Port", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_srks_ip_port,
       { "SRKS IP Port", "cops.pc_srks_ip_port",
         FT_UINT16, BASE_HEX, NULL, 0x00,
-        "SRKS IP Port", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_dest_port,
       { "Destination IP Port", "cops.pc_dest_port",
         FT_UINT16, BASE_HEX, NULL, 0x00,
-        "Destination IP Port", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_packetcable_err_code,
       { "Error Code", "cops.pc_packetcable_err_code",
         FT_UINT16, BASE_HEX, NULL, 0x00,
-        "Error Code", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_packetcable_sub_code,
       { "Error Sub Code", "cops.pc_packetcable_sub_code",
         FT_UINT16, BASE_HEX, NULL, 0x00,
-        "Error Sub Code", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_remote_flags,
       { "Flags", "cops.pc_remote_flags",
         FT_UINT16, BASE_HEX, NULL, 0x00,
-        "Flags", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_close_subcode,
       { "Reason Sub Code", "cops.pc_close_subcode",
         FT_UINT16, BASE_HEX, NULL, 0x00,
-        "Reason Sub Code", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_gate_command_type,
       { "Gate Command Type", "cops.pc_gate_command_type",
         FT_UINT16, BASE_HEX, NULL, 0x00,
-        "Gate Command Type", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_reason_code,
       { "Reason Code", "cops.pc_reason_code",
         FT_UINT16, BASE_HEX, NULL, 0x00,
-        "Reason Code", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_delete_subcode,
       { "Reason Sub Code", "cops.pc_delete_subcode",
         FT_UINT16, BASE_HEX, NULL, 0x00,
-        "Reason Sub Code", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_src_port,
       { "Source IP Port", "cops.pc_src_port",
         FT_UINT16, BASE_HEX, NULL, 0x00,
-        "Source IP Port", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_t1_value,
       { "Timer T1 Value (sec)", "cops.pc_t1_value",
         FT_UINT16, BASE_HEX, NULL, 0x00,
-        "Timer T1 Value (sec)", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_t7_value,
       { "Timer T7 Value (sec)", "cops.pc_t7_value",
         FT_UINT16, BASE_HEX, NULL, 0x00,
-        "Timer T7 Value (sec)", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_t8_value,
       { "Timer T8 Value (sec)", "cops.pc_t8_value",
         FT_UINT16, BASE_HEX, NULL, 0x00,
-        "Timer T8 Value (sec)", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_transaction_id,
       { "Transaction Identifier", "cops.pc_transaction_id",
         FT_UINT16, BASE_HEX, NULL, 0x00,
-        "Transaction Identifier", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_cmts_ip,
       { "CMTS IP Address", "cops.pc_cmts_ip",
-        FT_IPv4, BASE_HEX, NULL, 0x00,
-        "CMTS IP Address", HFILL }
+        FT_IPv4, BASE_NONE, NULL, 0x00,
+        NULL, HFILL }
     },
     { &hf_cops_pc_prks_ip,
       { "PRKS IP Address", "cops.pc_prks_ip",
-        FT_IPv4, BASE_HEX, NULL, 0x00,
-        "PRKS IP Address", HFILL }
+        FT_IPv4, BASE_NONE, NULL, 0x00,
+        NULL, HFILL }
     },
     { &hf_cops_pc_srks_ip,
       { "SRKS IP Address", "cops.pc_srks_ip",
-        FT_IPv4, BASE_HEX, NULL, 0x00,
-        "SRKS IP Address", HFILL }
+        FT_IPv4, BASE_NONE, NULL, 0x00,
+        NULL, HFILL }
     },
     { &hf_cops_pc_dfcdc_ip,
       { "DF IP Address CDC", "cops.pc_dfcdc_ip",
-        FT_IPv4, BASE_HEX, NULL, 0x00,
-        "DF IP Address CDC", HFILL }
+        FT_IPv4, BASE_NONE, NULL, 0x00,
+        NULL, HFILL }
     },
     { &hf_cops_pc_dfccc_ip,
       { "DF IP Address CCC", "cops.pc_dfccc_ip",
-        FT_IPv4, BASE_HEX, NULL, 0x00,
-        "DF IP Address CCC", HFILL }
+        FT_IPv4, BASE_NONE, NULL, 0x00,
+        NULL, HFILL }
     },
     { &hf_cops_pc_dfcdc_ip_port,
       { "DF IP Port CDC", "cops.pc_dfcdc_ip_port",
         FT_UINT16, BASE_HEX, NULL, 0x00,
-        "DF IP Port CDC", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_dfccc_ip_port,
       { "DF IP Port CCC", "cops.pc_dfccc_ip_port",
         FT_UINT16, BASE_HEX, NULL, 0x00,
-        "DF IP Port CCC", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_dfccc_id,
       { "CCC ID", "cops.pc_dfccc_id",
         FT_UINT32, BASE_DEC, NULL, 0x00,
-        "CCC ID", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_activity_count,
       { "Count", "cops.pc_activity_count",
         FT_UINT32, BASE_HEX, NULL, 0x00,
-        "Count", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_dest_ip,
       { "Destination IP Address", "cops.pc_dest_ip",
-        FT_IPv4, BASE_HEX, NULL, 0x00,
-        "Destination IP Address", HFILL }
+        FT_IPv4, BASE_NONE, NULL, 0x00,
+        NULL, HFILL }
     },
     { &hf_cops_pc_gate_id,
       { "Gate Identifier", "cops.pc_gate_id",
         FT_UINT32, BASE_HEX, NULL, 0x00,
-        "Gate Identifier", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_max_packet_size,
       { "Maximum Packet Size", "cops.pc_max_packet_size",
         FT_UINT32, BASE_HEX, NULL, 0x00,
-        "Maximum Packet Size", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_min_policed_unit,
       { "Minimum Policed Unit", "cops.pc_min_policed_unit",
         FT_UINT32, BASE_HEX, NULL, 0x00,
-        "Minimum Policed Unit", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_peak_data_rate,
       { "Peak Data Rate", "cops.pc_peak_data_rate",
         FT_FLOAT, BASE_NONE, NULL, 0x00,
-        "Peak Data Rate", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_spec_rate,
       { "Rate", "cops.pc_spec_rate",
         FT_FLOAT, BASE_NONE, NULL, 0x00,
-        "Rate", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_remote_gate_id,
       { "Remote Gate ID", "cops.pc_remote_gate_id",
         FT_UINT32, BASE_HEX, NULL, 0x00,
-        "Remote Gate ID", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_reserved,
       { "Reserved", "cops.pc_reserved",
         FT_UINT32, BASE_HEX, NULL, 0x00,
-        "Reserved", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_key,
       { "Security Key", "cops.pc_key",
         FT_UINT32, BASE_HEX, NULL, 0x00,
-        "Security Key", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_slack_term,
       { "Slack Term", "cops.pc_slack_term",
         FT_UINT32, BASE_HEX, NULL, 0x00,
-        "Slack Term", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_src_ip,
       { "Source IP Address", "cops.pc_src_ip",
-        FT_IPv4, BASE_HEX, NULL, 0x00,
-        "Source IP Address", HFILL }
+        FT_IPv4, BASE_NONE, NULL, 0x00,
+        NULL, HFILL }
     },
     { &hf_cops_pc_subscriber_id_ipv4,
       { "Subscriber Identifier (IPv4)", "cops.pc_subscriber_id4",
-        FT_IPv4, BASE_HEX, NULL, 0x00,
-        "Subscriber Identifier (IPv4)", HFILL }
+        FT_IPv4, BASE_NONE, NULL, 0x00,
+        NULL, HFILL }
     },
     { &hf_cops_pc_subscriber_id_ipv6,
       { "Subscriber Identifier (IPv6)", "cops.pc_subscriber_id6",
-        FT_IPv6, BASE_HEX, NULL, 0x00,
-        "Subscriber Identifier (IPv6)", HFILL }
+        FT_IPv6, BASE_NONE, NULL, 0x00,
+        NULL, HFILL }
     },
     { &hf_cops_pc_token_bucket_rate,
       { "Token Bucket Rate", "cops.pc_token_bucket_rate",
         FT_FLOAT, BASE_NONE, NULL, 0x00,
-        "Token Bucket Rate", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_token_bucket_size,
       { "Token Bucket Size", "cops.pc_token_bucket_size",
         FT_FLOAT, BASE_NONE, NULL, 0x00,
-        "Token Bucket Size", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_bcid,
       { "Billing Correlation ID", "cops.pc_bcid",
         FT_UINT32, BASE_HEX, NULL, 0x00,
-        "Billing Correlation ID", HFILL }
+        NULL, HFILL }
     },
     { &hf_cops_pc_bcid_ts,
       { "BDID Timestamp", "cops.pc_bcid_ts",
@@ -2130,22 +2134,22 @@ void proto_register_cops(void)
     },
     { &hf_cops_pcmm_classifier_src_addr,
            { "Source address", "cops.pc_mm_classifier_src_addr",
-           FT_IPv4, 0, NULL, 0,
+           FT_IPv4, BASE_NONE, NULL, 0,
            "PacketCable Multimedia Classifier Source IP Address", HFILL }
     },
     { &hf_cops_pcmm_classifier_src_mask,
            { "Source mask", "cops.pc_mm_classifier_src_mask",
-           FT_IPv4, 0, NULL, 0,
+           FT_IPv4, BASE_NONE, NULL, 0,
            "PacketCable Multimedia Classifier Source Mask", HFILL }
     },
     { &hf_cops_pcmm_classifier_dst_addr,
            { "Destination address", "cops.pc_mm_classifier_dst_addr",
-           FT_IPv4, 0, NULL, 0,
+           FT_IPv4, BASE_NONE, NULL, 0,
            "PacketCable Multimedia Classifier Destination IP Address", HFILL }
     },
     { &hf_cops_pcmm_classifier_dst_mask,
            { "Destination address", "cops.pc_mm_classifier_dst_mask",
-           FT_IPv4, 0, NULL, 0,
+           FT_IPv4, BASE_NONE, NULL, 0,
            "PacketCable Multimedia Classifier Destination Mask", HFILL }
     },
     { &hf_cops_pcmm_classifier_src_port,
@@ -2202,7 +2206,7 @@ void proto_register_cops(void)
 
     { &hf_cops_pcmm_docsis_scn,
            { "Service Class Name", "cops.pc_mm_docsis_scn",
-           FT_STRINGZ, BASE_DEC, NULL, 0,
+           FT_STRINGZ, BASE_NONE, NULL, 0,
            "PacketCable Multimedia DOCSIS Service Class Name", HFILL }
     },
 
@@ -2242,6 +2246,21 @@ void proto_register_cops(void)
            FT_UINT16, BASE_DEC, NULL, 0,
            "PacketCable Multimedia Committed Envelope Assumed Minimum Reserved Traffic Rate Packet Size", HFILL }
     },
+    { &hf_cops_pcmm_max_concat_burst,
+               { "Maximum Concatenated Burst", "cops.pc_mm_mcburst",
+               FT_UINT16, BASE_DEC, NULL, 0,
+               "PacketCable Multimedia Committed Envelope Maximum Concatenated Burst", HFILL }
+    },
+    { &hf_cops_pcmm_req_att_mask,
+               { "Required Attribute Mask", "cops.pc_mm_ramask",
+               FT_UINT16, BASE_DEC, NULL, 0,
+               "PacketCable Multimedia Committed Envelope Required Attribute Mask", HFILL }
+       },
+       { &hf_cops_pcmm_forbid_att_mask,
+               { "Forbidden Attribute Mask", "cops.pc_mm_famask",
+               FT_UINT16, BASE_DEC, NULL, 0,
+               "PacketCable Multimedia Committed Envelope Forbidden Attribute Mask", HFILL }
+       },
 
     { &hf_cops_pcmm_nominal_polling_interval,
            { "Nominal Polling Interval", "cops.pc_mm_npi",
@@ -2276,6 +2295,18 @@ void proto_register_cops(void)
            "PacketCable Multimedia Tolerated Grant Jitter", HFILL }
     },
 
+    { &hf_cops_pcmm_down_resequencing,
+               { "Downstream Resequencing", "cops.pc_mm_downres",
+               FT_UINT32, BASE_DEC, NULL, 0,
+               "PacketCable Multimedia Downstream Resequencing", HFILL }
+       },
+
+       { &hf_cops_pcmm_down_peak_traffic_rate,
+               { "Downstream Peak Traffic Rate", "cops.pc_mm_downpeak",
+               FT_UINT32, BASE_DEC, NULL, 0,
+               "PacketCable Multimedia Downstream Peak Traffic Rate", HFILL }
+       },
+
     { &hf_cops_pcmm_max_downstream_latency,
            { "Maximum Downstream Latency", "cops.pc_mm_mdl",
            FT_UINT32, BASE_DEC, NULL, 0,
@@ -2302,7 +2333,7 @@ void proto_register_cops(void)
 
     { &hf_cops_pcmm_gate_usage_info,
            { "Gate Usage Info", "cops.pc_mm_gui",
-           FT_UINT32, BASE_DEC, NULL, 0,
+           FT_UINT64, BASE_DEC, NULL, 0,
            "PacketCable Multimedia Gate Usage Info", HFILL }
     },
 
@@ -2360,6 +2391,13 @@ void proto_register_cops(void)
            FT_UINT32, BASE_HEX, NULL, 0,
            "PacketCable Multimedia Msg Receipt Key", HFILL }
     },
+
+    { &hf_cops_pcmm_userid,
+       { "UserID", "cops.pc_mm_userid",
+       FT_STRING, BASE_NONE, NULL, 0,
+       "PacketCable Multimedia UserID", HFILL }
+    },
+
     /* End of addition for PacketCable */
 
   };
@@ -2452,6 +2490,7 @@ void proto_reg_handoff_cops(void)
 #define   FMT_IPv4  2
 #define   FMT_IPv6  3
 #define   FMT_FLT   4
+#define   FMT_STR   5
 
 /* Print the translated information in the display gui in a formatted way
  *
@@ -2464,6 +2503,7 @@ void proto_reg_handoff_cops(void)
  *          2 -> print value as an IPv4 address
  *          3 -> print value as an IPv6 address
  *          4 -> print value as an IEEE float
+ *          5 -> print value as a string
  *
  * This function in combination with the separate function info_to_cops_subtree() for subtrees.
  *
@@ -2473,11 +2513,21 @@ static proto_item *
 info_to_display(tvbuff_t *tvb, proto_item *stt, int offset, int octets, const char *str, const value_string *vsp, int mode,gint *hf_proto_parameter)
 {
      proto_item *pi = NULL;
+     guint8   *codestr;
      guint8   code8  = 0;
      guint16  code16 = 0;
      guint32  codeipv4 = 0;
      guint32  code32 = 0;
-     float    codefl = 0.0;
+     guint64  code64 = 0;
+     float    codefl = 0.0f;
+
+     /* Special section for printing strings */
+        if (mode==FMT_STR) {
+                codestr = tvb_get_ephemeral_string(tvb, offset, octets);
+                pi = proto_tree_add_string_format(stt, *hf_proto_parameter, tvb,
+                offset, octets, codestr, "%-28s : %s", str, codestr);
+                return pi;
+        }
 
      /* Print information elements in the specified way */
      switch (octets) {
@@ -2580,19 +2630,23 @@ info_to_display(tvbuff_t *tvb, proto_item *stt, int offset, int octets, const ch
              break;
 
         /* In case of more than 4 octets.... */
-        default: {
+        default:
+
              if (mode==FMT_HEX) {
                 pi = proto_tree_add_bytes(stt, *hf_proto_parameter,
                    tvb, offset, octets, tvb_get_ptr(tvb, offset,octets));
-            } else if (mode==FMT_IPv6 && octets==16) {
-               pi = proto_tree_add_ipv6(stt, *hf_proto_parameter, tvb, offset, octets,
-                  tvb_get_ptr(tvb, offset, octets));
+             } else if (mode==FMT_IPv6 && octets==16) {
+                pi = proto_tree_add_ipv6(stt, *hf_proto_parameter, tvb, offset, octets,
+                   tvb_get_ptr(tvb, offset, octets));
+             } else if (mode==FMT_DEC && octets==8) {
+                code64 = tvb_get_ntoh64(tvb, offset);
+                pi = proto_tree_add_uint64_format(stt, *hf_proto_parameter, tvb, offset, octets,
+                   code64, "%-28s : %" G_GINT64_MODIFIER "u", str, code64);
              } else {
                 pi = proto_tree_add_uint_format(stt, *hf_proto_parameter,
                    tvb, offset, octets, code32,"%s",str);
-            }
+             }
              break;
-        }
 
      }
      return pi;
@@ -3174,15 +3228,17 @@ cops_classifier(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset, gboolean
        offset += 2;
     }
 
-    /* Priority */
-    info_to_display(tvb,stt,offset,1,"Priority",NULL,FMT_HEX,&hf_cops_pcmm_classifier_priority);
-    offset += 1;
-
     if (extended) {
        /* ClassifierID */
        info_to_display(tvb,stt,offset,2,"ClassifierID",NULL,FMT_HEX,&hf_cops_pcmm_classifier_classifier_id);
        offset += 2;
+    }
+
+    /* Priority */
+    info_to_display(tvb,stt,offset,1,"Priority",NULL,FMT_HEX,&hf_cops_pcmm_classifier_priority);
+    offset += 1;
 
+    if (extended) {
        /* Activation State */
        info_to_display(tvb,stt,offset,1,"Activation State",NULL,FMT_HEX,&hf_cops_pcmm_classifier_activation_state);
        offset += 1;
@@ -3343,9 +3399,15 @@ cops_docsis_service_class_name(tvbuff_t *tvb, proto_tree *st, guint object_len,
      }
 }
 
+/* New functions were made with the i04 suffix to maintain backward compatibility with I03
+*
+*  BEGIN PCMM I04
+*
+*/
+
 /* Cops - Section : Best Effort Service */
 static void
-cops_best_effort_service(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset) {
+cops_best_effort_service_i04(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset) {
      proto_item *ti;
      proto_tree *stt, *object_tree;
 
@@ -3391,10 +3453,18 @@ cops_best_effort_service(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset)
      info_to_display(tvb,object_tree,offset,2,"Assumed Minimum Reserved Traffic Rate Packet Size",NULL,FMT_DEC,&hf_cops_pcmm_ass_min_rtr_packet_size);
      offset += 2;
 
-     /* Reserved */
-     info_to_display(tvb,object_tree,offset,2,"Reserved",NULL,FMT_HEX,&hf_cops_pc_reserved);
+     /* Maximum Concatenated Burst */
+     info_to_display(tvb,object_tree,offset,2,"Maximum Concatenated Burst",NULL,FMT_DEC,&hf_cops_pcmm_max_concat_burst);
      offset += 2;
 
+     /* Required Attribute Mask */
+     info_to_display(tvb,object_tree,offset,4,"Required Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_req_att_mask);
+     offset += 4;
+
+     /* Forbidden Attribute Mask */
+        info_to_display(tvb,object_tree,offset,4,"Forbidden Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_forbid_att_mask);
+        offset += 4;
+
      if (n < 56) return;
 
      /* Reserved Envelope */
@@ -3428,9 +3498,17 @@ cops_best_effort_service(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset)
      info_to_display(tvb,object_tree,offset,2,"Assumed Minimum Reserved Traffic Rate Packet Size",NULL,FMT_DEC,&hf_cops_pcmm_ass_min_rtr_packet_size);
      offset += 2;
 
-     /* Reserved */
-     info_to_display(tvb,object_tree,offset,2,"Reserved",NULL,FMT_HEX,&hf_cops_pc_reserved);
-     offset += 2;
+     /* Maximum Concatenated Burst */
+        info_to_display(tvb,object_tree,offset,2,"Maximum Concatenated Burst",NULL,FMT_DEC,&hf_cops_pcmm_max_concat_burst);
+        offset += 2;
+
+        /* Required Attribute Mask */
+        info_to_display(tvb,object_tree,offset,4,"Required Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_req_att_mask);
+        offset += 4;
+
+        /* Forbidden Attribute Mask */
+        info_to_display(tvb,object_tree,offset,4,"Forbidden Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_forbid_att_mask);
+        offset += 4;
 
      if (n < 80) return;
 
@@ -3465,14 +3543,22 @@ cops_best_effort_service(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset)
      info_to_display(tvb,object_tree,offset,2,"Assumed Minimum Reserved Traffic Rate Packet Size",NULL,FMT_DEC,&hf_cops_pcmm_ass_min_rtr_packet_size);
      offset += 2;
 
-     /* Reserved */
-     info_to_display(tvb,object_tree,offset,2,"Reserved",NULL,FMT_HEX,&hf_cops_pc_reserved);
+     /* Maximum Concatenated Burst */
+     info_to_display(tvb,object_tree,offset,2,"Maximum Concatenated Burst",NULL,FMT_DEC,&hf_cops_pcmm_max_concat_burst);
      offset += 2;
+
+     /* Required Attribute Mask */
+     info_to_display(tvb,object_tree,offset,4,"Required Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_req_att_mask);
+        offset += 4;
+
+        /* Forbidden Attribute Mask */
+        info_to_display(tvb,object_tree,offset,4,"Forbidden Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_forbid_att_mask);
+        offset += 4;
 }
 
 /* Cops - Section : Non-Real-Time Polling Service */
 static void
-cops_non_real_time_polling_service(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset) {
+cops_non_real_time_polling_service_i04(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset) {
      proto_item *ti;
      proto_tree *stt, *object_tree;
 
@@ -3518,14 +3604,22 @@ cops_non_real_time_polling_service(tvbuff_t *tvb, proto_tree *st, guint n, guint
      info_to_display(tvb,object_tree,offset,2,"Assumed Minimum Reserved Traffic Rate Packet Size",NULL,FMT_DEC,&hf_cops_pcmm_ass_min_rtr_packet_size);
      offset += 2;
 
-     /* Reserved */
-     info_to_display(tvb,object_tree,offset,2,"Reserved",NULL,FMT_HEX,&hf_cops_pc_reserved);
+     /* Maximum Concatenated Burst */
+     info_to_display(tvb,object_tree,offset,2,"Maximum Concatenated Burst",NULL,FMT_DEC,&hf_cops_pcmm_max_concat_burst);
      offset += 2;
 
      /* Nominal Polling Interval */
      info_to_display(tvb,object_tree,offset,4,"Nominal Polling Interval",NULL,FMT_DEC,&hf_cops_pcmm_nominal_polling_interval);
      offset += 4;
 
+     /* Required Attribute Mask */
+        info_to_display(tvb,object_tree,offset,4,"Required Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_req_att_mask);
+        offset += 4;
+
+        /* Forbidden Attribute Mask */
+        info_to_display(tvb,object_tree,offset,4,"Forbidden Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_forbid_att_mask);
+        offset += 4;
+
      if (n < 64) return;
 
      /* Reserved Envelope */
@@ -3559,13 +3653,21 @@ cops_non_real_time_polling_service(tvbuff_t *tvb, proto_tree *st, guint n, guint
      info_to_display(tvb,object_tree,offset,2,"Assumed Minimum Reserved Traffic Rate Packet Size",NULL,FMT_DEC,&hf_cops_pcmm_ass_min_rtr_packet_size);
      offset += 2;
 
-     /* Reserved */
-     info_to_display(tvb,object_tree,offset,2,"Reserved",NULL,FMT_HEX,&hf_cops_pc_reserved);
-     offset += 2;
+     /* Maximum Concatenated Burst */
+        info_to_display(tvb,object_tree,offset,2,"Maximum Concatenated Burst",NULL,FMT_DEC,&hf_cops_pcmm_max_concat_burst);
+        offset += 2;
 
-     /* Nominal Polling Interval */
-     info_to_display(tvb,object_tree,offset,4,"Nominal Polling Interval",NULL,FMT_DEC,&hf_cops_pcmm_nominal_polling_interval);
-     offset += 4;
+        /* Nominal Polling Interval */
+        info_to_display(tvb,object_tree,offset,4,"Nominal Polling Interval",NULL,FMT_DEC,&hf_cops_pcmm_nominal_polling_interval);
+        offset += 4;
+
+        /* Required Attribute Mask */
+        info_to_display(tvb,object_tree,offset,4,"Required Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_req_att_mask);
+        offset += 4;
+
+        /* Forbidden Attribute Mask */
+        info_to_display(tvb,object_tree,offset,4,"Forbidden Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_forbid_att_mask);
+        offset += 4;
 
      if (n < 92) return;
 
@@ -3600,18 +3702,26 @@ cops_non_real_time_polling_service(tvbuff_t *tvb, proto_tree *st, guint n, guint
      info_to_display(tvb,object_tree,offset,2,"Assumed Minimum Reserved Traffic Rate Packet Size",NULL,FMT_DEC,&hf_cops_pcmm_ass_min_rtr_packet_size);
      offset += 2;
 
-     /* Reserved */
-     info_to_display(tvb,object_tree,offset,2,"Reserved",NULL,FMT_HEX,&hf_cops_pc_reserved);
-     offset += 2;
+     /* Maximum Concatenated Burst */
+        info_to_display(tvb,object_tree,offset,2,"Maximum Concatenated Burst",NULL,FMT_DEC,&hf_cops_pcmm_max_concat_burst);
+        offset += 2;
 
-     /* Nominal Polling Interval */
-     info_to_display(tvb,object_tree,offset,4,"Nominal Polling Interval",NULL,FMT_DEC,&hf_cops_pcmm_nominal_polling_interval);
-     offset += 4;
+        /* Nominal Polling Interval */
+        info_to_display(tvb,object_tree,offset,4,"Nominal Polling Interval",NULL,FMT_DEC,&hf_cops_pcmm_nominal_polling_interval);
+        offset += 4;
+
+        /* Required Attribute Mask */
+        info_to_display(tvb,object_tree,offset,4,"Required Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_req_att_mask);
+        offset += 4;
+
+        /* Forbidden Attribute Mask */
+        info_to_display(tvb,object_tree,offset,4,"Forbidden Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_forbid_att_mask);
+        offset += 4;
 }
 
 /* Cops - Section : Real-Time Polling Service */
 static void
-cops_real_time_polling_service(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset) {
+cops_real_time_polling_service_i04(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset) {
      proto_item *ti;
      proto_tree *stt, *object_tree;
 
@@ -3650,8 +3760,8 @@ cops_real_time_polling_service(tvbuff_t *tvb, proto_tree *st, guint n, guint32 o
      info_to_display(tvb,object_tree,offset,2,"Assumed Minimum Reserved Traffic Rate Packet Size",NULL,FMT_DEC,&hf_cops_pcmm_ass_min_rtr_packet_size);
      offset += 2;
 
-     /* Reserved */
-     info_to_display(tvb,object_tree,offset,2,"Reserved",NULL,FMT_HEX,&hf_cops_pc_reserved);
+     /* Maximum Concatenated Burst */
+     info_to_display(tvb,object_tree,offset,2,"Maximum Concatenated Burst",NULL,FMT_DEC,&hf_cops_pcmm_max_concat_burst);
      offset += 2;
 
      /* Nominal Polling Interval */
@@ -3662,6 +3772,14 @@ cops_real_time_polling_service(tvbuff_t *tvb, proto_tree *st, guint n, guint32 o
      info_to_display(tvb,object_tree,offset,4,"Tolerated Poll Jitter",NULL,FMT_DEC,&hf_cops_pcmm_tolerated_poll_jitter);
      offset += 4;
 
+     /* Required Attribute Mask */
+     info_to_display(tvb,object_tree,offset,4,"Required Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_req_att_mask);
+     offset += 4;
+
+     /* Forbidden Attribute Mask */
+     info_to_display(tvb,object_tree,offset,4,"Forbidden Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_forbid_att_mask);
+     offset += 4;
+
      if (n < 64) return;
 
      /* Reserved Envelope */
@@ -3688,17 +3806,25 @@ cops_real_time_polling_service(tvbuff_t *tvb, proto_tree *st, guint n, guint32 o
      info_to_display(tvb,object_tree,offset,2,"Assumed Minimum Reserved Traffic Rate Packet Size",NULL,FMT_DEC,&hf_cops_pcmm_ass_min_rtr_packet_size);
      offset += 2;
 
-     /* Reserved */
-     info_to_display(tvb,object_tree,offset,2,"Reserved",NULL,FMT_HEX,&hf_cops_pc_reserved);
-     offset += 2;
+     /* Maximum Concatenated Burst */
+        info_to_display(tvb,object_tree,offset,2,"Maximum Concatenated Burst",NULL,FMT_DEC,&hf_cops_pcmm_max_concat_burst);
+        offset += 2;
 
-     /* Nominal Polling Interval */
-     info_to_display(tvb,object_tree,offset,4,"Nominal Polling Interval",NULL,FMT_DEC,&hf_cops_pcmm_nominal_polling_interval);
-     offset += 4;
+        /* Nominal Polling Interval */
+        info_to_display(tvb,object_tree,offset,4,"Nominal Polling Interval",NULL,FMT_DEC,&hf_cops_pcmm_nominal_polling_interval);
+        offset += 4;
 
-     /* Tolerated Poll Jitter */
-     info_to_display(tvb,object_tree,offset,4,"Tolerated Poll Jitter",NULL,FMT_DEC,&hf_cops_pcmm_tolerated_poll_jitter);
-     offset += 4;
+        /* Tolerated Poll Jitter */
+        info_to_display(tvb,object_tree,offset,4,"Tolerated Poll Jitter",NULL,FMT_DEC,&hf_cops_pcmm_tolerated_poll_jitter);
+        offset += 4;
+
+        /* Required Attribute Mask */
+        info_to_display(tvb,object_tree,offset,4,"Required Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_req_att_mask);
+        offset += 4;
+
+        /* Forbidden Attribute Mask */
+        info_to_display(tvb,object_tree,offset,4,"Forbidden Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_forbid_att_mask);
+        offset += 4;
 
      if (n < 92) return;
 
@@ -3726,22 +3852,30 @@ cops_real_time_polling_service(tvbuff_t *tvb, proto_tree *st, guint n, guint32 o
      info_to_display(tvb,object_tree,offset,2,"Assumed Minimum Reserved Traffic Rate Packet Size",NULL,FMT_DEC,&hf_cops_pcmm_ass_min_rtr_packet_size);
      offset += 2;
 
-     /* Reserved */
-     info_to_display(tvb,object_tree,offset,2,"Reserved",NULL,FMT_HEX,&hf_cops_pc_reserved);
-     offset += 2;
+     /* Maximum Concatenated Burst */
+        info_to_display(tvb,object_tree,offset,2,"Maximum Concatenated Burst",NULL,FMT_DEC,&hf_cops_pcmm_max_concat_burst);
+        offset += 2;
 
-     /* Nominal Polling Interval */
-     info_to_display(tvb,object_tree,offset,4,"Nominal Polling Interval",NULL,FMT_DEC,&hf_cops_pcmm_nominal_polling_interval);
-     offset += 4;
+        /* Nominal Polling Interval */
+        info_to_display(tvb,object_tree,offset,4,"Nominal Polling Interval",NULL,FMT_DEC,&hf_cops_pcmm_nominal_polling_interval);
+        offset += 4;
 
-     /* Tolerated Poll Jitter */
-     info_to_display(tvb,object_tree,offset,4,"Tolerated Poll Jitter",NULL,FMT_DEC,&hf_cops_pcmm_tolerated_poll_jitter);
-     offset += 4;
+        /* Tolerated Poll Jitter */
+        info_to_display(tvb,object_tree,offset,4,"Tolerated Poll Jitter",NULL,FMT_DEC,&hf_cops_pcmm_tolerated_poll_jitter);
+        offset += 4;
+
+        /* Required Attribute Mask */
+        info_to_display(tvb,object_tree,offset,4,"Required Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_req_att_mask);
+        offset += 4;
+
+        /* Forbidden Attribute Mask */
+        info_to_display(tvb,object_tree,offset,4,"Forbidden Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_forbid_att_mask);
+        offset += 4;
 }
 
 /* Cops - Section : Unsolicited Grant Service */
 static void
-cops_unsolicited_grant_service(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset) {
+cops_unsolicited_grant_service_i04(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset) {
      proto_item *ti;
      proto_tree *stt, *object_tree;
 
@@ -3783,6 +3917,14 @@ cops_unsolicited_grant_service(tvbuff_t *tvb, proto_tree *st, guint n, guint32 o
      info_to_display(tvb,object_tree,offset,4,"Tolerated Grant Jitter",NULL,FMT_DEC,&hf_cops_pcmm_tolerated_grant_jitter);
      offset += 4;
 
+     /* Required Attribute Mask */
+        info_to_display(tvb,object_tree,offset,4,"Required Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_req_att_mask);
+        offset += 4;
+
+        /* Forbidden Attribute Mask */
+        info_to_display(tvb,object_tree,offset,4,"Forbidden Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_forbid_att_mask);
+        offset += 4;
+
      if (n < 40) return;
 
      /* Reserved Envelope */
@@ -3812,6 +3954,14 @@ cops_unsolicited_grant_service(tvbuff_t *tvb, proto_tree *st, guint n, guint32 o
      info_to_display(tvb,object_tree,offset,4,"Tolerated Grant Jitter",NULL,FMT_DEC,&hf_cops_pcmm_tolerated_grant_jitter);
      offset += 4;
 
+     /* Required Attribute Mask */
+        info_to_display(tvb,object_tree,offset,4,"Required Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_req_att_mask);
+        offset += 4;
+
+        /* Forbidden Attribute Mask */
+        info_to_display(tvb,object_tree,offset,4,"Forbidden Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_forbid_att_mask);
+        offset += 4;
+
      if (n < 56) return;
 
      /* Committed Envelope */
@@ -3840,11 +3990,19 @@ cops_unsolicited_grant_service(tvbuff_t *tvb, proto_tree *st, guint n, guint32 o
      /* Tolerated Grant Jitter */
      info_to_display(tvb,object_tree,offset,4,"Tolerated Grant Jitter",NULL,FMT_DEC,&hf_cops_pcmm_tolerated_grant_jitter);
      offset += 4;
+
+     /* Required Attribute Mask */
+        info_to_display(tvb,object_tree,offset,4,"Required Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_req_att_mask);
+        offset += 4;
+
+        /* Forbidden Attribute Mask */
+        info_to_display(tvb,object_tree,offset,4,"Forbidden Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_forbid_att_mask);
+        offset += 4;
 }
 
 /* Cops - Section : Unsolicited Grant Service with Activity Detection */
 static void
-cops_ugs_with_activity_detection(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset) {
+cops_ugs_with_activity_detection_i04(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset) {
      proto_item *ti;
      proto_tree *stt, *object_tree;
 
@@ -3894,6 +4052,14 @@ cops_ugs_with_activity_detection(tvbuff_t *tvb, proto_tree *st, guint n, guint32
      info_to_display(tvb,object_tree,offset,4,"Tolerated Poll Jitter",NULL,FMT_DEC,&hf_cops_pcmm_tolerated_poll_jitter);
      offset += 4;
 
+     /* Required Attribute Mask */
+        info_to_display(tvb,object_tree,offset,4,"Required Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_req_att_mask);
+        offset += 4;
+
+        /* Forbidden Attribute Mask */
+        info_to_display(tvb,object_tree,offset,4,"Forbidden Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_forbid_att_mask);
+        offset += 4;
+
      if (n < 56) return;
 
      /* Reserved Envelope */
@@ -3931,6 +4097,14 @@ cops_ugs_with_activity_detection(tvbuff_t *tvb, proto_tree *st, guint n, guint32
      info_to_display(tvb,object_tree,offset,4,"Tolerated Poll Jitter",NULL,FMT_DEC,&hf_cops_pcmm_tolerated_poll_jitter);
      offset += 4;
 
+     /* Required Attribute Mask */
+        info_to_display(tvb,object_tree,offset,4,"Required Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_req_att_mask);
+        offset += 4;
+
+        /* Forbidden Attribute Mask */
+        info_to_display(tvb,object_tree,offset,4,"Forbidden Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_forbid_att_mask);
+        offset += 4;
+
      if (n < 80) return;
 
      /* Committed Envelope */
@@ -3967,11 +4141,19 @@ cops_ugs_with_activity_detection(tvbuff_t *tvb, proto_tree *st, guint n, guint32
      /* Tolerated Poll Jitter */
      info_to_display(tvb,object_tree,offset,4,"Tolerated Poll Jitter",NULL,FMT_DEC,&hf_cops_pcmm_tolerated_poll_jitter);
      offset += 4;
+
+     /* Required Attribute Mask */
+        info_to_display(tvb,object_tree,offset,4,"Required Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_req_att_mask);
+        offset += 4;
+
+        /* Forbidden Attribute Mask */
+        info_to_display(tvb,object_tree,offset,4,"Forbidden Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_forbid_att_mask);
+        offset += 4;
 }
 
 /* Cops - Section : Downstream Service */
 static void
-cops_downstream_service(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset) {
+cops_downstream_service_i04(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset) {
      proto_item *ti;
      proto_tree *stt, *object_tree;
 
@@ -3994,8 +4176,12 @@ cops_downstream_service(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset)
      info_to_display(tvb,object_tree,offset,1,"Traffic Priority",NULL,FMT_HEX,&hf_cops_pcmm_traffic_priority);
      offset += 1;
 
-     proto_tree_add_text(object_tree, tvb, offset, 3, "Reserved");
-     offset += 3;
+     /* Downstream Resequencing */
+        info_to_display(tvb,object_tree,offset,1,"Downstream Resequencing",NULL,FMT_HEX,&hf_cops_pcmm_down_resequencing);
+        offset += 1;
+
+     proto_tree_add_text(object_tree, tvb, offset, 2, "Reserved");
+     offset += 2;
 
      /* Maximum Sustained Traffic Rate */
      info_to_display(tvb,object_tree,offset,4,"Maximum Sustained Traffic Rate",NULL,FMT_DEC,&hf_cops_pcmm_max_sustained_traffic_rate);
@@ -4021,6 +4207,18 @@ cops_downstream_service(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset)
      info_to_display(tvb,object_tree,offset,4,"Maximum Downstream Latency",NULL,FMT_DEC,&hf_cops_pcmm_max_downstream_latency);
      offset += 4;
 
+     /* Downstream Peak Traffic Rate */
+        info_to_display(tvb,object_tree,offset,4,"Downstream Peak Traffic Rate",NULL,FMT_DEC,&hf_cops_pcmm_down_peak_traffic_rate);
+        offset += 4;
+
+        /* Required Attribute Mask */
+        info_to_display(tvb,object_tree,offset,4,"Required Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_req_att_mask);
+        offset += 4;
+
+        /* Forbidden Attribute Mask */
+        info_to_display(tvb,object_tree,offset,4,"Forbidden Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_forbid_att_mask);
+        offset += 4;
+
      if (n < 56) return;
 
      /* Reserved Envelope */
@@ -4031,8 +4229,12 @@ cops_downstream_service(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset)
      info_to_display(tvb,object_tree,offset,1,"Traffic Priority",NULL,FMT_HEX,&hf_cops_pcmm_traffic_priority);
      offset += 1;
 
-     proto_tree_add_text(object_tree, tvb, offset, 3, "Reserved");
-     offset += 3;
+     /* Downstream Resequencing */
+        info_to_display(tvb,object_tree,offset,1,"Downstream Resequencing",NULL,FMT_HEX,&hf_cops_pcmm_down_resequencing);
+        offset += 1;
+
+     proto_tree_add_text(object_tree, tvb, offset, 2, "Reserved");
+     offset += 2;
 
      /* Maximum Sustained Traffic Rate */
      info_to_display(tvb,object_tree,offset,4,"Maximum Sustained Traffic Rate",NULL,FMT_DEC,&hf_cops_pcmm_max_sustained_traffic_rate);
@@ -4058,6 +4260,18 @@ cops_downstream_service(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset)
      info_to_display(tvb,object_tree,offset,4,"Maximum Downstream Latency",NULL,FMT_DEC,&hf_cops_pcmm_max_downstream_latency);
      offset += 4;
 
+     /* Downstream Peak Traffic Rate */
+        info_to_display(tvb,object_tree,offset,4,"Downstream Peak Traffic Rate",NULL,FMT_DEC,&hf_cops_pcmm_down_peak_traffic_rate);
+        offset += 4;
+
+        /* Required Attribute Mask */
+        info_to_display(tvb,object_tree,offset,4,"Required Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_req_att_mask);
+        offset += 4;
+
+        /* Forbidden Attribute Mask */
+        info_to_display(tvb,object_tree,offset,4,"Forbidden Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_forbid_att_mask);
+        offset += 4;
+
      if (n < 80) return;
 
      /* Committed Envelope */
@@ -4068,8 +4282,12 @@ cops_downstream_service(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset)
      info_to_display(tvb,object_tree,offset,1,"Traffic Priority",NULL,FMT_HEX,&hf_cops_pcmm_traffic_priority);
      offset += 1;
 
-     proto_tree_add_text(object_tree, tvb, offset, 3, "Reserved");
-     offset += 3;
+     /* Downstream Resequencing */
+        info_to_display(tvb,object_tree,offset,1,"Downstream Resequencing",NULL,FMT_HEX,&hf_cops_pcmm_down_resequencing);
+        offset += 1;
+
+     proto_tree_add_text(object_tree, tvb, offset, 2, "Reserved");
+     offset += 2;
 
      /* Maximum Sustained Traffic Rate */
      info_to_display(tvb,object_tree,offset,4,"Maximum Sustained Traffic Rate",NULL,FMT_DEC,&hf_cops_pcmm_max_sustained_traffic_rate);
@@ -4094,119 +4312,903 @@ cops_downstream_service(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset)
      /* Maximum Downstream Latency */
      info_to_display(tvb,object_tree,offset,4,"Maximum Downstream Latency",NULL,FMT_DEC,&hf_cops_pcmm_max_downstream_latency);
      offset += 4;
+
+     /* Downstream Peak Traffic Rate */
+        info_to_display(tvb,object_tree,offset,4,"Downstream Peak Traffic Rate",NULL,FMT_DEC,&hf_cops_pcmm_down_peak_traffic_rate);
+        offset += 4;
+
+        /* Required Attribute Mask */
+        info_to_display(tvb,object_tree,offset,4,"Required Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_req_att_mask);
+        offset += 4;
+
+        /* Forbidden Attribute Mask */
+        info_to_display(tvb,object_tree,offset,4,"Forbidden Attribute Mask",NULL,FMT_DEC,&hf_cops_pcmm_forbid_att_mask);
+        offset += 4;
 }
 
-/* Cops - Section : PacketCable Multimedia Event Gereration-Info */
+/* Cops - Section : Upstream Drop */
 static void
-cops_mm_event_generation_info(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset) {
-
+cops_upstream_drop_i04(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset) {
      proto_tree *stt;
-     guint8 *bcid_str;
 
      /* Create a subtree */
-     stt = info_to_cops_subtree(tvb,st,n,offset,"Event Generation Info");
-     offset += 4;
-
-     /* Primary Record Keeping Server IP Address */
-     info_to_display(tvb,stt,offset,4,"PRKS IP Address", NULL,FMT_IPv4,&hf_cops_pc_prks_ip);
+     stt = info_to_cops_subtree(tvb,st,n,offset,"Upstream Drop");
      offset += 4;
 
-     /* Primary Record Keeping Server IP Port */
-     info_to_display(tvb,stt,offset,2,"PRKS IP Port",NULL,FMT_DEC,&hf_cops_pc_prks_ip_port);
-     offset += 2;
-
-     /* Reserved */
-     info_to_display(tvb,stt,offset,2,"Reserved",NULL,FMT_HEX,&hf_cops_pc_reserved);
-     offset += 2;
+     /* Envelope */
+     info_to_display(tvb,stt,offset,1,"Envelope",NULL,FMT_DEC,&hf_cops_pcmm_envelope);
+     offset += 1;
 
-     /* Secondary Record Keeping Server IP Address */
-     info_to_display(tvb,stt,offset,4,"SRKS IP Address", NULL,FMT_IPv4,&hf_cops_pc_srks_ip);
-     offset += 4;
+     proto_tree_add_text(stt, tvb, offset, 3, "Reserved");
+     offset += 3;
+}
 
-     /* Secondary Record Keeping Server IP Port */
-     info_to_display(tvb,stt,offset,2,"SRKS IP Port",NULL,FMT_DEC,&hf_cops_pc_srks_ip_port);
-     offset += 2;
+/* END PCMM I04 */
 
-     /* Reserved */
-     info_to_display(tvb,stt,offset,2,"Reserved",NULL,FMT_HEX,&hf_cops_pc_reserved);
-     offset += 2;
+/* Cops - Section : Best Effort Service */
+static void
+cops_best_effort_service(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset) {
+     proto_item *ti;
+     proto_tree *stt, *object_tree;
 
-     /* BCID Timestamp */
-     info_to_display(tvb,stt,offset,4,"BCID - Timestamp",NULL,FMT_HEX,&hf_cops_pc_bcid_ts);
+     /* Create a subtree */
+     stt = info_to_cops_subtree(tvb,st,n,offset,"Best Effort Service");
      offset += 4;
 
-     /* BCID Element ID */
-     bcid_str = (guchar*)tvb_format_text(tvb, offset, 8);
-     proto_tree_add_text(stt, tvb, offset, 8,"%-28s : '%s'","BCID - Element ID",bcid_str);
-     offset += 8;
+     /* Envelope */
+     info_to_display(tvb,stt,offset,1,"Envelope",NULL,FMT_DEC,&hf_cops_pcmm_envelope);
+     offset += 1;
 
-     /* BCID Time Zone */
-     bcid_str = (guchar*)tvb_format_text(tvb, offset, 8);
-     proto_tree_add_text(stt, tvb, offset, 8,"%-28s : '%s'","BCID - Time Zone",bcid_str);
-     offset += 8;
+     proto_tree_add_text(stt, tvb, offset, 3, "Reserved");
+     offset += 3;
 
-     /* BCID Event Counter */
-     info_to_display(tvb,stt,offset,4,"BCID - Event Counter",NULL,FMT_DEC,&hf_cops_pc_bcid_ev);
-}
+     /* Authorized Envelope */
+     ti = proto_tree_add_text(stt, tvb, offset, 24, "Authorized Envelope");
+     object_tree = proto_item_add_subtree(ti, ett_cops_subtree);
 
-/* Cops - Section : Volume-Based Usage Limit */
-static void
-cops_volume_based_usage_limit(tvbuff_t *tvb, proto_tree *st, guint object_len, guint32 offset) {
+     /* Traffic Priority */
+     info_to_display(tvb,object_tree,offset,1,"Traffic Priority",NULL,FMT_HEX,&hf_cops_pcmm_traffic_priority);
+     offset += 1;
 
-     proto_tree *stt;
+     proto_tree_add_text(object_tree, tvb, offset, 3, "Reserved");
+     offset += 3;
 
-     /* Create a subtree */
-     stt = info_to_cops_subtree(tvb,st,object_len,offset,"Volume-Based Usage Limit");
+     /* Request Transmission Policy */
+     decode_docsis_request_transmission_policy(tvb, offset, object_tree, hf_cops_pcmm_request_transmission_policy);
      offset += 4;
 
-     /* Usage Limit */
-     proto_tree_add_item(stt, hf_cops_pcmm_volume_based_usage_limit, tvb, offset, 8,
-           FALSE);
-}
-
-/* Cops - Section : Time-Based Usage Limit */
-static void
-cops_time_based_usage_limit(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset) {
-
-     proto_tree *stt;
+     /* Maximum Sustained Traffic Rate */
+     info_to_display(tvb,object_tree,offset,4,"Maximum Sustained Traffic Rate",NULL,FMT_DEC,&hf_cops_pcmm_max_sustained_traffic_rate);
+     offset += 4;
 
-     /* Create a subtree */
-     stt = info_to_cops_subtree(tvb,st,n,offset,"Time-Based Usage Limit");
+     /* Maximum Traffic Burst */
+     info_to_display(tvb,object_tree,offset,4,"Maximum Traffic Burst",NULL,FMT_DEC,&hf_cops_pcmm_max_traffic_burst);
      offset += 4;
 
-     /* Time Limit */
-     info_to_display(tvb,stt,offset,4,"Time Limit", NULL,FMT_DEC,&hf_cops_pcmm_time_based_usage_limit);
+     /* Minimum Reserved Traffic Rate */
+     info_to_display(tvb,object_tree,offset,4,"Minimum Reserved Traffic Rate",NULL,FMT_DEC,&hf_cops_pcmm_min_reserved_traffic_rate);
      offset += 4;
-}
 
-/* Cops - Section : Opaque Data */
-static void
-cops_opaque_data(tvbuff_t *tvb, proto_tree *st, guint object_len, guint32 offset) {
+     /* Assumed Minimum Reserved Traffic Rate Packet Size */
+     info_to_display(tvb,object_tree,offset,2,"Assumed Minimum Reserved Traffic Rate Packet Size",NULL,FMT_DEC,&hf_cops_pcmm_ass_min_rtr_packet_size);
+     offset += 2;
 
-     proto_tree *stt;
+     /* Reserved */
+     info_to_display(tvb,object_tree,offset,2,"Reserved",NULL,FMT_HEX,&hf_cops_pc_reserved);
+     offset += 2;
 
-     /* Create a subtree */
-     stt = info_to_cops_subtree(tvb,st,object_len,offset,"Opaque Data");
-     offset += 4;
+     if (n < 56) return;
 
-     /* Opaque Data */
-     proto_tree_add_text(stt, tvb, offset, 8,"Opaque Data");
-}
+     /* Reserved Envelope */
+     ti = proto_tree_add_text(stt, tvb, offset, 24, "Reserved Envelope");
+     object_tree = proto_item_add_subtree(ti, ett_cops_subtree);
 
-/* Cops - Section : Gate Time Info */
-static void
-cops_gate_time_info(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset) {
+     /* Traffic Priority */
+     info_to_display(tvb,object_tree,offset,1,"Traffic Priority",NULL,FMT_HEX,&hf_cops_pcmm_traffic_priority);
+     offset += 1;
 
-     proto_tree *stt;
+     proto_tree_add_text(object_tree, tvb, offset, 3, "Reserved");
+     offset += 3;
 
-     /* Create a subtree */
-     stt = info_to_cops_subtree(tvb,st,n,offset,"Gate Time Info");
+     /* Request Transmission Policy */
+     decode_docsis_request_transmission_policy(tvb, offset, object_tree, hf_cops_pcmm_request_transmission_policy);
      offset += 4;
 
-     /* Gate Time Info */
-     info_to_display(tvb,stt,offset,4,"Time Committed", NULL,FMT_DEC,&hf_cops_pcmm_gate_time_info);
+     /* Maximum Sustained Traffic Rate */
+     info_to_display(tvb,object_tree,offset,4,"Maximum Sustained Traffic Rate",NULL,FMT_DEC,&hf_cops_pcmm_max_sustained_traffic_rate);
      offset += 4;
-}
+
+     /* Maximum Traffic Burst */
+     info_to_display(tvb,object_tree,offset,4,"Maximum Traffic Burst",NULL,FMT_DEC,&hf_cops_pcmm_max_traffic_burst);
+     offset += 4;
+
+     /* Minimum Reserved Traffic Rate */
+     info_to_display(tvb,object_tree,offset,4,"Minimum Reserved Traffic Rate",NULL,FMT_DEC,&hf_cops_pcmm_min_reserved_traffic_rate);
+     offset += 4;
+
+     /* Assumed Minimum Reserved Traffic Rate Packet Size */
+     info_to_display(tvb,object_tree,offset,2,"Assumed Minimum Reserved Traffic Rate Packet Size",NULL,FMT_DEC,&hf_cops_pcmm_ass_min_rtr_packet_size);
+     offset += 2;
+
+     /* Reserved */
+     info_to_display(tvb,object_tree,offset,2,"Reserved",NULL,FMT_HEX,&hf_cops_pc_reserved);
+     offset += 2;
+
+     if (n < 80) return;
+
+     /* Committed Envelope */
+     ti = proto_tree_add_text(stt, tvb, offset, 24, "Committed Envelope");
+     object_tree = proto_item_add_subtree(ti, ett_cops_subtree);
+
+     /* Traffic Priority */
+     info_to_display(tvb,object_tree,offset,1,"Traffic Priority",NULL,FMT_HEX,&hf_cops_pcmm_traffic_priority);
+     offset += 1;
+
+     proto_tree_add_text(object_tree, tvb, offset, 3, "Reserved");
+     offset += 3;
+
+     /* Request Transmission Policy */
+     decode_docsis_request_transmission_policy(tvb, offset, object_tree, hf_cops_pcmm_request_transmission_policy);
+     offset += 4;
+
+     /* Maximum Sustained Traffic Rate */
+     info_to_display(tvb,object_tree,offset,4,"Maximum Sustained Traffic Rate",NULL,FMT_DEC,&hf_cops_pcmm_max_sustained_traffic_rate);
+     offset += 4;
+
+     /* Maximum Traffic Burst */
+     info_to_display(tvb,object_tree,offset,4,"Maximum Traffic Burst",NULL,FMT_DEC,&hf_cops_pcmm_max_traffic_burst);
+     offset += 4;
+
+     /* Minimum Reserved Traffic Rate */
+     info_to_display(tvb,object_tree,offset,4,"Minimum Reserved Traffic Rate",NULL,FMT_DEC,&hf_cops_pcmm_min_reserved_traffic_rate);
+     offset += 4;
+
+     /* Assumed Minimum Reserved Traffic Rate Packet Size */
+     info_to_display(tvb,object_tree,offset,2,"Assumed Minimum Reserved Traffic Rate Packet Size",NULL,FMT_DEC,&hf_cops_pcmm_ass_min_rtr_packet_size);
+     offset += 2;
+
+     /* Reserved */
+     info_to_display(tvb,object_tree,offset,2,"Reserved",NULL,FMT_HEX,&hf_cops_pc_reserved);
+     offset += 2;
+}
+
+/* Cops - Section : Non-Real-Time Polling Service */
+static void
+cops_non_real_time_polling_service(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset) {
+     proto_item *ti;
+     proto_tree *stt, *object_tree;
+
+     /* Create a subtree */
+     stt = info_to_cops_subtree(tvb,st,n,offset,"Non-Real-Time Polling Service");
+     offset += 4;
+
+     /* Envelope */
+     info_to_display(tvb,stt,offset,1,"Envelope",NULL,FMT_DEC,&hf_cops_pcmm_envelope);
+     offset += 1;
+
+     proto_tree_add_text(stt, tvb, offset, 3, "Reserved");
+     offset += 3;
+
+     /* Authorized Envelope */
+     ti = proto_tree_add_text(stt, tvb, offset, 28, "Authorized Envelope");
+     object_tree = proto_item_add_subtree(ti, ett_cops_subtree);
+
+     /* Traffic Priority */
+     info_to_display(tvb,object_tree,offset,1,"Traffic Priority",NULL,FMT_HEX,&hf_cops_pcmm_traffic_priority);
+     offset += 1;
+
+     proto_tree_add_text(object_tree, tvb, offset, 3, "Reserved");
+     offset += 3;
+
+     /* Request Transmission Policy */
+     decode_docsis_request_transmission_policy(tvb, offset, object_tree, hf_cops_pcmm_request_transmission_policy);
+     offset += 4;
+
+     /* Maximum Sustained Traffic Rate */
+     info_to_display(tvb,object_tree,offset,4,"Maximum Sustained Traffic Rate",NULL,FMT_DEC,&hf_cops_pcmm_max_sustained_traffic_rate);
+     offset += 4;
+
+     /* Maximum Traffic Burst */
+     info_to_display(tvb,object_tree,offset,4,"Maximum Traffic Burst",NULL,FMT_DEC,&hf_cops_pcmm_max_traffic_burst);
+     offset += 4;
+
+     /* Minimum Reserved Traffic Rate */
+     info_to_display(tvb,object_tree,offset,4,"Minimum Reserved Traffic Rate",NULL,FMT_DEC,&hf_cops_pcmm_min_reserved_traffic_rate);
+     offset += 4;
+
+     /* Assumed Minimum Reserved Traffic Rate Packet Size */
+     info_to_display(tvb,object_tree,offset,2,"Assumed Minimum Reserved Traffic Rate Packet Size",NULL,FMT_DEC,&hf_cops_pcmm_ass_min_rtr_packet_size);
+     offset += 2;
+
+     /* Reserved */
+     info_to_display(tvb,object_tree,offset,2,"Reserved",NULL,FMT_HEX,&hf_cops_pc_reserved);
+     offset += 2;
+
+     /* Nominal Polling Interval */
+     info_to_display(tvb,object_tree,offset,4,"Nominal Polling Interval",NULL,FMT_DEC,&hf_cops_pcmm_nominal_polling_interval);
+     offset += 4;
+
+     if (n < 64) return;
+
+     /* Reserved Envelope */
+     ti = proto_tree_add_text(stt, tvb, offset, 24, "Reserved Envelope");
+     object_tree = proto_item_add_subtree(ti, ett_cops_subtree);
+
+     /* Traffic Priority */
+     info_to_display(tvb,object_tree,offset,1,"Traffic Priority",NULL,FMT_HEX,&hf_cops_pcmm_traffic_priority);
+     offset += 1;
+
+     proto_tree_add_text(object_tree, tvb, offset, 3, "Reserved");
+     offset += 3;
+
+     /* Request Transmission Policy */
+     decode_docsis_request_transmission_policy(tvb, offset, object_tree, hf_cops_pcmm_request_transmission_policy);
+     offset += 4;
+
+     /* Maximum Sustained Traffic Rate */
+     info_to_display(tvb,object_tree,offset,4,"Maximum Sustained Traffic Rate",NULL,FMT_DEC,&hf_cops_pcmm_max_sustained_traffic_rate);
+     offset += 4;
+
+     /* Maximum Traffic Burst */
+     info_to_display(tvb,object_tree,offset,4,"Maximum Traffic Burst",NULL,FMT_DEC,&hf_cops_pcmm_max_traffic_burst);
+     offset += 4;
+
+     /* Minimum Reserved Traffic Rate */
+     info_to_display(tvb,object_tree,offset,4,"Minimum Reserved Traffic Rate",NULL,FMT_DEC,&hf_cops_pcmm_min_reserved_traffic_rate);
+     offset += 4;
+
+     /* Assumed Minimum Reserved Traffic Rate Packet Size */
+     info_to_display(tvb,object_tree,offset,2,"Assumed Minimum Reserved Traffic Rate Packet Size",NULL,FMT_DEC,&hf_cops_pcmm_ass_min_rtr_packet_size);
+     offset += 2;
+
+     /* Reserved */
+     info_to_display(tvb,object_tree,offset,2,"Reserved",NULL,FMT_HEX,&hf_cops_pc_reserved);
+     offset += 2;
+
+     /* Nominal Polling Interval */
+     info_to_display(tvb,object_tree,offset,4,"Nominal Polling Interval",NULL,FMT_DEC,&hf_cops_pcmm_nominal_polling_interval);
+     offset += 4;
+
+     if (n < 92) return;
+
+     /* Committed Envelope */
+     ti = proto_tree_add_text(stt, tvb, offset, 24, "Committed Envelope");
+     object_tree = proto_item_add_subtree(ti, ett_cops_subtree);
+
+     /* Traffic Priority */
+     info_to_display(tvb,object_tree,offset,1,"Traffic Priority",NULL,FMT_HEX,&hf_cops_pcmm_traffic_priority);
+     offset += 1;
+
+     proto_tree_add_text(object_tree, tvb, offset, 3, "Reserved");
+     offset += 3;
+
+     /* Request Transmission Policy */
+     decode_docsis_request_transmission_policy(tvb, offset, object_tree, hf_cops_pcmm_request_transmission_policy);
+     offset += 4;
+
+     /* Maximum Sustained Traffic Rate */
+     info_to_display(tvb,object_tree,offset,4,"Maximum Sustained Traffic Rate",NULL,FMT_DEC,&hf_cops_pcmm_max_sustained_traffic_rate);
+     offset += 4;
+
+     /* Maximum Traffic Burst */
+     info_to_display(tvb,object_tree,offset,4,"Maximum Traffic Burst",NULL,FMT_DEC,&hf_cops_pcmm_max_traffic_burst);
+     offset += 4;
+
+     /* Minimum Reserved Traffic Rate */
+     info_to_display(tvb,object_tree,offset,4,"Minimum Reserved Traffic Rate",NULL,FMT_DEC,&hf_cops_pcmm_min_reserved_traffic_rate);
+     offset += 4;
+
+     /* Assumed Minimum Reserved Traffic Rate Packet Size */
+     info_to_display(tvb,object_tree,offset,2,"Assumed Minimum Reserved Traffic Rate Packet Size",NULL,FMT_DEC,&hf_cops_pcmm_ass_min_rtr_packet_size);
+     offset += 2;
+
+     /* Reserved */
+     info_to_display(tvb,object_tree,offset,2,"Reserved",NULL,FMT_HEX,&hf_cops_pc_reserved);
+     offset += 2;
+
+     /* Nominal Polling Interval */
+     info_to_display(tvb,object_tree,offset,4,"Nominal Polling Interval",NULL,FMT_DEC,&hf_cops_pcmm_nominal_polling_interval);
+     offset += 4;
+}
+
+/* Cops - Section : Real-Time Polling Service */
+static void
+cops_real_time_polling_service(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset) {
+     proto_item *ti;
+     proto_tree *stt, *object_tree;
+
+     /* Create a subtree */
+     stt = info_to_cops_subtree(tvb,st,n,offset,"Real-Time Polling Service");
+     offset += 4;
+
+     /* Envelope */
+     info_to_display(tvb,stt,offset,1,"Envelope",NULL,FMT_DEC,&hf_cops_pcmm_envelope);
+     offset += 1;
+
+     proto_tree_add_text(stt, tvb, offset, 3, "Reserved");
+     offset += 3;
+
+     /* Authorized Envelope */
+     ti = proto_tree_add_text(stt, tvb, offset, 28, "Authorized Envelope");
+     object_tree = proto_item_add_subtree(ti, ett_cops_subtree);
+
+     /* Request Transmission Policy */
+     decode_docsis_request_transmission_policy(tvb, offset, object_tree, hf_cops_pcmm_request_transmission_policy);
+     offset += 4;
+
+     /* Maximum Sustained Traffic Rate */
+     info_to_display(tvb,object_tree,offset,4,"Maximum Sustained Traffic Rate",NULL,FMT_DEC,&hf_cops_pcmm_max_sustained_traffic_rate);
+     offset += 4;
+
+     /* Maximum Traffic Burst */
+     info_to_display(tvb,object_tree,offset,4,"Maximum Traffic Burst",NULL,FMT_DEC,&hf_cops_pcmm_max_traffic_burst);
+     offset += 4;
+
+     /* Minimum Reserved Traffic Rate */
+     info_to_display(tvb,object_tree,offset,4,"Minimum Reserved Traffic Rate",NULL,FMT_DEC,&hf_cops_pcmm_min_reserved_traffic_rate);
+     offset += 4;
+
+     /* Assumed Minimum Reserved Traffic Rate Packet Size */
+     info_to_display(tvb,object_tree,offset,2,"Assumed Minimum Reserved Traffic Rate Packet Size",NULL,FMT_DEC,&hf_cops_pcmm_ass_min_rtr_packet_size);
+     offset += 2;
+
+     /* Reserved */
+     info_to_display(tvb,object_tree,offset,2,"Reserved",NULL,FMT_HEX,&hf_cops_pc_reserved);
+     offset += 2;
+
+     /* Nominal Polling Interval */
+     info_to_display(tvb,object_tree,offset,4,"Nominal Polling Interval",NULL,FMT_DEC,&hf_cops_pcmm_nominal_polling_interval);
+     offset += 4;
+
+     /* Tolerated Poll Jitter */
+     info_to_display(tvb,object_tree,offset,4,"Tolerated Poll Jitter",NULL,FMT_DEC,&hf_cops_pcmm_tolerated_poll_jitter);
+     offset += 4;
+
+     if (n < 64) return;
+
+     /* Reserved Envelope */
+     ti = proto_tree_add_text(stt, tvb, offset, 24, "Reserved Envelope");
+     object_tree = proto_item_add_subtree(ti, ett_cops_subtree);
+
+     /* Request Transmission Policy */
+     decode_docsis_request_transmission_policy(tvb, offset, object_tree, hf_cops_pcmm_request_transmission_policy);
+     offset += 4;
+
+     /* Maximum Sustained Traffic Rate */
+     info_to_display(tvb,object_tree,offset,4,"Maximum Sustained Traffic Rate",NULL,FMT_DEC,&hf_cops_pcmm_max_sustained_traffic_rate);
+     offset += 4;
+
+     /* Maximum Traffic Burst */
+     info_to_display(tvb,object_tree,offset,4,"Maximum Traffic Burst",NULL,FMT_DEC,&hf_cops_pcmm_max_traffic_burst);
+     offset += 4;
+
+     /* Minimum Reserved Traffic Rate */
+     info_to_display(tvb,object_tree,offset,4,"Minimum Reserved Traffic Rate",NULL,FMT_DEC,&hf_cops_pcmm_min_reserved_traffic_rate);
+     offset += 4;
+
+     /* Assumed Minimum Reserved Traffic Rate Packet Size */
+     info_to_display(tvb,object_tree,offset,2,"Assumed Minimum Reserved Traffic Rate Packet Size",NULL,FMT_DEC,&hf_cops_pcmm_ass_min_rtr_packet_size);
+     offset += 2;
+
+     /* Reserved */
+     info_to_display(tvb,object_tree,offset,2,"Reserved",NULL,FMT_HEX,&hf_cops_pc_reserved);
+     offset += 2;
+
+     /* Nominal Polling Interval */
+     info_to_display(tvb,object_tree,offset,4,"Nominal Polling Interval",NULL,FMT_DEC,&hf_cops_pcmm_nominal_polling_interval);
+     offset += 4;
+
+     /* Tolerated Poll Jitter */
+     info_to_display(tvb,object_tree,offset,4,"Tolerated Poll Jitter",NULL,FMT_DEC,&hf_cops_pcmm_tolerated_poll_jitter);
+     offset += 4;
+
+     if (n < 92) return;
+
+     /* Committed Envelope */
+     ti = proto_tree_add_text(stt, tvb, offset, 24, "Committed Envelope");
+     object_tree = proto_item_add_subtree(ti, ett_cops_subtree);
+
+     /* Request Transmission Policy */
+     decode_docsis_request_transmission_policy(tvb, offset, object_tree, hf_cops_pcmm_request_transmission_policy);
+     offset += 4;
+
+     /* Maximum Sustained Traffic Rate */
+     info_to_display(tvb,object_tree,offset,4,"Maximum Sustained Traffic Rate",NULL,FMT_DEC,&hf_cops_pcmm_max_sustained_traffic_rate);
+     offset += 4;
+
+     /* Maximum Traffic Burst */
+     info_to_display(tvb,object_tree,offset,4,"Maximum Traffic Burst",NULL,FMT_DEC,&hf_cops_pcmm_max_traffic_burst);
+     offset += 4;
+
+     /* Minimum Reserved Traffic Rate */
+     info_to_display(tvb,object_tree,offset,4,"Minimum Reserved Traffic Rate",NULL,FMT_DEC,&hf_cops_pcmm_min_reserved_traffic_rate);
+     offset += 4;
+
+     /* Assumed Minimum Reserved Traffic Rate Packet Size */
+     info_to_display(tvb,object_tree,offset,2,"Assumed Minimum Reserved Traffic Rate Packet Size",NULL,FMT_DEC,&hf_cops_pcmm_ass_min_rtr_packet_size);
+     offset += 2;
+
+     /* Reserved */
+     info_to_display(tvb,object_tree,offset,2,"Reserved",NULL,FMT_HEX,&hf_cops_pc_reserved);
+     offset += 2;
+
+     /* Nominal Polling Interval */
+     info_to_display(tvb,object_tree,offset,4,"Nominal Polling Interval",NULL,FMT_DEC,&hf_cops_pcmm_nominal_polling_interval);
+     offset += 4;
+
+     /* Tolerated Poll Jitter */
+     info_to_display(tvb,object_tree,offset,4,"Tolerated Poll Jitter",NULL,FMT_DEC,&hf_cops_pcmm_tolerated_poll_jitter);
+     offset += 4;
+}
+
+/* Cops - Section : Unsolicited Grant Service */
+static void
+cops_unsolicited_grant_service(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset) {
+     proto_item *ti;
+     proto_tree *stt, *object_tree;
+
+     /* Create a subtree */
+     stt = info_to_cops_subtree(tvb,st,n,offset,"Unsolicited Grant Service");
+     offset += 4;
+
+     /* Envelope */
+     info_to_display(tvb,stt,offset,1,"Envelope",NULL,FMT_DEC,&hf_cops_pcmm_envelope);
+     offset += 1;
+
+     proto_tree_add_text(stt, tvb, offset, 3, "Reserved");
+     offset += 3;
+
+     /* Authorized Envelope */
+     ti = proto_tree_add_text(stt, tvb, offset, 16, "Authorized Envelope");
+     object_tree = proto_item_add_subtree(ti, ett_cops_subtree);
+
+     /* Request Transmission Policy */
+     decode_docsis_request_transmission_policy(tvb, offset, object_tree, hf_cops_pcmm_request_transmission_policy);
+     offset += 4;
+
+     /* Unsolicited Grant Size */
+     info_to_display(tvb,object_tree,offset,2,"Unsolicited Grant Size",NULL,FMT_DEC,&hf_cops_pcmm_unsolicited_grant_size);
+     offset += 2;
+
+     /* Grants Per Interval */
+     info_to_display(tvb,object_tree,offset,1,"Grants Per Interval",NULL,FMT_DEC,&hf_cops_pcmm_grants_per_interval);
+     offset += 1;
+
+     proto_tree_add_text(object_tree, tvb, offset, 1, "Reserved");
+     offset += 1;
+
+     /* Nominal Grant Interval */
+     info_to_display(tvb,object_tree,offset,4,"Nominal Grant Interval",NULL,FMT_DEC,&hf_cops_pcmm_nominal_grant_interval);
+     offset += 4;
+
+     /* Tolerated Grant Jitter */
+     info_to_display(tvb,object_tree,offset,4,"Tolerated Grant Jitter",NULL,FMT_DEC,&hf_cops_pcmm_tolerated_grant_jitter);
+     offset += 4;
+
+     if (n < 40) return;
+
+     /* Reserved Envelope */
+     ti = proto_tree_add_text(stt, tvb, offset, 16, "Reserved Envelope");
+     object_tree = proto_item_add_subtree(ti, ett_cops_subtree);
+
+     /* Request Transmission Policy */
+     decode_docsis_request_transmission_policy(tvb, offset, object_tree, hf_cops_pcmm_request_transmission_policy);
+     offset += 4;
+
+     /* Unsolicited Grant Size */
+     info_to_display(tvb,object_tree,offset,2,"Unsolicited Grant Size",NULL,FMT_DEC,&hf_cops_pcmm_unsolicited_grant_size);
+     offset += 2;
+
+     /* Grants Per Interval */
+     info_to_display(tvb,object_tree,offset,1,"Grants Per Interval",NULL,FMT_DEC,&hf_cops_pcmm_grants_per_interval);
+     offset += 1;
+
+     proto_tree_add_text(object_tree, tvb, offset, 1, "Reserved");
+     offset += 1;
+
+     /* Nominal Grant Interval */
+     info_to_display(tvb,object_tree,offset,4,"Nominal Grant Interval",NULL,FMT_DEC,&hf_cops_pcmm_nominal_grant_interval);
+     offset += 4;
+
+     /* Tolerated Grant Jitter */
+     info_to_display(tvb,object_tree,offset,4,"Tolerated Grant Jitter",NULL,FMT_DEC,&hf_cops_pcmm_tolerated_grant_jitter);
+     offset += 4;
+
+     if (n < 56) return;
+
+     /* Committed Envelope */
+     ti = proto_tree_add_text(stt, tvb, offset, 16, "Committed Envelope");
+     object_tree = proto_item_add_subtree(ti, ett_cops_subtree);
+
+     /* Request Transmission Policy */
+     decode_docsis_request_transmission_policy(tvb, offset, object_tree, hf_cops_pcmm_request_transmission_policy);
+     offset += 4;
+
+     /* Unsolicited Grant Size */
+     info_to_display(tvb,object_tree,offset,2,"Unsolicited Grant Size",NULL,FMT_DEC,&hf_cops_pcmm_unsolicited_grant_size);
+     offset += 2;
+
+     /* Grants Per Interval */
+     info_to_display(tvb,object_tree,offset,1,"Grants Per Interval",NULL,FMT_DEC,&hf_cops_pcmm_grants_per_interval);
+     offset += 1;
+
+     proto_tree_add_text(object_tree, tvb, offset, 1, "Reserved");
+     offset += 1;
+
+     /* Nominal Grant Interval */
+     info_to_display(tvb,object_tree,offset,4,"Nominal Grant Interval",NULL,FMT_DEC,&hf_cops_pcmm_nominal_grant_interval);
+     offset += 4;
+
+     /* Tolerated Grant Jitter */
+     info_to_display(tvb,object_tree,offset,4,"Tolerated Grant Jitter",NULL,FMT_DEC,&hf_cops_pcmm_tolerated_grant_jitter);
+     offset += 4;
+}
+
+/* Cops - Section : Unsolicited Grant Service with Activity Detection */
+static void
+cops_ugs_with_activity_detection(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset) {
+     proto_item *ti;
+     proto_tree *stt, *object_tree;
+
+     /* Create a subtree */
+     stt = info_to_cops_subtree(tvb,st,n,offset,"Unsolicited Grant Service with Activity Detection");
+     offset += 4;
+
+     /* Envelope */
+     info_to_display(tvb,stt,offset,1,"Envelope",NULL,FMT_DEC,&hf_cops_pcmm_envelope);
+     offset += 1;
+
+     proto_tree_add_text(stt, tvb, offset, 3, "Reserved");
+     offset += 3;
+
+     /* Authorized Envelope */
+     ti = proto_tree_add_text(stt, tvb, offset, 24, "Authorized Envelope");
+     object_tree = proto_item_add_subtree(ti, ett_cops_subtree);
+
+     /* Request Transmission Policy */
+     decode_docsis_request_transmission_policy(tvb, offset, object_tree, hf_cops_pcmm_request_transmission_policy);
+     offset += 4;
+
+     /* Unsolicited Grant Size */
+     info_to_display(tvb,object_tree,offset,2,"Unsolicited Grant Size",NULL,FMT_DEC,&hf_cops_pcmm_unsolicited_grant_size);
+     offset += 2;
+
+     /* Grants Per Interval */
+     info_to_display(tvb,object_tree,offset,1,"Grants Per Interval",NULL,FMT_DEC,&hf_cops_pcmm_grants_per_interval);
+     offset += 1;
+
+     proto_tree_add_text(object_tree, tvb, offset, 1, "Reserved");
+     offset += 1;
+
+     /* Nominal Grant Interval */
+     info_to_display(tvb,object_tree,offset,4,"Nominal Grant Interval",NULL,FMT_DEC,&hf_cops_pcmm_nominal_grant_interval);
+     offset += 4;
+
+     /* Tolerated Grant Jitter */
+     info_to_display(tvb,object_tree,offset,4,"Tolerated Grant Jitter",NULL,FMT_DEC,&hf_cops_pcmm_tolerated_grant_jitter);
+     offset += 4;
+
+     /* Nominal Polling Interval */
+     info_to_display(tvb,object_tree,offset,4,"Nominal Polling Interval",NULL,FMT_DEC,&hf_cops_pcmm_nominal_polling_interval);
+     offset += 4;
+
+     /* Tolerated Poll Jitter */
+     info_to_display(tvb,object_tree,offset,4,"Tolerated Poll Jitter",NULL,FMT_DEC,&hf_cops_pcmm_tolerated_poll_jitter);
+     offset += 4;
+
+     if (n < 56) return;
+
+     /* Reserved Envelope */
+     ti = proto_tree_add_text(stt, tvb, offset, 24, "Reserved Envelope");
+     object_tree = proto_item_add_subtree(ti, ett_cops_subtree);
+
+     /* Request Transmission Policy */
+     decode_docsis_request_transmission_policy(tvb, offset, object_tree, hf_cops_pcmm_request_transmission_policy);
+     offset += 4;
+
+     /* Unsolicited Grant Size */
+     info_to_display(tvb,object_tree,offset,2,"Unsolicited Grant Size",NULL,FMT_DEC,&hf_cops_pcmm_unsolicited_grant_size);
+     offset += 2;
+
+     /* Grants Per Interval */
+     info_to_display(tvb,object_tree,offset,1,"Grants Per Interval",NULL,FMT_DEC,&hf_cops_pcmm_grants_per_interval);
+     offset += 1;
+
+     proto_tree_add_text(object_tree, tvb, offset, 1, "Reserved");
+     offset += 1;
+
+     /* Nominal Grant Interval */
+     info_to_display(tvb,object_tree,offset,4,"Nominal Grant Interval",NULL,FMT_DEC,&hf_cops_pcmm_nominal_grant_interval);
+     offset += 4;
+
+     /* Tolerated Grant Jitter */
+     info_to_display(tvb,object_tree,offset,4,"Tolerated Grant Jitter",NULL,FMT_DEC,&hf_cops_pcmm_tolerated_grant_jitter);
+     offset += 4;
+
+     /* Nominal Polling Interval */
+     info_to_display(tvb,object_tree,offset,4,"Nominal Polling Interval",NULL,FMT_DEC,&hf_cops_pcmm_nominal_polling_interval);
+     offset += 4;
+
+     /* Tolerated Poll Jitter */
+     info_to_display(tvb,object_tree,offset,4,"Tolerated Poll Jitter",NULL,FMT_DEC,&hf_cops_pcmm_tolerated_poll_jitter);
+     offset += 4;
+
+     if (n < 80) return;
+
+     /* Committed Envelope */
+     ti = proto_tree_add_text(stt, tvb, offset, 24, "Committed Envelope");
+     object_tree = proto_item_add_subtree(ti, ett_cops_subtree);
+
+     /* Request Transmission Policy */
+     decode_docsis_request_transmission_policy(tvb, offset, object_tree, hf_cops_pcmm_request_transmission_policy);
+     offset += 4;
+
+     /* Unsolicited Grant Size */
+     info_to_display(tvb,object_tree,offset,2,"Unsolicited Grant Size",NULL,FMT_DEC,&hf_cops_pcmm_unsolicited_grant_size);
+     offset += 2;
+
+     /* Grants Per Interval */
+     info_to_display(tvb,object_tree,offset,1,"Grants Per Interval",NULL,FMT_DEC,&hf_cops_pcmm_grants_per_interval);
+     offset += 1;
+
+     proto_tree_add_text(object_tree, tvb, offset, 1, "Reserved");
+     offset += 1;
+
+     /* Nominal Grant Interval */
+     info_to_display(tvb,object_tree,offset,4,"Nominal Grant Interval",NULL,FMT_DEC,&hf_cops_pcmm_nominal_grant_interval);
+     offset += 4;
+
+     /* Tolerated Grant Jitter */
+     info_to_display(tvb,object_tree,offset,4,"Tolerated Grant Jitter",NULL,FMT_DEC,&hf_cops_pcmm_tolerated_grant_jitter);
+     offset += 4;
+
+     /* Nominal Polling Interval */
+     info_to_display(tvb,object_tree,offset,4,"Nominal Polling Interval",NULL,FMT_DEC,&hf_cops_pcmm_nominal_polling_interval);
+     offset += 4;
+
+     /* Tolerated Poll Jitter */
+     info_to_display(tvb,object_tree,offset,4,"Tolerated Poll Jitter",NULL,FMT_DEC,&hf_cops_pcmm_tolerated_poll_jitter);
+     offset += 4;
+}
+
+/* Cops - Section : Downstream Service */
+static void
+cops_downstream_service(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset) {
+     proto_item *ti;
+     proto_tree *stt, *object_tree;
+
+     /* Create a subtree */
+     stt = info_to_cops_subtree(tvb,st,n,offset,"Downstream Service");
+     offset += 4;
+
+     /* Envelope */
+     info_to_display(tvb,stt,offset,1,"Envelope",NULL,FMT_DEC,&hf_cops_pcmm_envelope);
+     offset += 1;
+
+     proto_tree_add_text(stt, tvb, offset, 3, "Reserved");
+     offset += 3;
+
+     /* Authorized Envelope */
+     ti = proto_tree_add_text(stt, tvb, offset, 24, "Authorized Envelope");
+     object_tree = proto_item_add_subtree(ti, ett_cops_subtree);
+
+     /* Traffic Priority */
+     info_to_display(tvb,object_tree,offset,1,"Traffic Priority",NULL,FMT_HEX,&hf_cops_pcmm_traffic_priority);
+     offset += 1;
+
+     proto_tree_add_text(object_tree, tvb, offset, 3, "Reserved");
+     offset += 3;
+
+     /* Maximum Sustained Traffic Rate */
+     info_to_display(tvb,object_tree,offset,4,"Maximum Sustained Traffic Rate",NULL,FMT_DEC,&hf_cops_pcmm_max_sustained_traffic_rate);
+     offset += 4;
+
+     /* Maximum Traffic Burst */
+     info_to_display(tvb,object_tree,offset,4,"Maximum Traffic Burst",NULL,FMT_DEC,&hf_cops_pcmm_max_traffic_burst);
+     offset += 4;
+
+     /* Minimum Reserved Traffic Rate */
+     info_to_display(tvb,object_tree,offset,4,"Minimum Reserved Traffic Rate",NULL,FMT_DEC,&hf_cops_pcmm_min_reserved_traffic_rate);
+     offset += 4;
+
+     /* Assumed Minimum Reserved Traffic Rate Packet Size */
+     info_to_display(tvb,object_tree,offset,2,"Assumed Minimum Reserved Traffic Rate Packet Size",NULL,FMT_DEC,&hf_cops_pcmm_ass_min_rtr_packet_size);
+     offset += 2;
+
+     /* Reserved */
+     info_to_display(tvb,object_tree,offset,2,"Reserved",NULL,FMT_HEX,&hf_cops_pc_reserved);
+     offset += 2;
+
+     /* Maximum Downstream Latency */
+     info_to_display(tvb,object_tree,offset,4,"Maximum Downstream Latency",NULL,FMT_DEC,&hf_cops_pcmm_max_downstream_latency);
+     offset += 4;
+
+     if (n < 56) return;
+
+     /* Reserved Envelope */
+     ti = proto_tree_add_text(stt, tvb, offset, 24, "Reserved Envelope");
+     object_tree = proto_item_add_subtree(ti, ett_cops_subtree);
+
+     /* Traffic Priority */
+     info_to_display(tvb,object_tree,offset,1,"Traffic Priority",NULL,FMT_HEX,&hf_cops_pcmm_traffic_priority);
+     offset += 1;
+
+     proto_tree_add_text(object_tree, tvb, offset, 3, "Reserved");
+     offset += 3;
+
+     /* Maximum Sustained Traffic Rate */
+     info_to_display(tvb,object_tree,offset,4,"Maximum Sustained Traffic Rate",NULL,FMT_DEC,&hf_cops_pcmm_max_sustained_traffic_rate);
+     offset += 4;
+
+     /* Maximum Traffic Burst */
+     info_to_display(tvb,object_tree,offset,4,"Maximum Traffic Burst",NULL,FMT_DEC,&hf_cops_pcmm_max_traffic_burst);
+     offset += 4;
+
+     /* Minimum Reserved Traffic Rate */
+     info_to_display(tvb,object_tree,offset,4,"Minimum Reserved Traffic Rate",NULL,FMT_DEC,&hf_cops_pcmm_min_reserved_traffic_rate);
+     offset += 4;
+
+     /* Assumed Minimum Reserved Traffic Rate Packet Size */
+     info_to_display(tvb,object_tree,offset,2,"Assumed Minimum Reserved Traffic Rate Packet Size",NULL,FMT_DEC,&hf_cops_pcmm_ass_min_rtr_packet_size);
+     offset += 2;
+
+     /* Reserved */
+     info_to_display(tvb,object_tree,offset,2,"Reserved",NULL,FMT_HEX,&hf_cops_pc_reserved);
+     offset += 2;
+
+     /* Maximum Downstream Latency */
+     info_to_display(tvb,object_tree,offset,4,"Maximum Downstream Latency",NULL,FMT_DEC,&hf_cops_pcmm_max_downstream_latency);
+     offset += 4;
+
+     if (n < 80) return;
+
+     /* Committed Envelope */
+     ti = proto_tree_add_text(stt, tvb, offset, 24, "Committed Envelope");
+     object_tree = proto_item_add_subtree(ti, ett_cops_subtree);
+
+     /* Traffic Priority */
+     info_to_display(tvb,object_tree,offset,1,"Traffic Priority",NULL,FMT_HEX,&hf_cops_pcmm_traffic_priority);
+     offset += 1;
+
+     proto_tree_add_text(object_tree, tvb, offset, 3, "Reserved");
+     offset += 3;
+
+     /* Maximum Sustained Traffic Rate */
+     info_to_display(tvb,object_tree,offset,4,"Maximum Sustained Traffic Rate",NULL,FMT_DEC,&hf_cops_pcmm_max_sustained_traffic_rate);
+     offset += 4;
+
+     /* Maximum Traffic Burst */
+     info_to_display(tvb,object_tree,offset,4,"Maximum Traffic Burst",NULL,FMT_DEC,&hf_cops_pcmm_max_traffic_burst);
+     offset += 4;
+
+     /* Minimum Reserved Traffic Rate */
+     info_to_display(tvb,object_tree,offset,4,"Minimum Reserved Traffic Rate",NULL,FMT_DEC,&hf_cops_pcmm_min_reserved_traffic_rate);
+     offset += 4;
+
+     /* Assumed Minimum Reserved Traffic Rate Packet Size */
+     info_to_display(tvb,object_tree,offset,2,"Assumed Minimum Reserved Traffic Rate Packet Size",NULL,FMT_DEC,&hf_cops_pcmm_ass_min_rtr_packet_size);
+     offset += 2;
+
+     /* Reserved */
+     info_to_display(tvb,object_tree,offset,2,"Reserved",NULL,FMT_HEX,&hf_cops_pc_reserved);
+     offset += 2;
+
+     /* Maximum Downstream Latency */
+     info_to_display(tvb,object_tree,offset,4,"Maximum Downstream Latency",NULL,FMT_DEC,&hf_cops_pcmm_max_downstream_latency);
+     offset += 4;
+}
+
+/* Cops - Section : PacketCable Multimedia Event Gereration-Info */
+static void
+cops_mm_event_generation_info(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset) {
+
+     proto_tree *stt;
+     guint8 *bcid_str;
+
+     /* Create a subtree */
+     stt = info_to_cops_subtree(tvb,st,n,offset,"Event Generation Info");
+     offset += 4;
+
+     /* Primary Record Keeping Server IP Address */
+     info_to_display(tvb,stt,offset,4,"PRKS IP Address", NULL,FMT_IPv4,&hf_cops_pc_prks_ip);
+     offset += 4;
+
+     /* Primary Record Keeping Server IP Port */
+     info_to_display(tvb,stt,offset,2,"PRKS IP Port",NULL,FMT_DEC,&hf_cops_pc_prks_ip_port);
+     offset += 2;
+
+     /* Reserved */
+     info_to_display(tvb,stt,offset,2,"Reserved",NULL,FMT_HEX,&hf_cops_pc_reserved);
+     offset += 2;
+
+     /* Secondary Record Keeping Server IP Address */
+     info_to_display(tvb,stt,offset,4,"SRKS IP Address", NULL,FMT_IPv4,&hf_cops_pc_srks_ip);
+     offset += 4;
+
+     /* Secondary Record Keeping Server IP Port */
+     info_to_display(tvb,stt,offset,2,"SRKS IP Port",NULL,FMT_DEC,&hf_cops_pc_srks_ip_port);
+     offset += 2;
+
+     /* Reserved */
+     info_to_display(tvb,stt,offset,2,"Reserved",NULL,FMT_HEX,&hf_cops_pc_reserved);
+     offset += 2;
+
+     /* BCID Timestamp */
+     info_to_display(tvb,stt,offset,4,"BCID - Timestamp",NULL,FMT_HEX,&hf_cops_pc_bcid_ts);
+     offset += 4;
+
+     /* BCID Element ID */
+     bcid_str = (guchar*)tvb_format_text(tvb, offset, 8);
+     proto_tree_add_text(stt, tvb, offset, 8,"%-28s : '%s'","BCID - Element ID",bcid_str);
+     offset += 8;
+
+     /* BCID Time Zone */
+     bcid_str = (guchar*)tvb_format_text(tvb, offset, 8);
+     proto_tree_add_text(stt, tvb, offset, 8,"%-28s : '%s'","BCID - Time Zone",bcid_str);
+     offset += 8;
+
+     /* BCID Event Counter */
+     info_to_display(tvb,stt,offset,4,"BCID - Event Counter",NULL,FMT_DEC,&hf_cops_pc_bcid_ev);
+}
+
+/* Cops - Section : Volume-Based Usage Limit */
+static void
+cops_volume_based_usage_limit(tvbuff_t *tvb, proto_tree *st, guint object_len, guint32 offset) {
+
+     proto_tree *stt;
+
+     /* Create a subtree */
+     stt = info_to_cops_subtree(tvb,st,object_len,offset,"Volume-Based Usage Limit");
+     offset += 4;
+
+     /* Usage Limit */
+     proto_tree_add_item(stt, hf_cops_pcmm_volume_based_usage_limit, tvb, offset, 8,
+           FALSE);
+}
+
+/* Cops - Section : Time-Based Usage Limit */
+static void
+cops_time_based_usage_limit(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset) {
+
+     proto_tree *stt;
+
+     /* Create a subtree */
+     stt = info_to_cops_subtree(tvb,st,n,offset,"Time-Based Usage Limit");
+     offset += 4;
+
+     /* Time Limit */
+     info_to_display(tvb,stt,offset,4,"Time Limit", NULL,FMT_DEC,&hf_cops_pcmm_time_based_usage_limit);
+     offset += 4;
+}
+
+/* Cops - Section : Opaque Data */
+static void
+cops_opaque_data(tvbuff_t *tvb, proto_tree *st, guint object_len, guint32 offset) {
+
+     proto_tree *stt;
+
+     /* Create a subtree */
+     stt = info_to_cops_subtree(tvb,st,object_len,offset,"Opaque Data");
+     offset += 4;
+
+     /* Opaque Data */
+     proto_tree_add_text(stt, tvb, offset, 8,"Opaque Data");
+}
+
+/* Cops - Section : Gate Time Info */
+static void
+cops_gate_time_info(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset) {
+
+     proto_tree *stt;
+
+     /* Create a subtree */
+     stt = info_to_cops_subtree(tvb,st,n,offset,"Gate Time Info");
+     offset += 4;
+
+     /* Gate Time Info */
+     info_to_display(tvb,stt,offset,4,"Time Committed", NULL,FMT_DEC,&hf_cops_pcmm_gate_time_info);
+     offset += 4;
+}
 
 /* Cops - Section : Gate Usage Info */
 static void
@@ -4218,9 +5220,8 @@ cops_gate_usage_info(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset) {
      stt = info_to_cops_subtree(tvb,st,n,offset,"Gate Usage Info");
      offset += 4;
 
-     /* Gate Time Info */
-     info_to_display(tvb,stt,offset,4,"Octet Count", NULL,FMT_DEC,&hf_cops_pcmm_gate_usage_info);
-     offset += 4;
+     /* Gate Usage Info */
+     info_to_display(tvb,stt,offset,8,"Octet Count", NULL,FMT_DEC,&hf_cops_pcmm_gate_usage_info);
 }
 
 /* Cops - Section : PacketCable error */
@@ -4339,6 +5340,19 @@ cops_msg_receipt_key(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset) {
      info_to_display(tvb,stt,offset,4,"Msg Receipt Key", NULL,FMT_HEX,&hf_cops_pcmm_msg_receipt_key);
 }
 
+/* Cops - Section : UserID */
+static void
+cops_userid(tvbuff_t *tvb, proto_tree *st, guint n, guint32 offset) {
+
+     proto_tree *stt;
+
+     /* Create a subtree */
+     stt = info_to_cops_subtree(tvb, st, n, offset, "UserID");
+     offset += 4;
+
+     /* UserID */
+     info_to_display(tvb, stt, offset, n-4, "UserID", NULL, FMT_STR, &hf_cops_pcmm_userid);
+}
 
 /* PacketCable D-QoS S-Num/S-Type globs */
 #define PCDQ_TRANSACTION_ID              0x0101
@@ -4468,6 +5482,7 @@ decode_docsis_request_transmission_policy(tvbuff_t *tvb, guint32 offset, proto_t
 #define PCMM_TRANSACTION_ID                0x0101
 #define PCMM_AMID                          0x0201
 #define PCMM_SUBSCRIBER_ID                 0x0301
+#define PCMM_SUBSCRIBER_ID_V6              0x0302
 #define PCMM_GATE_ID                       0x0401
 #define PCMM_GATE_SPEC                     0x0501
 #define PCMM_CLASSIFIER                    0x0601
@@ -4480,6 +5495,7 @@ decode_docsis_request_transmission_policy(tvbuff_t *tvb, guint32 offset, proto_t
 #define PCMM_UNSOLICITED_GRANT_SERVICE     0x0706
 #define PCMM_UGS_WITH_ACTIVITY_DETECTION   0x0707
 #define PCMM_DOWNSTREAM_SERVICE            0x0708
+#define PCMM_UPSTREAM_DROP                 0x0709
 #define PCMM_EVENT_GENERATION_INFO         0x0801
 #define PCMM_VOLUME_BASED_USAGE_LIMIT      0x0901
 #define PCMM_TIME_BASED_USAGE_LIMIT        0x0a01
@@ -4492,6 +5508,7 @@ decode_docsis_request_transmission_policy(tvbuff_t *tvb, guint32 offset, proto_t
 #define PCMM_PSID                          0x1101
 #define PCMM_SYNCH_OPTIONS                 0x1201
 #define PCMM_MSG_RECEIPT_KEY               0x1301
+#define PCMM_USERID                        0x1501
 
 
 static void
@@ -4534,6 +5551,9 @@ cops_analyze_packetcable_mm_obj(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t
         case PCMM_SUBSCRIBER_ID:
                cops_subscriber_id_v4(tvb, tree, object_len, offset);
                break;
+        case PCMM_SUBSCRIBER_ID_V6:
+               cops_subscriber_id_v6(tvb, tree, object_len, offset);
+               break;
         case PCMM_GATE_ID:
                cops_gate_id(tvb, tree, object_len, offset);
                break;
@@ -4553,23 +5573,44 @@ cops_analyze_packetcable_mm_obj(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t
                cops_docsis_service_class_name(tvb, tree, object_len, offset);
                break;
         case PCMM_BEST_EFFORT_SERVICE:
-               cops_best_effort_service(tvb, tree, object_len, offset);
-               break;
+                      if (object_len == 40 || object_len == 72 || object_len == 104)
+                          cops_best_effort_service_i04(tvb, tree, object_len, offset);
+                      else
+                          cops_best_effort_service(tvb, tree, object_len, offset);
+                      break;
         case PCMM_NON_REAL_TIME_POLLING_SERVICE:
-               cops_non_real_time_polling_service(tvb, tree, object_len, offset);
+                  if (object_len == 44 || object_len == 80 || object_len == 116)
+                   cops_non_real_time_polling_service_i04(tvb, tree, object_len, offset);
+                  else
+                          cops_non_real_time_polling_service(tvb, tree, object_len, offset);
                break;
         case PCMM_REAL_TIME_POLLING_SERVICE:
-               cops_real_time_polling_service(tvb, tree, object_len, offset);
+                  if (object_len == 44 || object_len == 80 || object_len == 116)
+                   cops_real_time_polling_service_i04(tvb, tree, object_len, offset);
+                  else
+                          cops_real_time_polling_service(tvb, tree, object_len, offset);
                break;
         case PCMM_UNSOLICITED_GRANT_SERVICE:
-               cops_unsolicited_grant_service(tvb, tree, object_len, offset);
-               break;
+                  if (object_len == 32 || object_len == 56 || object_len == 80)
+                   cops_unsolicited_grant_service_i04(tvb, tree, object_len, offset);
+                  else
+                          cops_unsolicited_grant_service(tvb, tree, object_len, offset);
+                  break;
         case PCMM_UGS_WITH_ACTIVITY_DETECTION:
-               cops_ugs_with_activity_detection(tvb, tree, object_len, offset);
-               break;
+                  if (object_len == 40 || object_len == 72 || object_len == 104)
+                   cops_ugs_with_activity_detection_i04(tvb, tree, object_len, offset);
+                  else
+                          cops_ugs_with_activity_detection(tvb, tree, object_len, offset);
+                  break;
         case PCMM_DOWNSTREAM_SERVICE:
-               cops_downstream_service(tvb, tree, object_len, offset);
-               break;
+                  if (object_len == 40 || object_len == 72 || object_len == 104)
+                   cops_downstream_service_i04(tvb, tree, object_len, offset);
+                  else
+                          cops_downstream_service(tvb, tree, object_len, offset);
+                  break;
+        case PCMM_UPSTREAM_DROP:
+                  cops_upstream_drop_i04(tvb, tree, object_len, offset);
+                  break;
         case PCMM_EVENT_GENERATION_INFO:
                cops_mm_event_generation_info(tvb, tree, object_len, offset);
                break;
@@ -4606,6 +5647,10 @@ cops_analyze_packetcable_mm_obj(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t
         case PCMM_MSG_RECEIPT_KEY:
                cops_msg_receipt_key(tvb, tree, object_len, offset);
                break;
+        case PCMM_USERID:
+                          cops_userid(tvb, tree, object_len, offset);
+                          break;
+
        }
 
        /* Tune offset */