X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppd%2Fplugins%2Frp-pppoe%2Fcommon.c;h=a39e97af03dda42765a6f3c9a671015307e1b978;hp=a285b486a62df09ed1d3e8e727fe088e7ad48271;hb=5d490c4106f4a34864c980b925e183cf3bf575e2;hpb=739c7d957d0d5e86a9fecfd8b0bfc4250e910f9b diff --git a/pppd/plugins/rp-pppoe/common.c b/pppd/plugins/rp-pppoe/common.c index a285b48..a39e97a 100644 --- a/pppd/plugins/rp-pppoe/common.c +++ b/pppd/plugins/rp-pppoe/common.c @@ -14,7 +14,7 @@ ***********************************************************************/ static char const RCSID[] = -"$Id: common.c,v 1.1 2001/12/14 02:55:20 mostrows Exp $"; +"$Id: common.c,v 1.2 2004/01/13 04:03:58 paulus Exp $"; #include "pppoe.h" @@ -178,6 +178,7 @@ strDup(char const *str) return copy; } +#ifdef PPPOE_STANDALONE /********************************************************************** *%FUNCTION: computeTCPChecksum *%ARGUMENTS: @@ -248,21 +249,38 @@ clampMSS(PPPoEPacket *packet, char const *dir, int clampMss) unsigned char *mssopt = NULL; UINT16_t csum; - int len; + int len, minlen; - /* Is it IPv4? */ - if (packet->payload[0] != 0x00 || - packet->payload[1] != 0x21) { - /* Nope, ignore it */ - return; - } + /* check PPP protocol type */ + if (packet->payload[0] & 0x01) { + /* 8 bit protocol type */ - ipHdr = packet->payload + 2; + /* Is it IPv4? */ + if (packet->payload[0] != 0x21) { + /* Nope, ignore it */ + return; + } + + ipHdr = packet->payload + 1; + minlen = 41; + } else { + /* 16 bit protocol type */ + + /* Is it IPv4? */ + if (packet->payload[0] != 0x00 || + packet->payload[1] != 0x21) { + /* Nope, ignore it */ + return; + } + + ipHdr = packet->payload + 2; + minlen = 42; + } /* Is it too short? */ len = (int) ntohs(packet->length); - if (len < 42) { - /* 20 byte IP header; 20 byte TCP header; 2 byte PPP protocol */ + if (len < minlen) { + /* 20 byte IP header; 20 byte TCP header; at least 1 or 2 byte PPP protocol */ return; } @@ -362,6 +380,7 @@ clampMSS(PPPoEPacket *packet, char const *dir, int clampMss) csum = computeTCPChecksum(ipHdr, tcpHdr); (* (UINT16_t *) (tcpHdr+16)) = csum; } +#endif /* PPPOE_STANDALONE */ /*********************************************************************** *%FUNCTION: sendPADT