diff --git a/lib/ethdev/rte_mtr.h b/lib/ethdev/rte_mtr.h
index dc246dd7af..311e8754de 100644
--- a/lib/ethdev/rte_mtr.h
+++ b/lib/ethdev/rte_mtr.h
@@ -213,6 +213,16 @@ struct rte_mtr_meter_policy_params {
 	const struct rte_flow_action *actions[RTE_COLORS];
 };

+/**
+ * Input color table
+ */
+enum rte_mtr_input_color_tbl {
+	/** DSCP based input color table */
+	RTE_MTR_INPUT_COLOR_TBL_DSCP,
+	/** VLAN based input color table */
+	RTE_MTR_INPUT_COLOR_TBL_VLAN,
+};
+
 /**
  * Parameters for each traffic metering & policing object
  *
@@ -233,20 +243,44 @@ struct rte_mtr_params {
 	 */
 	int use_prev_mtr_color;

-	/** Meter input color. When non-NULL: it points to a pre-allocated and
-	 * pre-populated table with exactly 64 elements providing the input
-	 * color for each value of the IPv4/IPv6 Differentiated Services Code
-	 * Point (DSCP) input packet field. When NULL: it is equivalent to
-	 * setting this parameter to an all-green populated table (i.e. table
-	 * with all the 64 elements set to green color). The color blind mode
-	 * is configured by setting *use_prev_mtr_color* to 0 and *dscp_table*
-	 * to either NULL or to an all-green populated table. When
-	 * *use_prev_mtr_color* is non-zero value or when *dscp_table* contains
-	 * at least one yellow or red color element, then the color aware mode
-	 * is configured.
-	 */
-	enum rte_color *dscp_table;
-
+	RTE_STD_C11
+	union {
+		/** Meter input color based on DSCP.
+		 * Valid when rte_mtr_input_color_tbl::tbl_selector is
+		 * set to RTE_MTR_INPUT_COLOR_TBL_DSCP.
+		 * When non-NULL: it points to a pre-allocated and pre-populated
+		 * table with exactly 64 elements providing the input color for
+		 * each value of the IPv4/IPv6 Differentiated Services Code
+		 * Point (DSCP) input packet field. When NULL:
+		 * it is equivalent to setting this parameter to an all-green
+		 * populated table (i.e. table with
+		 * all the 64 elements set to green color). The color blind mode
+		 * is configured by setting *use_prev_mtr_color* to 0 and
+		 * *dscp_table* to either NULL or to an all-green
+		 * populated table. When *use_prev_mtr_color* is non-zero value
+		 * or when *dscp_table* contains at least one yellow or
+		 * red color element, then the color aware mode is configured.
+		 * @see struct rte_mtr_capabilities::input_color_dscp_supported
+		 */
+		enum rte_color *dscp_table;
+		/** Meter input color based on VLAN.
+		 * Valid when rte_mtr_input_color_tbl::tbl_selector is
+		 * set to RTE_MTR_INPUT_COLOR_TBL_VLAN.
+		 * When non-NULL: it points to a pre-allocated and pre-populated
+		 * table with exactly 16 elements providing the input color for
+		 * each value of the DEI(1bit), PCP(3 bits) input packet field.
+		 * When NULL: it is equivalent to setting this parameter to an
+		 * all-green populated table (i.e. table with
+		 * all the 16 elements set to green color). The color blind mode
+		 * is configured by setting *use_prev_mtr_color* to 0 and
+		 * *vlan_table* to either NULL or to an all-green
+		 * populated table. When *use_prev_mtr_color* is non-zero value
+		 * or when *vlan_table* contains at least one yellow or
+		 * red color element, then the color aware mode is configured.
+		 * @see struct rte_mtr_capabilities::input_color_vlan_supported
+		 */
+		enum rte_color *vlan_table;
+	};
 	/** Non-zero to enable the meter, zero to disable the meter at the time
 	 * of MTR object creation. Ignored when the meter profile indicated by
 	 * *meter_profile_id* is set to NONE.
@@ -261,6 +295,25 @@ struct rte_mtr_params {

 	/** Meter policy ID. */
 	uint32_t meter_policy_id;
+
+	/** Select the input color table
+	 * @see struct rte_mtr_params::dscp_table
+	 * @see struct rte_mtr_capabilities::input_color_dscp_supported
+	 * @see struct rte_mtr_params::vlan_table
+	 * @see struct rte_mtr_capabilities::input_color_vlan_supported
+	 */
+	enum rte_mtr_input_color_tbl tbl_selector;
+	/** Fallback input color for the meter,
+	 *  when *use_prev_mtr_color* set to zero value and
+	 *  when packet is not based on selected *tbl_selector*.
+	 *  @see struct rte_mtr_capabilities::input_color_fallback_supported
+	 */
+	enum rte_color fallback_input_color;
+	/** Input color table based on inner field of selected
+	 *  of *tbl_selector*.
+	 *  @see struct rte_mtr_capabilities::input_color_inner_supported
+	 */
+	int input_color_inner_enable;
 };

 /**
@@ -417,6 +470,31 @@ struct rte_mtr_capabilities {
 	 * @see enum rte_mtr_stats_type
 	 */
 	uint64_t stats_mask;
+
+	/** Input color based on DSCP.
+	 * When non-zero, it indicates that driver supports input color table
+	 * based on DSCP.
+	 */
+	int input_color_dscp_supported;
+	/** Input color based on VLAN.
+	 * When non-zero, it indicates that driver supports input color table
+	 * based on VLAN.
+	 */
+	int input_color_vlan_supported;
+	/** Input color fallback support.
+	 * When non-zero, it indicates that driver supports input color
+	 * fallback.
+	 */
+	int input_color_fallback_supported;
+	/** Input color based on inner packet field.
+	 * When non-zero, it indicates that driver supports input color
+	 * based on inner field.
+	 */
+	int input_color_inner_supported;
+	 /** When non-zero, it indicates that driver supports separate
+	  * input color table for given ethdev port.
+	  */
+	int seperate_input_color_table_per_port;
 };

 /**
@@ -832,6 +910,30 @@ rte_mtr_meter_dscp_table_update(uint16_t port_id,
 	enum rte_color *dscp_table,
 	struct rte_mtr_error *error);

+/**
+ * MTR object VLAN table update
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] mtr_id
+ *   MTR object ID. Needs to be valid.
+ * @param[in] vlan_table
+ *   When non-NULL: it points to a pre-allocated and pre-populated table with
+ *   exactly 16 elements providing the input color for each value of the
+ *   each value of the DEI(1bit), PCP(3 bits) input packet field.
+ *   When NULL: it is equivalent to setting this parameter to an "all-green"
+ *   populated table (i.e. table with all the 16 elements set to green color).
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ */
+__rte_experimental
+int
+rte_mtr_meter_vlan_table_update(uint16_t port_id,
+	uint32_t mtr_id,
+	enum rte_color *vlan_table,
+	struct rte_mtr_error *error);
 /**
  * MTR object enabled statistics counters update
  *
