int eigrp_is_type_redistributed(int type)
{
return ((DEFAULT_ROUTE_TYPE(type))
- ? vrf_bitmap_check(zclient->default_information,
+ ? vrf_bitmap_check(zclient->default_information[AFI_IP],
VRF_DEFAULT)
: vrf_bitmap_check(zclient->redist[AFI_IP][type],
VRF_DEFAULT));
{
if (type == DEFAULT_ROUTE)
zclient_redistribute_default(ZEBRA_REDISTRIBUTE_DEFAULT_ADD,
- zclient, VRF_DEFAULT);
+ zclient, afi, VRF_DEFAULT);
else
zclient_redistribute(ZEBRA_REDISTRIBUTE_ADD, zclient, afi, type,
0, VRF_DEFAULT);
{
if (type == DEFAULT_ROUTE)
zclient_redistribute_default(ZEBRA_REDISTRIBUTE_DEFAULT_DELETE,
- zclient, VRF_DEFAULT);
+ zclient, afi, VRF_DEFAULT);
else
zclient_redistribute(ZEBRA_REDISTRIBUTE_DELETE, zclient, afi,
type, 0, VRF_DEFAULT);
redist_del_instance(
&zclient->mi_redist[afi][zclient->redist_default],
zclient->instance);
- }
- vrf_bitmap_free(zclient->default_information);
- zclient->default_information = VRF_BITMAP_NULL;
+ vrf_bitmap_free(zclient->default_information[afi]);
+ zclient->default_information[afi] = VRF_BITMAP_NULL;
+ }
}
void zclient_reset(struct zclient *zclient)
}
/* Resend all redistribute request. */
- for (afi = AFI_IP; afi < AFI_MAX; afi++)
+ for (afi = AFI_IP; afi < AFI_MAX; afi++) {
for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
if (i != zclient->redist_default
&& vrf_bitmap_check(zclient->redist[afi][i],
zclient, afi, i, 0,
vrf_id);
- /* If default information is needed. */
- if (vrf_bitmap_check(zclient->default_information, VRF_DEFAULT))
- zebra_message_send(zclient, ZEBRA_REDISTRIBUTE_DEFAULT_ADD,
- vrf_id);
+ /* If default information is needed. */
+ if (vrf_bitmap_check(zclient->default_information[afi],
+ VRF_DEFAULT))
+ zebra_redistribute_default_send(
+ ZEBRA_REDISTRIBUTE_DEFAULT_ADD, zclient, afi,
+ vrf_id);
+ }
}
/* Send unregister requests to zebra daemon for the information in a VRF. */
}
/* Flush all redistribute request. */
- for (afi = AFI_IP; afi < AFI_MAX; afi++)
+ for (afi = AFI_IP; afi < AFI_MAX; afi++) {
for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
if (i != zclient->redist_default
&& vrf_bitmap_check(zclient->redist[afi][i],
ZEBRA_REDISTRIBUTE_DELETE, zclient, afi,
i, 0, vrf_id);
- /* If default information is needed. */
- if (vrf_bitmap_check(zclient->default_information, VRF_DEFAULT))
- zebra_message_send(zclient, ZEBRA_REDISTRIBUTE_DEFAULT_DELETE,
- vrf_id);
+ /* If default information is needed. */
+ if (vrf_bitmap_check(zclient->default_information[afi],
+ VRF_DEFAULT))
+ zebra_redistribute_default_send(
+ ZEBRA_REDISTRIBUTE_DEFAULT_DELETE, zclient, afi,
+ vrf_id);
+ }
}
/* Send request to zebra daemon to start or stop RA. */
zclient->redist_default = redist_default;
zclient->instance = instance;
/* Pending: make afi(s) an arg. */
- for (afi = AFI_IP; afi < AFI_MAX; afi++)
+ for (afi = AFI_IP; afi < AFI_MAX; afi++) {
redist_add_instance(&zclient->mi_redist[afi][redist_default],
instance);
- /* Set default-information redistribute to zero. */
- zclient->default_information = vrf_bitmap_init();
+ /* Set default-information redistribute to zero. */
+ zclient->default_information[afi] = vrf_bitmap_init();
+ }
if (zclient_debug)
zlog_debug("zclient_start is called");
return zclient_send_message(zclient);
}
+int zebra_redistribute_default_send(int command, struct zclient *zclient,
+ afi_t afi, vrf_id_t vrf_id)
+{
+ struct stream *s;
+
+ s = zclient->obuf;
+ stream_reset(s);
+
+ zclient_create_header(s, command, vrf_id);
+ stream_putc(s, afi);
+
+ stream_putw_at(s, 0, stream_get_endp(s));
+
+ return zclient_send_message(zclient);
+}
+
/* Get prefix in ZServ format; family should be filled in on prefix */
static void zclient_stream_get_prefix(struct stream *s, struct prefix *p)
{
void zclient_redistribute_default(int command, struct zclient *zclient,
- vrf_id_t vrf_id)
+ afi_t afi, vrf_id_t vrf_id)
{
if (command == ZEBRA_REDISTRIBUTE_DEFAULT_ADD) {
- if (vrf_bitmap_check(zclient->default_information, vrf_id))
+ if (vrf_bitmap_check(zclient->default_information[afi], vrf_id))
return;
- vrf_bitmap_set(zclient->default_information, vrf_id);
+ vrf_bitmap_set(zclient->default_information[afi], vrf_id);
} else {
- if (!vrf_bitmap_check(zclient->default_information, vrf_id))
+ if (!vrf_bitmap_check(zclient->default_information[afi],
+ vrf_id))
return;
- vrf_bitmap_unset(zclient->default_information, vrf_id);
+ vrf_bitmap_unset(zclient->default_information[afi], vrf_id);
}
if (zclient->sock > 0)
- zebra_message_send(zclient, command, vrf_id);
+ zebra_redistribute_default_send(command, zclient, afi, vrf_id);
}
static void zclient_event(enum event event, struct zclient *zclient)
vrf_bitmap_t redist[AFI_MAX][ZEBRA_ROUTE_MAX];
/* Redistribute defauilt. */
- vrf_bitmap_t default_information;
+ vrf_bitmap_t default_information[AFI_MAX];
/* Pointer to the callback functions. */
void (*zebra_connected)(struct zclient *);
int type, unsigned short instance,
vrf_id_t vrf_id);
+extern int zebra_redistribute_default_send(int command, struct zclient *zclient,
+ afi_t afi, vrf_id_t vrf_id);
+
/* If state has changed, update state and call zebra_redistribute_send. */
extern void zclient_redistribute(int command, struct zclient *, afi_t, int type,
unsigned short instance, vrf_id_t vrf_id);
/* If state has changed, update state and send the command to zebra. */
extern void zclient_redistribute_default(int command, struct zclient *,
- vrf_id_t vrf_id);
+ afi_t, vrf_id_t vrf_id);
/* Send the message in zclient->obuf to the zebra daemon (or enqueue it).
Returns 0 for success or -1 on an I/O error. */
vty_out(vty, "Zebra Infomation\n");
vty_out(vty, " fail: %d\n", zclient->fail);
vty_out(vty, " redistribute default: %d\n",
- vrf_bitmap_check(zclient->default_information, VRF_DEFAULT));
+ vrf_bitmap_check(zclient->default_information[AFI_IP6],
+ VRF_DEFAULT));
vty_out(vty, " redistribute:");
for (i = 0; i < ZEBRA_ROUTE_MAX; i++) {
if (vrf_bitmap_check(zclient->redist[AFI_IP6][i], VRF_DEFAULT))
redist_on =
is_prefix_default(&p)
- ? vrf_bitmap_check(zclient->default_information,
- ospf->vrf_id)
+ ? vrf_bitmap_check(
+ zclient->default_information[AFI_IP],
+ ospf->vrf_id)
: (zclient->mi_redist[AFI_IP][type].enabled
|| vrf_bitmap_check(
zclient->redist[AFI_IP][type],
unsigned short instance)
{
return (DEFAULT_ROUTE_TYPE(type)
- ? vrf_bitmap_check(zclient->default_information,
+ ? vrf_bitmap_check(zclient->default_information[AFI_IP],
ospf->vrf_id)
: ((instance
&& redist_check_instance(
* existance.
*/
zclient_redistribute_default(
- ZEBRA_REDISTRIBUTE_DEFAULT_ADD,
- zclient, ospf->vrf_id);
+ ZEBRA_REDISTRIBUTE_DEFAULT_ADD, zclient, AFI_IP,
+ ospf->vrf_id);
}
ospf_asbr_status_update(ospf, ++ospf->redistribute);
zclient_redistribute_default(
ZEBRA_REDISTRIBUTE_DEFAULT_DELETE,
- zclient, ospf->vrf_id);
+ zclient, AFI_IP, ospf->vrf_id);
/* here , ex-info should be added since ex-info might
* have not updated earlier if def route is not exist.
* If ex-iinfo ex-info already exist , it will return
zclient_redistribute_default(
ZEBRA_REDISTRIBUTE_DEFAULT_ADD,
- zclient, ospf->vrf_id);
+ zclient, AFI_IP, ospf->vrf_id);
}
}
if (!ospf_is_type_redistributed(ospf, DEFAULT_ROUTE, 0))
return CMD_SUCCESS;
zclient_redistribute_default(ZEBRA_REDISTRIBUTE_DEFAULT_DELETE,
- zclient, ospf->vrf_id);
+ zclient, AFI_IP, ospf->vrf_id);
}
ospf->default_originate = DEFAULT_ORIGINATE_NONE;
send_redistribute = 0;
if (is_default_prefix(p)
- && vrf_bitmap_check(client->redist_default, re->vrf_id))
+ && vrf_bitmap_check(client->redist_default[afi],
+ re->vrf_id))
send_redistribute = 1;
else if (vrf_bitmap_check(client->redist[afi][ZEBRA_ROUTE_ALL],
re->vrf_id))
for (ALL_LIST_ELEMENTS(zebrad.client_list, node, nnode, client)) {
if ((is_default_prefix(p)
- && vrf_bitmap_check(client->redist_default, re->vrf_id))
+ && vrf_bitmap_check(client->redist_default[afi],
+ re->vrf_id))
|| vrf_bitmap_check(client->redist[afi][ZEBRA_ROUTE_ALL],
re->vrf_id)
|| (re->instance
void zebra_redistribute_default_add(ZAPI_HANDLER_ARGS)
{
- vrf_bitmap_set(client->redist_default, zvrf_id(zvrf));
+ afi_t afi = 0;
+
+ STREAM_GETC(msg, afi);
+
+ if (afi == 0 || afi >= AFI_MAX) {
+ flog_warn(EC_ZEBRA_REDISTRIBUTE_UNKNOWN_AF,
+ "%s: Specified afi %u does not exist",
+ __PRETTY_FUNCTION__, afi);
+ return;
+ }
+
+ vrf_bitmap_set(client->redist_default[afi], zvrf_id(zvrf));
zebra_redistribute_default(client, zvrf_id(zvrf));
+
+stream_failure:
+ return;
}
void zebra_redistribute_default_delete(ZAPI_HANDLER_ARGS)
{
- vrf_bitmap_unset(client->redist_default, zvrf_id(zvrf));
+ afi_t afi = 0;
+
+ STREAM_GETC(msg, afi);
+
+ if (afi == 0 || afi >= AFI_MAX) {
+ flog_warn(EC_ZEBRA_REDISTRIBUTE_UNKNOWN_AF,
+ "%s: Specified afi %u does not exist",
+ __PRETTY_FUNCTION__, afi);
+ return;
+ }
+
+ vrf_bitmap_unset(client->redist_default[afi], zvrf_id(zvrf));
+
+stream_failure:
+ return;
}
/* Interface up information. */
int i;
afi_t afi;
- for (afi = AFI_IP; afi < AFI_MAX; afi++)
+ for (afi = AFI_IP; afi < AFI_MAX; afi++) {
for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
vrf_bitmap_unset(client->redist[afi][i], zvrf_id(zvrf));
- vrf_bitmap_unset(client->redist_default, zvrf_id(zvrf));
+ vrf_bitmap_unset(client->redist_default[afi], zvrf_id(zvrf));
+ }
vrf_bitmap_unset(client->ifinfo, zvrf_id(zvrf));
vrf_bitmap_unset(client->ridinfo, zvrf_id(zvrf));
}
pthread_mutex_destroy(&client->ibuf_mtx);
/* Free bitmaps. */
- for (afi_t afi = AFI_IP; afi < AFI_MAX; afi++)
+ for (afi_t afi = AFI_IP; afi < AFI_MAX; afi++) {
for (int i = 0; i < ZEBRA_ROUTE_MAX; i++)
vrf_bitmap_free(client->redist[afi][i]);
- vrf_bitmap_free(client->redist_default);
+ vrf_bitmap_free(client->redist_default[afi]);
+ }
vrf_bitmap_free(client->ifinfo);
vrf_bitmap_free(client->ridinfo);
memory_order_relaxed);
/* Initialize flags */
- for (afi = AFI_IP; afi < AFI_MAX; afi++)
+ for (afi = AFI_IP; afi < AFI_MAX; afi++) {
for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
client->redist[afi][i] = vrf_bitmap_init();
- client->redist_default = vrf_bitmap_init();
+ client->redist_default[afi] = vrf_bitmap_init();
+ }
client->ifinfo = vrf_bitmap_init();
client->ridinfo = vrf_bitmap_init();
vrf_bitmap_t redist[AFI_MAX][ZEBRA_ROUTE_MAX];
/* Redistribute default route flag. */
- vrf_bitmap_t redist_default;
+ vrf_bitmap_t redist_default[AFI_MAX];
/* Interface information. */
vrf_bitmap_t ifinfo;