summaryrefslogtreecommitdiffstats
path: root/sbin/ipfw
diff options
context:
space:
mode:
authoroleg <oleg@FreeBSD.org>2009-06-24 22:57:07 +0000
committeroleg <oleg@FreeBSD.org>2009-06-24 22:57:07 +0000
commit11197296caae985dd245decd98433d199f255d12 (patch)
treea9efdc63dcb90f2bc9fa7f4586182471924222a1 /sbin/ipfw
parent4a49dd3ace47cbf930cdee3e43aaa5efddc2ed49 (diff)
downloadFreeBSD-src-11197296caae985dd245decd98433d199f255d12.zip
FreeBSD-src-11197296caae985dd245decd98433d199f255d12.tar.gz
- fix dummynet 'fast' mode for WF2Q case.
- fix printing of pipe profile data. - introduce new pipe parameter: 'burst' - how much data can be sent through pipe bypassing bandwidth limit.
Diffstat (limited to 'sbin/ipfw')
-rw-r--r--sbin/ipfw/Makefile1
-rw-r--r--sbin/ipfw/dummynet.c37
-rw-r--r--sbin/ipfw/ipfw.816
-rw-r--r--sbin/ipfw/ipfw2.h1
4 files changed, 48 insertions, 7 deletions
diff --git a/sbin/ipfw/Makefile b/sbin/ipfw/Makefile
index 3205c66..c09ebca 100644
--- a/sbin/ipfw/Makefile
+++ b/sbin/ipfw/Makefile
@@ -3,6 +3,7 @@
PROG= ipfw
SRCS= ipfw2.c dummynet.c ipv6.c main.c nat.c altq.c
WARNS?= 2
+LDADD= -lutil
MAN= ipfw.8
.include <bsd.prog.mk>
diff --git a/sbin/ipfw/dummynet.c b/sbin/ipfw/dummynet.c
index 9e8356e..1473284 100644
--- a/sbin/ipfw/dummynet.c
+++ b/sbin/ipfw/dummynet.c
@@ -32,6 +32,8 @@
#include <ctype.h>
#include <err.h>
+#include <errno.h>
+#include <libutil.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
@@ -70,6 +72,7 @@ static struct _s_x dummynet_params[] = {
{ "src-ipv6", TOK_SRCIP6},
{ "src-ip6", TOK_SRCIP6},
{ "profile", TOK_PIPE_PROFILE},
+ { "burst", TOK_BURST},
{ "dummynet-params", TOK_NULL },
{ NULL, 0 } /* terminator */
};
@@ -236,7 +239,7 @@ print_flowset_parms(struct dn_flow_set *fs, char *prefix)
plr[0] = '\0';
if (fs->flags_fs & DN_IS_RED) /* RED parameters */
sprintf(red,
- "\n\t %cRED w_q %f min_th %d max_th %d max_p %f",
+ "\n\t %cRED w_q %f min_th %d max_th %d max_p %f",
(fs->flags_fs & DN_IS_GENTLE_RED) ? 'G' : ' ',
1.0 * fs->w_q / (double)(1 << SCALE_RED),
SCALE_VAL(fs->min_th),
@@ -250,7 +253,7 @@ print_flowset_parms(struct dn_flow_set *fs, char *prefix)
}
static void
-print_extra_delay_parms(struct dn_pipe *p, char *prefix)
+print_extra_delay_parms(struct dn_pipe *p)
{
double loss;
if (p->samples_no <= 0)
@@ -258,8 +261,8 @@ print_extra_delay_parms(struct dn_pipe *p, char *prefix)
loss = p->loss_level;
loss /= p->samples_no;
- printf("%s profile: name \"%s\" loss %f samples %d\n",
- prefix, p->name, loss, p->samples_no);
+ printf("\t profile: name \"%s\" loss %f samples %d\n",
+ p->name, loss, p->samples_no);
}
void
@@ -280,6 +283,7 @@ ipfw_list_pipes(void *data, uint nbytes, int ac, char *av[])
double b = p->bandwidth;
char buf[30];
char prefix[80];
+ char burst[5 + 7];
if (SLIST_NEXT(p, next) != (struct dn_pipe *)DN_IS_PIPE)
break; /* done with pipes, now queues */
@@ -311,10 +315,16 @@ ipfw_list_pipes(void *data, uint nbytes, int ac, char *av[])
sprintf(prefix, "%05d: %s %4d ms ",
p->pipe_nr, buf, p->delay);
- print_extra_delay_parms(p, prefix);
-
print_flowset_parms(&(p->fs), prefix);
+ if (humanize_number(burst, sizeof(burst), p->burst,
+ "Byte", HN_AUTOSCALE, 0) < 0 || co.verbose)
+ printf("\t burst: %ju Byte\n", p->burst);
+ else
+ printf("\t burst: %s\n", burst);
+
+ print_extra_delay_parms(p);
+
q = (struct dn_flow_queue *)(p+1);
list_queues(&(p->fs), q);
}
@@ -933,6 +943,21 @@ end_mask:
--ac; ++av;
break;
+ case TOK_BURST:
+ if (co.do_pipe != 1)
+ errx(EX_DATAERR, "burst only valid for pipes");
+ NEED1("burst needs argument\n");
+ errno = 0;
+ if (expand_number(av[0], &p.burst) < 0)
+ if (errno != ERANGE)
+ errx(EX_DATAERR,
+ "burst: invalid argument");
+ if (errno || p.burst > (1ULL << 48) - 1)
+ errx(EX_DATAERR,
+ "burst: out of range (0..2^48-1)");
+ ac--; av++;
+ break;
+
default:
errx(EX_DATAERR, "unrecognised option ``%s''", av[-1]);
}
diff --git a/sbin/ipfw/ipfw.8 b/sbin/ipfw/ipfw.8
index 9777272..de683e3 100644
--- a/sbin/ipfw/ipfw.8
+++ b/sbin/ipfw/ipfw.8
@@ -1,7 +1,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd April 9, 2009
+.Dd June 24, 2009
.Dt IPFW 8
.Os
.Sh NAME
@@ -1943,6 +1943,20 @@ to reduce
the granularity to 1ms or less).
Default value is 0, meaning no delay.
.Pp
+.It Cm burst Ar size
+If the data rate exceeds the pipe bandwith limit
+(and pipe was idle long enough),
+.Ar size
+bytes of data is allowed to bypass the
+.Nm dummynet
+scheduler (i.e. it will be sent without shaping), then transmission rate
+will not exceed pipe bandwidth. Effective burst size calculated as follows:
+MAX(
+.Ar size
+,
+.Nm bw
+* pipe_idle_time).
+.Pp
.It Cm profile Ar filename
A file specifying the additional overhead incurred in the transmission
of a packet on the link.
diff --git a/sbin/ipfw/ipfw2.h b/sbin/ipfw/ipfw2.h
index 5b49f55..d3ce7fb 100644
--- a/sbin/ipfw/ipfw2.h
+++ b/sbin/ipfw/ipfw2.h
@@ -154,6 +154,7 @@ enum tokens {
TOK_BW,
TOK_DELAY,
TOK_PIPE_PROFILE,
+ TOK_BURST,
TOK_RED,
TOK_GRED,
TOK_DROPTAIL,
OpenPOWER on IntegriCloud