Commit a28b52a5 authored by Juliusz Chroboczek's avatar Juliusz Chroboczek

Refactor check_xroutes to treat redistributed and local routes identically.

parent 33318259
...@@ -103,25 +103,27 @@ check_xroutes() ...@@ -103,25 +103,27 @@ check_xroutes()
{ {
int i, j, metric, export, change = 0, rc; int i, j, metric, export, change = 0, rc;
struct kernel_route routes[240]; struct kernel_route routes[240];
struct kernel_route addresses[240]; int numroutes;
int numroutes, numaddr;
debugf("\nChecking kernel routes.\n"); debugf("\nChecking kernel routes.\n");
rc = kernel_addresses(addresses, 240); rc = kernel_addresses(routes, 240);
if(rc < 0) { if(rc < 0) {
fprintf(stderr, "Couldn't get local addresses.\n"); fprintf(stderr, "Couldn't get local addresses.\n");
numaddr = 0; numroutes = 0;
} else { } else {
numaddr = rc; numroutes = rc;
} }
rc = kernel_routes(routes, 240); if(numroutes <= 240) {
rc = kernel_routes(routes + numroutes, 240 - numroutes);
if(rc < 0) { if(rc < 0) {
fprintf(stderr, "Couldn't get kernel routes.\n"); fprintf(stderr, "Couldn't get kernel routes.\n");
numroutes = 0;
} else { } else {
numroutes = rc; numroutes += rc;
}
} else {
fprintf(stderr, "Too many local ddresses -- ignoring kernel routes.\n");
} }
/* Check for any routes that need to be flushed */ /* Check for any routes that need to be flushed */
...@@ -131,25 +133,6 @@ check_xroutes() ...@@ -131,25 +133,6 @@ check_xroutes()
export = 0; export = 0;
if(xroutes[i].kind == XROUTE_FORCED) { if(xroutes[i].kind == XROUTE_FORCED) {
export = 1; export = 1;
} else if(xroutes[i].kind == XROUTE_LOCAL) {
metric = redistribute_filter(xroutes[i].prefix, xroutes[i].plen,
xroutes[i].ifindex,
RTPROT_BABEL_LOCAL);
if(metric == METRIC_INHERIT)
metric = 0;
if(metric < INFINITY && metric == xroutes[i].metric) {
for(j = 0; j < numaddr; j++) {
if(xroutes[i].plen == addresses[j].plen &&
memcmp(xroutes[i].prefix,
addresses[j].prefix, 128) == 0 &&
xroutes[i].ifindex == addresses[j].ifindex) {
if(metric < INFINITY) {
export = 1;
break;
}
}
}
}
} else if(xroutes[i].kind == XROUTE_REDISTRIBUTED) { } else if(xroutes[i].kind == XROUTE_REDISTRIBUTED) {
metric = redistribute_filter(xroutes[i].prefix, xroutes[i].plen, metric = redistribute_filter(xroutes[i].prefix, xroutes[i].plen,
xroutes[i].ifindex, xroutes[i].proto); xroutes[i].ifindex, xroutes[i].proto);
...@@ -164,7 +147,7 @@ check_xroutes() ...@@ -164,7 +147,7 @@ check_xroutes()
export = 1; export = 1;
break; break;
} else if(metric == METRIC_INHERIT && } else if(metric == METRIC_INHERIT &&
xroutes[i].metric == routes[j].metric) { xroutes[i].metric == routes[j].metric * 256) {
export = 1; export = 1;
break; break;
} }
...@@ -183,29 +166,13 @@ check_xroutes() ...@@ -183,29 +166,13 @@ check_xroutes()
/* Add any new routes */ /* Add any new routes */
for(i = 0; i < numaddr; i++) {
if(martian_prefix(addresses[i].prefix, addresses[i].plen))
continue;
metric = redistribute_filter(addresses[i].prefix, addresses[i].plen,
addresses[i].ifindex, RTPROT_BABEL_LOCAL);
if(metric == METRIC_INHERIT)
metric = 0;
if(metric < INFINITY) {
rc = add_xroute(XROUTE_LOCAL,
addresses[i].prefix, addresses[i].plen,
0, addresses[i].ifindex, RTPROT_BABEL_LOCAL);
if(rc)
change = 1;
}
}
for(i = 0; i < numroutes; i++) { for(i = 0; i < numroutes; i++) {
if(martian_prefix(routes[i].prefix, routes[i].plen)) if(martian_prefix(routes[i].prefix, routes[i].plen))
continue; continue;
metric = redistribute_filter(routes[i].prefix, routes[i].plen, metric = redistribute_filter(routes[i].prefix, routes[i].plen,
routes[i].ifindex, routes[i].proto); routes[i].ifindex, routes[i].proto);
if(metric == METRIC_INHERIT) if(metric == METRIC_INHERIT)
metric = routes[i].metric; metric = routes[i].metric * 256;
if(metric < INFINITY) { if(metric < INFINITY) {
rc = add_xroute(XROUTE_REDISTRIBUTED, rc = add_xroute(XROUTE_REDISTRIBUTED,
routes[i].prefix, routes[i].plen, routes[i].prefix, routes[i].plen,
......
...@@ -25,8 +25,7 @@ int check_xroutes(void); ...@@ -25,8 +25,7 @@ int check_xroutes(void);
/* These should come in decreasing order of priority. */ /* These should come in decreasing order of priority. */
#define XROUTE_FORCED 1 #define XROUTE_FORCED 1
#define XROUTE_LOCAL 2 #define XROUTE_REDISTRIBUTED 2
#define XROUTE_REDISTRIBUTED 3
struct xroute { struct xroute {
unsigned char prefix[16]; unsigned char prefix[16];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment