Commit 0c3cbd37 authored by Juliusz Chroboczek's avatar Juliusz Chroboczek

Implement -u: keep unfeasible routes.

This is useful in order to provide extra information to a graphic
front-end.  In can cause the RIB to explode in some pathological cases,
so it is not the default.
parent ec07953a
...@@ -125,7 +125,7 @@ main(int argc, char **argv) ...@@ -125,7 +125,7 @@ main(int argc, char **argv)
protocol_port = 6697; protocol_port = 6697;
while(1) { while(1) {
opt = getopt(argc, argv, "m:p:h:H:i:k:A:PsS:d:g:lwt:T:c:C:DL:I:"); opt = getopt(argc, argv, "m:p:h:H:i:k:A:PsuS:d:g:lwt:T:c:C:DL:I:");
if(opt < 0) if(opt < 0)
break; break;
...@@ -180,6 +180,9 @@ main(int argc, char **argv) ...@@ -180,6 +180,9 @@ main(int argc, char **argv)
case 's': case 's':
split_horizon = 0; split_horizon = 0;
break; break;
case 'u':
keep_unfeasible = 1;
break;
case 'S': case 'S':
state_file = optarg; state_file = optarg;
break; break;
...@@ -776,11 +779,11 @@ main(int argc, char **argv) ...@@ -776,11 +779,11 @@ main(int argc, char **argv)
" " " "
"[-h hello] [-H wired_hello] [-i idle_hello]\n" "[-h hello] [-H wired_hello] [-i idle_hello]\n"
" " " "
"[-k metric] [-A metric] [-s] [-P] [-l] [-w] [-d level] [-g port]\n" "[-k metric] [-A metric] [-s] [-P] [-l] [-w] [-u] [-g port]\n"
" " " "
"[-t table] [-T table] [-c file] [-C statement]\n" "[-t table] [-T table] [-c file] [-C statement]\n"
" " " "
"[-D] [-L logfile] [-I pidfile]\n" "[-d level] [-D] [-L logfile] [-I pidfile]\n"
" " " "
"[id] interface...\n", "[id] interface...\n",
argv[0]); argv[0]);
......
...@@ -44,6 +44,7 @@ struct route *routes = NULL; ...@@ -44,6 +44,7 @@ struct route *routes = NULL;
int numroutes = 0, maxroutes = 0; int numroutes = 0, maxroutes = 0;
int kernel_metric = 0; int kernel_metric = 0;
int allow_duplicates = -1; int allow_duplicates = -1;
int keep_unfeasible = 0;
struct route * struct route *
find_route(const unsigned char *prefix, unsigned char plen, find_route(const unsigned char *prefix, unsigned char plen,
...@@ -455,7 +456,7 @@ update_route(const unsigned char *a, const unsigned char *p, unsigned char plen, ...@@ -455,7 +456,7 @@ update_route(const unsigned char *a, const unsigned char *p, unsigned char plen,
} }
route->src = src; route->src = src;
if(feasible && refmetric < INFINITY) if((feasible || keep_unfeasible) && refmetric < INFINITY)
route->time = now.tv_sec; route->time = now.tv_sec;
route->seqno = seqno; route->seqno = seqno;
route->refmetric = refmetric; route->refmetric = refmetric;
...@@ -475,8 +476,10 @@ update_route(const unsigned char *a, const unsigned char *p, unsigned char plen, ...@@ -475,8 +476,10 @@ update_route(const unsigned char *a, const unsigned char *p, unsigned char plen,
return NULL; return NULL;
if(!feasible) { if(!feasible) {
send_unfeasible_request(neigh, 0, seqno, metric, src); send_unfeasible_request(neigh, 0, seqno, metric, src);
if(!keep_unfeasible)
return NULL; return NULL;
} }
if(numroutes >= maxroutes) { if(numroutes >= maxroutes) {
struct route *new_routes; struct route *new_routes;
int n = maxroutes < 1 ? 8 : 2 * maxroutes; int n = maxroutes < 1 ? 8 : 2 * maxroutes;
......
...@@ -41,6 +41,7 @@ route_metric(const struct route *route) ...@@ -41,6 +41,7 @@ route_metric(const struct route *route)
extern struct route *routes; extern struct route *routes;
extern int numroutes, maxroutes; extern int numroutes, maxroutes;
extern int kernel_metric, allow_duplicates; extern int kernel_metric, allow_duplicates;
extern int keep_unfeasible;
struct route *find_route(const unsigned char *prefix, unsigned char plen, struct route *find_route(const unsigned char *prefix, unsigned char plen,
struct neighbour *neigh, const unsigned char *nexthop); struct neighbour *neigh, const unsigned char *nexthop);
......
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