Integer (8 bit) or string
|hour|
Hour of day|
-String
+String value in the form HH:MM or HH:MM:SS. Values are expected to be less than
+24:00, although for technical reasons, 23:59:60 is accepted, too.
|====================
.Meta expression specific types
return 0;
}
-static int expr_evaluate_symbol_range(struct eval_ctx *ctx, struct expr **exprp)
+static struct expr *symbol_range_expand(struct expr *expr)
{
- struct expr *left, *right, *range, *constant_range;
- struct expr *expr = *exprp;
+ struct expr *left, *right;
/* expand to symbol and range expressions to consolidate evaluation. */
left = symbol_expr_alloc(&expr->location, expr->symtype,
right = symbol_expr_alloc(&expr->location, expr->symtype,
(struct scope *)expr->scope,
expr->identifier_range[1]);
- range = range_expr_alloc(&expr->location, left, right);
+ return range_expr_alloc(&expr->location, left, right);
+}
+
+static int expr_evaluate_symbol_range(struct eval_ctx *ctx, struct expr **exprp)
+{
+ struct expr *left, *right, *range, *constant_range;
+ struct expr *expr = *exprp;
+
+ /* expand to symbol and range expressions to consolidate evaluation. */
+ range = symbol_range_expand(expr);
if (expr_evaluate(ctx, &range) < 0) {
expr_free(range);
pctx = eval_proto_ctx(ctx);
- if (rel->right->etype == EXPR_RANGE && lhs_is_meta_hour(rel->left)) {
+ if (lhs_is_meta_hour(rel->left) &&
+ (rel->right->etype == EXPR_RANGE ||
+ rel->right->etype == EXPR_RANGE_SYMBOL)) {
+ if (rel->right->etype == EXPR_RANGE_SYMBOL) {
+ range = symbol_range_expand(rel->right);
+ expr_free(rel->right);
+ rel->right = range;
+ }
ret = __expr_evaluate_range(ctx, &rel->right);
if (ret)
return ret;
meta hour "17:00:01" drop;ok
meta hour "00:00" drop;ok
meta hour "00:01" drop;ok
+meta hour "01:01" drop;ok
+meta hour "02:02" drop;ok
+meta hour "03:03" drop;ok
+meta hour "24:00" drop;fail
+meta hour "23:59:60" drop;ok;meta hour "00:00" drop
+meta hour "00:00"-"02:02" drop;ok
+meta hour "01:01"-"03:03" drop;ok
+meta hour "02:02"-"04:04" drop;ok
+meta hour "21:00"-"02:00" drop;ok
time < "2022-07-01 11:00:00" accept;ok;meta time < "2022-07-01 11:00:00" accept
time > "2022-07-01 11:00:00" accept;ok;meta time > "2022-07-01 11:00:00" accept
}
]
+# meta hour "01:01" drop
+[
+ {
+ "match": {
+ "left": {
+ "meta": {
+ "key": "hour"
+ }
+ },
+ "op": "==",
+ "right": "01:01"
+ }
+ },
+ {
+ "drop": null
+ }
+]
+
+# meta hour "02:02" drop
+[
+ {
+ "match": {
+ "left": {
+ "meta": {
+ "key": "hour"
+ }
+ },
+ "op": "==",
+ "right": "02:02"
+ }
+ },
+ {
+ "drop": null
+ }
+]
+
+# meta hour "03:03" drop
+[
+ {
+ "match": {
+ "left": {
+ "meta": {
+ "key": "hour"
+ }
+ },
+ "op": "==",
+ "right": "03:03"
+ }
+ },
+ {
+ "drop": null
+ }
+]
+
+# meta hour "24:00" drop
+[
+ {
+ "match": {
+ "left": {
+ "meta": {
+ "key": "hour"
+ }
+ },
+ "op": "==",
+ "right": "24:00"
+ }
+ },
+ {
+ "drop": null
+ }
+]
+
+# meta hour "23:59:60" drop
+[
+ {
+ "match": {
+ "left": {
+ "meta": {
+ "key": "hour"
+ }
+ },
+ "op": "==",
+ "right": "23:59:60"
+ }
+ },
+ {
+ "drop": null
+ }
+]
+
+# meta hour "00:00"-"02:02" drop
+[
+ {
+ "match": {
+ "left": {
+ "meta": {
+ "key": "hour"
+ }
+ },
+ "op": "in",
+ "right": {
+ "range": [
+ "00:00",
+ "02:02"
+ ]
+ }
+ }
+ },
+ {
+ "drop": null
+ }
+]
+
+# meta hour "01:01"-"03:03" drop
+[
+ {
+ "match": {
+ "left": {
+ "meta": {
+ "key": "hour"
+ }
+ },
+ "op": "in",
+ "right": {
+ "range": [
+ "01:01",
+ "03:03"
+ ]
+ }
+ }
+ },
+ {
+ "drop": null
+ }
+]
+
+# meta hour "02:02"-"04:04" drop
+[
+ {
+ "match": {
+ "left": {
+ "meta": {
+ "key": "hour"
+ }
+ },
+ "op": "==",
+ "right": {
+ "range": [
+ "02:02",
+ "04:04"
+ ]
+ }
+ }
+ },
+ {
+ "drop": null
+ }
+]
+
+# meta hour "21:00"-"02:00" drop
+[
+ {
+ "match": {
+ "left": {
+ "meta": {
+ "key": "hour"
+ }
+ },
+ "op": "in",
+ "right": {
+ "range": [
+ "21:00",
+ "02:00"
+ ]
+ }
+ }
+ },
+ {
+ "drop": null
+ }
+]
+
# time < "2022-07-01 11:00:00" accept
[
{
}
]
+# meta hour "23:59:60" drop
+[
+ {
+ "match": {
+ "left": {
+ "meta": {
+ "key": "hour"
+ }
+ },
+ "op": "==",
+ "right": "00:00"
+ }
+ },
+ {
+ "drop": null
+ }
+]
+
[ cmp eq reg 1 0x0001359c ]
[ immediate reg 0 drop ]
+# meta hour "01:01" drop
+ip test-ip4 input
+ [ meta load hour => reg 1 ]
+ [ cmp eq reg 1 0x000143ac ]
+ [ immediate reg 0 drop ]
+
+# meta hour "02:02" drop
+ip test-ip4 input
+ [ meta load hour => reg 1 ]
+ [ cmp eq reg 1 0x00000078 ]
+ [ immediate reg 0 drop ]
+
+# meta hour "03:03" drop
+ip test-ip4 input
+ [ meta load hour => reg 1 ]
+ [ cmp eq reg 1 0x00000ec4 ]
+ [ immediate reg 0 drop ]
+
+# meta hour "23:59:60" drop
+ip test-ip4 input
+ [ meta load hour => reg 1 ]
+ [ cmp eq reg 1 0x00013560 ]
+ [ immediate reg 0 drop ]
+
+# meta hour "00:00"-"02:02" drop
+ [ meta load hour => reg 1 ]
+ [ byteorder reg 1 = hton(reg 1, 4, 4) ]
+ [ range neq reg 1 0x78000000 0x60350100 ]
+ [ immediate reg 0 drop ]
+
+# meta hour "01:01"-"03:03" drop
+ip test-ip4 input
+ [ meta load hour => reg 1 ]
+ [ byteorder reg 1 = hton(reg 1, 4, 4) ]
+ [ range neq reg 1 0xc40e0000 0xac430100 ]
+ [ immediate reg 0 drop ]
+
+# meta hour "02:02"-"04:04" drop
+ip test-ip4 input
+ [ meta load hour => reg 1 ]
+ [ byteorder reg 1 = hton(reg 1, 4, 4) ]
+ [ range eq reg 1 0x78000000 0x101d0000 ]
+ [ immediate reg 0 drop ]
+
+# meta hour "21:00"-"02:00" drop
+ip test-ip4 input
+ [ meta load hour => reg 1 ]
+ [ byteorder reg 1 = hton(reg 1, 4, 4) ]
+ [ range neq reg 1 0x00000000 0x300b0100 ]
+ [ immediate reg 0 drop ]
+
# time < "2022-07-01 11:00:00" accept
ip test-ip4 input
[ meta load time => reg 1 ]
printf "\t\tmeta hour \"%02d:%02d\"-\"%02d:%02d\"\n" 6 0 17 0 >> "$TMP1"
check_decode EADT
+
+$NFT flush chain t c
+TZ=UTC-2 $NFT add rule t c meta hour "00:00"-"01:00"
+TZ=UTC-2 $NFT add rule t c meta hour "00:00"-"03:00"
+TZ=UTC-2 $NFT add rule t c meta hour "01:00"-"04:00"
+
+printf "\t\tmeta hour \"%02d:%02d\"-\"%02d:%02d\"\n" 0 0 1 0 > "$TMP1"
+printf "\t\tmeta hour \"%02d:%02d\"-\"%02d:%02d\"\n" 0 0 3 0 >> "$TMP1"
+printf "\t\tmeta hour \"%02d:%02d\"-\"%02d:%02d\"\n" 1 0 4 0 >> "$TMP1"
+
+check_decode UTC-2
+
+$NFT flush chain t c
+TZ=UTC-2 $NFT --debug=eval -f - <<EOF
+define midnight="00:00"
+define threeam="03:00"
+table t {
+ chain c {
+ meta hour \$midnight - "03:00"
+ meta hour 00:00 - \$threeam
+ meta hour \$midnight - \$threeam
+ }
+}
+EOF
+
+printf "\t\tmeta hour \"%02d:%02d\"-\"%02d:%02d\"\n" 0 0 3 0 > "$TMP1"
+printf "\t\tmeta hour \"%02d:%02d\"-\"%02d:%02d\"\n" 0 0 3 0 >> "$TMP1"
+printf "\t\tmeta hour \"%02d:%02d\"-\"%02d:%02d\"\n" 0 0 3 0 >> "$TMP1"
+
+check_decode UTC-2