summaryrefslogtreecommitdiffstats
path: root/sys/netgraph/ng_pptpgre.c
diff options
context:
space:
mode:
authorarchie <archie@FreeBSD.org>2004-04-26 14:26:54 +0000
committerarchie <archie@FreeBSD.org>2004-04-26 14:26:54 +0000
commit590a18f52ca14f52edaf8e4f3de51d707b0fc5b4 (patch)
treea06e7f851257781a7e2fb0df41427f2ba2b59f2b /sys/netgraph/ng_pptpgre.c
parentf3d97b227ba194bba6b9767442e14cc20f60f366 (diff)
downloadFreeBSD-src-590a18f52ca14f52edaf8e4f3de51d707b0fc5b4.zip
FreeBSD-src-590a18f52ca14f52edaf8e4f3de51d707b0fc5b4.tar.gz
Add 'enableWindowing' configuration knob to the ng_pptpgre(4) netgraph node.
Submitted by: Michael Bretterklieber <mbretter@a-quadrat.at> MFC after: 2 weeks
Diffstat (limited to 'sys/netgraph/ng_pptpgre.c')
-rw-r--r--sys/netgraph/ng_pptpgre.c84
1 files changed, 49 insertions, 35 deletions
diff --git a/sys/netgraph/ng_pptpgre.c b/sys/netgraph/ng_pptpgre.c
index 0542bb8..e6b549c 100644
--- a/sys/netgraph/ng_pptpgre.c
+++ b/sys/netgraph/ng_pptpgre.c
@@ -477,13 +477,16 @@ ng_pptpgre_xmit(node_p node, item_p item)
/* Check if there's data */
if (m != NULL) {
- /* Is our transmit window full? */
- if ((u_int32_t)PPTP_SEQ_DIFF(priv->xmitSeq, priv->recvAck)
- >= a->xmitWin) {
- priv->stats.xmitDrops++;
- NG_FREE_M(m);
- NG_FREE_ITEM(item);
- return (ENOBUFS);
+ /* Check if windowing is enabled */
+ if (priv->conf.enableWindowing) {
+ /* Is our transmit window full? */
+ if ((u_int32_t)PPTP_SEQ_DIFF(priv->xmitSeq,
+ priv->recvAck) >= a->xmitWin) {
+ priv->stats.xmitDrops++;
+ NG_FREE_M(m);
+ NG_FREE_ITEM(item);
+ return (ENOBUFS);
+ }
}
/* Sanity check frame length */
@@ -505,8 +508,10 @@ ng_pptpgre_xmit(node_p node, item_p item)
/* Include sequence number if packet contains any data */
if (m != NULL) {
gre->hasSeq = 1;
- a->timeSent[priv->xmitSeq - priv->recvAck]
- = ng_pptpgre_time(node);
+ if (priv->conf.enableWindowing) {
+ a->timeSent[priv->xmitSeq - priv->recvAck]
+ = ng_pptpgre_time(node);
+ }
priv->xmitSeq++;
gre->data[0] = htonl(priv->xmitSeq);
}
@@ -656,33 +661,36 @@ bad:
priv->recvAck = ack;
/* Update adaptive timeout stuff */
- sample = ng_pptpgre_time(node) - a->timeSent[index];
- diff = sample - a->rtt;
- a->rtt += PPTP_ACK_ALPHA(diff);
- if (diff < 0)
- diff = -diff;
- a->dev += PPTP_ACK_BETA(diff - a->dev);
- a->ato = a->rtt + PPTP_ACK_CHI(a->dev);
- if (a->ato > PPTP_MAX_TIMEOUT)
- a->ato = PPTP_MAX_TIMEOUT;
- if (a->ato < PPTP_MIN_TIMEOUT)
- a->ato = PPTP_MIN_TIMEOUT;
-
- /* Shift packet transmit times in our transmit window */
- bcopy(a->timeSent + index + 1, a->timeSent,
- sizeof(*a->timeSent) * (PPTP_XMIT_WIN - (index + 1)));
-
- /* If we sent an entire window, increase window size by one */
- if (PPTP_SEQ_DIFF(ack, a->winAck) >= 0
- && a->xmitWin < PPTP_XMIT_WIN) {
- a->xmitWin++;
- a->winAck = ack + a->xmitWin;
- }
+ if (priv->conf.enableWindowing) {
+ sample = ng_pptpgre_time(node) - a->timeSent[index];
+ diff = sample - a->rtt;
+ a->rtt += PPTP_ACK_ALPHA(diff);
+ if (diff < 0)
+ diff = -diff;
+ a->dev += PPTP_ACK_BETA(diff - a->dev);
+ a->ato = a->rtt + PPTP_ACK_CHI(a->dev);
+ if (a->ato > PPTP_MAX_TIMEOUT)
+ a->ato = PPTP_MAX_TIMEOUT;
+ if (a->ato < PPTP_MIN_TIMEOUT)
+ a->ato = PPTP_MIN_TIMEOUT;
+
+ /* Shift packet transmit times in our transmit window */
+ bcopy(a->timeSent + index + 1, a->timeSent,
+ sizeof(*a->timeSent)
+ * (PPTP_XMIT_WIN - (index + 1)));
+
+ /* If we sent an entire window, increase window size */
+ if (PPTP_SEQ_DIFF(ack, a->winAck) >= 0
+ && a->xmitWin < PPTP_XMIT_WIN) {
+ a->xmitWin++;
+ a->winAck = ack + a->xmitWin;
+ }
- /* Stop/(re)start receive ACK timer as necessary */
- ng_pptpgre_stop_recv_ack_timer(node);
- if (priv->recvAck != priv->xmitSeq)
- ng_pptpgre_start_recv_ack_timer(node);
+ /* Stop/(re)start receive ACK timer as necessary */
+ ng_pptpgre_stop_recv_ack_timer(node);
+ if (priv->recvAck != priv->xmitSeq)
+ ng_pptpgre_start_recv_ack_timer(node);
+ }
}
badAck:
@@ -752,6 +760,9 @@ ng_pptpgre_start_recv_ack_timer(node_p node)
struct ng_pptpgre_ackp *const a = &priv->ackp;
int remain, ticks;
+ if (!priv->conf.enableWindowing)
+ return;
+
/* Compute how long until oldest unack'd packet times out,
and reset the timer to that time. */
KASSERT(a->rackTimerPtr == NULL, ("%s: rackTimer", __func__));
@@ -788,6 +799,9 @@ ng_pptpgre_stop_recv_ack_timer(node_p node)
const priv_p priv = NG_NODE_PRIVATE(node);
struct ng_pptpgre_ackp *const a = &priv->ackp;
+ if (!priv->conf.enableWindowing)
+ return;
+
if (callout_stop(&a->rackTimer)) {
FREE(a->rackTimerPtr, M_NETGRAPH);
priv->timers--;
OpenPOWER on IntegriCloud