es gibt in der tat ein problem mit dem üblichen linux pptp client, und
zwar versucht dieser viel zu hartnäckig, "sprünge" in den GRE sequence
numbers auszugleichen. diese sprünge entstehen vor allem bei voller oder
übervoller auslastung der dsl-leitung, da es dann nicht vermieden werden
kann, daß mal ein paar pakete verlorengehen. da sich bei inode xdsl@ der
GRE-tunnel (pptp-tunnel) über die dsl-leitung erstreckt, während beim
telekom adsl der tunnel nur im lokalen lan besteht, kann dieses problem
beim xdsl@ auftreten während es beim telekom adsl nicht auftritt[1]. ein
gepatchter pptp client kann hier unter umständen abhilfe schaffen[2].
lg
richard
[1] das rfc gibt an, daß die sequence numbers nur für "congestion
control" (in verbindung mit den ack-paketen) und "packet reordering"
verwendet werden, keinesfalls aber um den tunnel zu einem "reliable
transport" zu machen, da von keinem der peers verlorengegangene pakete
neu gesendet werden (retransmissions). deswegen halte ich das aktuelle
verhalten des pptp clients (aggressives verwerfen von paketen) für einen
bug. außerdem fungiert GRE als einkapselung für IP, was per definition
ein "unreliable" protokoll ist, deswegen macht es wenig sinn, im
kapselungsprotkoll hier einen level an "reliability" zu erzeugen. aus
diesem grund gibt es in anderen kapselungsprotokollen (z.b. pppoe, l2tp)
keine ähnlichen mechanismen.
[2] ein inoffizieller "quick & dirty" (aber funktionierender) patch
könnte so aussehen: (vorsicht whitespace)
------------8<------------8<------------
--- pptp_gre.c.ori 2004-01-08 12:03:08.000000000 +0100
+++ pptp_gre.c 2004-01-05 10:39:13.000000000 +0100
@@ -366,13 +366,14 @@
return 0;
}
/* check for expected sequence number */
- if ( first || (seq == seq_recv + 1)) { /* wrap-around safe */
+ /* if ( first || (seq == seq_recv + 1)) { */ /* wrap-around safe */
if ( log_level >= 2 )
log("accepting packet %d", seq);
stats.rx_accepted++;
first = 0;
seq_recv = seq;
return callback(cl, buffer + ip_len + headersize, payload_len);
+#if 0
/* out of order, check if the number is too low and discard
thepacket.
* (handle sequence number wrap-around, and try to do it right) */
} else if ( seq < seq_recv + 1 || WRAPPED(seq_recv, seq) ) {
@@ -395,6 +396,7 @@
seq, seq_recv + 1);
stats.rx_overwin++;
}
+#endif
return 0;
}
------------>8------------>8------------
--
Richard Fuchs | Software Development
Fon. 059 999 2000 | Inode GmbH, Büro Graz
Fax. 059 999 6699 | Business Center, Schmiedlstraße 1, 8042 Graz
www.inode.at | Raserei verbindet uns.