diff --git a/lib/librte_ethdev/rte_tm.c b/lib/librte_ethdev/rte_tm.c
index 9709454..89a7dec 100644
--- a/lib/librte_ethdev/rte_tm.c
+++ b/lib/librte_ethdev/rte_tm.c
@@ -168,6 +168,48 @@ int rte_tm_shared_wred_context_delete(uint16_t port_id,
 		shared_wred_context_id, error);
 }
 
+/* Add Tail Drop profile */
+int rte_tm_tdrop_profile_add(uint16_t port_id,
+	uint32_t tdrop_profile_id,
+	struct rte_tm_tdrop_params *profile,
+	struct rte_tm_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_TM_FUNC(port_id, tdrop_profile_add)(dev,
+		tdrop_profile_id, profile, error);
+}
+
+/* Delete Tail Drop profile */
+int rte_tm_tdrop_profile_delete(uint16_t port_id,
+	uint32_t tdrop_profile_id,
+	struct rte_tm_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_TM_FUNC(port_id, tdrop_profile_delete)(dev,
+		tdrop_profile_id, error);
+}
+
+/* Add/update shared Tail Drop context */
+int rte_tm_shared_tdrop_context_add_update(uint16_t port_id,
+	uint32_t shared_tdrop_context_id,
+	uint32_t tdrop_profile_id,
+	struct rte_tm_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_TM_FUNC(port_id, shared_tdrop_context_add_update)(dev,
+		shared_tdrop_context_id, tdrop_profile_id, error);
+}
+
+/* Delete shared Tail Drop context */
+int rte_tm_shared_tdrop_context_delete(uint16_t port_id,
+	uint32_t shared_tdrop_context_id,
+	struct rte_tm_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_TM_FUNC(port_id, shared_tdrop_context_delete)(dev,
+		shared_tdrop_context_id, error);
+}
+
 /* Add shaper profile */
 int rte_tm_shaper_profile_add(uint16_t port_id,
 	uint32_t shaper_profile_id,
diff --git a/lib/librte_ethdev/rte_tm.h b/lib/librte_ethdev/rte_tm.h
index 955f02f..91b087d 100644
--- a/lib/librte_ethdev/rte_tm.h
+++ b/lib/librte_ethdev/rte_tm.h
@@ -93,6 +93,15 @@
 #define RTE_TM_WRED_PROFILE_ID_NONE                  UINT32_MAX
 
 /**
+ * Invalid TDROP profile ID.
+ *
+ * @see struct rte_tm_node_params
+ * @see rte_tm_node_add()
+ * @see rte_tm_node_tdrop_context_update()
+ */
+#define RTE_TM_TDROP_PROFILE_ID_NONE                  UINT32_MAX
+
+/**
  *Invalid shaper profile ID.
  *
  * @see struct rte_tm_node_params
@@ -871,6 +880,37 @@ struct rte_tm_wred_params {
 };
 
 /**
+ * Tail Drop (TDROP) profile
+ *
+ * Multiple TDROP contexts can share the same TDROP profile. Each leaf node with
+ * TDROP enabled as its congestion management mode has zero or one private TDROP
+ * context (only one leaf node using it) and/or zero, one or several shared
+ * TDROP contexts (multiple leaf nodes use the same TDROP context). A private
+ * TDROP context is used to perform congestion management for a single leaf
+ * node, while a shared TDROP context is used to perform congestion management
+ * for a group of leaf nodes.
+ *
+ * @see struct rte_tm_capabilities::cman_tdrop_packet_mode_supported
+ * @see struct rte_tm_capabilities::cman_tdrop_byte_mode_supported
+ */
+struct rte_tm_tdrop_params {
+	/** Committed queue length (in bytes) */
+	uint64_t committed_length;
+
+	/** Peak queue length (in bytes) */
+	uint64_t peak_length;
+
+	/** Drop threshold of queue */
+	uint64_t drop_th;
+
+	/** When non-zero, the *drop_th* threshold is specified
+	 * in packets (TDROP packet mode). When zero, the *drop_th*
+	 * threshold is specified in bytes (TDROP byte mode)
+	 */
+	int packet_mode;
+};
+
+/**
  * Token bucket
  */
 struct rte_tm_token_bucket {
@@ -1000,6 +1040,32 @@ struct rte_tm_node_params {
 				 */
 				uint32_t n_shared_wred_contexts;
 			} wred;
+
+			/** TDROP parameters (only valid when *cman* is set to
+			 * TDROP).
+			 */
+			struct {
+				/** TDROP profile for private TDROP context. The
+				 * absence of a private TDROP context for the
+				 * current leaf node is indicated by value
+				 * RTE_TM_TDROP_PROFILE_ID_NONE.
+				 */
+				uint32_t tdrop_profile_id;
+
+				/** User allocated array of shared TDROP context
+				 * IDs. When set to NULL, it indicates that the
+				 * current leaf node should not currently be
+				 * part of any shared TDROP contexts.
+				 */
+				uint32_t *shared_tdrop_context_id;
+
+				/** Number of elements in the
+				 * *shared_tdrop_context_id* array. Only valid
+				 * when *shared_tdrop_context_id* is non-NULL,
+				 * in which case it should be non-zero.
+				 */
+				uint32_t n_shared_tdrop_contexts;
+			} tdrop;
 		} leaf;
 	};
 
