Per AFI redist registrations

The problem is that zclient->redist[ZEBRA_ROUTE_MAX] used for storing a
client’s redist state, has no address-family qualification. This means
a client can only store its interest in a protocol (connected, static etc.),
but cant choose IPv4 or ipv6 with that. This hindered implementation on
client sides to manage redistribution of ipv4 and ipv6 both.

BGP's redistribution of protocols like connected/static is one such place.

One fix could be to overload this and flap the redist connection each time
any new afi is added for redist, but that may have side-effects on the
existing afi redist.

The cleaner way is to modify redist data-structure to also take AFI, and adjust
routines that deal with it, so that a client can register for a protocol
redistribution based on the AFI. BGP already maintains redistribution state
based on afi and protocol (bgp->redist[AFI_MAX][ZEBRA_ROUTE_MAX]). This patch
takes care of filling up the gap in zclient/zserv redistribution state to
also use AFI qualification.

Signed-off-by: Vipin Kumar <vipin@cumulusnetworks.com>
Reviewed-by: Daniel Walton <dwalton@cumulusnetworks.com>
Reviewed-by: Dinesh G Dutt <ddutt@cumulusnetworks.com>
This commit is contained in:
Donald Sharp 2015-05-19 18:03:45 -07:00
parent a82478b985
commit 8bb0831e23
16 changed files with 222 additions and 181 deletions

View File

