fix protocol-reject
[l2tpns.git] / ppp.c
diff --git a/ppp.c b/ppp.c
index 774efbd..4e19251 100644 (file)
--- a/ppp.c
+++ b/ppp.c
@@ -1,6 +1,6 @@
 // L2TPNS PPP Stuff
 
-char const *cvs_id_ppp = "$Id: ppp.c,v 1.80 2005-09-13 14:23:07 bodea Exp $";
+char const *cvs_id_ppp = "$Id: ppp.c,v 1.83 2005-09-16 05:20:32 bodea Exp $";
 
 #include <stdio.h>
 #include <string.h>
@@ -449,8 +449,6 @@ static void ppp_code_rej(sessionidt s, tunnelidt t, uint16_t proto,
 {
        uint8_t *q;
        int mru = session[s].mru;
-
-       if (!mru) mru = MAXMRU;
        if (mru > size) mru = size;
 
        l += 4;
@@ -738,12 +736,12 @@ void processlcp(sessionidt s, tunnelidt t, uint8_t *p, uint16_t l)
                                case 1: // Maximum-Receive-Unit
                                        if (*p == ConfigNak)
                                        {
-                                               session[s].mru = ntohs(*(uint16_t *)(o + 2));
-                                               LOG(3, s, t, "    Remote requested MRU of %u\n", session[s].mru);
+                                               sess_local[s].ppp_mru = ntohs(*(uint16_t *)(o + 2));
+                                               LOG(3, s, t, "    Remote requested MRU of %u\n", sess_local[s].ppp_mru);
                                        }
                                        else
                                        {
-                                               session[s].mru = 0;
+                                               sess_local[s].ppp_mru = 0;
                                                LOG(3, s, t, "    Remote rejected MRU negotiation\n");
                                        }
 
@@ -1337,6 +1335,13 @@ void processipin(sessionidt s, tunnelidt t, uint8_t *p, uint16_t l)
 
        LOG_HEX(5, "IP", p, l);
 
+       if (l < 20)
+       {
+               LOG(1, s, t, "IP packet too short %d\n", l);
+               STAT(tunnel_rx_errors);
+               return ;
+       }
+
        ip = ntohl(*(uint32_t *)(p + 12));
 
        if (l > MAXETHER)
@@ -1360,6 +1365,14 @@ void processipin(sessionidt s, tunnelidt t, uint8_t *p, uint16_t l)
        if (session[s].filter_in && !ip_filter(p, l, session[s].filter_in - 1))
                return;
 
+       // adjust MSS on SYN and SYN,ACK packets with options
+       if ((ntohs(*(uint16_t *) (p + 6)) & 0x1fff) == 0 && p[9] == IPPROTO_TCP) // first tcp fragment
+       {
+               int ihl = (p[0] & 0xf) * 4; // length of IP header
+               if (l >= ihl + 20 && (p[ihl + 13] & TCP_FLAG_SYN) && ((p[ihl + 12] >> 4) > 5))
+                       adjust_tcp_mss(s, t, p, l, p + ihl);
+       }
+
        // Add on the tun header
        p -= 4;
        *(uint32_t *) p = htonl(PKTIP);
@@ -1807,10 +1820,10 @@ void sendlcp(sessionidt s, tunnelidt t)
 
        l += 2; //Save space for length
 
-       if (session[s].mru)
+       if (sess_local[s].ppp_mru)
        {
                *l++ = 1; *l++ = 4; // Maximum-Receive-Unit (length 4)
-               *(uint16_t *) l = htons(session[s].mru); l += 2;
+               *(uint16_t *) l = htons(sess_local[s].ppp_mru); l += 2;
        }
 
        if (authtype)