0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2024-09-18 19:35:20 +00:00

Filter: Split clist add/delete operations to multiple methods

This commit is contained in:
Ondrej Zajicek 2023-07-25 19:33:51 +02:00
parent f0d1396073
commit 132f1edaf4
2 changed files with 84 additions and 27 deletions

View File

@ -1245,22 +1245,39 @@
} }
/* Community list add */ /* Community list add */
INST(FI_CLIST_ADD, 2, 1) { INST(FI_CLIST_ADD_PAIR, 2, 1) {
ARG(1, T_CLIST); ARG(1, T_CLIST);
ARG_ANY(2); ARG(2, T_PAIR);
METHOD_CONSTRUCTOR("add"); METHOD_CONSTRUCTOR("add");
struct f_val dummy; RESULT(T_CLIST, ad, [[ int_set_add(fpool, v1.val.ad, v2.val.i) ]]);
if ((v2.type == T_PAIR) || (v2.type == T_QUAD)) }
RESULT(T_CLIST, ad, [[ int_set_add(fpool, v1.val.ad, v2.val.i) ]]);
/* IP->Quad implicit conversion */ INST(FI_CLIST_ADD_IP, 2, 1) {
else if (val_is_ip4(&v2)) ARG(1, T_CLIST);
RESULT(T_CLIST, ad, [[ int_set_add(fpool, v1.val.ad, ipa_to_u32(v2.val.ip)) ]]); ARG(2, T_IP);
else if ((v2.type == T_SET) && clist_set_type(v2.val.t, &dummy)) METHOD_CONSTRUCTOR("add");
runtime("Can't add set");
else if (v2.type == T_CLIST) FID_NEW_BODY();
RESULT(T_CLIST, ad, [[ int_set_union(fpool, v1.val.ad, v2.val.ad) ]]); /* IP->Quad implicit conversion, must be before FI_CLIST_ADD_QUAD */
else cf_warn("Method add(clist, ip) is deprecated, please use add(clist, quad)");
runtime("Can't add non-pair");
FID_INTERPRET_BODY();
if (!val_is_ip4(&v2)) runtime("Mismatched IP type");
RESULT(T_CLIST, ad, [[ int_set_add(fpool, v1.val.ad, ipa_to_u32(v2.val.ip)) ]]);
}
INST(FI_CLIST_ADD_QUAD, 2, 1) {
ARG(1, T_CLIST);
ARG(2, T_QUAD);
METHOD_CONSTRUCTOR("add");
RESULT(T_CLIST, ad, [[ int_set_add(fpool, v1.val.ad, v2.val.i) ]]);
}
INST(FI_CLIST_ADD_CLIST, 2, 1) {
ARG(1, T_CLIST);
ARG(2, T_CLIST);
METHOD_CONSTRUCTOR("add");
RESULT(T_CLIST, ad, [[ int_set_union(fpool, v1.val.ad, v2.val.ad) ]]);
} }
INST(FI_ECLIST_ADD_EC, 2, 1) { INST(FI_ECLIST_ADD_EC, 2, 1) {
@ -1310,22 +1327,50 @@
} }
/* Community list delete */ /* Community list delete */
INST(FI_CLIST_DELETE, 2, 1) { INST(FI_CLIST_DELETE_PAIR, 2, 1) {
ARG(1, T_CLIST); ARG(1, T_CLIST);
ARG_ANY(2); ARG(2, T_PAIR);
METHOD_CONSTRUCTOR("delete"); METHOD_CONSTRUCTOR("delete");
/* Community (or cluster) list */ RESULT(T_CLIST, ad, [[ int_set_del(fpool, v1.val.ad, v2.val.i) ]]);
struct f_val dummy; }
if ((v2.type == T_PAIR) || (v2.type == T_QUAD)) INST(FI_CLIST_DELETE_IP, 2, 1) {
RESULT(T_CLIST, ad, [[ int_set_del(fpool, v1.val.ad, v2.val.i) ]]); ARG(1, T_CLIST);
/* IP->Quad implicit conversion */ ARG(2, T_IP);
else if (val_is_ip4(&v2)) METHOD_CONSTRUCTOR("delete");
RESULT(T_CLIST, ad, [[ int_set_del(fpool, v1.val.ad, ipa_to_u32(v2.val.ip)) ]]);
else if ((v2.type == T_SET) && clist_set_type(v2.val.t, &dummy) || (v2.type == T_CLIST)) FID_NEW_BODY();
RESULT(T_CLIST, ad, [[ clist_filter(fpool, v1.val.ad, &v2, 0) ]]); /* IP->Quad implicit conversion, must be before FI_CLIST_DELETE_QUAD */
else cf_warn("Method delete(clist, ip) is deprecated, please use delete(clist, quad)");
runtime("Can't delete non-pair");
FID_INTERPRET_BODY();
if (!val_is_ip4(&v2)) runtime("Mismatched IP type");
RESULT(T_CLIST, ad, [[ int_set_del(fpool, v1.val.ad, ipa_to_u32(v2.val.ip)) ]]);
}
INST(FI_CLIST_DELETE_QUAD, 2, 1) {
ARG(1, T_CLIST);
ARG(2, T_QUAD);
METHOD_CONSTRUCTOR("delete");
RESULT(T_CLIST, ad, [[ int_set_del(fpool, v1.val.ad, v2.val.i) ]]);
}
INST(FI_CLIST_DELETE_CLIST, 2, 1) {
ARG(1, T_CLIST);
ARG(2, T_CLIST);
METHOD_CONSTRUCTOR("delete");
RESULT(T_CLIST, ad, [[ clist_filter(fpool, v1.val.ad, &v2, 0) ]]);
}
INST(FI_CLIST_DELETE_SET, 2, 1) {
ARG(1, T_CLIST);
ARG(2, T_SET);
METHOD_CONSTRUCTOR("delete");
if (!clist_set_type(v2.val.t, &(struct f_val){}))
runtime("Mismatched set type");
RESULT(T_CLIST, ad, [[ clist_filter(fpool, v1.val.ad, &v2, 0) ]]);
} }
INST(FI_ECLIST_DELETE_EC, 2, 1) { INST(FI_ECLIST_DELETE_EC, 2, 1) {

View File

@ -1010,6 +1010,12 @@ clist r;
l = filter(l2, [(3,1..4)]); l = filter(l2, [(3,1..4)]);
l2 = filter(l2, [(3,3..6)]); l2 = filter(l2, [(3,3..6)]);
quad q = 2.0.1.0;
clist ql = add(add(add(-empty-, 1.0.0.1), q), 3.1.0.0);
bt_assert(delete(ql, 1.0.0.1) = add(add(-empty-, 2.0.1.0), 3.1.0.0));
bt_assert(delete(ql, [2.0.0.0 .. 4.0.0.0]) = add(-empty-, 1.0.0.1));
bt_assert(filter(ql, [3.0.0.0 .. 4.0.0.0]) = add(-empty-, 3.1.0.0));
# clist A (10,20,30) # clist A (10,20,30)
bt_assert(l = add(add(add(add(-empty-, (3,1)), (3,2)), (3,3)), (3,4))); bt_assert(l = add(add(add(add(-empty-, (3,1)), (3,2)), (3,3)), (3,4)));
bt_assert(format(l) = "(clist (3,1) (3,2) (3,3) (3,4))"); bt_assert(format(l) = "(clist (3,1) (3,2) (3,3) (3,4))");
@ -1132,6 +1138,12 @@ function t_clist_new()
l = l2.filter([(3,1..4)]); l = l2.filter([(3,1..4)]);
l2.filter([(3,3..6)]); l2.filter([(3,3..6)]);
quad q = 2.0.1.0;
clist ql = -empty-.add(1.0.0.1).add(q).add(3.1.0.0);
bt_assert(delete(ql, 1.0.0.1) = -empty-.add(2.0.1.0).add(3.1.0.0));
bt_assert(delete(ql, [2.0.0.0 .. 4.0.0.0]) = -empty-.add(1.0.0.1));
bt_assert(filter(ql, [3.0.0.0 .. 4.0.0.0]) = -empty-.add(3.1.0.0));
# clist A (10,20,30) # clist A (10,20,30)
bt_assert(l = -empty-.add((3,1)).add((3,2)).add((3,3)).add((3,4))); bt_assert(l = -empty-.add((3,1)).add((3,2)).add((3,3)).add((3,4)));
bt_assert(format(l) = "(clist (3,1) (3,2) (3,3) (3,4))"); bt_assert(format(l) = "(clist (3,1) (3,2) (3,3) (3,4))");