bin/70311: ipfw(8) pipe/queue show N displays data not only for N

Pawel Malachowski pawmal-posting at freebsd.lublin.pl
Mon Aug 23 11:42:54 PDT 2004


On Mon, Aug 23, 2004 at 06:57:18PM +0200, Pawel Jakub Dawidek wrote:

> This patch doesn't work for me as expected. It shows all pipes and queues
> with parentpipe=N.
> Could you check this patch (it is against -CURRENT, but it should be easy
> to apply it to 4.x):

Weird.
For me, Your patch gives on my working RELENG_4 shaper setup:

% ipfw pipe show 1
00001: unlimited    0 ms  12 KB 0 queues (1 buckets) droptail
    mask: 0x00 0x00000000/0x0000 -> 0x00000000/0x0000
q00110: weight 1 pipe 1  8 KB 0 queues (512 buckets) droptail
    mask: 0x00 0x00000000/0x0000 -> 0xffffffff/0x0000
q00120: weight 99 pipe 1  8 KB 0 queues (512 buckets) droptail
    mask: 0x00 0x00000000/0x0000 -> 0xffffffff/0x0000

	// expected, show pipe 1 and every queue with parent=1

% ipfw queue show 1
00001: unlimited    0 ms  12 KB 0 queues (1 buckets) droptail
    mask: 0x00 0x00000000/0x0000 -> 0x00000000/0x0000

	// not expected, there is no queue 1, but it shows pipe 1 here.
	// if I want pipe 1, I would type ipfw pipe show 1

% ipfw pipe show 110

	// expected, there is no pipe 110

% ipfw queue show 110
q00110: weight 1 pipe 1  8 KB 0 queues (512 buckets) droptail
    mask: 0x00 0x00000000/0x0000 -> 0xffffffff/0x0000

	// expected, there is queue 110.

> Index: ipfw2.c
> ===================================================================
> RCS file: /private/FreeBSD/src/sbin/ipfw/ipfw2.c,v
> retrieving revision 1.54
> diff -u -p -r1.54 ipfw2.c
> --- ipfw2.c	12 Aug 2004 22:06:55 -0000	1.54
> +++ ipfw2.c	23 Aug 2004 16:51:26 -0000
> @@ -1564,6 +1564,12 @@ list_pipes(void *data, uint nbytes, int 
>  		l = sizeof(*fs) + fs->rq_elements * sizeof(*q);
>  		next = (char *)fs + l;
>  		nbytes -= l;
> +
> +		if (rulenum != 0 && ((rulenum != fs->fs_nr && do_pipe == 2) ||
> +		    (rulenum != fs->parent_nr && do_pipe == 1))) {
> +			continue;
> +		}
> +
>  		q = (struct dn_flow_queue *)(fs+1);
>  		sprintf(prefix, "q%05d: weight %d pipe %d ",
>  		    fs->fs_nr, fs->weight, fs->parent_nr);
> 
> Basically, it looks that first addition of 'do_pipe==2' is bogus.

Well, with this first 'do_pipe==2' check it works here like this:

% ipfw pipe show 1
00001: unlimited    0 ms  12 KB 0 queues (1 buckets) droptail
    mask: 0x00 0x00000000/0x0000 -> 0x00000000/0x0000
q00110: weight 1 pipe 1  8 KB 0 queues (512 buckets) droptail
    mask: 0x00 0x00000000/0x0000 -> 0xffffffff/0x0000
q00120: weight 99 pipe 1  8 KB 0 queues (512 buckets) droptail
    mask: 0x00 0x00000000/0x0000 -> 0xffffffff/0x0000

	// expected, shows pipe 1 and every queue with parent=1

% ipfw queue show 1

	// expected, there is no queue 1

% ipfw pipe show 110

	// expected, there is no pipe 110

% ipfw queue show 110
q00110: weight 1 pipe 1  8 KB 0 queues (512 buckets) droptail
    mask: 0x00 0x00000000/0x0000 -> 0xffffffff/0x0000

	// expected, there is queue 110


So, for me it is not bogus. :)


cheers,
-- 
Paweł Małachowski


More information about the freebsd-ipfw mailing list