- We keep the "export-table" option for compatibility reasons. - It overrides the selection of source-specific tables. Not sure if it is the right thing to do.
Thanks to Jernej Kos <jer...@kos.mx> for its review. --- babeld.man | 6 ++++++ configuration.c | 29 +++++++++++++++++++++++++++++ configuration.h | 4 ++++ kernel_netlink.c | 7 ++++++- 4 files changed, 45 insertions(+), 1 deletion(-) diff --git a/babeld.man b/babeld.man index 1991811..1712d71 100644 --- a/babeld.man +++ b/babeld.man @@ -498,6 +498,12 @@ For a redistribute filter, redistribute this route with metric .BI src-prefix " prefix" For a redistribute filter, set the source prefix of this route to .IR prefix . +.TP +.BI table " table" +For an export filter, specify the kernel routing table to use when inserting +that route. This may conflict with the disambiguation algorithm. You should +not use it with IPv4 source-specific routes, nor IPv6 sources-specific routes if +you don't have IPv6 subtrees. .PP If .I action diff --git a/configuration.c b/configuration.c index 4b85df0..a6c7cc0 100644 --- a/configuration.c +++ b/configuration.c @@ -42,6 +42,7 @@ THE SOFTWARE. struct filter *input_filters = NULL; struct filter *output_filters = NULL; struct filter *redistribute_filters = NULL; +struct filter *export_filters = NULL; struct interface_conf *default_interface_conf = NULL; struct interface_conf *interface_confs = NULL; @@ -403,6 +404,13 @@ parse_filter(int c, gnc_t gnc, void *closure, struct filter **filter_return) goto error; if(af == AF_INET && filter->action.src_plen == 96) memset(&filter->action.src_prefix, 0, 16); + } else if(strcmp(token, "table") == 0) { + int table; + c = getint(c, &table, gnc, closure); + if(c < -1) goto error; + if(table <= 0 || table > INFINITY) + goto error; + filter->action.table = table; } else { goto error; } @@ -846,6 +854,12 @@ parse_config(gnc_t gnc, void *closure) if(c < -1) return -1; add_filter(filter, &redistribute_filters); + } else if(strcmp(token, "export") == 0) { + struct filter *filter; + c = parse_filter(c, gnc, closure, &filter); + if(c < -1) + return -1; + add_filter(filter, &export_filters); } else if(strcmp(token, "interface") == 0) { struct interface_conf *if_conf; c = parse_ifconf(c, gnc, closure, &if_conf); @@ -945,6 +959,7 @@ renumber_filters() renumber_filter(input_filters); renumber_filter(output_filters); renumber_filter(redistribute_filters); + renumber_filter(export_filters); } static int @@ -1079,6 +1094,20 @@ redistribute_filter(const unsigned char *prefix, unsigned short plen, } int +export_filter(const unsigned char *prefix, unsigned short plen, + const unsigned char *src_prefix, unsigned short src_plen, + unsigned int ifindex, + struct filter_result *result) +{ + int res; + res = do_filter(export_filters, NULL, prefix, plen, + src_prefix, src_plen, NULL, ifindex, 0, result); + if(res < 0) + res = INFINITY; + return res; +} + +int finalise_config() { struct filter *filter = calloc(1, sizeof(struct filter)); diff --git a/configuration.h b/configuration.h index 67e6cde..7ff4927 100644 --- a/configuration.h +++ b/configuration.h @@ -24,6 +24,7 @@ struct filter_result { unsigned int add_metric; /* allow = 0, deny = INF, metric = <0..INF> */ unsigned char *src_prefix; unsigned char src_plen; + unsigned int table; /* linux specific: export in the FIB table number */ }; struct filter { @@ -61,4 +62,7 @@ int redistribute_filter(const unsigned char *prefix, unsigned short plen, const unsigned char *src_prefix, unsigned short src_plen, unsigned int ifindex, int proto, struct filter_result *result); +int export_filter(const unsigned char *prefix, unsigned short plen, + const unsigned char *src_prefix, unsigned short src_plen, + unsigned int ifindex, struct filter_result *result); int finalise_config(void); diff --git a/kernel_netlink.c b/kernel_netlink.c index 1b87e74..b3101e1 100644 --- a/kernel_netlink.c +++ b/kernel_netlink.c @@ -51,6 +51,7 @@ THE SOFTWARE. #include "kernel.h" #include "util.h" #include "interface.h" +#include "configuration.h" #ifndef MAX_INTERFACES #define MAX_INTERFACES 20 @@ -893,6 +894,7 @@ kernel_route(int operation, const unsigned char *dest, unsigned short plen, const unsigned char *newgate, int newifindex, unsigned int newmetric) { + struct filter_result filter_result = {0}; union { char raw[1024]; struct nlmsghdr nh; } buf; struct rtmsg *rtm; struct rtattr *rta; @@ -961,7 +963,10 @@ kernel_route(int operation, const unsigned char *dest, unsigned short plen, ipv4 = v4mapped(gate); - if(src_plen == 0) { + export_filter(dest, plen, src, src_plen, ifindex, &filter_result); + if(filter_result.table) { + table = filter_result.table; + } else if(src_plen == 0) { table = export_table; } else if(kernel_disambiguate(ipv4)) { table = export_table; -- 2.1.4 _______________________________________________ Babel-users mailing list Babel-users@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/babel-users