zebra: lookup the address in all VRFs when set the route-map rule "set src"
When configuring the route-map rule "set src A.B.C.D", it checked
whether the source address exists on some interface.
Now it checks the source address throughout all VRFs.
Signed-off-by: Feng Lu <lu.feng@6wind.com>
Reviewed-by: Alain Ritoux <alain.ritoux@6wind.com>
Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
Acked-by: Vincent JARDIN <vincent.jardin@6wind.com>
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
diff --git a/zebra/zebra_routemap.c b/zebra/zebra_routemap.c
index f373775..bd9be53 100644
--- a/zebra/zebra_routemap.c
+++ b/zebra/zebra_routemap.c
@@ -28,6 +28,7 @@
#include "command.h"
#include "filter.h"
#include "plist.h"
+#include "vrf.h"
#include "zebra/zserv.h"
@@ -369,7 +370,8 @@
"src address\n")
{
struct in_addr src;
- struct interface *pif;
+ struct interface *pif = NULL;
+ vrf_iter_t iter;
if (inet_pton(AF_INET, argv[0], &src) <= 0)
{
@@ -377,12 +379,16 @@
return CMD_WARNING;
}
- pif = if_lookup_exact_address (src);
- if (!pif)
- {
- vty_out (vty, "%% not a local address%s", VTY_NEWLINE);
- return CMD_WARNING;
- }
+ for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+ if ((pif = if_lookup_exact_address_vrf (src, vrf_iter2id (iter))) != NULL)
+ break;
+
+ if (!pif)
+ {
+ vty_out (vty, "%% not a local address%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
return zebra_route_set_add (vty, vty->index, "src", argv[0]);
}