mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-11-13 22:58:42 +00:00
5a14df3950
The two-letter instructions were quite messy but they could be easily read from memory dumps. Now GDB (since 2012) supports pretty printing enum values and GCC checks the switch construction for missing enum values so we are converting the nice two-byte values to enums. Anyway, the enum still keeps the old two-byte values to be able to read the instruction codes even without GDB from plain memory dump.
93 lines
2.0 KiB
C
93 lines
2.0 KiB
C
/*
|
|
* Filters: utility functions
|
|
*
|
|
* Copyright 1998 Pavel Machek <pavel@ucw.cz>
|
|
* 2017 Jan Maria Matejka <mq@ucw.cz>
|
|
*
|
|
* Can be freely distributed and used under the terms of the GNU GPL.
|
|
*/
|
|
|
|
#include "nest/bird.h"
|
|
#include "conf/conf.h"
|
|
#include "filter/filter.h"
|
|
|
|
#define P(a,b) ((a<<8) | b)
|
|
|
|
struct f_inst *
|
|
f_new_inst(enum f_instruction_code fi_code)
|
|
{
|
|
struct f_inst * ret;
|
|
ret = cfg_allocz(sizeof(struct f_inst));
|
|
ret->fi_code = fi_code;
|
|
ret->lineno = ifs->lino;
|
|
return ret;
|
|
}
|
|
|
|
struct f_inst *
|
|
f_new_inst_da(enum f_instruction_code fi_code, struct f_dynamic_attr da)
|
|
{
|
|
struct f_inst *ret = f_new_inst(fi_code);
|
|
ret->aux = da.type;
|
|
ret->a2.i = da.ea_code;
|
|
return ret;
|
|
}
|
|
|
|
struct f_inst *
|
|
f_new_inst_sa(enum f_instruction_code fi_code, struct f_static_attr sa)
|
|
{
|
|
struct f_inst *ret = f_new_inst(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(int operation, int operation_aux, struct f_dynamic_attr da, struct f_inst *argument)
|
|
{
|
|
struct f_inst *set_dyn = f_new_inst_da(FI_EA_SET, da),
|
|
*oper = f_new_inst(operation),
|
|
*get_dyn = f_new_inst_da(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 symbol *sym, 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 = ifs->lino;
|
|
ret->i.arg1 = prefix;
|
|
ret->i.arg2 = asn;
|
|
/* prefix == NULL <-> asn == NULL */
|
|
|
|
if ((sym->class != SYM_ROA) || ! sym->def)
|
|
cf_error("%s is not a ROA table", sym->name);
|
|
ret->rtc = sym->def;
|
|
|
|
return &ret->i;
|
|
}
|
|
|
|
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;
|
|
}
|