2 * IS-IS Rout(e)ing protocol - isis_zebra.c
4 * Copyright (C) 2001,2002 Sampo Saaristo
5 * Tampere University of Technology
6 * Institute of Communications Engineering
7 * Copyright (C) 2013-2015 Christian Franke <chris@opensourcerouting.org>
9 * This program is free software; you can redistribute it and/or modify it
10 * under the terms of the GNU General Public Licenseas published by the Free
11 * Software Foundation; either version 2 of the License, or (at your option)
14 * This program is distributed in the hope that it will be useful,but WITHOUT
15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
19 * You should have received a copy of the GNU General Public License along
20 * with this program; if not, write to the Free Software Foundation, Inc.,
21 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
39 #include "isisd/dict.h"
40 #include "isisd/isis_constants.h"
41 #include "isisd/isis_common.h"
42 #include "isisd/isis_flags.h"
43 #include "isisd/isis_misc.h"
44 #include "isisd/isis_circuit.h"
45 #include "isisd/isis_tlv.h"
46 #include "isisd/isisd.h"
47 #include "isisd/isis_circuit.h"
48 #include "isisd/isis_csm.h"
49 #include "isisd/isis_lsp.h"
50 #include "isisd/isis_route.h"
51 #include "isisd/isis_zebra.h"
52 #include "isisd/isis_te.h"
54 struct zclient
*zclient
= NULL
;
56 /* Router-id update message from zebra. */
58 isis_router_id_update_zebra (int command
, struct zclient
*zclient
,
59 zebra_size_t length
, vrf_id_t vrf_id
)
61 struct isis_area
*area
;
62 struct listnode
*node
;
63 struct prefix router_id
;
66 * If ISIS TE is enable, TE Router ID is set through specific command.
67 * See mpls_te_router_addr() command in isis_te.c
69 if (IS_MPLS_TE(isisMplsTE
))
72 zebra_router_id_update_read (zclient
->ibuf
, &router_id
);
73 if (isis
->router_id
== router_id
.u
.prefix4
.s_addr
)
76 isis
->router_id
= router_id
.u
.prefix4
.s_addr
;
77 for (ALL_LIST_ELEMENTS_RO (isis
->area_list
, node
, area
))
78 if (listcount (area
->area_addrs
) > 0)
79 lsp_regenerate_schedule (area
, area
->is_type
, 0);
85 isis_zebra_if_add (int command
, struct zclient
*zclient
, zebra_size_t length
,
88 struct interface
*ifp
;
90 ifp
= zebra_interface_add_read (zclient
->ibuf
, vrf_id
);
92 if (isis
->debugs
& DEBUG_ZEBRA
)
93 zlog_debug ("Zebra I/F add: %s index %d flags %ld metric %d mtu %d",
94 ifp
->name
, ifp
->ifindex
, (long)ifp
->flags
, ifp
->metric
, ifp
->mtu
);
96 if (if_is_operative (ifp
))
97 isis_csm_state_change (IF_UP_FROM_Z
, circuit_scan_by_ifp (ifp
), ifp
);
103 isis_zebra_if_del (int command
, struct zclient
*zclient
, zebra_size_t length
,
106 struct interface
*ifp
;
110 ifp
= zebra_interface_state_read (s
, vrf_id
);
115 if (if_is_operative (ifp
))
116 zlog_warn ("Zebra: got delete of %s, but interface is still up",
119 if (isis
->debugs
& DEBUG_ZEBRA
)
120 zlog_debug ("Zebra I/F delete: %s index %d flags %ld metric %d mtu %d",
121 ifp
->name
, ifp
->ifindex
, (long)ifp
->flags
, ifp
->metric
, ifp
->mtu
);
123 isis_csm_state_change (IF_DOWN_FROM_Z
, circuit_scan_by_ifp (ifp
), ifp
);
125 /* Cannot call if_delete because we should retain the pseudo interface
126 in case there is configuration info attached to it. */
127 if_delete_retain(ifp
);
129 ifp
->ifindex
= IFINDEX_DELETED
;
135 isis_zebra_if_state_up (int command
, struct zclient
*zclient
,
136 zebra_size_t length
, vrf_id_t vrf_id
)
138 struct interface
*ifp
;
140 ifp
= zebra_interface_state_read (zclient
->ibuf
, vrf_id
);
145 isis_csm_state_change (IF_UP_FROM_Z
, circuit_scan_by_ifp (ifp
), ifp
);
151 isis_zebra_if_state_down (int command
, struct zclient
*zclient
,
152 zebra_size_t length
, vrf_id_t vrf_id
)
154 struct interface
*ifp
;
155 struct isis_circuit
*circuit
;
157 ifp
= zebra_interface_state_read (zclient
->ibuf
, vrf_id
);
162 circuit
= isis_csm_state_change (IF_DOWN_FROM_Z
, circuit_scan_by_ifp (ifp
),
165 SET_FLAG(circuit
->flags
, ISIS_CIRCUIT_FLAPPED_AFTER_SPF
);
171 isis_zebra_if_address_add (int command
, struct zclient
*zclient
,
172 zebra_size_t length
, vrf_id_t vrf_id
)
176 char buf
[PREFIX2STR_BUFFER
];
178 c
= zebra_interface_address_read (ZEBRA_INTERFACE_ADDRESS_ADD
,
179 zclient
->ibuf
, vrf_id
);
186 prefix2str (p
, buf
, sizeof (buf
));
188 if (p
->family
== AF_INET
)
189 zlog_debug ("connected IP address %s", buf
);
191 if (p
->family
== AF_INET6
)
192 zlog_debug ("connected IPv6 address %s", buf
);
193 #endif /* HAVE_IPV6 */
194 #endif /* EXTREME_DEBUG */
195 if (if_is_operative (c
->ifp
))
196 isis_circuit_add_addr (circuit_scan_by_ifp (c
->ifp
), c
);
202 isis_zebra_if_address_del (int command
, struct zclient
*client
,
203 zebra_size_t length
, vrf_id_t vrf_id
)
206 struct interface
*ifp
;
209 char buf
[PREFIX2STR_BUFFER
];
210 #endif /* EXTREME_DEBUG */
212 c
= zebra_interface_address_read (ZEBRA_INTERFACE_ADDRESS_DELETE
,
213 zclient
->ibuf
, vrf_id
);
222 prefix2str (p
, buf
, sizeof (buf
));
224 if (p
->family
== AF_INET
)
225 zlog_debug ("disconnected IP address %s", buf
);
227 if (p
->family
== AF_INET6
)
228 zlog_debug ("disconnected IPv6 address %s", buf
);
229 #endif /* HAVE_IPV6 */
230 #endif /* EXTREME_DEBUG */
232 if (if_is_operative (ifp
))
233 isis_circuit_del_addr (circuit_scan_by_ifp (ifp
), c
);
240 isis_zebra_link_params (int command
, struct zclient
*zclient
,
243 struct interface
*ifp
;
245 ifp
= zebra_interface_link_params_read (zclient
->ibuf
);
251 isis_mpls_te_update(ifp
);
257 isis_zebra_route_add_ipv4 (struct prefix
*prefix
,
258 struct isis_route_info
*route_info
)
263 struct stream
*stream
;
264 struct isis_nexthop
*nexthop
;
265 struct listnode
*node
;
267 if (CHECK_FLAG (route_info
->flag
, ISIS_ROUTE_FLAG_ZEBRA_SYNCED
))
270 if (vrf_bitmap_check (zclient
->redist
[AFI_IP
][ZEBRA_ROUTE_ISIS
], VRF_DEFAULT
))
275 SET_FLAG (message
, ZAPI_MESSAGE_NEXTHOP
);
276 SET_FLAG (message
, ZAPI_MESSAGE_METRIC
);
278 SET_FLAG (message
, ZAPI_MESSAGE_DISTANCE
);
281 stream
= zclient
->obuf
;
282 stream_reset (stream
);
283 zclient_create_header (stream
, ZEBRA_IPV4_ROUTE_ADD
, VRF_DEFAULT
);
285 stream_putc (stream
, ZEBRA_ROUTE_ISIS
);
287 stream_putw (stream
, 0);
289 stream_putl (stream
, flags
);
291 stream_putc (stream
, message
);
293 stream_putw (stream
, SAFI_UNICAST
);
294 /* prefix information */
295 psize
= PSIZE (prefix
->prefixlen
);
296 stream_putc (stream
, prefix
->prefixlen
);
297 stream_write (stream
, (u_char
*) & prefix
->u
.prefix4
, psize
);
299 stream_putc (stream
, listcount (route_info
->nexthops
));
301 /* Nexthop, ifindex, distance and metric information */
302 for (ALL_LIST_ELEMENTS_RO (route_info
->nexthops
, node
, nexthop
))
304 /* FIXME: can it be ? */
305 if (nexthop
->ip
.s_addr
!= INADDR_ANY
)
307 stream_putc (stream
, NEXTHOP_TYPE_IPV4
);
308 stream_put_in_addr (stream
, &nexthop
->ip
);
312 stream_putc (stream
, NEXTHOP_TYPE_IFINDEX
);
313 stream_putl (stream
, nexthop
->ifindex
);
317 if (CHECK_FLAG (message
, ZAPI_MESSAGE_DISTANCE
))
318 stream_putc (stream
, route_info
->depth
);
320 if (CHECK_FLAG (message
, ZAPI_MESSAGE_METRIC
))
321 stream_putl (stream
, route_info
->cost
);
323 stream_putw_at (stream
, 0, stream_get_endp (stream
));
324 zclient_send_message(zclient
);
325 SET_FLAG (route_info
->flag
, ISIS_ROUTE_FLAG_ZEBRA_SYNCED
);
326 UNSET_FLAG (route_info
->flag
, ISIS_ROUTE_FLAG_ZEBRA_RESYNC
);
331 isis_zebra_route_del_ipv4 (struct prefix
*prefix
,
332 struct isis_route_info
*route_info
)
334 struct zapi_ipv4 api
;
335 struct prefix_ipv4 prefix4
;
337 if (vrf_bitmap_check (zclient
->redist
[AFI_IP
][ZEBRA_ROUTE_ISIS
], VRF_DEFAULT
))
339 api
.vrf_id
= VRF_DEFAULT
;
340 api
.type
= ZEBRA_ROUTE_ISIS
;
344 api
.safi
= SAFI_UNICAST
;
345 prefix4
.family
= AF_INET
;
346 prefix4
.prefixlen
= prefix
->prefixlen
;
347 prefix4
.prefix
= prefix
->u
.prefix4
;
348 zapi_ipv4_route (ZEBRA_IPV4_ROUTE_DELETE
, zclient
, &prefix4
, &api
);
350 UNSET_FLAG (route_info
->flag
, ISIS_ROUTE_FLAG_ZEBRA_SYNCED
);
357 isis_zebra_route_add_ipv6 (struct prefix
*prefix
,
358 struct isis_route_info
*route_info
)
360 struct zapi_ipv6 api
;
361 struct in6_addr
**nexthop_list
;
362 ifindex_t
*ifindex_list
;
363 struct isis_nexthop6
*nexthop6
;
365 struct listnode
*node
;
366 struct prefix_ipv6 prefix6
;
368 if (CHECK_FLAG (route_info
->flag
, ISIS_ROUTE_FLAG_ZEBRA_SYNCED
))
371 api
.vrf_id
= VRF_DEFAULT
;
372 api
.type
= ZEBRA_ROUTE_ISIS
;
376 api
.safi
= SAFI_UNICAST
;
377 SET_FLAG (api
.message
, ZAPI_MESSAGE_NEXTHOP
);
378 SET_FLAG (api
.message
, ZAPI_MESSAGE_IFINDEX
);
379 SET_FLAG (api
.message
, ZAPI_MESSAGE_METRIC
);
380 api
.metric
= route_info
->cost
;
382 SET_FLAG (api
.message
, ZAPI_MESSAGE_DISTANCE
);
383 api
.distance
= route_info
->depth
;
385 api
.nexthop_num
= listcount (route_info
->nexthops6
);
386 api
.ifindex_num
= listcount (route_info
->nexthops6
);
388 /* allocate memory for nexthop_list */
389 size
= sizeof (struct isis_nexthop6
*) * listcount (route_info
->nexthops6
);
390 nexthop_list
= (struct in6_addr
**) XMALLOC (MTYPE_ISIS_TMP
, size
);
393 zlog_err ("isis_zebra_add_route_ipv6: out of memory!");
397 /* allocate memory for ifindex_list */
398 size
= sizeof (unsigned int) * listcount (route_info
->nexthops6
);
399 ifindex_list
= (ifindex_t
*) XMALLOC (MTYPE_ISIS_TMP
, size
);
402 zlog_err ("isis_zebra_add_route_ipv6: out of memory!");
403 XFREE (MTYPE_ISIS_TMP
, nexthop_list
);
407 /* for each nexthop */
409 for (ALL_LIST_ELEMENTS_RO (route_info
->nexthops6
, node
, nexthop6
))
411 if (!IN6_IS_ADDR_LINKLOCAL (&nexthop6
->ip6
) &&
412 !IN6_IS_ADDR_UNSPECIFIED (&nexthop6
->ip6
))
419 nexthop_list
[i
] = &nexthop6
->ip6
;
420 ifindex_list
[i
] = nexthop6
->ifindex
;
424 api
.nexthop
= nexthop_list
;
425 api
.ifindex
= ifindex_list
;
427 if (api
.nexthop_num
&& api
.ifindex_num
)
429 prefix6
.family
= AF_INET6
;
430 prefix6
.prefixlen
= prefix
->prefixlen
;
431 memcpy (&prefix6
.prefix
, &prefix
->u
.prefix6
, sizeof (struct in6_addr
));
432 zapi_ipv6_route (ZEBRA_IPV6_ROUTE_ADD
, zclient
, &prefix6
, &api
);
433 SET_FLAG (route_info
->flag
, ISIS_ROUTE_FLAG_ZEBRA_SYNCED
);
434 UNSET_FLAG (route_info
->flag
, ISIS_ROUTE_FLAG_ZEBRA_RESYNC
);
437 XFREE (MTYPE_ISIS_TMP
, nexthop_list
);
438 XFREE (MTYPE_ISIS_TMP
, ifindex_list
);
444 isis_zebra_route_del_ipv6 (struct prefix
*prefix
,
445 struct isis_route_info
*route_info
)
447 struct zapi_ipv6 api
;
448 struct in6_addr
**nexthop_list
;
449 ifindex_t
*ifindex_list
;
450 struct isis_nexthop6
*nexthop6
;
452 struct listnode
*node
;
453 struct prefix_ipv6 prefix6
;
455 if (!CHECK_FLAG (route_info
->flag
, ISIS_ROUTE_FLAG_ZEBRA_SYNCED
))
458 api
.vrf_id
= VRF_DEFAULT
;
459 api
.type
= ZEBRA_ROUTE_ISIS
;
463 api
.safi
= SAFI_UNICAST
;
464 SET_FLAG (api
.message
, ZAPI_MESSAGE_NEXTHOP
);
465 SET_FLAG (api
.message
, ZAPI_MESSAGE_IFINDEX
);
466 api
.nexthop_num
= listcount (route_info
->nexthops6
);
467 api
.ifindex_num
= listcount (route_info
->nexthops6
);
469 /* allocate memory for nexthop_list */
470 size
= sizeof (struct isis_nexthop6
*) * listcount (route_info
->nexthops6
);
471 nexthop_list
= (struct in6_addr
**) XMALLOC (MTYPE_ISIS_TMP
, size
);
474 zlog_err ("isis_zebra_route_del_ipv6: out of memory!");
478 /* allocate memory for ifindex_list */
479 size
= sizeof (unsigned int) * listcount (route_info
->nexthops6
);
480 ifindex_list
= (ifindex_t
*) XMALLOC (MTYPE_ISIS_TMP
, size
);
483 zlog_err ("isis_zebra_route_del_ipv6: out of memory!");
484 XFREE (MTYPE_ISIS_TMP
, nexthop_list
);
488 /* for each nexthop */
490 for (ALL_LIST_ELEMENTS_RO (route_info
->nexthops6
, node
, nexthop6
))
492 if (!IN6_IS_ADDR_LINKLOCAL (&nexthop6
->ip6
) &&
493 !IN6_IS_ADDR_UNSPECIFIED (&nexthop6
->ip6
))
500 nexthop_list
[i
] = &nexthop6
->ip6
;
501 ifindex_list
[i
] = nexthop6
->ifindex
;
505 api
.nexthop
= nexthop_list
;
506 api
.ifindex
= ifindex_list
;
508 if (api
.nexthop_num
&& api
.ifindex_num
)
510 prefix6
.family
= AF_INET6
;
511 prefix6
.prefixlen
= prefix
->prefixlen
;
512 memcpy (&prefix6
.prefix
, &prefix
->u
.prefix6
, sizeof (struct in6_addr
));
513 zapi_ipv6_route (ZEBRA_IPV6_ROUTE_DELETE
, zclient
, &prefix6
, &api
);
514 UNSET_FLAG (route_info
->flag
, ISIS_ROUTE_FLAG_ZEBRA_SYNCED
);
517 XFREE (MTYPE_ISIS_TMP
, nexthop_list
);
518 XFREE (MTYPE_ISIS_TMP
, ifindex_list
);
521 #endif /* HAVE_IPV6 */
524 isis_zebra_route_update (struct prefix
*prefix
,
525 struct isis_route_info
*route_info
)
527 if (zclient
->sock
< 0)
530 if ((prefix
->family
== AF_INET
&& !vrf_bitmap_check (zclient
->redist
[AFI_IP
][ZEBRA_ROUTE_ISIS
], VRF_DEFAULT
)) ||
531 (prefix
->family
== AF_INET6
&& !vrf_bitmap_check (zclient
->redist
[AFI_IP6
][ZEBRA_ROUTE_ISIS
], VRF_DEFAULT
)))
534 if (CHECK_FLAG (route_info
->flag
, ISIS_ROUTE_FLAG_ACTIVE
))
536 if (prefix
->family
== AF_INET
)
537 isis_zebra_route_add_ipv4 (prefix
, route_info
);
539 else if (prefix
->family
== AF_INET6
)
540 isis_zebra_route_add_ipv6 (prefix
, route_info
);
541 #endif /* HAVE_IPV6 */
545 if (prefix
->family
== AF_INET
)
546 isis_zebra_route_del_ipv4 (prefix
, route_info
);
548 else if (prefix
->family
== AF_INET6
)
549 isis_zebra_route_del_ipv6 (prefix
, route_info
);
550 #endif /* HAVE_IPV6 */
556 isis_zebra_read_ipv4 (int command
, struct zclient
*zclient
,
557 zebra_size_t length
, vrf_id_t vrf_id
)
559 struct stream
*stream
;
560 struct zapi_ipv4 api
;
561 struct prefix_ipv4 p
;
562 struct prefix
*p_generic
= (struct prefix
*)&p
;
564 stream
= zclient
->ibuf
;
565 memset(&api
, 0, sizeof(api
));
566 memset (&p
, 0, sizeof (struct prefix_ipv4
));
568 api
.type
= stream_getc (stream
);
569 api
.instance
= stream_getw (stream
);
570 api
.flags
= stream_getl (stream
);
571 api
.message
= stream_getc (stream
);
574 p
.prefixlen
= MIN(IPV4_MAX_PREFIXLEN
, stream_getc (stream
));
575 stream_get (&p
.prefix
, stream
, PSIZE (p
.prefixlen
));
577 if (CHECK_FLAG (api
.message
, ZAPI_MESSAGE_NEXTHOP
))
579 api
.nexthop_num
= stream_getc (stream
);
580 (void)stream_get_ipv4 (stream
);
582 if (CHECK_FLAG (api
.message
, ZAPI_MESSAGE_IFINDEX
))
584 api
.ifindex_num
= stream_getc (stream
);
585 stream_getl (stream
);
587 if (CHECK_FLAG (api
.message
, ZAPI_MESSAGE_DISTANCE
))
588 api
.distance
= stream_getc (stream
);
589 if (CHECK_FLAG (api
.message
, ZAPI_MESSAGE_METRIC
))
590 api
.metric
= stream_getl (stream
);
593 * Avoid advertising a false default reachability. (A default
594 * route installed by IS-IS gets redistributed from zebra back
595 * into IS-IS causing us to start advertising default reachabity
596 * without this check)
598 if (p
.prefixlen
== 0 && api
.type
== ZEBRA_ROUTE_ISIS
)
599 command
= ZEBRA_IPV4_ROUTE_DELETE
;
601 if (command
== ZEBRA_REDISTRIBUTE_IPV4_ADD
)
602 isis_redist_add(api
.type
, p_generic
, api
.distance
, api
.metric
);
604 isis_redist_delete(api
.type
, p_generic
);
610 isis_zebra_read_ipv6 (int command
, struct zclient
*zclient
,
611 zebra_size_t length
, vrf_id_t vrf_id
)
613 struct stream
*stream
;
614 struct zapi_ipv6 api
;
615 struct prefix_ipv6 p
;
616 struct prefix
*p_generic
= (struct prefix
*)&p
;
617 struct in6_addr nexthop
;
618 unsigned long ifindex
__attribute__((unused
));
620 stream
= zclient
->ibuf
;
621 memset(&api
, 0, sizeof(api
));
622 memset(&p
, 0, sizeof(struct prefix_ipv6
));
623 memset(&nexthop
, 0, sizeof(nexthop
));
626 api
.type
= stream_getc(stream
);
627 api
.flags
= stream_getl(stream
);
628 api
.message
= stream_getc(stream
);
631 p
.prefixlen
= stream_getc(stream
);
632 stream_get(&p
.prefix
, stream
, PSIZE(p
.prefixlen
));
634 if (CHECK_FLAG(api
.message
, ZAPI_MESSAGE_NEXTHOP
))
636 api
.nexthop_num
= stream_getc(stream
); /* this is always 1 */
637 stream_get(&nexthop
, stream
, sizeof(nexthop
));
639 if (CHECK_FLAG(api
.message
, ZAPI_MESSAGE_IFINDEX
))
641 api
.ifindex_num
= stream_getc(stream
);
642 ifindex
= stream_getl(stream
);
644 if (CHECK_FLAG(api
.message
, ZAPI_MESSAGE_DISTANCE
))
645 api
.distance
= stream_getc(stream
);
646 if (CHECK_FLAG(api
.message
, ZAPI_MESSAGE_METRIC
))
647 api
.metric
= stream_getl(stream
);
650 * Avoid advertising a false default reachability. (A default
651 * route installed by IS-IS gets redistributed from zebra back
652 * into IS-IS causing us to start advertising default reachabity
653 * without this check)
655 if (p
.prefixlen
== 0 && api
.type
== ZEBRA_ROUTE_ISIS
)
656 command
= ZEBRA_IPV6_ROUTE_DELETE
;
658 if (command
== ZEBRA_IPV6_ROUTE_ADD
)
659 isis_redist_add(api
.type
, p_generic
, api
.distance
, api
.metric
);
661 isis_redist_delete(api
.type
, p_generic
);
667 isis_distribute_list_update (int routetype
)
673 isis_zebra_redistribute_set(int type
)
675 if (type
== DEFAULT_ROUTE
)
676 zclient_redistribute_default(ZEBRA_REDISTRIBUTE_DEFAULT_ADD
, zclient
, VRF_DEFAULT
);
678 zclient_redistribute(ZEBRA_REDISTRIBUTE_ADD
, zclient
, AFI_IP
, type
, 0, VRF_DEFAULT
);
682 isis_zebra_redistribute_unset(int type
)
684 if (type
== DEFAULT_ROUTE
)
685 zclient_redistribute_default(ZEBRA_REDISTRIBUTE_DEFAULT_DELETE
, zclient
, VRF_DEFAULT
);
687 zclient_redistribute(ZEBRA_REDISTRIBUTE_DELETE
, zclient
, AFI_IP
, type
, 0, VRF_DEFAULT
);
691 isis_zebra_connected (struct zclient
*zclient
)
693 zclient_send_reg_requests (zclient
, VRF_DEFAULT
);
697 isis_zebra_init (struct thread_master
*master
)
699 zclient
= zclient_new (master
);
700 zclient_init (zclient
, ZEBRA_ROUTE_ISIS
, 0);
701 zclient
->zebra_connected
= isis_zebra_connected
;
702 zclient
->router_id_update
= isis_router_id_update_zebra
;
703 zclient
->interface_add
= isis_zebra_if_add
;
704 zclient
->interface_delete
= isis_zebra_if_del
;
705 zclient
->interface_up
= isis_zebra_if_state_up
;
706 zclient
->interface_down
= isis_zebra_if_state_down
;
707 zclient
->interface_address_add
= isis_zebra_if_address_add
;
708 zclient
->interface_address_delete
= isis_zebra_if_address_del
;
709 zclient
->interface_link_params
= isis_zebra_link_params
;
710 zclient
->redistribute_route_ipv4_add
= isis_zebra_read_ipv4
;
711 zclient
->redistribute_route_ipv4_del
= isis_zebra_read_ipv4
;
713 zclient
->redistribute_route_ipv6_add
= isis_zebra_read_ipv6
;
714 zclient
->redistribute_route_ipv6_del
= isis_zebra_read_ipv6
;
715 #endif /* HAVE_IPV6 */