# apparently redundant "count" is not "optimized" away ------------------------
tcc -xif:err 2>&1 >/dev/null | grep -v '^#'
$p = police(rate 8kbps,burst 1000B);

prio {
    class if count $p || 1;
}
EOF
block eth0 egress
bucket 1 = 1000 0 1000 1000 0
action 1 = class 1:1
action 0 = count 1 action 1
match action 0
# apparently redundant "count" is not "optimized" away by -B ------------------
tcc -xif:err -B 2>&1 >/dev/null | grep -v '^#'
$p = police(rate 8kbps,burst 1000B);

prio {
    class if count $p || 1;
}
EOF
block eth0 egress
bucket 1 = 1000 0 1000 1000 0
action 0 = class 1:1
action 1 = count 1 action 0
match action 1
# tcc-ext-test detects empty bucket -------------------------------------------
LD_LIBRARY_PATH=. PATH=$PATH:tcc/ext tcsim -v -Xc,-xif:test | \
  sed 's/^.* c .* returns //p;d'
dev eth 10000 {
    $p = police(rate 8kbps,burst 1100B); /* allow for rounding errors */

    prio {
	class if raw[0] == 0 && count $p;
	class if conform $p;
	drop if 1;
    }
}

send 0 0 x 999	/* bucket down to 100 */
send 1 0 x 999	/* packet is dropped */
EOF
OK (0) (1:1, 0x0)
SHOT (2)
# tcc-ext-test refills bucket on "conform" ------------------------------------
LD_LIBRARY_PATH=. PATH=$PATH:tcc/ext tcsim -v -Xc,-xif:test | \
  sed 's/^.* c .* returns //p;d'
dev eth 10000 {
    $p = police(rate 8kbps,burst 1100B);

    prio {
	class if raw[0] == 0 && count $p;
	class if conform $p;
	drop if 1;
    }
}

send 0 0 x 999	/* bucket down to 100 */
time 1.1s	/* bucket fills up again (allow for some rounding errors) */
send 1 0 x 999	/* packet passes */
EOF
OK (0) (1:1, 0x0)
OK (0) (1:2, 0x0)
# tcc-ext-test refills bucket on "count" --------------------------------------
LD_LIBRARY_PATH=. PATH=$PATH:tcc/ext tcsim -v -Xc,-xif:test | \
  sed 's/^.* c .* returns //p;d'
dev eth 10000 {
    $p = police(rate 8kbps,burst 1100B);

    prio {
	class if raw[0] == 0 && count $p;
	class if conform $p;
	drop if 1;
    }
}

send 0 0 x 999	/* bucket down to 100 */
time 1.1s	/* bucket fills up again (allow for some rounding errors) */
send 0 0 x 999	/* bucket down to 100 */
send 1 0 x 999	/* packet is dropped */
EOF
OK (0) (1:1, 0x0)
OK (0) (1:1, 0x0)
SHOT (2)
# tcm_cls.c detects empty bucket ----------------------------------------------
LD_LIBRARY_PATH=. tcsim -v -Xc,-tc | sed 's/^.* c .* returns //p;d'
dev eth 10000 {
    $p = police(rate 8kbps,burst 1100B);

    prio {
	class if raw[0] == 0 && count $p;
	class if conform $p;
	drop if 1;
    }
}

send 0 0 x 999	/* bucket down to 100 */
send 1 0 x 999	/* packet is dropped */
EOF
OK (0) (1:1, 0x1)
SHOT (2)
# tcm_cls.c refills bucket on "conform" ---------------------------------------
LD_LIBRARY_PATH=. tcsim -v -Xc,-tc | sed 's/^.* c .* returns //p;d'
dev eth 10000 {
    $p = police(rate 8kbps,burst 1100B);

    prio {
	class if raw[0] == 0 && count $p;
	class if conform $p;
	drop if 1;
    }
}

send 0 0 x 999	/* bucket down to 100 */
time 1.1s	/* bucket fills up again */
send 1 0 x 999	/* packet passes */
EOF
OK (0) (1:1, 0x1)
OK (0) (1:2, 0x2)
# tcm_cls.c refills bucket on "count" -----------------------------------------
LD_LIBRARY_PATH=. tcsim -v -Xc,-tc | sed 's/^.* c .* returns //p;d'
dev eth 10000 {
    $p = police(rate 8kbps,burst 1100B);

    prio {
	class if raw[0] == 0 && count $p;
	class if conform $p;
	drop if 1;
    }
}

send 0 0 x 999	/* bucket down to 100 */
time 1.1s	/* bucket fills up again */
send 0 0 x 999	/* bucket down to 100 */
send 1 0 x 999	/* packet is dropped */
EOF
OK (0) (1:1, 0x1)
OK (0) (1:1, 0x1)
SHOT (2)
