diff --git a/platform/linux-generic/include/odp_packet_internal.h b/platform/linux-generic/include/odp_packet_internal.h
index 792fc7c..b316b20 100644
--- a/platform/linux-generic/include/odp_packet_internal.h
+++ b/platform/linux-generic/include/odp_packet_internal.h
@@ -135,7 +135,7 @@ static inline odp_packet_hdr_t *odp_packet_hdr(odp_packet_t pkt)
 /**
  * Parse packet and set internal metadata
  */
-void odp_packet_parse(odp_packet_t pkt, size_t len, size_t l2_offset);
+int odp_packet_parse(odp_packet_t pkt, size_t len, size_t l2_offset);
 
 #ifdef __cplusplus
 }
diff --git a/platform/linux-generic/source/odp_packet.c b/platform/linux-generic/source/odp_packet.c
index 5f07374..700ac39 100644
--- a/platform/linux-generic/source/odp_packet.c
+++ b/platform/linux-generic/source/odp_packet.c
@@ -138,8 +138,9 @@ void odp_packet_set_l4_offset(odp_packet_t pkt, size_t offset)
  * @param pkt        Packet handle
  * @param len        Packet length in bytes
  * @param frame_offset  Byte offset to L2 header
+ * @return           1 if the packet is valid, 0 otherwise
  */
-void odp_packet_parse(odp_packet_t pkt, size_t len, size_t frame_offset)
+int odp_packet_parse(odp_packet_t pkt, size_t len, size_t frame_offset)
 {
 	odp_packet_hdr_t *const pkt_hdr = odp_packet_hdr(pkt);
 	odp_ethhdr_t *eth;
@@ -154,9 +155,9 @@ void odp_packet_parse(odp_packet_t pkt, size_t len, size_t frame_offset)
 	pkt_hdr->frame_offset = frame_offset;
 	pkt_hdr->frame_len = len;
 
-	if (odp_unlikely(len < ODP_ETH_LEN_MIN)) {
+	if (odp_unlikely(len < ODP_ETHHDR_LEN)) {
 		pkt_hdr->error_flags.frame_len = 1;
-		return;
+		return 0;
 	} else if (len > ODP_ETH_LEN_MAX) {
 		pkt_hdr->input_flags.jumbo = 1;
 	}
@@ -235,6 +236,7 @@ void odp_packet_parse(odp_packet_t pkt, size_t len, size_t frame_offset)
 		}
 		break;
 	}
+	return 1;
 }
 
 static inline uint8_t parse_ipv4(odp_packet_hdr_t *pkt_hdr, odp_ipv4hdr_t *ipv4,
diff --git a/platform/linux-generic/source/odp_packet_netmap.c b/platform/linux-generic/source/odp_packet_netmap.c
index 1cbd84c..0dc109c 100644
--- a/platform/linux-generic/source/odp_packet_netmap.c
+++ b/platform/linux-generic/source/odp_packet_netmap.c
@@ -308,7 +308,11 @@ int recv_pkt_netmap(pkt_netmap_t * const pkt_nm, odp_packet_t pkt_table[],
 
 			/* Initialize, parse and set packet header data */
 			odp_packet_init(pkt);
-			odp_packet_parse(pkt, payload_len, pkt_nm->l2_offset);
+			if (!odp_packet_parse(pkt, payload_len, pkt_nm->l2_offset)) {
+				ODP_DBG("Packet parsing failed\n");
+				odp_packet_init(pkt);
+				continue;
+			}
 
 			pkt_table[nb_rx] = pkt;
 			pkt = ODP_PACKET_INVALID;
diff --git a/platform/linux-generic/source/odp_packet_socket.c b/platform/linux-generic/source/odp_packet_socket.c
index aaf2605..65796de 100644
--- a/platform/linux-generic/source/odp_packet_socket.c
+++ b/platform/linux-generic/source/odp_packet_socket.c
@@ -224,7 +224,11 @@ int recv_pkt_sock(pkt_sock_t *const pkt_sock,
 			continue;
 
 		/* Parse and set packet header data */
-		odp_packet_parse(pkt, recv_bytes, pkt_sock->frame_offset);
+		if (!odp_packet_parse(pkt, recv_bytes, pkt_sock->frame_offset)) {
+			ODP_DBG("Packet parsing failed\n");
+			odp_packet_init(pkt);
+			continue;
+		}
 
 		pkt_table[nb_rx] = pkt;
 		pkt = ODP_PACKET_INVALID;
@@ -331,8 +335,12 @@ int recv_pkt_sock(pkt_sock_t * const pkt_sock,
 		}
 
 		/* Parse and set packet header data */
-		odp_packet_parse(pkt_table[i], msgvec[i].msg_len,
-				 pkt_sock->frame_offset);
+		if (!odp_packet_parse(pkt_table[i], msgvec[i].msg_len,
+				 pkt_sock->frame_offset)) {
+			ODP_DBG("Packet parsing failed\n");
+			odp_packet_init(pkt);
+			continue;
+		}
 
 		pkt_table[nb_rx] = pkt_table[i];
 		nb_rx++;
@@ -489,7 +497,11 @@ static inline unsigned pkt_mmap_v2_rx(int sock, struct ring *ring,
 			rx_user_ready(ppd.raw);
 
 			/* Parse and set packet header data */
-			odp_packet_parse(pkt_table[i], pkt_len, frame_offset);
+			if (!odp_packet_parse(pkt_table[i], pkt_len, frame_offset)) {
+				ODP_DBG("Packet parsing failed\n");
+				odp_packet_init(pkt_table[i]);
+				continue;
+			}
 
 			frame_num = next_frame_num;
 			i++;
