diff -ur eagleusb/driver/eu_eth.c eagleusb.mtu/driver/eu_eth.c
--- eagleusb/driver/eu_eth.c	2004-06-04 20:56:19.000000000 +0200
+++ eagleusb.mtu/driver/eu_eth.c	2004-08-22 17:10:26.000000000 +0200
@@ -2,6 +2,10 @@
  * eu_eth - Ethernet handling functions.
  * Copyright (C) 2003  Frederick Ros (sl33p3r@free.fr)
  *
+ * Fix by Robert.Siemer-eagleusb@backsla.sh  22.8.2004:
+ * Lift MTU limit in PPPoA case so the kernel will not return
+ * -EMSGSIZE on send()-alike syscalls before asking us...
+ *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
  * as published by the Free Software Foundation; either version 2
@@ -118,7 +122,11 @@
         return (-EINVAL);
     }
     
-    
+    if (ins->MpoaMode == MPOA_MODE_PPPOA_VC ||
+	ins->MpoaMode == MPOA_MODE_PPPOA_LLC) {
+	    dev->mtu = ins->mru;	/* Who wonders: quite symetric here */
+	    dev->change_mtu = NULL;
+    }
     dev->open = eu_eth_open;
     dev->stop = eu_eth_close;
     dev->do_ioctl = eu_eth_ioctl;
diff -ur eagleusb/driver/Mpoa.c eagleusb.mtu/driver/Mpoa.c
--- eagleusb/driver/Mpoa.c	2004-07-13 21:01:00.000000000 +0200
+++ eagleusb.mtu/driver/Mpoa.c	2004-08-22 17:22:32.000000000 +0200
@@ -7,6 +7,9 @@
 /*										  */
 /* RFC2684(1483) "Multi-Protocol Encapsulation Over ATM AAL5" support module      */
 /*										  */
+/* Fix by Robert.Siemer-eagleusb@backsla.sh  22.8.2004:				  */
+/* Correction of mru in PPPoA cases.						  */
+/*										  */
 /* This file is part of the "ADI USB ADSL Driver for Linux".			  */
 /*										  */
 /* "ADI USB ADSL Driver for Linux" is free software; you can redistribute it      */
@@ -319,7 +322,7 @@
     ins->MpoaMode = MpoaMode;
 
     /*
-     * We also need to set the reassembly siwe that will be used. By default it is
+     * We also need to set the reassembly size that will be used. By default it is
      * set to the size of the pReassemblyBuffer, which is 1536, but as this size is
      * used to control that the received PDU is not to big, we should set it up
      * accordingly to the encapsulation type
@@ -340,13 +343,23 @@
             break;
             
         case MPOA_MODE_PPPOA_LLC:
+	    ins->mru= 65535-4;	/* like VC, but LLC occupies 4 Bytes AAL5 space */
+	    ins->eth_hdr = 16;
+	    break;
         case MPOA_MODE_PPPOA_VC:
             /*
              * PPPoA packet should hold in an Ethernet frame. Thus it is limited
              * to 1500 bytes. As we'll add 2 bytes for packet size following
              * ethernet header, the payload size is 1498.
+	     * 
+	     * What is a PPPoA packet? PPPoA is a method.
+	     * Okay, let's say it's a PPP packet going to be
+	     * transmitted or was received over an ATM link.
+	     * So, a PPPoA packet should hold a PPP packet, which can be 
+	     * 65537 Bytes. Unfortunately AAL5 can carry only 65535 Bytes.
+	     *     Robert
              */
-            ins->mru = 1498;
+            ins->mru = 65535;
             ins->eth_hdr = 16;
             break;
             
diff -ur eagleusb/pppoa/if.c eagleusb.mtu/pppoa/if.c
--- eagleusb/pppoa/if.c	2004-02-06 23:26:38.000000000 +0100
+++ eagleusb.mtu/pppoa/if.c	2004-08-22 18:46:37.000000000 +0200
@@ -10,6 +10,9 @@
 /* Modified and enhanced by Anoosh Naderi from ADI on May22,2002 to support   */
 /* PPPoA								      */
 /*									      */
