diff --git a/doc/guides/rel_notes/release_20_05.rst b/doc/guides/rel_notes/release_20_05.rst
index 2190eaf..000bbf5 100644
--- a/doc/guides/rel_notes/release_20_05.rst
+++ b/doc/guides/rel_notes/release_20_05.rst
@@ -56,6 +56,12 @@ New Features
      Also, make sure to start the actual text at the margin.
      =========================================================
 
+* **Updated Mellanox mlx5 driver.**
+
+  Updated Mellanox mlx5 driver with new features and improvements, including:
+
+  * Added support for matching on IPv4 Time To Live and IPv6 Hop Limit.
+
 
 Removed Items
 -------------
diff --git a/drivers/common/mlx5/mlx5_prm.h b/drivers/common/mlx5/mlx5_prm.h
index 4ac3d4b..eee3a4b 100644
--- a/drivers/common/mlx5/mlx5_prm.h
+++ b/drivers/common/mlx5/mlx5_prm.h
@@ -651,7 +651,8 @@ struct mlx5_ifc_fte_match_set_lyr_2_4_bits {
 	u8 tcp_flags[0x9];
 	u8 tcp_sport[0x10];
 	u8 tcp_dport[0x10];
-	u8 reserved_at_c0[0x20];
+	u8 reserved_at_c0[0x18];
+	u8 ip_ttl_hoplimit[0x8];
 	u8 udp_sport[0x10];
 	u8 udp_dport[0x10];
 	union mlx5_ifc_ipv6_layout_ipv4_layout_auto_bits src_ipv4_src_ipv6;
diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c
index 2414a97..e7278f0 100644
--- a/drivers/net/mlx5/mlx5_flow_dv.c
+++ b/drivers/net/mlx5/mlx5_flow_dv.c
@@ -4490,13 +4490,35 @@ struct field_modify_info modify_tcp[] = {
 	const struct rte_flow_action_raw_decap *decap;
 	const struct rte_flow_action_raw_encap *encap;
 	const struct rte_flow_action_rss *rss;
-	struct rte_flow_item_tcp nic_tcp_mask = {
+	const struct rte_flow_item_tcp nic_tcp_mask = {
 		.hdr = {
 			.tcp_flags = 0xFF,
 			.src_port = RTE_BE16(UINT16_MAX),
 			.dst_port = RTE_BE16(UINT16_MAX),
 		}
 	};
+	const struct rte_flow_item_ipv4 nic_ipv4_mask = {
+		.hdr = {
+			.src_addr = RTE_BE32(0xffffffff),
+			.dst_addr = RTE_BE32(0xffffffff),
+			.type_of_service = 0xff,
+			.next_proto_id = 0xff,
+			.time_to_live = 0xff,
+		},
+	};
+	const struct rte_flow_item_ipv6 nic_ipv6_mask = {
+		.hdr = {
+			.src_addr =
+			"\xff\xff\xff\xff\xff\xff\xff\xff"
+			"\xff\xff\xff\xff\xff\xff\xff\xff",
+			.dst_addr =
+			"\xff\xff\xff\xff\xff\xff\xff\xff"
+			"\xff\xff\xff\xff\xff\xff\xff\xff",
+			.vtc_flow = RTE_BE32(0xffffffff),
+			.proto = 0xff,
+			.hop_limits = 0xff,
+		},
+	};
 	struct mlx5_priv *priv = dev->data->dev_private;
 	struct mlx5_dev_config *dev_conf = &priv->config;
 	uint16_t queue_index = 0xFFFF;
@@ -4563,7 +4585,8 @@ struct field_modify_info modify_tcp[] = {
 						  &item_flags, &tunnel);
 			ret = mlx5_flow_validate_item_ipv4(items, item_flags,
 							   last_item,
-							   ether_type, NULL,
+							   ether_type,
+							   &nic_ipv4_mask,
 							   error);
 			if (ret < 0)
 				return ret;
@@ -4588,7 +4611,8 @@ struct field_modify_info modify_tcp[] = {
 						  &item_flags, &tunnel);
 			ret = mlx5_flow_validate_item_ipv6(items, item_flags,
 							   last_item,
-							   ether_type, NULL,
+							   ether_type,
+							   &nic_ipv6_mask,
 							   error);
 			if (ret < 0)
 				return ret;
@@ -5421,6 +5445,7 @@ struct field_modify_info modify_tcp[] = {
 			.dst_addr = RTE_BE32(0xffffffff),
 			.type_of_service = 0xff,
 			.next_proto_id = 0xff,
+			.time_to_live = 0xff,
 		},
 	};
 	void *headers_m;
@@ -5470,6 +5495,10 @@ struct field_modify_info modify_tcp[] = {
 		 ipv4_m->hdr.next_proto_id);
 	MLX5_SET(fte_match_set_lyr_2_4, headers_v, ip_protocol,
 		 ipv4_v->hdr.next_proto_id & ipv4_m->hdr.next_proto_id);
+	MLX5_SET(fte_match_set_lyr_2_4, headers_m, ip_ttl_hoplimit,
+		 ipv4_m->hdr.time_to_live);
+	MLX5_SET(fte_match_set_lyr_2_4, headers_v, ip_ttl_hoplimit,
+		 ipv4_v->hdr.time_to_live & ipv4_m->hdr.time_to_live);
 	/*
 	 * On outer header (which must contains L2), or inner header with L2,
 	 * set cvlan_tag mask bit to mark this packet as untagged.
@@ -5583,6 +5612,11 @@ struct field_modify_info modify_tcp[] = {
 		 ipv6_m->hdr.proto);
 	MLX5_SET(fte_match_set_lyr_2_4, headers_v, ip_protocol,
 		 ipv6_v->hdr.proto & ipv6_m->hdr.proto);
+	/* Hop limit. */
+	MLX5_SET(fte_match_set_lyr_2_4, headers_m, ip_ttl_hoplimit,
+		 ipv6_m->hdr.hop_limits);
+	MLX5_SET(fte_match_set_lyr_2_4, headers_v, ip_ttl_hoplimit,
+		 ipv6_v->hdr.hop_limits & ipv6_m->hdr.hop_limits);
 	/*
 	 * On outer header (which must contains L2), or inner header with L2,
 	 * set cvlan_tag mask bit to mark this packet as untagged.