@ -196,18 +196,23 @@ DEFUN (babel_redistribute_type,
QUAGGA_REDIST_HELP_STR_BABELD)
{
int type;
afi_t afi;
type = proto_redistnum(AFI_IP6, argv[0]);
afi = AFI_IP6;
type = proto_redistnum(afi, argv[0]);
if (type < 0)
type = proto_redistnum(AFI_IP, argv[0]);
{
afi = AFI_IP;
type = proto_redistnum(afi, argv[0]);
}
if (type < 0) {
vty_out(vty, "Invalid type %s%s", argv[0], VTY_NEWLINE);
return CMD_WARNING;
}
zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, type, 0);
zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, afi, type, 0);
return CMD_SUCCESS;
}
@ -220,18 +225,23 @@ DEFUN (no_babel_redistribute_type,
QUAGGA_REDIST_HELP_STR_BABELD)
{
int type;
afi_t afi;
type = proto_redistnum(AFI_IP6, argv[0]);
afi = AFI_IP6;
type = proto_redistnum(afi, argv[0]);
if (type < 0)
type = proto_redistnum(AFI_IP, argv[0]);
{
afi = AFI_IP;
type = proto_redistnum(afi, argv[0]);
}
if (type < 0) {
vty_out(vty, "Invalid type %s%s", argv[0], VTY_NEWLINE);
return CMD_WARNING;
}
zclient_redistribute (ZEBRA_REDISTRIBUTE_DELETE, zclient, type, 0);
zclient_redistribute (ZEBRA_REDISTRIBUTE_DELETE, zclient, afi, type, 0);
/* perhaps should we remove xroutes having the same type... */
return CMD_SUCCESS;
}
@ -364,7 +374,8 @@ zebra_config_write (struct vty *vty)
vty_out (vty, "no router zebra%s", VTY_NEWLINE);
return 1;
}
else if (! zclient->redist[ZEBRA_ROUTE_BABEL].enabled)
else if (! (zclient->redist[AFI_IP][ZEBRA_ROUTE_BABEL].enabled ||
zclient->redist[AFI_IP6][ZEBRA_ROUTE_BABEL].enabled))
{
vty_out (vty, "router zebra%s", VTY_NEWLINE);
vty_out (vty, " no redistribute babel%s", VTY_NEWLINE);

View File

@ -95,6 +95,7 @@ babel_config_write (struct vty *vty)
{
int lines = 0;
int i;
afi_t afi;
/* list enabled debug modes */
lines += debug_babel_config_write (vty);
@ -110,9 +111,10 @@ babel_config_write (struct vty *vty)
/* list enabled interfaces */
lines = 1 + babel_enable_if_config_write (vty);
/* list redistributed protocols */
for (afi = AFI_IP; afi < AFI_MAX; afi++)
for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
if (i != zclient->redist_default &&
zclient->redist[i].enabled)
zclient->redist[afi][i].enabled)
{
vty_out (vty, " redistribute %s%s", zebra_route_string (i), VTY_NEWLINE);
lines++;

View File

@ -9681,7 +9681,7 @@ DEFUN (bgp_redistribute_ipv4,
return CMD_WARNING;
}
bgp_redist_add(vty->index, AFI_IP, type, 0);
return bgp_redistribute_set (type, 0);
return bgp_redistribute_set (AFI_IP, type, 0);
}
DEFUN (bgp_redistribute_ipv4_rmap,
@ -9704,7 +9704,7 @@ DEFUN (bgp_redistribute_ipv4_rmap,
red = bgp_redist_add(vty->index, AFI_IP, type, 0);
bgp_redistribute_rmap_set (red, argv[1]);
return bgp_redistribute_set (type, 0);
return bgp_redistribute_set (AFI_IP, type, 0);
}
DEFUN (bgp_redistribute_ipv4_metric,
@ -9729,7 +9729,7 @@ DEFUN (bgp_redistribute_ipv4_metric,
red = bgp_redist_add(vty->index, AFI_IP, type, 0);
bgp_redistribute_metric_set (red, metric);
return bgp_redistribute_set (type, 0);
return bgp_redistribute_set (AFI_IP, type, 0);
}
DEFUN (bgp_redistribute_ipv4_rmap_metric,
@ -9757,7 +9757,7 @@ DEFUN (bgp_redistribute_ipv4_rmap_metric,
red = bgp_redist_add(vty->index, AFI_IP, type, 0);
bgp_redistribute_rmap_set (red, argv[1]);
bgp_redistribute_metric_set (red, metric);
return bgp_redistribute_set (type, 0);
return bgp_redistribute_set (AFI_IP, type, 0);
}
DEFUN (bgp_redistribute_ipv4_metric_rmap,
@ -9785,7 +9785,7 @@ DEFUN (bgp_redistribute_ipv4_metric_rmap,
red = bgp_redist_add(vty->index, AFI_IP, type, 0);
bgp_redistribute_metric_set (red, metric);
bgp_redistribute_rmap_set (red, argv[2]);
return bgp_redistribute_set (type, 0);
return bgp_redistribute_set (AFI_IP, type, 0);
}
DEFUN (bgp_redistribute_ipv4_ospf,
@ -9806,7 +9806,7 @@ DEFUN (bgp_redistribute_ipv4_ospf,
protocol = ZEBRA_ROUTE_TABLE;
bgp_redist_add(vty->index, AFI_IP, protocol, instance);
return bgp_redistribute_set (protocol, instance);
return bgp_redistribute_set (AFI_IP, protocol, instance);
}
DEFUN (bgp_redistribute_ipv4_ospf_rmap,
@ -9830,7 +9830,7 @@ DEFUN (bgp_redistribute_ipv4_ospf_rmap,
VTY_GET_INTEGER ("Instance ID", instance, argv[1]);
red = bgp_redist_add(vty->index, AFI_IP, protocol, instance);
bgp_redistribute_rmap_set (red, argv[2]);
return bgp_redistribute_set (protocol, instance);
return bgp_redistribute_set (AFI_IP, protocol, instance);
}
DEFUN (bgp_redistribute_ipv4_ospf_metric,
@ -9857,7 +9857,7 @@ DEFUN (bgp_redistribute_ipv4_ospf_metric,
red = bgp_redist_add(vty->index, AFI_IP, protocol, instance);
bgp_redistribute_metric_set (red, metric);
return bgp_redistribute_set (protocol, instance);
return bgp_redistribute_set (AFI_IP, protocol, instance);
}
DEFUN (bgp_redistribute_ipv4_ospf_rmap_metric,
@ -9887,7 +9887,7 @@ DEFUN (bgp_redistribute_ipv4_ospf_rmap_metric,
red = bgp_redist_add(vty->index, AFI_IP, protocol, instance);
bgp_redistribute_rmap_set (red, argv[2]);
bgp_redistribute_metric_set (red, metric);
return bgp_redistribute_set (protocol, instance);
return bgp_redistribute_set (AFI_IP, protocol, instance);
}
DEFUN (bgp_redistribute_ipv4_ospf_metric_rmap,
@ -9917,7 +9917,7 @@ DEFUN (bgp_redistribute_ipv4_ospf_metric_rmap,
red = bgp_redist_add(vty->index, AFI_IP, protocol, instance);
bgp_redistribute_metric_set (red, metric);
bgp_redistribute_rmap_set (red, argv[3]);
return bgp_redistribute_set (protocol, instance);
return bgp_redistribute_set (AFI_IP, protocol, instance);
}
DEFUN (no_bgp_redistribute_ipv4_ospf,
@ -10059,7 +10059,7 @@ DEFUN (bgp_redistribute_ipv6,
}
bgp_redist_add(vty->index, AFI_IP6, type, 0);
return bgp_redistribute_set (type, 0);
return bgp_redistribute_set (AFI_IP6, type, 0);
}
DEFUN (bgp_redistribute_ipv6_rmap,
@ -10082,7 +10082,7 @@ DEFUN (bgp_redistribute_ipv6_rmap,
red = bgp_redist_add(vty->index, AFI_IP6, type, 0);
bgp_redistribute_rmap_set (red, argv[1]);
return bgp_redistribute_set (type, 0);
return bgp_redistribute_set (AFI_IP6, type, 0);
}
DEFUN (bgp_redistribute_ipv6_metric,
@ -10107,7 +10107,7 @@ DEFUN (bgp_redistribute_ipv6_metric,
red = bgp_redist_add(vty->index, AFI_IP6, type, 0);
bgp_redistribute_metric_set (red, metric);
return bgp_redistribute_set (type, 0);
return bgp_redistribute_set (AFI_IP6, type, 0);
}
DEFUN (bgp_redistribute_ipv6_rmap_metric,
@ -10135,7 +10135,7 @@ DEFUN (bgp_redistribute_ipv6_rmap_metric,
red = bgp_redist_add(vty->index, AFI_IP6, type, 0);
bgp_redistribute_rmap_set (red, argv[1]);
bgp_redistribute_metric_set (red, metric);
return bgp_redistribute_set (type, 0);
return bgp_redistribute_set (AFI_IP6, type, 0);
}
DEFUN (bgp_redistribute_ipv6_metric_rmap,
@ -10163,7 +10163,7 @@ DEFUN (bgp_redistribute_ipv6_metric_rmap,
red = bgp_redist_add(vty->index, AFI_IP6, type, 0);
bgp_redistribute_metric_set (red, metric);
bgp_redistribute_rmap_set (red, argv[2]);
return bgp_redistribute_set (type, 0);
return bgp_redistribute_set (AFI_IP6, type, 0);
}
DEFUN (no_bgp_redistribute_ipv6,

View File

@ -944,7 +944,8 @@ bgp_zebra_announce (struct prefix *p, struct bgp_info *info, struct bgp *bgp,
if (zclient->sock < 0)
return;
if (!zclient->redist[ZEBRA_ROUTE_BGP].enabled)
if ((p->family == AF_INET && !zclient->redist[AFI_IP][ZEBRA_ROUTE_BGP].enabled)
|| (p->family == AF_INET6 && !zclient->redist[AFI_IP6][ZEBRA_ROUTE_BGP].enabled))
return;
if (bgp->main_zebra_update_hold)
@ -1284,7 +1285,8 @@ bgp_zebra_withdraw (struct prefix *p, struct bgp_info *info, safi_t safi)
if (zclient->sock < 0)
return;
if (!zclient->redist[ZEBRA_ROUTE_BGP].enabled)
if ((p->family == AF_INET && !zclient->redist[AFI_IP][ZEBRA_ROUTE_BGP].enabled)
|| (p->family == AF_INET6 && !zclient->redist[AFI_IP6][ZEBRA_ROUTE_BGP].enabled))
return;
peer = info->peer;
@ -1471,25 +1473,25 @@ bgp_redist_del (struct bgp *bgp, afi_t afi, u_char type, u_short instance)
/* Other routes redistribution into BGP. */
int
bgp_redistribute_set (int type, u_short instance)
bgp_redistribute_set (afi_t afi, int type, u_short instance)
{
/* Return if already redistribute flag is set. */
if (redist_check_instance(&zclient->redist[type], instance))
if (redist_check_instance(&zclient->redist[afi][type], instance))
return CMD_WARNING;
redist_add_instance(&zclient->redist[type], instance);
redist_add_instance(&zclient->redist[afi][type], instance);
/* Return if zebra connection is not established. */
if (zclient->sock < 0)
return CMD_WARNING;
if (BGP_DEBUG (zebra, ZEBRA))
zlog_debug("Zebra send: redistribute add %s %d", zebra_route_string(type),
instance);
zlog_debug("Zebra send: redistribute add afi %d %s %d", afi,
zebra_route_string(type), instance);
/* Send distribute add message to zebra. */
zebra_redistribute_send (ZEBRA_REDISTRIBUTE_ADD, zclient, type, instance);
zebra_redistribute_send (ZEBRA_REDISTRIBUTE_ADD, zclient, afi, type, instance);
return CMD_SUCCESS;
}
@ -1502,12 +1504,12 @@ bgp_redistribute_resend (struct bgp *bgp, afi_t afi, int type, u_short instance)
return -1;
if (BGP_DEBUG (zebra, ZEBRA))
zlog_debug("Zebra send: redistribute add %s %d", zebra_route_string(type),
instance);
zlog_debug("Zebra send: redistribute delete/add afi %d %s %d", afi,
zebra_route_string(type), instance);
/* Send distribute add message to zebra. */
zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE, zclient, type, instance);
zebra_redistribute_send (ZEBRA_REDISTRIBUTE_ADD, zclient, type, instance);
zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE, zclient, afi, type, instance);
zebra_redistribute_send (ZEBRA_REDISTRIBUTE_ADD, zclient, afi, type, instance);
return 0;
}
@ -1565,19 +1567,17 @@ bgp_redistribute_unset (struct bgp *bgp, afi_t afi, int type, u_short instance)
bgp_redist_del(bgp, afi, type, instance);
/* Return if zebra connection is disabled. */
if (!redist_check_instance(&zclient->redist[type], instance))
if (!redist_check_instance(&zclient->redist[afi][type], instance))
return CMD_WARNING;
redist_del_instance(&zclient->redist[type], instance);
redist_del_instance(&zclient->redist[afi][type], instance);
if (!bgp_redist_lookup(bgp, AFI_IP, type, instance)
&& !bgp_redist_lookup(bgp, AFI_IP6, type, instance)
&& zclient->sock >= 0)
if (zclient->sock >= 0)
{
/* Send distribute delete message to zebra. */
if (BGP_DEBUG (zebra, ZEBRA))
zlog_debug("Zebra send: redistribute delete %s %d",
zebra_route_string(type), instance);
zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE, zclient, type, instance);
zlog_debug("Zebra send: redistribute delete afi %d %s %d",
afi, zebra_route_string(type), instance);
zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE, zclient, afi, type, instance);
}
/* Withdraw redistributed routes from current BGP's routing table. */

View File

@ -40,7 +40,7 @@ extern void bgp_zebra_withdraw (struct prefix *, struct bgp_info *, safi_t);
extern struct bgp_redist *bgp_redist_lookup (struct bgp *, afi_t, u_char, u_short);
extern struct bgp_redist *bgp_redist_add (struct bgp *, afi_t, u_char, u_short);
extern int bgp_redistribute_set (int, u_short);
extern int bgp_redistribute_set (afi_t, int, u_short);
extern int bgp_redistribute_resend (struct bgp *, afi_t, int, u_short);
extern int bgp_redistribute_rmap_set (struct bgp_redist *, const char *);
extern int bgp_redistribute_metric_set (struct bgp_redist *, u_int32_t);

View File

@ -236,7 +236,7 @@ isis_zebra_route_add_ipv4 (struct prefix *prefix,
if (CHECK_FLAG (route_info->flag, ISIS_ROUTE_FLAG_ZEBRA_SYNCED))
return;
if (zclient->redist[ZEBRA_ROUTE_ISIS].enabled)
if (zclient->redist[AFI_IP][ZEBRA_ROUTE_ISIS].enabled)
{
message = 0;
flags = 0;
@ -303,7 +303,7 @@ isis_zebra_route_del_ipv4 (struct prefix *prefix,
struct zapi_ipv4 api;
struct prefix_ipv4 prefix4;
if (zclient->redist[ZEBRA_ROUTE_ISIS].enabled)
if (zclient->redist[AFI_IP][ZEBRA_ROUTE_ISIS].enabled)
{
api.type = ZEBRA_ROUTE_ISIS;
api.instance = 0;
@ -493,7 +493,8 @@ isis_zebra_route_update (struct prefix *prefix,
if (zclient->sock < 0)
return;
if (!zclient->redist[ZEBRA_ROUTE_ISIS].enabled)
if ((prefix->family == AF_INET && !zclient->redist[AFI_IP][ZEBRA_ROUTE_ISIS].enabled) ||
(prefix->family == AF_INET6 && !zclient->redist[AFI_IP6][ZEBRA_ROUTE_ISIS].enabled))
return;
if (CHECK_FLAG (route_info->flag, ISIS_ROUTE_FLAG_ACTIVE))
@ -577,7 +578,7 @@ isis_zebra_read_ipv6 (int command, struct zclient *zclient,
#define ISIS_TYPE_IS_REDISTRIBUTED(T) \
T == ZEBRA_ROUTE_MAX ? zclient->default_information : \
zclient->redist[type].enabled
(zclient->redist[AFI_IP][type].enabled || client->redist[AFI_IP6][type].enabled)
int
isis_distribute_list_update (int routetype)

View File

@ -139,7 +139,7 @@ redist_del_instance (struct redist_proto *red, u_short instance)
void
zclient_init (struct zclient *zclient, int redist_default, u_short instance)
{
int i;
int afi, i;
/* Enable zebra client connection by default. */
zclient->enable = 1;
@ -148,14 +148,17 @@ zclient_init (struct zclient *zclient, int redist_default, u_short instance)
zclient->sock = -1;
/* Clear redistribution flags. */
for (afi = AFI_IP; afi < AFI_MAX; afi++)
for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
memset(&zclient->redist[i], 0, sizeof(struct redist_proto));
memset(&zclient->redist[afi][i], 0, sizeof(struct redist_proto));
/* Set unwanted redistribute route. bgpd does not need BGP route
redistribution. */
zclient->redist_default = redist_default;
zclient->instance = instance;
redist_add_instance (&zclient->redist[redist_default], instance);
/* Pending: make afi(s) an arg. */
for (afi = AFI_IP; afi < AFI_MAX; afi++)
redist_add_instance (&zclient->redist[afi][redist_default], instance);
/* Set default-information redistribute to zero. */
zclient->default_information = 0;
@ -400,6 +403,7 @@ int
zclient_start (struct zclient *zclient)
{
int i;
afi_t afi;
if (zclient_debug)
zlog_debug ("zclient_start is called");
@ -445,15 +449,16 @@ zclient_start (struct zclient *zclient)
zebra_message_send (zclient, ZEBRA_INTERFACE_ADD);
/* Flush all redistribute request. */
for (afi = AFI_IP; afi < AFI_MAX; afi++)
for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
if (zclient->redist[i].enabled)
if (zclient->redist[afi][i].enabled)
{
struct listnode *node;
u_short *id;
for (ALL_LIST_ELEMENTS_RO(zclient->redist[i].instances, node, id))
for (ALL_LIST_ELEMENTS_RO(zclient->redist[afi][i].instances, node, id))
if (!(i == zclient->redist_default && *id == zclient->instance))
zebra_redistribute_send (ZEBRA_REDISTRIBUTE_ADD, zclient, i, *id);
zebra_redistribute_send (ZEBRA_REDISTRIBUTE_ADD, zclient, afi, i, *id);
}
/* If default information is needed. */
@ -694,7 +699,7 @@ zapi_ipv6_route (u_char cmd, struct zclient *zclient, struct prefix_ipv6 *p,
* sending client
*/
int
zebra_redistribute_send (int command, struct zclient *zclient, int type,
zebra_redistribute_send (int command, struct zclient *zclient, afi_t afi, int type,
u_short instance)
{
struct stream *s;
@ -703,6 +708,7 @@ zebra_redistribute_send (int command, struct zclient *zclient, int type,
stream_reset(s);
zclient_create_header (s, command);
stream_putc (s, afi);
stream_putc (s, type);
stream_putw (s, instance);
@ -1222,25 +1228,25 @@ zclient_read (struct thread *thread)
}
void
zclient_redistribute (int command, struct zclient *zclient, int type,
zclient_redistribute (int command, struct zclient *zclient, afi_t afi, int type,
u_short instance)
{
if (command == ZEBRA_REDISTRIBUTE_ADD)
{
if (redist_check_instance(&zclient->redist[type], instance))
if (redist_check_instance(&zclient->redist[afi][type], instance))
return;
redist_add_instance(&zclient->redist[type], instance);
redist_add_instance(&zclient->redist[afi][type], instance);
}
else
{
if (!redist_check_instance(&zclient->redist[type], instance))
if (!redist_check_instance(&zclient->redist[afi][type], instance))
return;
redist_del_instance(&zclient->redist[type], instance);
redist_del_instance(&zclient->redist[afi][type], instance);
}
if (zclient->sock > 0)
zebra_redistribute_send (command, zclient, type, instance);
zebra_redistribute_send (command, zclient, afi, type, instance);
}

View File

@ -72,7 +72,7 @@ struct zclient
/* Redistribute information. */
u_char redist_default; /* clients protocol */
u_short instance;
struct redist_proto redist[ZEBRA_ROUTE_MAX];
struct redist_proto redist[AFI_MAX][ZEBRA_ROUTE_MAX];
/* Redistribute defauilt. */
u_char default_information;
@ -156,10 +156,10 @@ extern void redist_add_instance (struct redist_proto *, u_short);
extern void redist_del_instance (struct redist_proto *, u_short);
/* Send redistribute command to zebra daemon. Do not update zclient state. */
extern int zebra_redistribute_send (int command, struct zclient *, int type, u_short instance);
extern int zebra_redistribute_send (int command, struct zclient *, afi_t, int type, u_short instance);
/* If state has changed, update state and call zebra_redistribute_send. */
extern void zclient_redistribute (int command, struct zclient *, int type,
extern void zclient_redistribute (int command, struct zclient *, afi_t, int type,
u_short instance);
/* If state has changed, update state and send the command to zebra. */

View File

@ -70,21 +70,21 @@ ospf6_router_id_update_zebra (int command, struct zclient *zclient,
void
ospf6_zebra_redistribute (int type)
{
if (zclient->redist[type].enabled)
if (zclient->redist[AFI_IP6][type].enabled)
return;
redist_add_instance(&zclient->redist[type], 0);
redist_add_instance(&zclient->redist[AFI_IP6][type], 0);
if (zclient->sock > 0)
zebra_redistribute_send (ZEBRA_REDISTRIBUTE_ADD, zclient, type, 0);
zebra_redistribute_send (ZEBRA_REDISTRIBUTE_ADD, zclient, AFI_IP6, type, 0);
}
void
ospf6_zebra_no_redistribute (int type)
{
if (! zclient->redist[type].enabled)
if (! zclient->redist[AFI_IP6][type].enabled)
return;
redist_del_instance(&zclient->redist[type], 0);
redist_del_instance(&zclient->redist[AFI_IP6][type], 0);
if (zclient->sock > 0)
zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE, zclient, type, 0);
zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE, zclient, AFI_IP6, type, 0);
}
/* Inteface addition message from zebra. */
@ -297,7 +297,7 @@ DEFUN (show_zebra,
vty_out (vty, " redistribute:");
for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
{
if (zclient->redist[i].enabled)
if (zclient->redist[AFI_IP6][i].enabled)
vty_out (vty, " %s", zebra_route_string(i));
}
vty_out (vty, "%s", VNL);
@ -337,7 +337,7 @@ config_write_ospf6_zebra (struct vty *vty)
vty_out (vty, "no router zebra%s", VNL);
vty_out (vty, "!%s", VNL);
}
else if (! zclient->redist[ZEBRA_ROUTE_OSPF6].enabled)
else if (! zclient->redist[AFI_IP6][ZEBRA_ROUTE_OSPF6].enabled)
{
vty_out (vty, "router zebra%s", VNL);
vty_out (vty, " no redistribute ospf6%s", VNL);
@ -472,7 +472,7 @@ ospf6_zebra_route_update (int type, struct ospf6_route *request)
void
ospf6_zebra_route_update_add (struct ospf6_route *request)
{
if (! zclient->redist[ZEBRA_ROUTE_OSPF6].enabled)
if (! zclient->redist[AFI_IP6][ZEBRA_ROUTE_OSPF6].enabled)
{
ospf6->route_table->hook_add = NULL;
ospf6->route_table->hook_remove = NULL;
@ -484,7 +484,7 @@ ospf6_zebra_route_update_add (struct ospf6_route *request)
void
ospf6_zebra_route_update_remove (struct ospf6_route *request)
{
if (! zclient->redist[ZEBRA_ROUTE_OSPF6].enabled)
if (! zclient->redist[AFI_IP6][ZEBRA_ROUTE_OSPF6].enabled)
{
ospf6->route_table->hook_add = NULL;
ospf6->route_table->hook_remove = NULL;
@ -500,7 +500,7 @@ ospf6_zebra_add_discard (struct ospf6_route *request)
char buf[INET6_ADDRSTRLEN];
struct prefix_ipv6 *dest;
if (zclient->redist[ZEBRA_ROUTE_OSPF6].enabled)
if (zclient->redist[AFI_IP6][ZEBRA_ROUTE_OSPF6].enabled)
{
if (!CHECK_FLAG (request->flag, OSPF6_ROUTE_BLACKHOLE_ADDED))
{
@ -544,7 +544,7 @@ ospf6_zebra_delete_discard (struct ospf6_route *request)
char buf[INET6_ADDRSTRLEN];
struct prefix_ipv6 *dest;
if (zclient->redist[ZEBRA_ROUTE_OSPF6].enabled)
if (zclient->redist[AFI_IP6][ZEBRA_ROUTE_OSPF6].enabled)
{
if (CHECK_FLAG (request->flag, OSPF6_ROUTE_BLACKHOLE_ADDED))
{
@ -587,10 +587,10 @@ DEFUN (redistribute_ospf6,
{
struct ospf6_route *route;
if (zclient->redist[ZEBRA_ROUTE_OSPF6].enabled)
if (zclient->redist[AFI_IP6][ZEBRA_ROUTE_OSPF6].enabled)
return CMD_SUCCESS;
redist_add_instance(&zclient->redist[ZEBRA_ROUTE_OSPF6], 0);
redist_add_instance(&zclient->redist[AFI_IP6][ZEBRA_ROUTE_OSPF6], 0);
if (ospf6 == NULL)
return CMD_SUCCESS;
@ -615,10 +615,10 @@ DEFUN (no_redistribute_ospf6,
{
struct ospf6_route *route;
if (! zclient->redist[ZEBRA_ROUTE_OSPF6].enabled)
if (! zclient->redist[AFI_IP6][ZEBRA_ROUTE_OSPF6].enabled)
return CMD_SUCCESS;
redist_del_instance(&zclient->redist[ZEBRA_ROUTE_OSPF6], 0);
redist_del_instance(&zclient->redist[AFI_IP6][ZEBRA_ROUTE_OSPF6], 0);
if (ospf6 == NULL)
return CMD_SUCCESS;

View File

@ -42,7 +42,7 @@ extern void ospf6_zebra_route_update_remove (struct ospf6_route *request);
extern void ospf6_zebra_redistribute (int);
extern void ospf6_zebra_no_redistribute (int);
#define ospf6_zebra_is_redistribute(type) (zclient->redist[type].enabled)
#define ospf6_zebra_is_redistribute(type) (zclient->redist[AFI_IP6][type].enabled)
extern void ospf6_zebra_init (void);
extern void ospf6_zebra_add_discard (struct ospf6_route *request);
extern void ospf6_zebra_delete_discard (struct ospf6_route *request);

View File

@ -95,7 +95,7 @@ ospf_external_info_check (struct ospf_lsa *lsa)
int redist_on = 0;
redist_on = is_prefix_default (&p) ? zclient->default_information :
zclient->redist[type].enabled;
zclient->redist[AFI_IP][type].enabled;
if (redist_on)
{
struct list *ext_list;

View File

@ -388,7 +388,7 @@ ospf_zebra_add (struct prefix_ipv4 *p, struct ospf_route *or)
#endif /* HAVE_NETLINK */
struct ospf *ospf = ospf_lookup ();
if (redist_check_instance(&zclient->redist[ZEBRA_ROUTE_OSPF], ospf->instance))
if (redist_check_instance(&zclient->redist[AFI_IP][ZEBRA_ROUTE_OSPF], ospf->instance))
{
message = 0;
flags = 0;
@ -533,7 +533,7 @@ ospf_zebra_delete (struct prefix_ipv4 *p, struct ospf_route *or)
struct listnode *node;
struct ospf *ospf = ospf_lookup ();
if (redist_check_instance(&zclient->redist[ZEBRA_ROUTE_OSPF], ospf->instance))
if (redist_check_instance(&zclient->redist[AFI_IP][ZEBRA_ROUTE_OSPF], ospf->instance))
{
message = 0;
flags = 0;
@ -616,7 +616,7 @@ ospf_zebra_add_discard (struct prefix_ipv4 *p)
struct zapi_ipv4 api;
struct ospf *ospf = ospf_lookup ();
if (redist_check_instance(&zclient->redist[ZEBRA_ROUTE_OSPF], ospf->instance))
if (redist_check_instance(&zclient->redist[AFI_IP][ZEBRA_ROUTE_OSPF], ospf->instance))
{
api.type = ZEBRA_ROUTE_OSPF;
api.instance = ospf->instance;
@ -642,7 +642,7 @@ ospf_zebra_delete_discard (struct prefix_ipv4 *p)
struct zapi_ipv4 api;
struct ospf *ospf = ospf_lookup ();
if (redist_check_instance(&zclient->redist[ZEBRA_ROUTE_OSPF], ospf->instance))
if (redist_check_instance(&zclient->redist[AFI_IP][ZEBRA_ROUTE_OSPF], ospf->instance))
{
api.type = ZEBRA_ROUTE_OSPF;
api.instance = ospf->instance;
@ -791,7 +791,7 @@ ospf_is_type_redistributed (int type, u_short instance)
{
return (DEFAULT_ROUTE_TYPE (type) ?
zclient->default_information :
redist_check_instance(&zclient->redist[type], instance));
redist_check_instance(&zclient->redist[AFI_IP][type], instance));
}
int
@ -831,7 +831,7 @@ ospf_redistribute_set (struct ospf *ospf, int type, u_short instance, int mtype,
ospf_external_add(type, instance);
zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, type, instance);
zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, AFI_IP, type, instance);
if (IS_DEBUG_OSPF (zebra, ZEBRA_REDISTRIBUTE))
zlog_debug ("Redistribute[%s][%d]: Start Type[%d], Metric[%d]",
@ -852,7 +852,7 @@ ospf_redistribute_unset (struct ospf *ospf, int type, u_short instance)
if (!ospf_is_type_redistributed (type, instance))
return CMD_SUCCESS;
zclient_redistribute (ZEBRA_REDISTRIBUTE_DELETE, zclient, type, instance);
zclient_redistribute (ZEBRA_REDISTRIBUTE_DELETE, zclient, AFI_IP, type, instance);
if (IS_DEBUG_OSPF (zebra, ZEBRA_REDISTRIBUTE))
zlog_debug ("Redistribute[%s][%d]: Stop",

View File

@ -41,7 +41,7 @@ rip_zebra_ipv4_add (struct prefix_ipv4 *p, struct in_addr *nexthop,
{
struct zapi_ipv4 api;
if (zclient->redist[ZEBRA_ROUTE_RIP].enabled)
if (zclient->redist[AFI_IP][ZEBRA_ROUTE_RIP].enabled)
{
api.type = ZEBRA_ROUTE_RIP;
api.instance = 0;
@ -73,7 +73,7 @@ rip_zebra_ipv4_delete (struct prefix_ipv4 *p, struct in_addr *nexthop,
{
struct zapi_ipv4 api;
if (zclient->redist[ZEBRA_ROUTE_RIP].enabled)
if (zclient->redist[AFI_IP][ZEBRA_ROUTE_RIP].enabled)
{
api.type = ZEBRA_ROUTE_RIP;
api.instance = 0;
@ -243,13 +243,13 @@ DEFUN (no_router_zebra,
static int
rip_redistribute_set (int type)
{
if (zclient->redist[type])
if (zclient->redist[AFI_IP][type])
return CMD_SUCCESS;
zclient->redist[type] = 1;
zclient->redist[AFI_IP][type] = 1;
if (zclient->sock > 0)
zebra_redistribute_send (ZEBRA_REDISTRIBUTE_ADD, zclient, type);
zebra_redistribute_send (ZEBRA_REDISTRIBUTE_ADD, zclient, API_IP, type);
return CMD_SUCCESS;
}
@ -258,13 +258,13 @@ rip_redistribute_set (int type)
static int
rip_redistribute_unset (int type)
{
if (! zclient->redist[type].enabled)
if (! zclient->redist[AFI_IP][type].enabled)
return CMD_SUCCESS;
redist_del_instance(&zclient->redist[type], 0);
redist_del_instance(&zclient->redist[AFI_IP][type], 0);
if (zclient->sock > 0)
zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE, zclient, type, 0);
zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE, zclient, AFI_IP, type, 0);
/* Remove the routes from RIP table. */
rip_redistribute_withdraw (type);
@ -275,7 +275,7 @@ rip_redistribute_unset (int type)
int
rip_redistribute_check (int type)
{
return (zclient->redist[type].enabled);
return (zclient->redist[AFI_IP][type].enabled);
}
void
@ -285,13 +285,13 @@ rip_redistribute_clean (void)
for (i = 0; redist_type[i].str; i++)
{
if (zclient->redist[redist_type[i].type].enabled)
if (zclient->redist[AFI_IP][redist_type[i].type].enabled)
{
if (zclient->sock > 0)
zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE,
zclient, redist_type[i].type, 0);
zclient, AFI_IP, redist_type[i].type, 0);
redist_del_instance(&zclient->redist[redist_type[i].type], 0);
redist_del_instance(&zclient->redist[AFI_IP][redist_type[i].type], 0);
/* Remove the routes from RIP table. */
rip_redistribute_withdraw (redist_type[i].type);
@ -305,7 +305,7 @@ DEFUN (rip_redistribute_rip,
"Redistribute information from another routing protocol\n"
"Routing Information Protocol (RIP)\n")
{
redist_add_instance(&zclient->redist[ZEBRA_ROUTE_RIP], 0);
redist_add_instance(&zclient->redist[AFI_IP][ZEBRA_ROUTE_RIP], 0);
return CMD_SUCCESS;
}
@ -316,7 +316,7 @@ DEFUN (no_rip_redistribute_rip,
"Redistribute information from another routing protocol\n"
"Routing Information Protocol (RIP)\n")
{
redist_del_instance(&zclient->redist[ZEBRA_ROUTE_RIP], 0);
redist_del_instance(&zclient->redist[AFI_IP][ZEBRA_ROUTE_RIP], 0);
return CMD_SUCCESS;
}
@ -334,7 +334,7 @@ DEFUN (rip_redistribute_type,
redist_type[i].str_min_len) == 0)
{
zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient,
redist_type[i].type, 0);
AFI_IP, redist_type[i].type, 0);
return CMD_SUCCESS;
}
}
@ -387,7 +387,8 @@ DEFUN (rip_redistribute_type_routemap,
redist_type[i].str_min_len) == 0)
{
rip_routemap_set (redist_type[i].type, argv[1]);
zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, redist_type[i].type, 0);
zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, AFI_IP,
redist_type[i].type, 0);
return CMD_SUCCESS;
}
}
@ -445,7 +446,8 @@ DEFUN (rip_redistribute_type_metric,
redist_type[i].str_min_len) == 0)
{
rip_redistribute_metric_set (redist_type[i].type, metric);
zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, redist_type[i].type, 0);
zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, AFI_IP,
redist_type[i].type, 0);
return CMD_SUCCESS;
}
}
@ -506,7 +508,8 @@ DEFUN (rip_redistribute_type_metric_routemap,
{
rip_redistribute_metric_set (redist_type[i].type, metric);
rip_routemap_set (redist_type[i].type, argv[2]);
zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, redist_type[i].type, 0);
zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, AFI_IP,
redist_type[i].type, 0);
return CMD_SUCCESS;
}
}
@ -610,7 +613,7 @@ config_write_zebra (struct vty *vty)
vty_out (vty, "no router zebra%s", VTY_NEWLINE);
return 1;
}
else if (! zclient->redist[ZEBRA_ROUTE_RIP].enabled)
else if (! zclient->redist[AFI_IP][ZEBRA_ROUTE_RIP].enabled)
{
vty_out (vty, "router zebra%s", VTY_NEWLINE);
vty_out (vty, " no redistribute rip%s", VTY_NEWLINE);
@ -626,7 +629,7 @@ config_write_rip_redistribute (struct vty *vty, int config_mode)
for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
if (i != zclient->redist_default &&
zclient->redist[i].enabled)
zclient->redist[AFI_IP][i].enabled)
{
if (config_mode)
{

View File

@ -48,7 +48,7 @@ ripng_zebra_ipv6_add (struct prefix_ipv6 *p, struct in6_addr *nexthop,
{
struct zapi_ipv6 api;
if (zclient->redist[ZEBRA_ROUTE_RIPNG].enabled)
if (zclient->redist[AFI_IP6][ZEBRA_ROUTE_RIPNG].enabled)
{
api.type = ZEBRA_ROUTE_RIPNG;
api.instance = 0;
@ -74,7 +74,7 @@ ripng_zebra_ipv6_delete (struct prefix_ipv6 *p, struct in6_addr *nexthop,
{
struct zapi_ipv6 api;
if (zclient->redist[ZEBRA_ROUTE_RIPNG].enabled)
if (zclient->redist[AFI_IP6][ZEBRA_ROUTE_RIPNG].enabled)
{
api.type = ZEBRA_ROUTE_RIPNG;
api.instance = 0;
@ -156,13 +156,13 @@ ripng_zclient_reset (void)
static int
ripng_redistribute_unset (int type)
{
if (! zclient->redist[type].enabled)
if (! zclient->redist[AFI_IP6][type].enabled)
return CMD_SUCCESS;
redist_del_instance(&zclient->redist[type], 0);
redist_del_instance(&zclient->redist[AFI_IP6][type], 0);
if (zclient->sock > 0)
zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE, zclient, type, 0);
zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE, zclient, AFI_IP6, type, 0);
ripng_redistribute_withdraw (type);
@ -172,7 +172,7 @@ ripng_redistribute_unset (int type)
int
ripng_redistribute_check (int type)
{
return (zclient->redist[type].enabled);
return (zclient->redist[AFI_IP6][type].enabled);
}
static void
@ -232,13 +232,13 @@ ripng_redistribute_clean ()
for (i = 0; redist_type[i].str; i++)
{
if (zclient->redist[redist_type[i].type].enabled)
if (zclient->redist[AFI_IP6][redist_type[i].type].enabled)
{
if (zclient->sock > 0)
zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE,
zclient, redist_type[i].type, 0);
zclient, AFI_IP6, redist_type[i].type, 0);
redist_del_instance(&zclient->redist[redist_type[i].type], 0);
redist_del_instance(&zclient->redist[AFI_IP6][redist_type[i].type], 0);
/* Remove the routes from RIPng table. */
ripng_redistribute_withdraw (redist_type[i].type);
@ -276,7 +276,7 @@ DEFUN (ripng_redistribute_ripng,
"Redistribute information from another routing protocol\n"
"RIPng route\n")
{
redist_add_instance(&zclient->redist[ZEBRA_ROUTE_RIPNG], 0);
redist_add_instance(&zclient->redist[AFI_IP6][ZEBRA_ROUTE_RIPNG], 0);
return CMD_SUCCESS;
}
@ -287,7 +287,7 @@ DEFUN (no_ripng_redistribute_ripng,
"Redistribute information from another routing protocol\n"
"RIPng route\n")
{
redist_del_instance(&zclient->redist[ZEBRA_ROUTE_RIPNG], 0);
redist_del_instance(&zclient->redist[AFI_IP6][ZEBRA_ROUTE_RIPNG], 0);
return CMD_SUCCESS;
}
@ -307,7 +307,7 @@ DEFUN (ripng_redistribute_type,
return CMD_WARNING;
}
zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, type, 0);
zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, AFI_IP6, type, 0);
return CMD_SUCCESS;
}
@ -355,7 +355,7 @@ DEFUN (ripng_redistribute_type_metric,
}
ripng_redistribute_metric_set (type, metric);
zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, type, 0);
zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, AFI_IP6, type, 0);
return CMD_SUCCESS;
}
@ -387,7 +387,7 @@ DEFUN (ripng_redistribute_type_routemap,
}
ripng_redistribute_routemap_set (type, argv[1]);
zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, type, 0);
zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, AFI_IP6, type, 0);
return CMD_SUCCESS;
}
@ -424,7 +424,7 @@ DEFUN (ripng_redistribute_type_metric_routemap,
ripng_redistribute_metric_set (type, metric);
ripng_redistribute_routemap_set (type, argv[2]);
zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, type, 0);
zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, AFI_IP6, type, 0);
return CMD_SUCCESS;
}
@ -444,7 +444,7 @@ ripng_redistribute_write (struct vty *vty, int config_mode)
for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
if (i != zclient->redist_default &&
zclient->redist[i].enabled)
zclient->redist[AFI_IP6][i].enabled)
{
if (config_mode)
{
@ -484,7 +484,7 @@ zebra_config_write (struct vty *vty)
vty_out (vty, "no router zebra%s", VTY_NEWLINE);
return 1;
}
else if (! zclient->redist[ZEBRA_ROUTE_RIPNG].enabled)
else if (! zclient->redist[AFI_IP6][ZEBRA_ROUTE_RIPNG].enabled)
{
vty_out (vty, "router zebra%s", VTY_NEWLINE);
vty_out (vty, " no redistribute ripng%s", VTY_NEWLINE);

View File

@ -208,32 +208,38 @@ redistribute_add (struct prefix *p, struct rib *rib)
{
if (is_default (p))
{
if (client->redist_default ||
redist_check_instance(&client->redist[rib->type], rib->instance))
{
if (p->family == AF_INET)
if ((p->family == AF_INET) &&
(client->redist_default ||
redist_check_instance(&client->redist[AFI_IP][rib->type],
rib->instance)))
{
client->redist_v4_add_cnt++;
zsend_route_multipath (ZEBRA_IPV4_ROUTE_ADD, client, p, rib);
}
#ifdef HAVE_IPV6
if (p->family == AF_INET6)
if ((p->family == AF_INET6) &&
(client->redist_default ||
redist_check_instance(&client->redist[AFI_IP6][rib->type],
rib->instance)))
{
client->redist_v6_add_cnt++;
zsend_route_multipath (ZEBRA_IPV6_ROUTE_ADD, client, p, rib);
}
#endif /* HAVE_IPV6 */
}
}
else if (redist_check_instance(&client->redist[rib->type], rib->instance))
else
{
if (p->family == AF_INET)
if ((p->family == AF_INET) &&
redist_check_instance(&client->redist[AFI_IP][rib->type],
rib->instance))
{
client->redist_v4_add_cnt++;
zsend_route_multipath (ZEBRA_IPV4_ROUTE_ADD, client, p, rib);
}
#ifdef HAVE_IPV6
if (p->family == AF_INET6)
if ((p->family == AF_INET6) &&
redist_check_instance(&client->redist[AFI_IP6][rib->type],
rib->instance))
{
client->redist_v6_add_cnt++;
zsend_route_multipath (ZEBRA_IPV6_ROUTE_ADD, client, p, rib);
@ -257,26 +263,34 @@ redistribute_delete (struct prefix *p, struct rib *rib)
{
if (is_default (p))
{
if (client->redist_default ||
redist_check_instance(&client->redist[rib->type], rib->instance))
{
if (p->family == AF_INET)
if ((p->family == AF_INET) &&
(client->redist_default ||
redist_check_instance(&client->redist[AFI_IP][rib->type],
rib->instance)))
zsend_route_multipath (ZEBRA_IPV4_ROUTE_DELETE, client, p,
rib);
#ifdef HAVE_IPV6
if (p->family == AF_INET6)
if ((p->family == AF_INET6) &&
(client->redist_default ||
redist_check_instance(&client->redist[AFI_IP6][rib->type],
rib->instance)))
zsend_route_multipath (ZEBRA_IPV6_ROUTE_DELETE, client, p,
rib);
#endif /* HAVE_IPV6 */
}
}
else if (redist_check_instance(&client->redist[rib->type], rib->instance))
else
{
if (p->family == AF_INET)
zsend_route_multipath (ZEBRA_IPV4_ROUTE_DELETE, client, p, rib);
if ((p->family == AF_INET) &&
redist_check_instance(&client->redist[AFI_IP][rib->type],
rib->instance))
zsend_route_multipath (ZEBRA_IPV4_ROUTE_DELETE, client, p,
rib);
#ifdef HAVE_IPV6
if (p->family == AF_INET6)
zsend_route_multipath (ZEBRA_IPV6_ROUTE_DELETE, client, p, rib);
if ((p->family == AF_INET6) &&
redist_check_instance(&client->redist[AFI_IP6][rib->type],
rib->instance))
zsend_route_multipath (ZEBRA_IPV6_ROUTE_DELETE, client, p,
rib);
#endif /* HAVE_IPV6 */
}
}
@ -285,18 +299,20 @@ redistribute_delete (struct prefix *p, struct rib *rib)
void
zebra_redistribute_add (int command, struct zserv *client, int length)
{
afi_t afi;
int type;
u_short instance;
afi = stream_getc (client->ibuf);
type = stream_getc (client->ibuf);
instance = stream_getw (client->ibuf);
if (type == 0 || type >= ZEBRA_ROUTE_MAX)
return;
if (!redist_check_instance(&client->redist[type], instance))
if (!redist_check_instance(&client->redist[afi][type], instance))
{
redist_add_instance(&client->redist[type], instance);
redist_add_instance(&client->redist[afi][type], instance);
zebra_redistribute (client, type, instance);
}
}
@ -304,18 +320,20 @@ zebra_redistribute_add (int command, struct zserv *client, int length)
void
zebra_redistribute_delete (int command, struct zserv *client, int length)
{
afi_t afi;
int type;
u_short instance;
afi = stream_getc (client->ibuf);
type = stream_getc (client->ibuf);
instance = stream_getw (client->ibuf);
if (type == 0 || type >= ZEBRA_ROUTE_MAX)
return;
if (redist_check_instance(&client->redist[type], instance))
if (redist_check_instance(&client->redist[afi][type], instance))
{
redist_del_instance(&client->redist[type], instance);
redist_del_instance(&client->redist[afi][type], instance);
//Pending: why no reaction here?
}
}

View File

@ -60,7 +60,7 @@ struct zserv
int rtm_table;
/* This client's redistribute flag. */
struct redist_proto redist[ZEBRA_ROUTE_MAX];
struct redist_proto redist[AFI_MAX][ZEBRA_ROUTE_MAX];
/* Redistribute default route flag. */
u_char redist_default;