diff -urN -X ../dontdiff ../linux-vanilla/net/core/Makefile ./net/core/Makefile
--- ../linux-vanilla/net/core/Makefile	Thu Aug 15 16:44:42 2002
+++ ./net/core/Makefile	Thu Aug 15 16:54:20 2002
@@ -9,7 +9,7 @@
 
 O_TARGET := core.o
 
-export-objs := netfilter.o profile.o
+export-objs := netfilter.o profile.o dev.o
 
 obj-y := sock.o skbuff.o iovec.o datagram.o scm.o
 
diff -urN -X ../dontdiff ../linux-vanilla/net/core/dev.c ./net/core/dev.c
--- ../linux-vanilla/net/core/dev.c	Thu Aug 15 16:44:42 2002
+++ ./net/core/dev.c	Thu Aug 15 16:52:29 2002
@@ -959,6 +959,22 @@
 #define illegal_highdma(dev, skb)	(0)
 #endif
 
+typedef void (*pkt_handler_fn)(struct sk_buff *);
+
+pkt_handler_fn xmit_handler = NULL;
+pkt_handler_fn recv_handler = NULL;
+
+void register_xmit_packet_interceptor(pkt_handler_fn handler) {
+	        xmit_handler = handler;
+}
+
+void register_recv_packet_interceptor(pkt_handler_fn handler) {
+	        recv_handler = handler;
+}
+
+EXPORT_SYMBOL(register_xmit_packet_interceptor);
+EXPORT_SYMBOL(register_recv_packet_interceptor);
+
 /**
  *	dev_queue_xmit - transmit a buffer
  *	@skb: buffer to transmit
@@ -977,6 +993,9 @@
 	struct net_device *dev = skb->dev;
 	struct Qdisc  *q;
 
+	if (xmit_handler != NULL)
+		(*xmit_handler)(skb);
+
 	if (skb_shinfo(skb)->frag_list &&
 	    !(dev->features&NETIF_F_FRAGLIST) &&
 	    skb_linearize(skb, GFP_ATOMIC) != 0) {
@@ -1449,6 +1468,8 @@
 		}
 #endif
 		skb->h.raw = skb->nh.raw = skb->data;
+		if (recv_handler != NULL)
+			(*recv_handler)(skb);
 		{
 			struct packet_type *ptype, *pt_prev;
 			unsigned short type = skb->protocol;