+/* Fix by Robert.Siemer-eagleusb@backsla.sh  22.8.2004:			      */
+/* Drop packets from interface which seem bigger than buffer and syslog.      */
+/*									      */
 /* This program may be distributed according to the terms of the GNU          */
 /* General Public License, version 2 or (at your option) any later version    */
 /*									      */
@@ -615,6 +618,8 @@
 int
 ReceivePacket(int sock, PPPoAPacket *pkt, int *size)
 {
+/* USE_BPF and USE_DLPI path look broken. First refers to PPPoEPacket,
+ * second writes to pkt without caring about size... - Robert */
 #ifdef USE_BPF
     struct bpf_hdr hdr;
     int seglen, copylen;
@@ -663,8 +668,7 @@
 	bpfSize -= seglen;
 	bpfOffset += seglen;
     }
-#else
-#ifdef USE_DLPI
+#elif defined USE_DLPI
 	struct strbuf data; 
 	int flags = 0; 	
 	int retval; 
@@ -687,7 +691,12 @@
 	return -1;
     }
 #endif
-#endif
+    if (*size == sizeof(PPPoAPacket)) {
+	    syslog(LOG_ERR, "Buffer probably too small (%u); Packet from interface"
+			    " dropped! Lower mru of pppd or change pppoa source.",
+			    sizeof(PPPoAPacket));
+	    return -1;
+    }
     return 0;
 }
 
diff -ur eagleusb/pppoa/ppp.c eagleusb.mtu/pppoa/ppp.c
--- eagleusb/pppoa/ppp.c	2004-04-16 21:40:33.000000000 +0200
+++ eagleusb.mtu/pppoa/ppp.c	2004-08-22 17:47:19.000000000 +0200
@@ -11,6 +11,9 @@
 /* support PPPoA							   */
 /* Synchronous mode and MTU fixed by C. Casteyde.			   */
 /*									   */
+/* Fix by Robert.Siemer-eagleusb@backsla.sh  22.8.2004:			   */
+/* Lift artificial PPP packet size limit. New limit: our buffer size.	   */
+/*									   */
 /* This program may be distributed according to the terms of the GNU	   */
 /* General Public License, version 2 or (at your option) any later version.*/
 /*									   */
@@ -105,6 +108,7 @@
     vec[0].iov_base = (void *) dummy;
     vec[0].iov_len = 2;
     vec[1].iov_base = (void *) packet->payload;
+    /* BUG? What if pppd uses a mtu > 1496?  -  Robert */
     vec[1].iov_len = ETH_DATA_LEN - PPPOA_OVERHEAD;
     r = readv(0, vec, 2);
 #else
@@ -232,11 +236,12 @@
 		PPPState = STATE_WAITFOR_FRAME_ADDR;
 		break;
 	    default:
-		if (PPPPacketSize > ETH_DATA_LEN - PPPOA_OVERHEAD)
+		if (PPPPacketSize > sizeof(packet->payload))
                 {
 		    syslog(LOG_ERR,
-                           "Packet too big (size=%u / max payload=%u!  Check MTU on PPP interface",
-                           PPPPacketSize,ETH_DATA_LEN - PPPOA_OVERHEAD);
+                           "Buffer too small (%u); Packet from pppd dropped!"
+			   " Lower mtu of pppd, on ppp interface or change pppoa source.",
+                           sizeof(packet->payload));
 		    PPPPacketSize = 0;
 		    PPPXorValue = 0;
 		    PPPState = STATE_WAITFOR_FRAME_ADDR;
diff -ur eagleusb/pppoa/pppoa.c eagleusb.mtu/pppoa/pppoa.c
--- eagleusb/pppoa/pppoa.c	2004-02-06 23:26:38.000000000 +0100
+++ eagleusb.mtu/pppoa/pppoa.c	2004-08-22 18:49:12.000000000 +0200
@@ -7,6 +7,9 @@
 /* Implementation of user-space PPPoE redirector for Linux.		    */
 /* Modified and enhanced by Anoosh Naderi from ADI on May22,2002	    */
 /* This program supports PPPoA in user space using a ADI USB ADSL LAN driver*/
