diff --git a/gtests/net/packetdrill/run_packet.c b/gtests/net/packetdrill/run_packet.c
index 212eff49ad16eb656ec1de9ac07f43f5fce7eca5..639940fb36c865b60bc466da7fe3e8cbc034ece6 100644
--- a/gtests/net/packetdrill/run_packet.c
+++ b/gtests/net/packetdrill/run_packet.c
@@ -843,6 +843,36 @@ static int verify_gre(
 	return STATUS_OK;
 }
 
+/* Verify that required actual MPLS header fields are as the script expected. */
+static int verify_mpls(
+	const struct packet *actual_packet,
+	const struct packet *script_packet,
+	int layer, char **error)
+{
+	const struct header *actual_header = &actual_packet->headers[layer];
+	const struct header *script_header = &script_packet->headers[layer];
+	const struct mpls *actual_mpls = actual_packet->headers[layer].h.mpls;
+	const struct mpls *script_mpls = script_packet->headers[layer].h.mpls;
+	int num_entries = script_header->header_bytes / sizeof(struct mpls);
+	int i = 0;
+
+	if (script_header->header_bytes != actual_header->header_bytes) {
+		asprintf(error, "mismatch in MPLS label stack depth");
+		return STATUS_ERR;
+	}
+
+	for (i = 0; i < num_entries; ++i) {
+		const struct mpls *actual_entry = actual_mpls + i;
+		const struct mpls *script_entry = script_mpls + i;
+		if (memcmp(actual_entry, script_entry, sizeof(*script_entry))) {
+			asprintf(error, "mismatch in MPLS label %d", i);
+			return STATUS_ERR;
+		}
+	}
+
+	return STATUS_OK;
+}
+
 typedef int (*verifier_func)(
 	const struct packet *actual_packet,
 	const struct packet *script_packet,
@@ -858,6 +888,7 @@ static int verify_header(
 		[HEADER_IPV4]	= verify_ipv4,
 		[HEADER_IPV6]	= verify_ipv6,
 		[HEADER_GRE]	= verify_gre,
+		[HEADER_MPLS]	= verify_mpls,
 		[HEADER_TCP]	= verify_tcp,
 		[HEADER_UDP]	= verify_udp,
 	};