X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=ipfw%2Fdummynet.c;h=6cfbff00e4ff079935f676fd0c02b8bee81ddcc1;hb=127aebb5ecac745bb693162d78d489ccba6273b9;hp=fd8fc4d30790c0cf61cf394a54eb3f0718585475;hpb=1c3dc9f45532c25adc21f297422f0f5a7420b8ca;p=ipfw.git diff --git a/ipfw/dummynet.c b/ipfw/dummynet.c index fd8fc4d..6cfbff0 100644 --- a/ipfw/dummynet.c +++ b/ipfw/dummynet.c @@ -32,6 +32,7 @@ #include #include +#include #include #include #include @@ -70,12 +71,13 @@ 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 */ }; static int -sort_q(const void *pa, const void *pb) +sort_q(void *arg, const void *pa, const void *pb) { int rev = (co.do_sort < 0); int field = rev ? -co.do_sort : co.do_sort; @@ -118,7 +120,7 @@ list_queues(struct dn_flow_set *fs, struct dn_flow_queue *q) return; if (co.do_sort != 0) - heapsort(q, fs->rq_elements, sizeof *q, sort_q); + qsort_r(q, fs->rq_elements, sizeof *q, NULL, sort_q); /* Print IPv4 flows */ index_printed = 0; @@ -250,7 +252,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 +260,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 +282,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 +314,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); } @@ -446,7 +455,6 @@ ipfw_delete_pipe(int pipe_or_queue, int i) * */ -/* XXX move to an array definition ? */ #define ED_MAX_LINE_LEN 256+ED_MAX_NAME_LEN #define ED_TOK_SAMPLES "samples" #define ED_TOK_LOSS "loss-level" @@ -477,7 +485,7 @@ is_valid_number(const char *s) * and return the numeric bandwidth value. * set clocking interface or bandwidth value */ -void +static void read_bandwidth(char *arg, int *bandwidth, char *if_name, int namelen) { if (*bandwidth != -1) @@ -521,7 +529,7 @@ struct point { double delay; }; -int +static int compare_points(const void *vp1, const void *vp2) { const struct point *p1 = vp1; @@ -641,6 +649,8 @@ load_extra_delays(const char *filename, struct dn_pipe *p) } } + fclose (f); + if (samples == -1) { warnx("'%s' not found, assuming 100", ED_TOK_SAMPLES); samples = 100; @@ -934,6 +944,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], (int64_t *)&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]); }