Adds igp_metric attribute.

This commit is contained in:
Ondrej Zajicek 2010-08-02 13:11:53 +02:00
parent d395fe4855
commit ba5e5940aa
5 changed files with 31 additions and 2 deletions

View file

@ -45,7 +45,7 @@ CF_KEYWORDS(INTERFACE, IMPORT, EXPORT, FILTER, NONE, TABLE, STATES, ROUTES, FILT
CF_KEYWORDS(PASSWORD, FROM, PASSIVE, TO, ID, EVENTS, PACKETS, PROTOCOLS, INTERFACES) CF_KEYWORDS(PASSWORD, FROM, PASSIVE, TO, ID, EVENTS, PACKETS, PROTOCOLS, INTERFACES)
CF_KEYWORDS(PRIMARY, STATS, COUNT, FOR, COMMANDS, PREEXPORT, GENERATE) CF_KEYWORDS(PRIMARY, STATS, COUNT, FOR, COMMANDS, PREEXPORT, GENERATE)
CF_KEYWORDS(LISTEN, BGP, V6ONLY, ADDRESS, PORT, PASSWORDS, DESCRIPTION) CF_KEYWORDS(LISTEN, BGP, V6ONLY, ADDRESS, PORT, PASSWORDS, DESCRIPTION)
CF_KEYWORDS(RELOAD, IN, OUT, MRTDUMP, MESSAGES, RESTRICT, MEMORY) CF_KEYWORDS(RELOAD, IN, OUT, MRTDUMP, MESSAGES, RESTRICT, MEMORY, IGP_METRIC)
CF_ENUM(T_ENUM_RTS, RTS_, DUMMY, STATIC, INHERIT, DEVICE, STATIC_DEVICE, REDIRECT, CF_ENUM(T_ENUM_RTS, RTS_, DUMMY, STATIC, INHERIT, DEVICE, STATIC_DEVICE, REDIRECT,
RIP, OSPF, OSPF_IA, OSPF_EXT1, OSPF_EXT2, BGP, PIPE) RIP, OSPF, OSPF_IA, OSPF_EXT1, OSPF_EXT2, BGP, PIPE)
@ -497,6 +497,9 @@ proto_patt2:
| TEXT { $$.ptr = $1; $$.patt = 1; } | TEXT { $$.ptr = $1; $$.patt = 1; }
; ;
CF_ADDTO(dynamic_attr, IGP_METRIC
{ $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_GEN_IGP_METRIC); })
CF_CODE CF_CODE

View file

@ -340,6 +340,8 @@ typedef struct eattr {
#define EA_PROTO(ea) ((ea) >> 8) #define EA_PROTO(ea) ((ea) >> 8)
#define EA_ID(ea) ((ea) & 0xff) #define EA_ID(ea) ((ea) & 0xff)
#define EA_GEN_IGP_METRIC EA_CODE(EAP_GENERIC, 0)
#define EA_CODE_MASK 0xffff #define EA_CODE_MASK 0xffff
#define EA_ALLOW_UNDEF 0x10000 /* ea_find: allow EAF_TYPE_UNDEF */ #define EA_ALLOW_UNDEF 0x10000 /* ea_find: allow EAF_TYPE_UNDEF */

View file

@ -362,6 +362,18 @@ ea_free(ea_list *o)
} }
} }
static int
get_generic_attr(eattr *a, byte **buf, int buflen UNUSED)
{
if (a->id == EA_GEN_IGP_METRIC)
{
*buf += bsprintf(*buf, "igp_metric");
return GA_NAME;
}
return GA_UNKNOWN;
}
/** /**
* ea_format - format an &eattr for printing * ea_format - format an &eattr for printing
* @e: attribute to be formatted * @e: attribute to be formatted
@ -392,6 +404,9 @@ ea_format(eattr *e, byte *buf)
} }
else if (EA_PROTO(e->id)) else if (EA_PROTO(e->id))
buf += bsprintf(buf, "%02x.", EA_PROTO(e->id)); buf += bsprintf(buf, "%02x.", EA_PROTO(e->id));
else
status = get_generic_attr(e, &buf, end - buf);
if (status < GA_NAME) if (status < GA_NAME)
buf += bsprintf(buf, "%02x", EA_ID(e->id)); buf += bsprintf(buf, "%02x", EA_ID(e->id));
if (status < GA_FULL) if (status < GA_FULL)

View file

@ -1473,6 +1473,11 @@ if_local_addr(ip_addr a, struct iface *i)
static u32 static u32
rt_get_igp_metric(rte *rt) rt_get_igp_metric(rte *rt)
{ {
eattr *ea = ea_find(rt->attrs->eattrs, EA_GEN_IGP_METRIC);
if (ea)
return ea->u.data;
rta *a = rt->attrs; rta *a = rt->attrs;
if ((a->source == RTS_OSPF) || if ((a->source == RTS_OSPF) ||
(a->source == RTS_OSPF_IA) || (a->source == RTS_OSPF_IA) ||

View file

@ -467,7 +467,11 @@ ospf_import_control(struct proto *p, rte ** new, ea_list ** attrs,
if (p == e->attrs->proto) if (p == e->attrs->proto)
return -1; /* Reject our own routes */ return -1; /* Reject our own routes */
*attrs = ospf_build_attrs(*attrs, pool, LSINFINITY, 10000, 0, 0);
eattr *ea = ea_find(e->attrs->eattrs, EA_GEN_IGP_METRIC);
u32 m1 = (ea && (ea->u.data < LSINFINITY)) ? ea->u.data : LSINFINITY;
*attrs = ospf_build_attrs(*attrs, pool, m1, 10000, 0, 0);
return 0; /* Leave decision to the filters */ return 0; /* Leave decision to the filters */
} }