@@ -1028,6 +1094,8 @@ enum rte_tm_error_type {
 	RTE_TM_ERROR_TYPE_WRED_PROFILE_YELLOW,
 	RTE_TM_ERROR_TYPE_WRED_PROFILE_RED,
 	RTE_TM_ERROR_TYPE_WRED_PROFILE_ID,
+	RTE_TM_ERROR_TYPE_TDROP_PROFILE,
+	RTE_TM_ERROR_TYPE_TDROP_PROFILE_ID,
 	RTE_TM_ERROR_TYPE_SHARED_WRED_CONTEXT_ID,
 	RTE_TM_ERROR_TYPE_SHAPER_PROFILE,
 	RTE_TM_ERROR_TYPE_SHAPER_PROFILE_COMMITTED_RATE,
@@ -1279,6 +1347,110 @@ struct rte_tm_error {
 	struct rte_tm_error *error);
 
 /**
+ * Traffic manager Tail Drop profile add
+ *
+ * Create a new Tail Drop profile with ID set to *tdrop_profile_id*.
+ * The new profile is used to create one or several Tail Drop contexts.
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] tdrop_profile_id
+ *   Tail Drop profile ID for the new profile. Needs to be unused.
+ * @param[in] profile
+ *   Tail Drop profile parameters. Needs to be pre-allocated and valid.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ *
+ * @see struct rte_tm_capabilities::cman_tdrop_context_n_max
+ */
+int
+rte_tm_tdrop_profile_add(uint16_t port_id,
+	uint32_t tdrop_profile_id,
+	struct rte_tm_tdrop_params *profile,
+	struct rte_tm_error *error);
+
+/**
+ * Traffic manager Tail Drop profile delete
+ *
+ * Delete an existing Tail Drop profile. This operation fails when there is
+ * currently at least one user (i.e. Tail Drop context) of this Tail Drop
+ * profile.
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] tdrop_profile_id
+ *   Tail Drop profile ID. Needs to be the valid.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ *
+ * @see struct rte_tm_capabilities::cman_tdrop_context_n_max
+ */
+int
+rte_tm_tdrop_profile_delete(uint16_t port_id,
+	uint32_t tdrop_profile_id,
+	struct rte_tm_error *error);
+
+/**
+ * Traffic manager shared Tail Drop context add or update
+ *
+ * When *shared_tdrop_context_id* is invalid, a new Tail Drop context with
+ * this ID is created by using the Tail Drop profile identified by
+ * *tdrop_profile_id*.
+ *
+ * When *shared_tdrop_context_id* is valid, this Tail Drop context is no
+ * longer using the profile previously assigned to it and is updated to
+ * use the profile identified by *tdrop_profile_id*.
+ *
+ * A valid shared Tail Drop context can be assigned to several hierarchy
+ * leaf nodes configured to use Tail Drop as the congestion management mode.
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] shared_tdrop_context_id
+ *   Shared Tail Drop context ID
+ * @param[in] tdrop_profile_id
+ *   Tail Drop profile ID. Needs to be the valid.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ *
+ * @see struct rte_tm_capabilities::cman_tdrop_context_shared_n_max
+ */
+int
+rte_tm_shared_tdrop_context_add_update(uint16_t port_id,
+	uint32_t shared_tdrop_context_id,
+	uint32_t tdrop_profile_id,
+	struct rte_tm_error *error);
+
+/**
+ * Traffic manager shared Tail Drop context delete
+ *
+ * Delete an existing shared Tail Drop context. This operation fails when
+ * there is currently at least one user (i.e. hierarchy leaf node) of this
+ * shared Tail Drop context.
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] shared_tdrop_context_id
+ *   Shared Tail Drop context ID. Needs to be the valid.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ *
+ * @see struct rte_tm_capabilities::cman_tdrop_context_shared_n_max
+ */
+int
+rte_tm_shared_tdrop_context_delete(uint16_t port_id,
+	uint32_t shared_tdrop_context_id,
+	struct rte_tm_error *error);
+
+/**
  * Traffic manager shaper profile add
  *
  * Create a new shaper profile with ID set to *shaper_profile_id*. The new
diff --git a/lib/librte_ethdev/rte_tm_driver.h b/lib/librte_ethdev/rte_tm_driver.h
index 90114ff..c0ca916 100644
--- a/lib/librte_ethdev/rte_tm_driver.h
+++ b/lib/librte_ethdev/rte_tm_driver.h
@@ -71,6 +71,30 @@ typedef int (*rte_tm_shared_wred_context_delete_t)(
 	uint32_t shared_wred_context_id,
 	struct rte_tm_error *error);
 
+/** @internal Traffic manager TDROP profile add */
+typedef int (*rte_tm_tdrop_profile_add_t)(struct rte_eth_dev *dev,
+	uint32_t tdrop_profile_id,
+	struct rte_tm_tdrop_params *profile,
+	struct rte_tm_error *error);
+
+/** @internal Traffic manager TDROP profile delete */
+typedef int (*rte_tm_tdrop_profile_delete_t)(struct rte_eth_dev *dev,
+	uint32_t tdrop_profile_id,
+	struct rte_tm_error *error);
+
+/** @internal Traffic manager shared TDROP context add */
+typedef int (*rte_tm_shared_tdrop_context_add_update_t)(
+	struct rte_eth_dev *dev,
+	uint32_t shared_tdrop_context_id,
+	uint32_t tdrop_profile_id,
+	struct rte_tm_error *error);
+
+/** @internal Traffic manager shared TDROP context delete */
+typedef int (*rte_tm_shared_tdrop_context_delete_t)(
+	struct rte_eth_dev *dev,
+	uint32_t shared_tdrop_context_id,
+	struct rte_tm_error *error);
+
 /** @internal Traffic manager shaper profile add */
 typedef int (*rte_tm_shaper_profile_add_t)(struct rte_eth_dev *dev,
 	uint32_t shaper_profile_id,
@@ -230,6 +254,17 @@ struct rte_tm_ops {
 	rte_tm_shared_wred_context_delete_t
 		shared_wred_context_delete;
 
+	/** Traffic manager TDROP profile add */
+	rte_tm_tdrop_profile_add_t tdrop_profile_add;
+	/** Traffic manager TDROP profile delete */
+	rte_tm_tdrop_profile_delete_t tdrop_profile_delete;
+	/** Traffic manager shared TDROP context add/update */
+	rte_tm_shared_tdrop_context_add_update_t
+		shared_tdrop_context_add_update;
+	/** Traffic manager shared TDROP context delete */
+	rte_tm_shared_tdrop_context_delete_t
+		shared_tdrop_context_delete;
+
 	/** Traffic manager shaper profile add */
 	rte_tm_shaper_profile_add_t shaper_profile_add;
 	/** Traffic manager shaper profile delete */
