diff options
author | archie <archie@FreeBSD.org> | 2004-04-26 14:26:54 +0000 |
---|---|---|
committer | archie <archie@FreeBSD.org> | 2004-04-26 14:26:54 +0000 |
commit | 590a18f52ca14f52edaf8e4f3de51d707b0fc5b4 (patch) | |
tree | a06e7f851257781a7e2fb0df41427f2ba2b59f2b /sys/netgraph/ng_pptpgre.c | |
parent | f3d97b227ba194bba6b9767442e14cc20f60f366 (diff) | |
download | FreeBSD-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.c | 84 |
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--; |