+/*									    */
+/* Fix by Robert.Siemer-eagleusb@backsla.sh  22.8.2004:			    */
+/* If we check what the driver is telling us, please exactly.		    */
 /*								            */
 /* This program may be distributed according to the terms of the GNU	    */
 /* General Public License, version 2 or (at your option) any later version. */
@@ -108,7 +111,9 @@
 	}
 	else
 	{
-	    SysErr("sendto (SendPPPPacket)");
+	    char errorstr[1024];
+	    sprintf(errorstr, "sendto (SendPPPPacket size: %d)", len);
+	    SysErr(errorstr);
 	    exit(EXIT_FAILURE);
 	}
     }
@@ -491,7 +496,7 @@
 	fflush(DebugFile);
     }
     plen = ntohs(packet.length);
-    if (plen + HDR_SIZE > len)
+    if (plen + HDR_SIZE != len)
     {
 	syslog(LOG_ERR, "Wrong length field in incoming data %d (%d)",(int) plen, (int) len);
 	return;
@@ -592,7 +597,7 @@
     
     /* Check length */
     plen = ntohs(packet.length);
-    if (plen + HDR_SIZE > len)
+    if (plen + HDR_SIZE != len)
     {
 	syslog(LOG_ERR, "Wrong length field in incoming data %d (%d)",(int) plen, (int) len);
 	return;
diff -ur eagleusb/pppoa/pppoa.h eagleusb.mtu/pppoa/pppoa.h
--- eagleusb/pppoa/pppoa.h	2004-02-06 23:26:38.000000000 +0100
+++ eagleusb.mtu/pppoa/pppoa.h	2004-08-22 18:53:50.000000000 +0200
@@ -10,6 +10,9 @@
 /* Modifiedandenhanced by Anoosh Naderi from ADI on May22,2002 to	   */
 /*  support PPPoA							   */
 /*									   */
+/* Fix by Robert.Siemer-eagleusb@backsla.sh  22.8.2004:			   */
+/* Larger buffer for PPPoAPacket...					   */
+/*									   */
 /* This program may be distributed according to the terms of the GNU	   */
 /* General Public License, version 2 or (at your option) any later version.*/
 /*									   */
@@ -154,17 +157,28 @@
 #define IPV4ALEN     4
 #define SMALLBUF   256
 
+/* PPPoA packet is a misleading term. It sounds something standard like
+ * but is here in fact a unframed PPP packet with an 16 Byte "header" 
+ * invented by the eagle-usb hardware driver.
+ * The payload here is choosen in the hope that we never get something
+ * bigger (we would drop the packet).
+ * The maximum packet size of PPP transported over ATM AAL5 (PPPoA) is 
+ * 65535 Bytes. Even in the case PPP is transporting only IP it could reach
+ * that size (unnormally large IP packet).
+ * As my ADSL PPP peer is denying (conformant) mru < 1500, I need to accept
+ * at least 1502 Bytes. The same is true to conform to RFC 1661 (PPP).
+ *   That's the reason I started to hack; someone set it here to 1500.
+ *   - Robert
+ */
 /* A PPPoA Packet, including Ethernet headers */
 typedef struct PPPoAPacketStruct {
     struct ethhdr ethHdr;	/* Ethernet header */
     unsigned int length:16;	/* Payload length */
-    unsigned char payload[ETH_DATA_LEN]; /* A bit of room to spare */
+    unsigned char payload[4000]; /* This is an artifical limit */
 } PPPoAPacket;
 
 #define PPPOA_OVERHEAD 2	/* Payload length */
 #define HDR_SIZE (sizeof(struct ethhdr) + PPPOA_OVERHEAD)
-#define MAX_PPPOA_PAYLOAD (ETH_DATA_LEN - PPPOA_OVERHEAD)
-#define MAX_PPPOA_MTU (MAX_PPPOA_PAYLOAD)
 
 /* Chunk to read from stdin */
 #define READ_CHUNK 4096
