2 * Zebra connect library for OSPFd
3 * Copyright (C) 1997, 98, 99, 2000 Kunihiro Ishiguro, Toshiaki Takada
5 * This file is part of GNU Zebra.
7 * GNU Zebra is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2, or (at your option) any
12 * GNU Zebra is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
17 * You should have received a copy of the GNU General Public License along
18 * with this program; see the file COPYING; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
39 #include "ospfd/ospfd.h"
40 #include "ospfd/ospf_interface.h"
41 #include "ospfd/ospf_ism.h"
42 #include "ospfd/ospf_asbr.h"
43 #include "ospfd/ospf_asbr.h"
44 #include "ospfd/ospf_abr.h"
45 #include "ospfd/ospf_lsa.h"
46 #include "ospfd/ospf_dump.h"
47 #include "ospfd/ospf_route.h"
48 #include "ospfd/ospf_lsdb.h"
49 #include "ospfd/ospf_neighbor.h"
50 #include "ospfd/ospf_nsm.h"
51 #include "ospfd/ospf_zebra.h"
52 #include "ospfd/ospf_te.h"
53 #include "ospfd/ospf_sr.h"
54 #include "ospfd/ospf_ldp_sync.h"
56 DEFINE_MTYPE_STATIC(OSPFD
, OSPF_EXTERNAL
, "OSPF External route table");
57 DEFINE_MTYPE_STATIC(OSPFD
, OSPF_REDISTRIBUTE
, "OSPF Redistriute");
60 /* Zebra structure to hold current status. */
61 struct zclient
*zclient
= NULL
;
62 /* and for the Synchronous connection to the Label Manager */
63 static struct zclient
*zclient_sync
;
65 /* For registering threads. */
66 extern struct thread_master
*master
;
68 /* Router-id update message from zebra. */
69 static int ospf_router_id_update_zebra(ZAPI_CALLBACK_ARGS
)
71 struct ospf
*ospf
= NULL
;
72 struct prefix router_id
;
73 zebra_router_id_update_read(zclient
->ibuf
, &router_id
);
75 if (IS_DEBUG_OSPF(zebra
, ZEBRA_INTERFACE
))
76 zlog_debug("Zebra rcvd: router id update %pFX vrf %s id %u",
77 &router_id
, ospf_vrf_id_to_name(vrf_id
), vrf_id
);
79 ospf
= ospf_lookup_by_vrf_id(vrf_id
);
82 ospf
->router_id_zebra
= router_id
.u
.prefix4
;
83 ospf_router_id_update(ospf
);
85 if (IS_DEBUG_OSPF_EVENT
)
87 "%s: ospf instance not found for vrf %s id %u router_id %pFX",
88 __func__
, ospf_vrf_id_to_name(vrf_id
), vrf_id
,
94 static int ospf_interface_address_add(ZAPI_CALLBACK_ARGS
)
97 struct ospf
*ospf
= NULL
;
100 c
= zebra_interface_address_read(cmd
, zclient
->ibuf
, vrf_id
);
105 if (IS_DEBUG_OSPF(zebra
, ZEBRA_INTERFACE
))
106 zlog_debug("Zebra: interface %s address add %pFX vrf %s id %u",
107 c
->ifp
->name
, c
->address
,
108 ospf_vrf_id_to_name(vrf_id
), vrf_id
);
110 ospf
= ospf_lookup_by_vrf_id(vrf_id
);
114 ospf_if_update(ospf
, c
->ifp
);
116 ospf_if_interface(c
->ifp
);
121 static int ospf_interface_address_delete(ZAPI_CALLBACK_ARGS
)
124 struct interface
*ifp
;
125 struct ospf_interface
*oi
;
126 struct route_node
*rn
;
129 c
= zebra_interface_address_read(cmd
, zclient
->ibuf
, vrf_id
);
134 if (IS_DEBUG_OSPF(zebra
, ZEBRA_INTERFACE
))
135 zlog_debug("Zebra: interface %s address delete %pFX",
136 c
->ifp
->name
, c
->address
);
140 p
.prefixlen
= IPV4_MAX_BITLEN
;
142 rn
= route_node_lookup(IF_OIFS(ifp
), &p
);
150 route_unlock_node(rn
);
152 /* Call interface hook functions to clean up */
155 ospf_if_interface(c
->ifp
);
162 static int ospf_interface_link_params(ZAPI_CALLBACK_ARGS
)
164 struct interface
*ifp
;
165 bool changed
= false;
167 ifp
= zebra_interface_link_params_read(zclient
->ibuf
, vrf_id
, &changed
);
169 if (ifp
== NULL
|| !changed
)
173 ospf_mpls_te_update_if(ifp
);
178 /* VRF update for an interface. */
179 static int ospf_interface_vrf_update(ZAPI_CALLBACK_ARGS
)
181 struct interface
*ifp
= NULL
;
184 ifp
= zebra_interface_vrf_update_read(zclient
->ibuf
, vrf_id
,
189 if (IS_DEBUG_OSPF_EVENT
)
191 "%s: Rx Interface %s VRF change vrf_id %u New vrf %s id %u",
192 __func__
, ifp
->name
, vrf_id
,
193 ospf_vrf_id_to_name(new_vrf_id
), new_vrf_id
);
195 /*if_update(ifp, ifp->name, strlen(ifp->name), new_vrf_id);*/
196 if_update_to_new_vrf(ifp
, new_vrf_id
);
201 /* Nexthop, ifindex, distance and metric information. */
202 static void ospf_zebra_add_nexthop(struct ospf
*ospf
, struct ospf_path
*path
,
203 struct zapi_route
*api
)
205 struct zapi_nexthop
*api_nh
;
206 struct zapi_nexthop
*api_nh_backup
;
208 /* TI-LFA backup path label stack comes first, if present */
209 if (path
->srni
.backup_label_stack
) {
210 api_nh_backup
= &api
->backup_nexthops
[api
->backup_nexthop_num
];
211 api_nh_backup
->vrf_id
= ospf
->vrf_id
;
213 api_nh_backup
->type
= NEXTHOP_TYPE_IPV4
;
214 api_nh_backup
->gate
.ipv4
= path
->srni
.backup_nexthop
;
216 api_nh_backup
->label_num
=
217 path
->srni
.backup_label_stack
->num_labels
;
218 memcpy(api_nh_backup
->labels
,
219 path
->srni
.backup_label_stack
->label
,
220 sizeof(mpls_label_t
) * api_nh_backup
->label_num
);
222 api
->backup_nexthop_num
++;
225 /* And here comes the primary nexthop */
226 api_nh
= &api
->nexthops
[api
->nexthop_num
];
229 || (path
->nexthop
.s_addr
!= INADDR_ANY
&& path
->ifindex
!= 0)) {
230 #else /* HAVE_NETLINK */
231 if (path
->nexthop
.s_addr
!= INADDR_ANY
&& path
->ifindex
!= 0) {
232 #endif /* HAVE_NETLINK */
233 api_nh
->gate
.ipv4
= path
->nexthop
;
234 api_nh
->ifindex
= path
->ifindex
;
235 api_nh
->type
= NEXTHOP_TYPE_IPV4_IFINDEX
;
236 } else if (path
->nexthop
.s_addr
!= INADDR_ANY
) {
237 api_nh
->gate
.ipv4
= path
->nexthop
;
238 api_nh
->type
= NEXTHOP_TYPE_IPV4
;
240 api_nh
->ifindex
= path
->ifindex
;
241 api_nh
->type
= NEXTHOP_TYPE_IFINDEX
;
243 api_nh
->vrf_id
= ospf
->vrf_id
;
245 /* Set TI-LFA backup nexthop info if present */
246 if (path
->srni
.backup_label_stack
) {
247 SET_FLAG(api
->message
, ZAPI_MESSAGE_BACKUP_NEXTHOPS
);
248 SET_FLAG(api_nh
->flags
, ZAPI_NEXTHOP_FLAG_HAS_BACKUP
);
250 /* Just care about a single TI-LFA backup path for now */
251 api_nh
->backup_num
= 1;
252 api_nh
->backup_idx
[0] = api
->backup_nexthop_num
- 1;
258 void ospf_zebra_add(struct ospf
*ospf
, struct prefix_ipv4
*p
,
259 struct ospf_route
* or)
261 struct zapi_route api
;
263 struct ospf_path
*path
;
264 struct listnode
*node
;
266 if (ospf
->gr_info
.restart_in_progress
) {
267 if (IS_DEBUG_OSPF_GR
)
269 "Zebra: Graceful Restart in progress -- not installing %pFX",
274 memset(&api
, 0, sizeof(api
));
275 api
.vrf_id
= ospf
->vrf_id
;
276 api
.type
= ZEBRA_ROUTE_OSPF
;
277 api
.instance
= ospf
->instance
;
278 api
.safi
= SAFI_UNICAST
;
280 memcpy(&api
.prefix
, p
, sizeof(*p
));
281 SET_FLAG(api
.message
, ZAPI_MESSAGE_NEXTHOP
);
284 SET_FLAG(api
.message
, ZAPI_MESSAGE_METRIC
);
285 if (or->path_type
== OSPF_PATH_TYPE1_EXTERNAL
)
286 api
.metric
= or->cost
+ or->u
.ext
.type2_cost
;
287 else if (or->path_type
== OSPF_PATH_TYPE2_EXTERNAL
)
288 api
.metric
= or->u
.ext
.type2_cost
;
290 api
.metric
= or->cost
;
292 /* Check if path type is ASE */
293 if (((or->path_type
== OSPF_PATH_TYPE1_EXTERNAL
)
294 || (or->path_type
== OSPF_PATH_TYPE2_EXTERNAL
))
295 && (or->u
.ext
.tag
> 0) && (or->u
.ext
.tag
<= ROUTE_TAG_MAX
)) {
296 SET_FLAG(api
.message
, ZAPI_MESSAGE_TAG
);
297 api
.tag
= or->u
.ext
.tag
;
300 /* Distance value. */
301 distance
= ospf_distance_apply(ospf
, p
, or);
303 SET_FLAG(api
.message
, ZAPI_MESSAGE_DISTANCE
);
304 api
.distance
= distance
;
307 for (ALL_LIST_ELEMENTS_RO(or->paths
, node
, path
)) {
308 if (api
.nexthop_num
>= ospf
->max_multipath
)
311 ospf_zebra_add_nexthop(ospf
, path
, &api
);
313 if (IS_DEBUG_OSPF(zebra
, ZEBRA_REDISTRIBUTE
)) {
314 struct interface
*ifp
;
316 ifp
= if_lookup_by_index(path
->ifindex
, ospf
->vrf_id
);
319 "Zebra: Route add %pFX nexthop %pI4, ifindex=%d %s",
320 p
, &path
->nexthop
, path
->ifindex
,
321 ifp
? ifp
->name
: " ");
325 zclient_route_send(ZEBRA_ROUTE_ADD
, zclient
, &api
);
328 void ospf_zebra_delete(struct ospf
*ospf
, struct prefix_ipv4
*p
,
329 struct ospf_route
* or)
331 struct zapi_route api
;
333 if (ospf
->gr_info
.restart_in_progress
) {
334 if (IS_DEBUG_OSPF_GR
)
336 "Zebra: Graceful Restart in progress -- not uninstalling %pFX",
341 memset(&api
, 0, sizeof(api
));
342 api
.vrf_id
= ospf
->vrf_id
;
343 api
.type
= ZEBRA_ROUTE_OSPF
;
344 api
.instance
= ospf
->instance
;
345 api
.safi
= SAFI_UNICAST
;
346 memcpy(&api
.prefix
, p
, sizeof(*p
));
348 if (IS_DEBUG_OSPF(zebra
, ZEBRA_REDISTRIBUTE
))
349 zlog_debug("Zebra: Route delete %pFX", p
);
351 zclient_route_send(ZEBRA_ROUTE_DELETE
, zclient
, &api
);
354 void ospf_zebra_add_discard(struct ospf
*ospf
, struct prefix_ipv4
*p
)
356 struct zapi_route api
;
358 if (ospf
->gr_info
.restart_in_progress
) {
359 if (IS_DEBUG_OSPF_GR
)
361 "Zebra: Graceful Restart in progress -- not installing %pFX",
366 memset(&api
, 0, sizeof(api
));
367 api
.vrf_id
= ospf
->vrf_id
;
368 api
.type
= ZEBRA_ROUTE_OSPF
;
369 api
.instance
= ospf
->instance
;
370 api
.safi
= SAFI_UNICAST
;
371 memcpy(&api
.prefix
, p
, sizeof(*p
));
372 zapi_route_set_blackhole(&api
, BLACKHOLE_NULL
);
374 zclient_route_send(ZEBRA_ROUTE_ADD
, zclient
, &api
);
376 if (IS_DEBUG_OSPF(zebra
, ZEBRA_REDISTRIBUTE
))
377 zlog_debug("Zebra: Route add discard %pFX", p
);
380 void ospf_zebra_delete_discard(struct ospf
*ospf
, struct prefix_ipv4
*p
)
382 struct zapi_route api
;
384 if (ospf
->gr_info
.restart_in_progress
) {
385 if (IS_DEBUG_OSPF_GR
)
387 "Zebra: Graceful Restart in progress -- not uninstalling %pFX",
392 memset(&api
, 0, sizeof(api
));
393 api
.vrf_id
= ospf
->vrf_id
;
394 api
.type
= ZEBRA_ROUTE_OSPF
;
395 api
.instance
= ospf
->instance
;
396 api
.safi
= SAFI_UNICAST
;
397 memcpy(&api
.prefix
, p
, sizeof(*p
));
398 zapi_route_set_blackhole(&api
, BLACKHOLE_NULL
);
400 zclient_route_send(ZEBRA_ROUTE_DELETE
, zclient
, &api
);
402 if (IS_DEBUG_OSPF(zebra
, ZEBRA_REDISTRIBUTE
))
403 zlog_debug("Zebra: Route delete discard %pFX", p
);
406 struct ospf_external
*ospf_external_lookup(struct ospf
*ospf
, uint8_t type
,
407 unsigned short instance
)
409 struct list
*ext_list
;
410 struct listnode
*node
;
411 struct ospf_external
*ext
;
413 ext_list
= ospf
->external
[type
];
417 for (ALL_LIST_ELEMENTS_RO(ext_list
, node
, ext
))
418 if (ext
->instance
== instance
)
424 struct ospf_external
*ospf_external_add(struct ospf
*ospf
, uint8_t type
,
425 unsigned short instance
)
427 struct list
*ext_list
;
428 struct ospf_external
*ext
;
430 ext
= ospf_external_lookup(ospf
, type
, instance
);
434 if (!ospf
->external
[type
])
435 ospf
->external
[type
] = list_new();
437 ext_list
= ospf
->external
[type
];
438 ext
= XCALLOC(MTYPE_OSPF_EXTERNAL
, sizeof(struct ospf_external
));
439 ext
->instance
= instance
;
440 EXTERNAL_INFO(ext
) = route_table_init();
442 listnode_add(ext_list
, ext
);
448 * Walk all the ei received from zebra for a route type and apply
451 bool ospf_external_default_routemap_apply_walk(struct ospf
*ospf
,
452 struct list
*ext_list
,
453 struct external_info
*default_ei
)
455 struct listnode
*node
;
456 struct ospf_external
*ext
;
457 struct route_node
*rn
;
458 struct external_info
*ei
= NULL
;
461 for (ALL_LIST_ELEMENTS_RO(ext_list
, node
, ext
)) {
462 if (!ext
->external_info
)
465 for (rn
= route_top(ext
->external_info
); rn
;
466 rn
= route_next(rn
)) {
470 ret
= ospf_external_info_apply_default_routemap(
471 ospf
, ei
, default_ei
);
478 if (IS_DEBUG_OSPF_DEFAULT_INFO
)
479 zlog_debug("Default originate routemap permit ei: %pI4",
488 * Function to originate or flush default after applying
489 * route-map on all ei.
491 static int ospf_external_lsa_default_routemap_timer(struct thread
*thread
)
493 struct list
*ext_list
;
494 struct ospf
*ospf
= THREAD_ARG(thread
);
495 struct prefix_ipv4 p
;
498 struct ospf_lsa
*lsa
;
499 struct external_info
*default_ei
;
503 p
.prefix
.s_addr
= INADDR_ANY
;
505 /* Get the default extenal info. */
506 default_ei
= ospf_external_info_lookup(ospf
, DEFAULT_ROUTE
,
509 /* Nothing to be done here. */
510 if (IS_DEBUG_OSPF_DEFAULT_INFO
)
511 zlog_debug("Default originate info not present");
515 /* For all the ei apply route-map */
516 for (type
= 0; type
<= ZEBRA_ROUTE_MAX
; type
++) {
517 ext_list
= ospf
->external
[type
];
518 if (!ext_list
|| type
== ZEBRA_ROUTE_OSPF
)
521 ret
= ospf_external_default_routemap_apply_walk(ospf
, ext_list
,
527 /* Get the default LSA. */
528 lsa
= ospf_external_info_find_lsa(ospf
, &p
);
530 /* If permit then originate default. */
532 ospf_external_lsa_originate(ospf
, default_ei
);
533 else if (ret
&& lsa
&& IS_LSA_MAXAGE(lsa
))
534 ospf_external_lsa_refresh(ospf
, lsa
, default_ei
, true, false);
535 else if (!ret
&& lsa
)
536 ospf_external_lsa_flush(ospf
, DEFAULT_ROUTE
, &default_ei
->p
, 0);
542 void ospf_external_del(struct ospf
*ospf
, uint8_t type
, unsigned short instance
)
544 struct ospf_external
*ext
;
546 ext
= ospf_external_lookup(ospf
, type
, instance
);
549 if (EXTERNAL_INFO(ext
))
550 route_table_finish(EXTERNAL_INFO(ext
));
552 listnode_delete(ospf
->external
[type
], ext
);
554 if (!ospf
->external
[type
]->count
)
555 list_delete(&ospf
->external
[type
]);
557 XFREE(MTYPE_OSPF_EXTERNAL
, ext
);
561 * Check if default needs to be flushed too.
563 thread_add_event(master
, ospf_external_lsa_default_routemap_timer
, ospf
,
564 0, &ospf
->t_default_routemap_timer
);
567 /* Update NHLFE for Prefix SID */
568 void ospf_zebra_update_prefix_sid(const struct sr_prefix
*srp
)
570 struct zapi_labels zl
;
571 struct zapi_nexthop
*znh
;
572 struct zapi_nexthop
*znh_backup
;
573 struct listnode
*node
;
574 struct ospf_path
*path
;
576 /* Prepare message. */
577 memset(&zl
, 0, sizeof(zl
));
578 zl
.type
= ZEBRA_LSP_OSPF_SR
;
579 zl
.local_label
= srp
->label_in
;
583 /* Set Label for local Prefix */
584 znh
= &zl
.nexthops
[zl
.nexthop_num
++];
585 znh
->type
= NEXTHOP_TYPE_IFINDEX
;
586 znh
->ifindex
= srp
->nhlfe
.ifindex
;
588 znh
->labels
[0] = srp
->nhlfe
.label_out
;
590 osr_debug("SR (%s): Configure Prefix %pFX with labels %u/%u",
591 __func__
, (struct prefix
*)&srp
->prefv4
,
592 srp
->label_in
, srp
->nhlfe
.label_out
);
597 /* Update route in the RIB too. */
598 SET_FLAG(zl
.message
, ZAPI_LABELS_FTN
);
599 zl
.route
.prefix
.u
.prefix4
= srp
->prefv4
.prefix
;
600 zl
.route
.prefix
.prefixlen
= srp
->prefv4
.prefixlen
;
601 zl
.route
.prefix
.family
= srp
->prefv4
.family
;
602 zl
.route
.type
= ZEBRA_ROUTE_OSPF
;
603 zl
.route
.instance
= 0;
605 /* Check that SRP contains at least one valid path */
606 if (srp
->route
== NULL
) {
610 osr_debug("SR (%s): Configure Prefix %pFX with",
611 __func__
, (struct prefix
*)&srp
->prefv4
);
613 for (ALL_LIST_ELEMENTS_RO(srp
->route
->paths
, node
, path
)) {
614 if (path
->srni
.label_out
== MPLS_INVALID_LABEL
)
617 if (zl
.nexthop_num
>= MULTIPATH_NUM
)
621 * TI-LFA backup path label stack comes first, if
624 if (path
->srni
.backup_label_stack
) {
625 znh_backup
= &zl
.backup_nexthops
626 [zl
.backup_nexthop_num
++];
627 znh_backup
->type
= NEXTHOP_TYPE_IPV4
;
628 znh_backup
->gate
.ipv4
=
629 path
->srni
.backup_nexthop
;
631 memcpy(znh_backup
->labels
,
632 path
->srni
.backup_label_stack
->label
,
634 * path
->srni
.backup_label_stack
637 znh_backup
->label_num
=
638 path
->srni
.backup_label_stack
640 if (path
->srni
.label_out
641 != MPLS_LABEL_IPV4_EXPLICIT_NULL
642 && path
->srni
.label_out
643 != MPLS_LABEL_IMPLICIT_NULL
)
645 [znh_backup
->label_num
++] =
646 path
->srni
.label_out
;
649 znh
= &zl
.nexthops
[zl
.nexthop_num
++];
650 znh
->type
= NEXTHOP_TYPE_IPV4_IFINDEX
;
651 znh
->gate
.ipv4
= path
->nexthop
;
652 znh
->ifindex
= path
->ifindex
;
654 znh
->labels
[0] = path
->srni
.label_out
;
656 osr_debug(" |- labels %u/%u", srp
->label_in
,
657 path
->srni
.label_out
);
659 /* Set TI-LFA backup nexthop info if present */
660 if (path
->srni
.backup_label_stack
) {
661 SET_FLAG(zl
.message
, ZAPI_LABELS_HAS_BACKUPS
);
663 ZAPI_NEXTHOP_FLAG_HAS_BACKUP
);
665 /* Just care about a single TI-LFA backup path
668 znh
->backup_idx
[0] = zl
.backup_nexthop_num
- 1;
677 /* Finally, send message to zebra. */
678 (void)zebra_send_mpls_labels(zclient
, ZEBRA_MPLS_LABELS_REPLACE
, &zl
);
681 /* Remove NHLFE for Prefix-SID */
682 void ospf_zebra_delete_prefix_sid(const struct sr_prefix
*srp
)
684 struct zapi_labels zl
;
686 osr_debug("SR (%s): Delete Labels %u for Prefix %pFX", __func__
,
687 srp
->label_in
, (struct prefix
*)&srp
->prefv4
);
689 /* Prepare message. */
690 memset(&zl
, 0, sizeof(zl
));
691 zl
.type
= ZEBRA_LSP_OSPF_SR
;
692 zl
.local_label
= srp
->label_in
;
694 if (srp
->type
== PREF_SID
) {
695 /* Update route in the RIB too */
696 SET_FLAG(zl
.message
, ZAPI_LABELS_FTN
);
697 zl
.route
.prefix
.u
.prefix4
= srp
->prefv4
.prefix
;
698 zl
.route
.prefix
.prefixlen
= srp
->prefv4
.prefixlen
;
699 zl
.route
.prefix
.family
= srp
->prefv4
.family
;
700 zl
.route
.type
= ZEBRA_ROUTE_OSPF
;
701 zl
.route
.instance
= 0;
704 /* Send message to zebra. */
705 (void)zebra_send_mpls_labels(zclient
, ZEBRA_MPLS_LABELS_DELETE
, &zl
);
708 /* Send MPLS Label entry to Zebra for installation or deletion */
709 void ospf_zebra_send_adjacency_sid(int cmd
, struct sr_nhlfe nhlfe
)
711 struct zapi_labels zl
;
712 struct zapi_nexthop
*znh
;
714 osr_debug("SR (%s): %s Labels %u/%u for Adjacency via %u", __func__
,
715 cmd
== ZEBRA_MPLS_LABELS_ADD
? "Add" : "Delete",
716 nhlfe
.label_in
, nhlfe
.label_out
, nhlfe
.ifindex
);
718 memset(&zl
, 0, sizeof(zl
));
719 zl
.type
= ZEBRA_LSP_OSPF_SR
;
720 zl
.local_label
= nhlfe
.label_in
;
722 znh
= &zl
.nexthops
[0];
723 znh
->type
= NEXTHOP_TYPE_IPV4_IFINDEX
;
724 znh
->gate
.ipv4
= nhlfe
.nexthop
;
725 znh
->ifindex
= nhlfe
.ifindex
;
727 znh
->labels
[0] = nhlfe
.label_out
;
729 (void)zebra_send_mpls_labels(zclient
, cmd
, &zl
);
732 struct ospf_redist
*ospf_redist_lookup(struct ospf
*ospf
, uint8_t type
,
733 unsigned short instance
)
735 struct list
*red_list
;
736 struct listnode
*node
;
737 struct ospf_redist
*red
;
739 red_list
= ospf
->redist
[type
];
743 for (ALL_LIST_ELEMENTS_RO(red_list
, node
, red
))
744 if (red
->instance
== instance
)
750 struct ospf_redist
*ospf_redist_add(struct ospf
*ospf
, uint8_t type
,
751 unsigned short instance
)
753 struct list
*red_list
;
754 struct ospf_redist
*red
;
756 red
= ospf_redist_lookup(ospf
, type
, instance
);
760 if (!ospf
->redist
[type
])
761 ospf
->redist
[type
] = list_new();
763 red_list
= ospf
->redist
[type
];
764 red
= XCALLOC(MTYPE_OSPF_REDISTRIBUTE
, sizeof(struct ospf_redist
));
765 red
->instance
= instance
;
766 red
->dmetric
.type
= -1;
767 red
->dmetric
.value
= -1;
768 ROUTEMAP_NAME(red
) = NULL
;
769 ROUTEMAP(red
) = NULL
;
771 listnode_add(red_list
, red
);
776 void ospf_redist_del(struct ospf
*ospf
, uint8_t type
, unsigned short instance
)
778 struct ospf_redist
*red
;
780 red
= ospf_redist_lookup(ospf
, type
, instance
);
783 listnode_delete(ospf
->redist
[type
], red
);
784 if (!ospf
->redist
[type
]->count
) {
785 list_delete(&ospf
->redist
[type
]);
787 ospf_routemap_unset(red
);
788 XFREE(MTYPE_OSPF_REDISTRIBUTE
, red
);
793 int ospf_is_type_redistributed(struct ospf
*ospf
, int type
,
794 unsigned short instance
)
796 return (DEFAULT_ROUTE_TYPE(type
)
797 ? vrf_bitmap_check(zclient
->default_information
[AFI_IP
],
800 && redist_check_instance(
801 &zclient
->mi_redist
[AFI_IP
][type
],
805 zclient
->redist
[AFI_IP
][type
],
809 int ospf_redistribute_update(struct ospf
*ospf
, struct ospf_redist
*red
,
810 int type
, unsigned short instance
, int mtype
,
815 if (mtype
!= red
->dmetric
.type
) {
816 red
->dmetric
.type
= mtype
;
817 force
= LSA_REFRESH_FORCE
;
819 if (mvalue
!= red
->dmetric
.value
) {
820 red
->dmetric
.value
= mvalue
;
821 force
= LSA_REFRESH_FORCE
;
824 ospf_external_lsa_refresh_type(ospf
, type
, instance
, force
);
826 if (IS_DEBUG_OSPF(zebra
, ZEBRA_REDISTRIBUTE
))
828 "Redistribute[%s][%d]: Refresh Type[%d], Metric[%d]",
829 ospf_redist_string(type
), instance
,
830 metric_type(ospf
, type
, instance
),
831 metric_value(ospf
, type
, instance
));
836 int ospf_redistribute_set(struct ospf
*ospf
, struct ospf_redist
*red
, int type
,
837 unsigned short instance
, int mtype
, int mvalue
)
839 red
->dmetric
.type
= mtype
;
840 red
->dmetric
.value
= mvalue
;
842 ospf_external_add(ospf
, type
, instance
);
844 zclient_redistribute(ZEBRA_REDISTRIBUTE_ADD
, zclient
, AFI_IP
, type
,
845 instance
, ospf
->vrf_id
);
847 if (IS_DEBUG_OSPF(zebra
, ZEBRA_REDISTRIBUTE
))
849 "Redistribute[%s][%d] vrf id %u: Start Type[%d], Metric[%d]",
850 ospf_redist_string(type
), instance
, ospf
->vrf_id
,
851 metric_type(ospf
, type
, instance
),
852 metric_value(ospf
, type
, instance
));
854 ospf_asbr_status_update(ospf
, ++ospf
->redistribute
);
859 int ospf_redistribute_unset(struct ospf
*ospf
, int type
,
860 unsigned short instance
)
862 if (type
== zclient
->redist_default
&& instance
== zclient
->instance
)
865 zclient_redistribute(ZEBRA_REDISTRIBUTE_DELETE
, zclient
, AFI_IP
, type
,
866 instance
, ospf
->vrf_id
);
868 if (IS_DEBUG_OSPF(zebra
, ZEBRA_REDISTRIBUTE
))
869 zlog_debug("Redistribute[%s][%d] vrf id %u: Stop",
870 ospf_redist_string(type
), instance
, ospf
->vrf_id
);
872 /* Remove the routes from OSPF table. */
873 ospf_redistribute_withdraw(ospf
, type
, instance
);
875 ospf_external_del(ospf
, type
, instance
);
877 ospf_asbr_status_update(ospf
, --ospf
->redistribute
);
882 int ospf_redistribute_default_set(struct ospf
*ospf
, int originate
, int mtype
,
885 struct prefix_ipv4 p
;
886 struct in_addr nexthop
;
887 int cur_originate
= ospf
->default_originate
;
888 const char *type_str
= NULL
;
890 nexthop
.s_addr
= INADDR_ANY
;
892 p
.prefix
.s_addr
= INADDR_ANY
;
895 ospf
->default_originate
= originate
;
897 if (cur_originate
== originate
) {
898 /* Refresh the lsa since metric might different */
899 if (IS_DEBUG_OSPF(zebra
, ZEBRA_REDISTRIBUTE
))
901 "Redistribute[%s]: Refresh Type[%d], Metric[%d]",
902 ospf_redist_string(DEFAULT_ROUTE
),
903 metric_type(ospf
, DEFAULT_ROUTE
, 0),
904 metric_value(ospf
, DEFAULT_ROUTE
, 0));
906 ospf_external_lsa_refresh_default(ospf
);
910 switch (cur_originate
) {
911 case DEFAULT_ORIGINATE_NONE
:
913 case DEFAULT_ORIGINATE_ZEBRA
:
914 zclient_redistribute_default(ZEBRA_REDISTRIBUTE_DEFAULT_DELETE
,
915 zclient
, AFI_IP
, ospf
->vrf_id
);
916 ospf
->redistribute
--;
918 case DEFAULT_ORIGINATE_ALWAYS
:
919 ospf_external_info_delete(ospf
, DEFAULT_ROUTE
, 0, p
);
920 ospf_external_del(ospf
, DEFAULT_ROUTE
, 0);
921 ospf
->redistribute
--;
926 case DEFAULT_ORIGINATE_NONE
:
929 case DEFAULT_ORIGINATE_ZEBRA
:
931 ospf
->redistribute
++;
932 zclient_redistribute_default(ZEBRA_REDISTRIBUTE_DEFAULT_ADD
,
933 zclient
, AFI_IP
, ospf
->vrf_id
);
935 case DEFAULT_ORIGINATE_ALWAYS
:
937 ospf
->redistribute
++;
938 ospf_external_add(ospf
, DEFAULT_ROUTE
, 0);
939 ospf_external_info_add(ospf
, DEFAULT_ROUTE
, 0, p
, 0, nexthop
,
944 if (IS_DEBUG_OSPF(zebra
, ZEBRA_REDISTRIBUTE
))
945 zlog_debug("Redistribute[DEFAULT]: %s Type[%d], Metric[%d]",
947 metric_type(ospf
, DEFAULT_ROUTE
, 0),
948 metric_value(ospf
, DEFAULT_ROUTE
, 0));
950 ospf_external_lsa_refresh_default(ospf
);
951 ospf_asbr_status_update(ospf
, ospf
->redistribute
);
955 static int ospf_external_lsa_originate_check(struct ospf
*ospf
,
956 struct external_info
*ei
)
958 /* If prefix is multicast, then do not originate LSA. */
959 if (IN_MULTICAST(htonl(ei
->p
.prefix
.s_addr
))) {
961 "LSA[Type5:%pI4]: Not originate AS-external-LSA, Prefix belongs multicast",
966 /* Take care of default-originate. */
967 if (is_default_prefix4(&ei
->p
))
968 if (ospf
->default_originate
== DEFAULT_ORIGINATE_NONE
) {
970 "LSA[Type5:0.0.0.0]: Not originate AS-external-LSA for default");
977 /* If connected prefix is OSPF enable interface, then do not announce. */
978 int ospf_distribute_check_connected(struct ospf
*ospf
, struct external_info
*ei
)
980 struct listnode
*node
;
981 struct ospf_interface
*oi
;
984 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
))
985 if (prefix_match(oi
->address
, (struct prefix
*)&ei
->p
))
991 /* Apply default route-map on ei received. */
992 int ospf_external_info_apply_default_routemap(struct ospf
*ospf
,
993 struct external_info
*ei
,
994 struct external_info
*default_ei
)
996 struct ospf_redist
*red
;
997 int type
= default_ei
->type
;
998 struct prefix_ipv4
*p
= &ei
->p
;
999 struct route_map_set_values save_values
;
1002 if (!ospf_external_lsa_originate_check(ospf
, default_ei
))
1005 save_values
= default_ei
->route_map_set
;
1006 ospf_reset_route_map_set_values(&default_ei
->route_map_set
);
1008 /* apply route-map if needed */
1009 red
= ospf_redist_lookup(ospf
, type
, ospf
->instance
);
1010 if (red
&& ROUTEMAP_NAME(red
)) {
1011 route_map_result_t ret
;
1013 ret
= route_map_apply(ROUTEMAP(red
), (struct prefix
*)p
, ei
);
1015 if (ret
== RMAP_DENYMATCH
) {
1016 ei
->route_map_set
= save_values
;
1026 * Default originated is based on route-map condition then
1027 * apply route-map on received external info. Originate or
1028 * flush based on route-map condition.
1030 static bool ospf_external_lsa_default_routemap_apply(struct ospf
*ospf
,
1031 struct external_info
*ei
,
1034 struct external_info
*default_ei
;
1035 struct prefix_ipv4 p
;
1036 struct ospf_lsa
*lsa
;
1041 p
.prefix
.s_addr
= INADDR_ANY
;
1044 /* Get the default extenal info. */
1045 default_ei
= ospf_external_info_lookup(ospf
, DEFAULT_ROUTE
,
1046 ospf
->instance
, &p
);
1048 /* Nothing to be done here. */
1052 if (IS_DEBUG_OSPF_DEFAULT_INFO
)
1053 zlog_debug("Apply default originate routemap on ei: %pI4 cmd: %d",
1054 &ei
->p
.prefix
, cmd
);
1056 ret
= ospf_external_info_apply_default_routemap(ospf
, ei
, default_ei
);
1058 /* If deny then nothing to be done both in add and del case. */
1060 if (IS_DEBUG_OSPF_DEFAULT_INFO
)
1061 zlog_debug("Default originte routemap deny for ei: %pI4",
1066 /* Get the default LSA. */
1067 lsa
= ospf_external_info_find_lsa(ospf
, &p
);
1069 /* If this is add route and permit then ooriginate default. */
1070 if (cmd
== ZEBRA_REDISTRIBUTE_ROUTE_ADD
) {
1071 /* If permit and default already advertise then return. */
1072 if (lsa
&& !IS_LSA_MAXAGE(lsa
)) {
1073 if (IS_DEBUG_OSPF_DEFAULT_INFO
)
1074 zlog_debug("Default lsa already originated");
1078 if (IS_DEBUG_OSPF_DEFAULT_INFO
)
1079 zlog_debug("Originating/Refreshing default lsa");
1081 if (lsa
&& IS_LSA_MAXAGE(lsa
))
1083 ospf_external_lsa_refresh(ospf
, lsa
, default_ei
, true,
1086 /* If permit and default not advertised then advertise.
1088 ospf_external_lsa_originate(ospf
, default_ei
);
1090 } else if (cmd
== ZEBRA_REDISTRIBUTE_ROUTE_DEL
) {
1091 /* If deny and lsa is not originated then nothing to be done.*/
1093 if (IS_DEBUG_OSPF_DEFAULT_INFO
)
1095 "Default lsa not originated, not flushing");
1099 if (IS_DEBUG_OSPF_DEFAULT_INFO
)
1101 "Running default route-map again as ei: %pI4 deleted",
1104 * if this route delete was permitted then we need to check
1105 * there are any other external info which can still trigger
1106 * default route origination else flush it.
1108 thread_add_event(master
,
1109 ospf_external_lsa_default_routemap_timer
, ospf
,
1110 0, &ospf
->t_default_routemap_timer
);
1116 /* return 1 if external LSA must be originated, 0 otherwise */
1117 int ospf_redistribute_check(struct ospf
*ospf
, struct external_info
*ei
,
1120 struct route_map_set_values save_values
;
1121 struct prefix_ipv4
*p
= &ei
->p
;
1122 struct ospf_redist
*red
;
1123 uint8_t type
= is_default_prefix4(&ei
->p
) ? DEFAULT_ROUTE
: ei
->type
;
1124 unsigned short instance
= is_default_prefix4(&ei
->p
) ? 0 : ei
->instance
;
1125 route_tag_t saved_tag
= 0;
1127 /* Default is handled differently. */
1128 if (type
== DEFAULT_ROUTE
)
1134 if (!ospf_external_lsa_originate_check(ospf
, ei
))
1137 /* Take care connected route. */
1138 if (type
== ZEBRA_ROUTE_CONNECT
1139 && !ospf_distribute_check_connected(ospf
, ei
))
1142 if (!DEFAULT_ROUTE_TYPE(type
) && DISTRIBUTE_NAME(ospf
, type
))
1143 /* distirbute-list exists, but access-list may not? */
1144 if (DISTRIBUTE_LIST(ospf
, type
))
1145 if (access_list_apply(DISTRIBUTE_LIST(ospf
, type
), p
)
1147 if (IS_DEBUG_OSPF(zebra
, ZEBRA_REDISTRIBUTE
))
1149 "Redistribute[%s]: %pFX filtered by distribute-list.",
1150 ospf_redist_string(type
), p
);
1154 save_values
= ei
->route_map_set
;
1155 ospf_reset_route_map_set_values(&ei
->route_map_set
);
1157 saved_tag
= ei
->tag
;
1158 /* Resetting with original route tag */
1159 ei
->tag
= ei
->orig_tag
;
1161 /* apply route-map if needed */
1162 red
= ospf_redist_lookup(ospf
, type
, instance
);
1163 if (red
&& ROUTEMAP_NAME(red
)) {
1164 route_map_result_t ret
;
1166 ret
= route_map_apply(ROUTEMAP(red
), (struct prefix
*)p
, ei
);
1168 if (ret
== RMAP_DENYMATCH
) {
1169 ei
->route_map_set
= save_values
;
1170 if (IS_DEBUG_OSPF(zebra
, ZEBRA_REDISTRIBUTE
))
1172 "Redistribute[%s]: %pFX filtered by route-map.",
1173 ospf_redist_string(type
), p
);
1177 /* check if 'route-map set' changed something */
1179 *changed
= !ospf_route_map_set_compare(
1180 &ei
->route_map_set
, &save_values
);
1182 /* check if tag is modified */
1183 *changed
|= (saved_tag
!= ei
->tag
);
1190 /* OSPF route-map set for redistribution */
1191 void ospf_routemap_set(struct ospf_redist
*red
, const char *name
)
1193 if (ROUTEMAP_NAME(red
)) {
1194 route_map_counter_decrement(ROUTEMAP(red
));
1195 free(ROUTEMAP_NAME(red
));
1198 ROUTEMAP_NAME(red
) = strdup(name
);
1199 ROUTEMAP(red
) = route_map_lookup_by_name(name
);
1200 route_map_counter_increment(ROUTEMAP(red
));
1203 void ospf_routemap_unset(struct ospf_redist
*red
)
1205 if (ROUTEMAP_NAME(red
)) {
1206 route_map_counter_decrement(ROUTEMAP(red
));
1207 free(ROUTEMAP_NAME(red
));
1210 ROUTEMAP_NAME(red
) = NULL
;
1211 ROUTEMAP(red
) = NULL
;
1214 static int ospf_zebra_gr_update(struct ospf
*ospf
, int command
,
1215 uint32_t stale_time
)
1217 struct zapi_cap api
;
1219 if (!zclient
|| zclient
->sock
< 0 || !ospf
)
1222 memset(&api
, 0, sizeof(struct zapi_cap
));
1224 api
.stale_removal_time
= stale_time
;
1225 api
.vrf_id
= ospf
->vrf_id
;
1227 (void)zclient_capabilities_send(ZEBRA_CLIENT_CAPABILITIES
, zclient
,
1233 int ospf_zebra_gr_enable(struct ospf
*ospf
, uint32_t stale_time
)
1235 return ospf_zebra_gr_update(ospf
, ZEBRA_CLIENT_GR_CAPABILITIES
,
1239 int ospf_zebra_gr_disable(struct ospf
*ospf
)
1241 return ospf_zebra_gr_update(ospf
, ZEBRA_CLIENT_GR_DISABLE
, 0);
1244 /* Zebra route add and delete treatment. */
1245 static int ospf_zebra_read_route(ZAPI_CALLBACK_ARGS
)
1247 struct zapi_route api
;
1248 struct prefix_ipv4 p
;
1249 unsigned long ifindex
;
1250 struct in_addr nexthop
;
1251 struct external_info
*ei
;
1256 ospf
= ospf_lookup_by_vrf_id(vrf_id
);
1260 if (zapi_route_decode(zclient
->ibuf
, &api
) < 0)
1263 ifindex
= api
.nexthops
[0].ifindex
;
1264 nexthop
= api
.nexthops
[0].gate
.ipv4
;
1267 memcpy(&p
, &api
.prefix
, sizeof(p
));
1268 if (IPV4_NET127(ntohl(p
.prefix
.s_addr
)))
1271 /* Re-destributed route is default route.
1272 * Here, route type is used as 'ZEBRA_ROUTE_KERNEL' for
1273 * updating ex-info. But in resetting (no default-info
1274 * originate)ZEBRA_ROUTE_MAX is used to delete the ex-info.
1275 * Resolved this inconsistency by maintaining same route type.
1277 if (is_default_prefix4(&p
))
1278 rt_type
= DEFAULT_ROUTE
;
1280 if (IS_DEBUG_OSPF(zebra
, ZEBRA_REDISTRIBUTE
))
1281 zlog_debug("%s: cmd %s from client %s: vrf_id %d, p %pFX",
1282 __func__
, zserv_command_string(cmd
),
1283 zebra_route_string(api
.type
), vrf_id
, &api
.prefix
);
1285 if (cmd
== ZEBRA_REDISTRIBUTE_ROUTE_ADD
) {
1286 /* XXX|HACK|TODO|FIXME:
1287 * Maybe we should ignore reject/blackhole routes? Testing
1288 * shows that there is no problems though and this is only way
1289 * to "summarize" routes in ASBR at the moment. Maybe we need
1290 * just a better generalised solution for these types?
1293 /* Protocol tag overwrites all other tag value sent by zebra */
1294 if (ospf
->dtag
[rt_type
] > 0)
1295 api
.tag
= ospf
->dtag
[rt_type
];
1298 * Given zebra sends update for a prefix via ADD message, it
1300 * be considered as an implicit DEL for that prefix with other
1304 for (i
= 0; i
<= ZEBRA_ROUTE_MAX
; i
++)
1306 ospf_external_info_delete(ospf
, i
, api
.instance
,
1309 ei
= ospf_external_info_add(ospf
, rt_type
, api
.instance
, p
,
1310 ifindex
, nexthop
, api
.tag
);
1312 /* Nothing has changed, so nothing to do; return */
1315 if (ospf
->router_id
.s_addr
!= INADDR_ANY
) {
1316 if (is_default_prefix4(&p
))
1317 ospf_external_lsa_refresh_default(ospf
);
1319 struct ospf_external_aggr_rt
*aggr
;
1320 struct as_external_lsa
*al
;
1321 struct ospf_lsa
*lsa
= NULL
;
1322 struct in_addr mask
;
1324 aggr
= ospf_external_aggr_match(ospf
, &ei
->p
);
1327 /* Check the AS-external-LSA
1328 * should be originated.
1330 if (!ospf_redistribute_check(ospf
, ei
,
1334 if (IS_DEBUG_OSPF(lsa
, EXTNL_LSA_AGGR
))
1336 "%s: Send Aggreate LSA (%pI4/%d)",
1341 ospf_originate_summary_lsa(ospf
, aggr
,
1344 /* Handling the case where the
1345 * external route prefix
1346 * and aggegate prefix is same
1347 * If same dont flush the
1352 (struct prefix
*)&aggr
->p
,
1353 (struct prefix
*)&ei
->p
))
1356 lsa
= ospf_external_info_find_lsa(
1360 al
= (struct as_external_lsa
*)
1362 masklen2ip(ei
->p
.prefixlen
,
1369 ospf_external_lsa_flush(
1370 ospf
, ei
->type
, &ei
->p
,
1374 struct ospf_lsa
*current
;
1376 current
= ospf_external_info_find_lsa(
1384 if (!ospf_redistribute_check(
1388 ospf_external_lsa_originate(
1393 ZEBRA_REDISTRIBUTE
))
1395 "%s: %pI4 refreshing LSA",
1398 ospf_external_lsa_refresh(
1408 * Check if default-information originate is
1409 * with some routemap prefix/access list match.
1411 ospf_external_lsa_default_routemap_apply(ospf
, ei
, cmd
);
1413 } else { /* if (cmd == ZEBRA_REDISTRIBUTE_ROUTE_DEL) */
1414 struct ospf_external_aggr_rt
*aggr
;
1416 ei
= ospf_external_info_lookup(ospf
, rt_type
, api
.instance
, &p
);
1421 * Check if default-information originate i
1422 * with some routemap prefix/access list match.
1423 * Apply before ei is deleted.
1425 ospf_external_lsa_default_routemap_apply(ospf
, ei
, cmd
);
1427 aggr
= ospf_external_aggr_match(ospf
, &ei
->p
);
1429 if (aggr
&& (ei
->aggr_route
== aggr
)) {
1430 ospf_unlink_ei_from_aggr(ospf
, aggr
, ei
);
1432 ospf_external_info_delete(ospf
, rt_type
, api
.instance
,
1435 ospf_external_info_delete(ospf
, rt_type
, api
.instance
,
1438 if (is_default_prefix4(&p
))
1439 ospf_external_lsa_refresh_default(ospf
);
1441 ospf_external_lsa_flush(ospf
, rt_type
, &p
,
1442 ifindex
/*, nexthop */);
1450 int ospf_distribute_list_out_set(struct ospf
*ospf
, int type
, const char *name
)
1452 /* Lookup access-list for distribute-list. */
1453 DISTRIBUTE_LIST(ospf
, type
) = access_list_lookup(AFI_IP
, name
);
1455 /* Clear previous distribute-name. */
1456 if (DISTRIBUTE_NAME(ospf
, type
))
1457 free(DISTRIBUTE_NAME(ospf
, type
));
1459 /* Set distribute-name. */
1460 DISTRIBUTE_NAME(ospf
, type
) = strdup(name
);
1462 /* If access-list have been set, schedule update timer. */
1463 if (DISTRIBUTE_LIST(ospf
, type
))
1464 ospf_distribute_list_update(ospf
, type
, 0);
1469 int ospf_distribute_list_out_unset(struct ospf
*ospf
, int type
,
1472 /* Schedule update timer. */
1473 if (DISTRIBUTE_LIST(ospf
, type
))
1474 ospf_distribute_list_update(ospf
, type
, 0);
1476 /* Unset distribute-list. */
1477 DISTRIBUTE_LIST(ospf
, type
) = NULL
;
1479 /* Clear distribute-name. */
1480 if (DISTRIBUTE_NAME(ospf
, type
))
1481 free(DISTRIBUTE_NAME(ospf
, type
));
1483 DISTRIBUTE_NAME(ospf
, type
) = NULL
;
1488 /* distribute-list update timer. */
1489 static int ospf_distribute_list_update_timer(struct thread
*thread
)
1491 struct route_node
*rn
;
1492 struct external_info
*ei
;
1493 struct route_table
*rt
;
1494 struct ospf_lsa
*lsa
;
1495 int type
, default_refresh
= 0;
1496 struct ospf
*ospf
= THREAD_ARG(thread
);
1501 ospf
->t_distribute_update
= NULL
;
1503 zlog_info("Zebra[Redistribute]: distribute-list update timer fired!");
1505 if (IS_DEBUG_OSPF_EVENT
) {
1506 zlog_debug("%s: ospf distribute-list update vrf %s id %d",
1507 __func__
, ospf_vrf_id_to_name(ospf
->vrf_id
),
1511 /* foreach all external info. */
1512 for (type
= 0; type
<= ZEBRA_ROUTE_MAX
; type
++) {
1513 struct list
*ext_list
;
1514 struct listnode
*node
;
1515 struct ospf_external
*ext
;
1517 ext_list
= ospf
->external
[type
];
1521 for (ALL_LIST_ELEMENTS_RO(ext_list
, node
, ext
)) {
1522 rt
= ext
->external_info
;
1525 for (rn
= route_top(rt
); rn
; rn
= route_next(rn
)) {
1530 if (is_default_prefix4(&ei
->p
))
1531 default_refresh
= 1;
1533 struct ospf_external_aggr_rt
*aggr
;
1535 aggr
= ospf_external_aggr_match(ospf
,
1540 * should be originated.
1542 if (!ospf_redistribute_check(
1545 ospf_unlink_ei_from_aggr(
1554 "%s: Send Aggregate LSA (%pI4/%d)",
1559 /* Originate Aggregate
1562 ospf_originate_summary_lsa(
1565 (lsa
= ospf_external_info_find_lsa(
1568 LSA_REFRESH_IF_CHANGED
;
1569 /* If this is a MaxAge
1572 * because distribute
1573 * settings might have
1575 * this LSA needs to be
1576 * originated, not be
1579 * refresh it, it will
1580 * remain a MaxAge LSA
1581 * because it will look
1583 * changed. Neighbors
1585 * updates for this LSA.
1587 if (IS_LSA_MAXAGE(lsa
))
1588 force
= LSA_REFRESH_FORCE
;
1590 ospf_external_lsa_refresh(
1591 ospf
, lsa
, ei
, force
,
1594 if (!ospf_redistribute_check(
1597 ospf_external_lsa_originate(
1604 if (default_refresh
)
1605 ospf_external_lsa_refresh_default(ospf
);
1610 /* Update distribute-list and set timer to apply access-list. */
1611 void ospf_distribute_list_update(struct ospf
*ospf
, int type
,
1612 unsigned short instance
)
1614 struct ospf_external
*ext
;
1616 /* External info does not exist. */
1617 ext
= ospf_external_lookup(ospf
, type
, instance
);
1618 if (!ext
|| !EXTERNAL_INFO(ext
))
1621 /* Set timer. If timer is already started, this call does nothing. */
1622 thread_add_timer_msec(master
, ospf_distribute_list_update_timer
, ospf
,
1623 ospf
->min_ls_interval
,
1624 &ospf
->t_distribute_update
);
1627 /* If access-list is updated, apply some check. */
1628 static void ospf_filter_update(struct access_list
*access
)
1633 struct ospf_area
*area
;
1634 struct listnode
*node
, *n1
;
1636 /* If OSPF instance does not exist, return right now. */
1637 if (listcount(om
->ospf
) == 0)
1640 /* Iterate all ospf [VRF] instances */
1641 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, n1
, ospf
)) {
1642 /* Update distribute-list, and apply filter. */
1643 for (type
= 0; type
<= ZEBRA_ROUTE_MAX
; type
++) {
1644 struct list
*red_list
;
1645 struct ospf_redist
*red
;
1647 red_list
= ospf
->redist
[type
];
1649 for (ALL_LIST_ELEMENTS_RO(red_list
, node
,
1651 if (ROUTEMAP(red
)) {
1652 /* if route-map is not NULL it
1654 * using this access list */
1655 ospf_distribute_list_update(
1661 /* There is place for route-map for default-information
1662 * (ZEBRA_ROUTE_MAX),
1663 * but no distribute list. */
1664 if (type
== ZEBRA_ROUTE_MAX
)
1667 if (DISTRIBUTE_NAME(ospf
, type
)) {
1668 /* Keep old access-list for distribute-list. */
1669 struct access_list
*old
=
1670 DISTRIBUTE_LIST(ospf
, type
);
1672 /* Update access-list for distribute-list. */
1673 DISTRIBUTE_LIST(ospf
, type
) =
1676 DISTRIBUTE_NAME(ospf
, type
));
1678 /* No update for this distribute type. */
1680 && DISTRIBUTE_LIST(ospf
, type
) == NULL
)
1683 /* Schedule distribute-list update timer. */
1684 if (DISTRIBUTE_LIST(ospf
, type
) == NULL
1685 || strcmp(DISTRIBUTE_NAME(ospf
, type
),
1688 ospf_distribute_list_update(ospf
, type
,
1693 /* Update Area access-list. */
1694 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
)) {
1695 if (EXPORT_NAME(area
)) {
1696 EXPORT_LIST(area
) = NULL
;
1700 if (IMPORT_NAME(area
)) {
1701 IMPORT_LIST(area
) = NULL
;
1706 /* Schedule ABR tasks -- this will be changed -- takada. */
1707 if (IS_OSPF_ABR(ospf
) && abr_inv
)
1708 ospf_schedule_abr_task(ospf
);
1712 /* If prefix-list is updated, do some updates. */
1713 void ospf_prefix_list_update(struct prefix_list
*plist
)
1715 struct ospf
*ospf
= NULL
;
1718 struct ospf_area
*area
;
1719 struct listnode
*node
, *n1
;
1721 /* If OSPF instatnce does not exist, return right now. */
1722 if (listcount(om
->ospf
) == 0)
1725 /* Iterate all ospf [VRF] instances */
1726 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, n1
, ospf
)) {
1728 /* Update all route-maps which are used
1729 * as redistribution filters.
1730 * They might use prefix-list.
1732 for (type
= 0; type
<= ZEBRA_ROUTE_MAX
; type
++) {
1733 struct list
*red_list
;
1734 struct ospf_redist
*red
;
1736 red_list
= ospf
->redist
[type
];
1740 for (ALL_LIST_ELEMENTS_RO(red_list
, node
, red
)) {
1741 if (ROUTEMAP(red
)) {
1742 /* if route-map is not NULL
1744 * this prefix list */
1745 ospf_distribute_list_update(
1746 ospf
, type
, red
->instance
);
1751 /* Update area filter-lists. */
1752 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
)) {
1753 /* Update filter-list in. */
1754 if (PREFIX_NAME_IN(area
)
1755 && strcmp(PREFIX_NAME_IN(area
),
1756 prefix_list_name(plist
))
1758 PREFIX_LIST_IN(area
) = prefix_list_lookup(
1759 AFI_IP
, PREFIX_NAME_IN(area
));
1763 /* Update filter-list out. */
1764 if (PREFIX_NAME_OUT(area
)
1765 && strcmp(PREFIX_NAME_OUT(area
),
1766 prefix_list_name(plist
))
1768 PREFIX_LIST_IN(area
) = prefix_list_lookup(
1769 AFI_IP
, PREFIX_NAME_OUT(area
));
1774 /* Schedule ABR task. */
1775 if (IS_OSPF_ABR(ospf
) && abr_inv
)
1776 ospf_schedule_abr_task(ospf
);
1780 static struct ospf_distance
*ospf_distance_new(void)
1782 return XCALLOC(MTYPE_OSPF_DISTANCE
, sizeof(struct ospf_distance
));
1785 static void ospf_distance_free(struct ospf_distance
*odistance
)
1787 XFREE(MTYPE_OSPF_DISTANCE
, odistance
);
1790 int ospf_distance_set(struct vty
*vty
, struct ospf
*ospf
,
1791 const char *distance_str
, const char *ip_str
,
1792 const char *access_list_str
)
1795 struct prefix_ipv4 p
;
1797 struct route_node
*rn
;
1798 struct ospf_distance
*odistance
;
1800 ret
= str2prefix_ipv4(ip_str
, &p
);
1802 vty_out(vty
, "Malformed prefix\n");
1803 return CMD_WARNING_CONFIG_FAILED
;
1806 distance
= atoi(distance_str
);
1808 /* Get OSPF distance node. */
1809 rn
= route_node_get(ospf
->distance_table
, (struct prefix
*)&p
);
1811 odistance
= rn
->info
;
1812 route_unlock_node(rn
);
1814 odistance
= ospf_distance_new();
1815 rn
->info
= odistance
;
1818 /* Set distance value. */
1819 odistance
->distance
= distance
;
1821 /* Reset access-list configuration. */
1822 if (odistance
->access_list
) {
1823 free(odistance
->access_list
);
1824 odistance
->access_list
= NULL
;
1826 if (access_list_str
)
1827 odistance
->access_list
= strdup(access_list_str
);
1832 int ospf_distance_unset(struct vty
*vty
, struct ospf
*ospf
,
1833 const char *distance_str
, const char *ip_str
,
1834 char const *access_list_str
)
1837 struct prefix_ipv4 p
;
1838 struct route_node
*rn
;
1839 struct ospf_distance
*odistance
;
1841 ret
= str2prefix_ipv4(ip_str
, &p
);
1843 vty_out(vty
, "Malformed prefix\n");
1844 return CMD_WARNING_CONFIG_FAILED
;
1847 rn
= route_node_lookup(ospf
->distance_table
, (struct prefix
*)&p
);
1849 vty_out(vty
, "Can't find specified prefix\n");
1850 return CMD_WARNING_CONFIG_FAILED
;
1853 odistance
= rn
->info
;
1855 if (odistance
->access_list
)
1856 free(odistance
->access_list
);
1857 ospf_distance_free(odistance
);
1860 route_unlock_node(rn
);
1861 route_unlock_node(rn
);
1866 void ospf_distance_reset(struct ospf
*ospf
)
1868 struct route_node
*rn
;
1869 struct ospf_distance
*odistance
;
1871 for (rn
= route_top(ospf
->distance_table
); rn
; rn
= route_next(rn
)) {
1872 odistance
= rn
->info
;
1876 if (odistance
->access_list
)
1877 free(odistance
->access_list
);
1878 ospf_distance_free(odistance
);
1880 route_unlock_node(rn
);
1884 uint8_t ospf_distance_apply(struct ospf
*ospf
, struct prefix_ipv4
*p
,
1885 struct ospf_route
* or)
1891 if (ospf
->distance_intra
&& or->path_type
== OSPF_PATH_INTRA_AREA
)
1892 return ospf
->distance_intra
;
1894 if (ospf
->distance_inter
&& or->path_type
== OSPF_PATH_INTER_AREA
)
1895 return ospf
->distance_inter
;
1897 if (ospf
->distance_external
1898 && (or->path_type
== OSPF_PATH_TYPE1_EXTERNAL
||
1899 or->path_type
== OSPF_PATH_TYPE2_EXTERNAL
))
1900 return ospf
->distance_external
;
1902 if (ospf
->distance_all
)
1903 return ospf
->distance_all
;
1908 void ospf_zebra_vrf_register(struct ospf
*ospf
)
1910 if (!zclient
|| zclient
->sock
< 0 || !ospf
)
1913 if (ospf
->vrf_id
!= VRF_UNKNOWN
) {
1914 if (IS_DEBUG_OSPF_EVENT
)
1915 zlog_debug("%s: Register VRF %s id %u", __func__
,
1916 ospf_vrf_id_to_name(ospf
->vrf_id
),
1918 zclient_send_reg_requests(zclient
, ospf
->vrf_id
);
1922 void ospf_zebra_vrf_deregister(struct ospf
*ospf
)
1924 if (!zclient
|| zclient
->sock
< 0 || !ospf
)
1927 if (ospf
->vrf_id
!= VRF_DEFAULT
&& ospf
->vrf_id
!= VRF_UNKNOWN
) {
1928 if (IS_DEBUG_OSPF_EVENT
)
1929 zlog_debug("%s: De-Register VRF %s id %u to Zebra.",
1930 __func__
, ospf_vrf_id_to_name(ospf
->vrf_id
),
1932 /* Deregister for router-id, interfaces,
1933 * redistributed routes. */
1934 zclient_send_dereg_requests(zclient
, ospf
->vrf_id
);
1938 /* Label Manager Functions */
1941 * Check if Label Manager is Ready or not.
1943 * @return True if Label Manager is ready, False otherwise
1945 bool ospf_zebra_label_manager_ready(void)
1947 return (zclient_sync
->sock
> 0);
1951 * Request Label Range to the Label Manager.
1953 * @param base base label of the label range to request
1954 * @param chunk_size size of the label range to request
1956 * @return 0 on success, -1 on failure
1958 int ospf_zebra_request_label_range(uint32_t base
, uint32_t chunk_size
)
1961 uint32_t start
, end
;
1963 if (zclient_sync
->sock
< 0)
1966 ret
= lm_get_label_chunk(zclient_sync
, 0, base
, chunk_size
, &start
,
1969 zlog_warn("%s: error getting label range!", __func__
);
1977 * Release Label Range to the Label Manager.
1979 * @param start start of label range to release
1980 * @param end end of label range to release
1982 * @return 0 on success, -1 otherwise
1984 int ospf_zebra_release_label_range(uint32_t start
, uint32_t end
)
1988 if (zclient_sync
->sock
< 0)
1991 ret
= lm_release_label_chunk(zclient_sync
, start
, end
);
1993 zlog_warn("%s: error releasing label range!", __func__
);
2001 * Connect to the Label Manager.
2003 * @return 0 on success, -1 otherwise
2005 int ospf_zebra_label_manager_connect(void)
2007 /* Connect to label manager. */
2008 if (zclient_socket_connect(zclient_sync
) < 0) {
2009 zlog_warn("%s: failed connecting synchronous zclient!",
2013 /* make socket non-blocking */
2014 set_nonblocking(zclient_sync
->sock
);
2016 /* Send hello to notify zebra this is a synchronous client */
2017 if (zclient_send_hello(zclient_sync
) == ZCLIENT_SEND_FAILURE
) {
2018 zlog_warn("%s: failed sending hello for synchronous zclient!",
2020 close(zclient_sync
->sock
);
2021 zclient_sync
->sock
= -1;
2025 /* Connect to label manager */
2026 if (lm_label_manager_connect(zclient_sync
, 0) != 0) {
2027 zlog_warn("%s: failed connecting to label manager!", __func__
);
2028 if (zclient_sync
->sock
> 0) {
2029 close(zclient_sync
->sock
);
2030 zclient_sync
->sock
= -1;
2035 osr_debug("SR (%s): Successfully connected to the Label Manager",
2041 static void ospf_zebra_connected(struct zclient
*zclient
)
2043 /* Send the client registration */
2044 bfd_client_sendmsg(zclient
, ZEBRA_BFD_CLIENT_REGISTER
, VRF_DEFAULT
);
2046 zclient_send_reg_requests(zclient
, VRF_DEFAULT
);
2050 * opaque messages between processes
2052 static int ospf_opaque_msg_handler(ZAPI_CALLBACK_ARGS
)
2055 struct zapi_opaque_msg info
;
2056 struct ldp_igp_sync_if_state state
;
2057 struct ldp_igp_sync_announce announce
;
2058 struct zapi_opaque_reg_info dst
;
2063 if (zclient_opaque_decode(s
, &info
) != 0)
2066 switch (info
.type
) {
2067 case LINK_STATE_SYNC
:
2068 STREAM_GETC(s
, dst
.proto
);
2069 STREAM_GETW(s
, dst
.instance
);
2070 STREAM_GETL(s
, dst
.session_id
);
2071 dst
.type
= LINK_STATE_SYNC
;
2072 ret
= ospf_te_sync_ted(dst
);
2074 case LDP_IGP_SYNC_IF_STATE_UPDATE
:
2075 STREAM_GET(&state
, s
, sizeof(state
));
2076 ret
= ospf_ldp_sync_state_update(state
);
2078 case LDP_IGP_SYNC_ANNOUNCE_UPDATE
:
2079 STREAM_GET(&announce
, s
, sizeof(announce
));
2080 ret
= ospf_ldp_sync_announce_update(announce
);
2091 static int ospf_zebra_client_close_notify(ZAPI_CALLBACK_ARGS
)
2095 struct zapi_client_close_info info
;
2097 if (zapi_client_close_notify_decode(zclient
->ibuf
, &info
) < 0)
2100 ospf_ldp_sync_handle_client_close(&info
);
2105 static zclient_handler
*const ospf_handlers
[] = {
2106 [ZEBRA_ROUTER_ID_UPDATE
] = ospf_router_id_update_zebra
,
2107 [ZEBRA_INTERFACE_ADDRESS_ADD
] = ospf_interface_address_add
,
2108 [ZEBRA_INTERFACE_ADDRESS_DELETE
] = ospf_interface_address_delete
,
2109 [ZEBRA_INTERFACE_LINK_PARAMS
] = ospf_interface_link_params
,
2110 [ZEBRA_INTERFACE_VRF_UPDATE
] = ospf_interface_vrf_update
,
2112 [ZEBRA_REDISTRIBUTE_ROUTE_ADD
] = ospf_zebra_read_route
,
2113 [ZEBRA_REDISTRIBUTE_ROUTE_DEL
] = ospf_zebra_read_route
,
2115 [ZEBRA_OPAQUE_MESSAGE
] = ospf_opaque_msg_handler
,
2117 [ZEBRA_CLIENT_CLOSE_NOTIFY
] = ospf_zebra_client_close_notify
,
2120 void ospf_zebra_init(struct thread_master
*master
, unsigned short instance
)
2122 /* Allocate zebra structure. */
2123 zclient
= zclient_new(master
, &zclient_options_default
, ospf_handlers
,
2124 array_size(ospf_handlers
));
2125 zclient_init(zclient
, ZEBRA_ROUTE_OSPF
, instance
, &ospfd_privs
);
2126 zclient
->zebra_connected
= ospf_zebra_connected
;
2128 /* Initialize special zclient for synchronous message exchanges. */
2129 struct zclient_options options
= zclient_options_default
;
2130 options
.synchronous
= true;
2131 zclient_sync
= zclient_new(master
, &options
, NULL
, 0);
2132 zclient_sync
->sock
= -1;
2133 zclient_sync
->redist_default
= ZEBRA_ROUTE_OSPF
;
2134 zclient_sync
->instance
= instance
;
2136 * session_id must be different from default value (0) to distinguish
2137 * the asynchronous socket from the synchronous one
2139 zclient_sync
->session_id
= 1;
2140 zclient_sync
->privs
= &ospfd_privs
;
2142 access_list_add_hook(ospf_filter_update
);
2143 access_list_delete_hook(ospf_filter_update
);
2144 prefix_list_add_hook(ospf_prefix_list_update
);
2145 prefix_list_delete_hook(ospf_prefix_list_update
);
2148 void ospf_zebra_send_arp(const struct interface
*ifp
, const struct prefix
*p
)
2150 zclient_send_neigh_discovery_req(zclient
, ifp
, p
);