diff --git a/include/linux/netfilter/nfnetlink_queue.h b/include/linux/netfilter/nfnetlink_queue.h
index 2455fe5..1212f3d 100644
--- a/include/linux/netfilter/nfnetlink_queue.h
+++ b/include/linux/netfilter/nfnetlink_queue.h
@@ -41,6 +41,7 @@ enum nfqnl_attr_type {
 	NFQA_IFINDEX_PHYSOUTDEV,	/* __u32 ifindex */
 	NFQA_HWADDR,			/* nfqnl_msg_packet_hw */
 	NFQA_PAYLOAD,			/* opaque data payload */
+	NFQA_L2HDR,
 
 	__NFQA_MAX
 };
diff --git a/net/netfilter/nfnetlink_queue.c b/net/netfilter/nfnetlink_queue.c
index 71daa09..f7c876a 100644
--- a/net/netfilter/nfnetlink_queue.c
+++ b/net/netfilter/nfnetlink_queue.c
@@ -259,6 +259,7 @@ nfqnl_build_packet_message(struct nfqnl_instance *queue,
 			data_len = queue->copy_range;
 
 		size += nla_total_size(data_len);
+		size += nla_total_size(skb->mac_len);
 		break;
 	}
 
@@ -374,6 +375,22 @@ nfqnl_build_packet_message(struct nfqnl_instance *queue,
 			BUG();
 	}
 
+	if (skb->mac_len != 0) {
+		struct nlattr *nla;
+		int sz = nla_attr_size(skb->mac_len);
+
+		if (skb_tailroom(skb) < nla_total_size(skb->mac_len)) {
+			printk(KERN_WARNING "nf_queue: no tailroom!\n");
+			goto nlmsg_failure;
+		}
+
+		nla = (struct nlattr *)skb_put(skb, nla_total_size(skb->mac_len));
+		nla->nla_type = NFQA_L2HDR;
+		nla->nla_len = sz;
+
+		memcpy(nla_data(nla), skb_mac_header(), skb->mac_len);
+	}
+
 	nlh->nlmsg_len = skb->tail - old_tail;
 	return skb;
 

