/* * Filters: utility functions * * Copyright 1998 Pavel Machek * 2017 Jan Maria Matejka * * Can be freely distributed and used under the terms of the GNU GPL. */ #include "nest/bird.h" #include "conf/conf.h" #include "conf/parser.h" #include "filter/filter.h" #include "filter/f-util.h" #define P(a,b) ((a<<8) | b) struct f_inst * f_new_inst(struct cf_context *ctx, enum f_instruction_code fi_code) { struct f_inst * ret; ret = cfg_allocz(sizeof(struct f_inst)); ret->fi_code = fi_code; ret->lineno = ctx->order->state->lino; return ret; } struct f_inst * f_new_inst_da(struct cf_context *ctx, enum f_instruction_code fi_code, struct f_dynamic_attr da) { struct f_inst *ret = f_new_inst(ctx, fi_code); ret->aux = (da.f_type << 8) | da.type; ret->a2.i = da.ea_code; return ret; } struct f_inst * f_new_inst_sa(struct cf_context *ctx, enum f_instruction_code fi_code, struct f_static_attr sa) { struct f_inst *ret = f_new_inst(ctx, fi_code); ret->aux = sa.f_type; ret->a2.i = sa.sa_code; ret->a1.i = sa.readonly; return ret; } /* * Generate set_dynamic( operation( get_dynamic(), argument ) ) */ struct f_inst * f_generate_complex(struct cf_context *ctx, int operation, int operation_aux, struct f_dynamic_attr da, struct f_inst *argument) { struct f_inst *set_dyn = f_new_inst_da(ctx, FI_EA_SET, da), *oper = f_new_inst(ctx, operation), *get_dyn = f_new_inst_da(ctx, FI_EA_GET, da); oper->aux = operation_aux; oper->a1.p = get_dyn; oper->a2.p = argument; set_dyn->a1.p = oper; return set_dyn; } struct f_inst * f_generate_roa_check(struct cf_context *ctx, struct rtable_config *table, struct f_inst *prefix, struct f_inst *asn) { struct f_inst_roa_check *ret = cfg_allocz(sizeof(struct f_inst_roa_check)); ret->i.fi_code = FI_ROA_CHECK; ret->i.lineno = ctx->order->state->lino; ret->i.arg1 = prefix; ret->i.arg2 = asn; /* prefix == NULL <-> asn == NULL */ if (table->addr_type != NET_ROA4 && table->addr_type != NET_ROA6) cf_error(ctx, "%s is not a ROA table", table->name); ret->rtc = table; return &ret->i; } static const char * const f_instruction_name_str[] = { #define F(c,a,b) \ [c] = #c, FI__LIST #undef F }; const char * f_instruction_name(enum f_instruction_code fi) { if (fi < FI__MAX) return f_instruction_name_str[fi]; else bug("Got unknown instruction code: %d", fi); } char * filter_name(struct filter *filter) { if (!filter) return "ACCEPT"; else if (filter == FILTER_REJECT) return "REJECT"; else if (!filter->name) return "(unnamed)"; else return filter->name; }