ref: 24e11497434928d895f1e84808d5d6b7ddc53757
parent: 66b23466fc46e8e2caa6d67d1736576b80be57e7
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sat Jan 20 10:13:11 EST 2018
gre: don't drop pptp packets when smaller than v4 header
--- a/sys/src/9/ip/gre.c
+++ b/sys/src/9/ip/gre.c
@@ -558,46 +558,44 @@
if(flags & GRE_seq)
hdrlen += 4;
- if(BLEN(bp) - hdrlen < sizeof(Ip4hdr)){- print("greretunnel: packet too short (s=%V d=%V)\n",- gre->src, gre->dst);
- freeb(bp);
- return;
- }
- ip = (Ip4hdr *)(bp->rp + hdrlen);
-
qlock(proto);
- /*
- * Look for a conversation structure for this port and address, or
- * match the retunnel part, or match on the raw flag.
- */
- for(p = proto->conv; *p; p++) {- c = *p;
- if(c->inuse == 0)
- continue;
+ if(eproto != 0x880B && BLEN(bp) - hdrlen >= sizeof(Ip4hdr)){+ ip = (Ip4hdr *)(bp->rp + hdrlen);
/*
- * Do not stop this session - blocking here
- * implies that etherread is blocked.
+ * Look for a conversation structure for this port and address, or
+ * match the retunnel part, or match on the raw flag.
*/
- grec = c->ptcl;
- if(memcmp(ip->dst, grec->hoa, sizeof ip->dst) == 0){- grepdin++;
- grebdin += BLEN(bp);
- gredownlink(c, bp);
- qunlock(proto);
- return;
- }
+ for(p = proto->conv; *p; p++) {+ c = *p;
- if(memcmp(ip->src, grec->hoa, sizeof ip->src) == 0){- grepuin++;
- grebuin += BLEN(bp);
- greuplink(c, bp);
- qunlock(proto);
- return;
+ if(c->inuse == 0)
+ continue;
+
+ /*
+ * Do not stop this session - blocking here
+ * implies that etherread is blocked.
+ */
+ grec = c->ptcl;
+ if(memcmp(ip->dst, grec->hoa, sizeof ip->dst) == 0){+ grepdin++;
+ grebdin += BLEN(bp);
+ gredownlink(c, bp);
+ qunlock(proto);
+ return;
+ }
+
+ if(memcmp(ip->src, grec->hoa, sizeof ip->src) == 0){+ grepuin++;
+ grebuin += BLEN(bp);
+ greuplink(c, bp);
+ qunlock(proto);
+ return;
+ }
}
}
+
/*
* when we get here, none of the forwarding tunnels matched. now
--
⑨