#
# ETHERSPOOF diff for Mac OS X 10.2 / Darwin 6.0
# by peter bartoli, version 2.0 of 9/4/2002
#
# to install
# 1. unpack and cd to your xnu source tree
# 2. patch -p0 -b [--verbose --suffix=.orig] < ETHERSPOOF+RAW4ALL.patch
# 3. build xnu and install your kernel
#
--- bsd/net/ether_if_module.c.orig	Thu Jul 11 23:09:54 2002
+++ bsd/net/ether_if_module.c	Wed Sep  4 00:58:03 2002
@@ -462,12 +462,25 @@
 
 	eh = mtod(*m, struct ether_header *);
 	(void)memcpy(&eh->ether_type, ether_type,
 		sizeof(eh->ether_type));
  	(void)memcpy(eh->ether_dhost, edst, 6);
+#ifdef ETHERSPOOF
+	if (ndest->sa_family == AF_UNSPEC) {
+	    (void)memcpy((u_char *)eh->ether_shost,
+	       (u_char *)((struct ether_header *)(ndest->sa_data))->ether_shost,
+	           sizeof(eh->ether_shost));
+	}
+	else
+	{
+	    (void)memcpy(eh->ether_shost, ac->ac_enaddr,
+	       sizeof(eh->ether_shost));
+	}
+#else
  	(void)memcpy(eh->ether_shost, ac->ac_enaddr,
 	    sizeof(eh->ether_shost));
+#endif /* ETHERSPOOF */
 
 	return 0;
 }
 
 
--- bsd/netinet/if_ether.c.orig	Sat Apr  6 23:41:52 2002
+++ bsd/netinet/if_ether.c	Wed Sep  4 01:08:09 2002
@@ -395,10 +395,13 @@
 	}
 	ea->arp_pro = htons(ETHERTYPE_IP);
 	ea->arp_hln = sizeof(ea->arp_sha);	/* hardware address length */
 	ea->arp_pln = sizeof(ea->arp_spa);	/* protocol address length */
 	ea->arp_op = htons(ARPOP_REQUEST);
+#ifdef ETHERSPOOF
+	(void)memcpy(eh->ether_shost, enaddr, sizeof(eh->ether_shost));
+#endif /* ETHERSPOOF */
 	(void)memcpy(ea->arp_sha, enaddr, sizeof(ea->arp_sha));
 	(void)memcpy(ea->arp_spa, sip, sizeof(ea->arp_spa));
 	(void)memcpy(ea->arp_tpa, tip, sizeof(ea->arp_tpa));
 	sa.sa_family = AF_UNSPEC;
 	sa.sa_len = sizeof(sa);
@@ -810,10 +813,13 @@
 	    if (IN_LINKLOCAL(ntohl(*((u_int32_t*)ea->arp_spa))))
 	        (void)memcpy(eh->ether_dhost, etherbroadcastaddr, sizeof(eh->ether_dhost));
 	    else
 #endif
 	        (void)memcpy(eh->ether_dhost, ea->arp_tha, sizeof(eh->ether_dhost));
+#ifdef ETHERSPOOF
+		(void)memcpy(eh->ether_shost, ac->ac_enaddr, sizeof(eh->ether_shost));
+#endif /* ETHERSPOOF */
 		eh->ether_type = htons(ETHERTYPE_ARP);
 		break;
 	}
 	sa.sa_family = AF_UNSPEC;
 	sa.sa_len = sizeof(sa);
