KRT: Fix option 'merge paths'

This commit is contained in:
Ondrej Zajicek (work) 2018-01-23 15:12:43 +01:00
parent e5ff7929c4
commit ace3072e09
3 changed files with 10 additions and 12 deletions

View file

@ -16,16 +16,6 @@ CF_DEFINES
#define THIS_KIF ((struct kif_config *) this_proto) #define THIS_KIF ((struct kif_config *) this_proto)
#define KIF_IFACE ((struct kif_iface_config *) this_ipatt) #define KIF_IFACE ((struct kif_iface_config *) this_ipatt)
static void
krt_set_merge_paths(struct channel_config *cc, uint merge, uint limit)
{
if ((limit <= 0) || (limit > 255))
cf_error("Merge paths limit must be in range 1-255");
cc->ra_mode = merge ? RA_MERGED : RA_OPTIMAL;
cc->merge_limit = limit;
}
static void static void
kif_set_preferred(ip_addr ip) kif_set_preferred(ip_addr ip)
{ {
@ -80,7 +70,7 @@ kern_item:
} }
| GRACEFUL RESTART bool { THIS_KRT->graceful_restart = $3; } | GRACEFUL RESTART bool { THIS_KRT->graceful_restart = $3; }
| MERGE PATHS bool kern_mp_limit { | MERGE PATHS bool kern_mp_limit {
krt_set_merge_paths(this_channel, $3, $4); THIS_KRT->merge_paths = $3 ? $4 : 0;
#ifndef KRT_ALLOW_MERGE_PATHS #ifndef KRT_ALLOW_MERGE_PATHS
if ($3) if ($3)
cf_error("Path merging not supported on this platform"); cf_error("Path merging not supported on this platform");

View file

@ -1059,11 +1059,18 @@ krt_postconfig(struct proto_config *CF)
cf_error("All kernel syncers must use the same table scan interval"); cf_error("All kernel syncers must use the same table scan interval");
#endif #endif
struct rtable_config *tab = proto_cf_main_channel(CF)->table; struct channel_config *cc = proto_cf_main_channel(CF);
struct rtable_config *tab = cc->table;
if (tab->krt_attached) if (tab->krt_attached)
cf_error("Kernel syncer (%s) already attached to table %s", tab->krt_attached->name, tab->name); cf_error("Kernel syncer (%s) already attached to table %s", tab->krt_attached->name, tab->name);
tab->krt_attached = CF; tab->krt_attached = CF;
if (cf->merge_paths)
{
cc->ra_mode = RA_MERGED;
cc->merge_limit = cf->merge_paths;
}
krt_sys_postconfig(cf); krt_sys_postconfig(cf);
} }

View file

@ -50,6 +50,7 @@ struct krt_config {
int persist; /* Keep routes when we exit */ int persist; /* Keep routes when we exit */
int learn; /* Learn routes from other sources */ int learn; /* Learn routes from other sources */
int graceful_restart; /* Regard graceful restart recovery */ int graceful_restart; /* Regard graceful restart recovery */
int merge_paths; /* Exported routes are merged for ECMP */
}; };
struct krt_proto { struct krt_proto {