diff -Naur rp-pppoe-3.8/src/if.c rp-pppoe-3.8-fakemac/src/if.c
--- rp-pppoe-3.8/src/if.c	2006-04-26 02:46:28.000000000 +0200
+++ rp-pppoe-3.8-fakemac/src/if.c	2006-10-12 22:27:40.639125347 +0200
@@ -457,9 +457,28 @@
     if (hwaddr) {
 	strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
 	if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0) {
+	  fatalSys("ioctl(SIOCGIFHWADDR)");
+	}
+	/* fake MAC address if hwaddr != 0:00:00:00:00:00 */
+	if ((hwaddr[0]==0) && (hwaddr[1]==0) && (hwaddr[2]==0) &&
+	    (hwaddr[3]==0) && (hwaddr[4]==0) && (hwaddr[5]==0)) {
+	  /* this is the normal mode, do not fake anything */
+	  memcpy(hwaddr, ifr.ifr_hwaddr.sa_data, ETH_ALEN);
+	} else {
+	  /* this is the mode using a faked Hardware address */
+	  /* switch Interface to promisc Mode */
+	  if (ioctl(fd, SIOCGIFFLAGS, &ifr) < 0) {
+	    	  fatalSys("ioctl(SIOCGIFFLAGS)");
+	  }
+	  ifr.ifr_flags |= IFF_PROMISC;
+	  if (ioctl(fd, SIOCSIFFLAGS, &ifr) < 0) {
+	      fatalSys("ioctl(SIOCSIFFLAGS)");
+	  }
+	  /* satisfy the subsequent checks */
+	  if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0) {
 	    fatalSys("ioctl(SIOCGIFHWADDR)");
+	  }
 	}
-	memcpy(hwaddr, ifr.ifr_hwaddr.sa_data, ETH_ALEN);
 #ifdef ARPHRD_ETHER
 	if (ifr.ifr_hwaddr.sa_family != ARPHRD_ETHER) {
 	    char buffer[256];
diff -Naur rp-pppoe-3.8/src/pppoe.c rp-pppoe-3.8-fakemac/src/pppoe.c
--- rp-pppoe-3.8/src/pppoe.c	2006-04-26 02:46:01.000000000 +0200
+++ rp-pppoe-3.8-fakemac/src/pppoe.c	2006-10-12 22:27:53.843812250 +0200
@@ -424,6 +424,7 @@
 	    "   -k             -- Kill a session with PADT (requires -e)\n"
 	    "   -d             -- Perform discovery, print session info and exit.\n"
 	    "   -f disc:sess   -- Set Ethernet frame types (hex).\n"
+	    "   -H XX:XX:XX:XX:XX:XX -- Force Hardware Address (hex).\n"
 	    "   -h             -- Print usage information.\n\n"
 	    "PPPoE Version %s, Copyright (C) 2001-2006 Roaring Penguin Software Inc.\n"
 	    "PPPoE comes with ABSOLUTELY NO WARRANTY.\n"
@@ -478,9 +479,9 @@
 
     char const *options;
 #ifdef DEBUGGING_ENABLED
-    options = "I:VAT:D:hS:C:Usm:np:e:kdf:F:t:";
+    options = "I:VAT:D:hS:C:Usm:np:e:kdf:F:t:H:";
 #else
-    options = "I:VAT:hS:C:Usm:np:e:kdf:F:t:";
+    options = "I:VAT:hS:C:Usm:np:e:kdf:F:t:H:";
 #endif
     while((opt = getopt(argc, argv, options)) != -1) {
 	switch(opt) {
@@ -513,6 +514,18 @@
 	    Eth_PPPOE_Discovery = (UINT16_t) discoveryType;
 	    Eth_PPPOE_Session   = (UINT16_t) sessionType;
 	    break;
+        case 'H':
+	  if (sscanf(optarg, "%2x:%2x:%2x:%2x:%2x:%2x",
+		     &m[0], &m[1], &m[2], &m[3], &m[4], &m[5])!= 6) {
+	    fprintf(stderr,
+		    "Illegal argument to -H: Should be"
+		    "XX:XX:XX:XX:XX:XX in hex\n");
+	    exit(EXIT_FAILURE);
+	  }
+	  for (n=0; n<6; n++) {
+	    conn.myEth[n] = (unsigned char) m[n];
+	  }
+	  break;
 	case 'd':
 	    optSkipSession = 1;
 	    break;
