diff options
author | whitespace / reindent <invalid@invalid.invalid> | 2017-07-17 14:03:14 +0200 |
---|---|---|
committer | whitespace / reindent <invalid@invalid.invalid> | 2017-07-17 14:04:07 +0200 |
commit | d62a17aedeb0eebdba98238874bb13d62c48dbf9 (patch) | |
tree | 3b319b1d61c8b85b4d1f06adf8b844bb8a9b5107 /ospfd/ospf_zebra.c | |
parent | *: add indent control files (diff) | |
download | frr-d62a17aedeb0eebdba98238874bb13d62c48dbf9.tar.xz frr-d62a17aedeb0eebdba98238874bb13d62c48dbf9.zip |
*: reindentreindent-master-after
indent.py `git ls-files | pcregrep '\.[ch]$' | pcregrep -v '^(ldpd|babeld|nhrpd)/'`
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
Diffstat (limited to 'ospfd/ospf_zebra.c')
-rw-r--r-- | ospfd/ospf_zebra.c | 2507 |
1 files changed, 1225 insertions, 1282 deletions
diff --git a/ospfd/ospf_zebra.c b/ospfd/ospf_zebra.c index e262bd8aa..c6b0955da 100644 --- a/ospfd/ospf_zebra.c +++ b/ospfd/ospf_zebra.c @@ -51,8 +51,8 @@ #include "ospfd/ospf_zebra.h" #include "ospfd/ospf_te.h" -DEFINE_HOOK(ospf_if_update, (struct interface *ifp), (ifp)) -DEFINE_HOOK(ospf_if_delete, (struct interface *ifp), (ifp)) +DEFINE_HOOK(ospf_if_update, (struct interface * ifp), (ifp)) +DEFINE_HOOK(ospf_if_delete, (struct interface * ifp), (ifp)) /* Zebra structure to hold current status. */ struct zclient *zclient = NULL; @@ -62,1536 +62,1479 @@ extern struct thread_master *master; struct in_addr router_id_zebra; /* Router-id update message from zebra. */ -static int -ospf_router_id_update_zebra (int command, struct zclient *zclient, - zebra_size_t length, vrf_id_t vrf_id) +static int ospf_router_id_update_zebra(int command, struct zclient *zclient, + zebra_size_t length, vrf_id_t vrf_id) { - struct ospf *ospf; - struct prefix router_id; - zebra_router_id_update_read(zclient->ibuf,&router_id); - - if (IS_DEBUG_OSPF (zebra, ZEBRA_INTERFACE)) - { - char buf[PREFIX2STR_BUFFER]; - prefix2str(&router_id, buf, sizeof(buf)); - zlog_debug("Zebra rcvd: router id update %s", buf); - } - - router_id_zebra = router_id.u.prefix4; - - ospf = ospf_lookup (); - - if (ospf != NULL) - ospf_router_id_update (ospf); - - return 0; + struct ospf *ospf; + struct prefix router_id; + zebra_router_id_update_read(zclient->ibuf, &router_id); + + if (IS_DEBUG_OSPF(zebra, ZEBRA_INTERFACE)) { + char buf[PREFIX2STR_BUFFER]; + prefix2str(&router_id, buf, sizeof(buf)); + zlog_debug("Zebra rcvd: router id update %s", buf); + } + + router_id_zebra = router_id.u.prefix4; + + ospf = ospf_lookup(); + + if (ospf != NULL) + ospf_router_id_update(ospf); + + return 0; } /* Inteface addition message from zebra. */ -static int -ospf_interface_add (int command, struct zclient *zclient, zebra_size_t length, - vrf_id_t vrf_id) +static int ospf_interface_add(int command, struct zclient *zclient, + zebra_size_t length, vrf_id_t vrf_id) { - struct interface *ifp; + struct interface *ifp; - ifp = zebra_interface_add_read (zclient->ibuf, vrf_id); + ifp = zebra_interface_add_read(zclient->ibuf, vrf_id); - if (IS_DEBUG_OSPF (zebra, ZEBRA_INTERFACE)) - zlog_debug ("Zebra: interface add %s[%u] index %d flags %llx metric %d mtu %d", - ifp->name, ifp->vrf_id, ifp->ifindex, (unsigned long long)ifp->flags, - ifp->metric, ifp->mtu); + if (IS_DEBUG_OSPF(zebra, ZEBRA_INTERFACE)) + zlog_debug( + "Zebra: interface add %s[%u] index %d flags %llx metric %d mtu %d", + ifp->name, ifp->vrf_id, ifp->ifindex, + (unsigned long long)ifp->flags, ifp->metric, ifp->mtu); - assert (ifp->info); + assert(ifp->info); - if (!OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (ifp), type)) - { - SET_IF_PARAM (IF_DEF_PARAMS (ifp), type); - IF_DEF_PARAMS (ifp)->type = ospf_default_iftype(ifp); - } + if (!OSPF_IF_PARAM_CONFIGURED(IF_DEF_PARAMS(ifp), type)) { + SET_IF_PARAM(IF_DEF_PARAMS(ifp), type); + IF_DEF_PARAMS(ifp)->type = ospf_default_iftype(ifp); + } - ospf_if_update (NULL, ifp); + ospf_if_update(NULL, ifp); - hook_call(ospf_if_update, ifp); + hook_call(ospf_if_update, ifp); - return 0; + return 0; } -static int -ospf_interface_delete (int command, struct zclient *zclient, - zebra_size_t length, vrf_id_t vrf_id) +static int ospf_interface_delete(int command, struct zclient *zclient, + zebra_size_t length, vrf_id_t vrf_id) { - struct interface *ifp; - struct stream *s; - struct route_node *rn; + struct interface *ifp; + struct stream *s; + struct route_node *rn; - s = zclient->ibuf; - /* zebra_interface_state_read() updates interface structure in iflist */ - ifp = zebra_interface_state_read (s, vrf_id); + s = zclient->ibuf; + /* zebra_interface_state_read() updates interface structure in iflist */ + ifp = zebra_interface_state_read(s, vrf_id); - if (ifp == NULL) - return 0; + if (ifp == NULL) + return 0; - if (if_is_up (ifp)) - zlog_warn ("Zebra: got delete of %s, but interface is still up", - ifp->name); + if (if_is_up(ifp)) + zlog_warn("Zebra: got delete of %s, but interface is still up", + ifp->name); - if (IS_DEBUG_OSPF (zebra, ZEBRA_INTERFACE)) - zlog_debug - ("Zebra: interface delete %s[%u] index %d flags %llx metric %d mtu %d", - ifp->name, ifp->vrf_id, ifp->ifindex, (unsigned long long)ifp->flags, ifp->metric, ifp->mtu); + if (IS_DEBUG_OSPF(zebra, ZEBRA_INTERFACE)) + zlog_debug( + "Zebra: interface delete %s[%u] index %d flags %llx metric %d mtu %d", + ifp->name, ifp->vrf_id, ifp->ifindex, + (unsigned long long)ifp->flags, ifp->metric, ifp->mtu); - hook_call(ospf_if_delete, ifp); + hook_call(ospf_if_delete, ifp); - for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn)) - if (rn->info) - ospf_if_free ((struct ospf_interface *) rn->info); + for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next(rn)) + if (rn->info) + ospf_if_free((struct ospf_interface *)rn->info); - ifp->ifindex = IFINDEX_DELETED; - return 0; + ifp->ifindex = IFINDEX_DELETED; + return 0; } -static struct interface * -zebra_interface_if_lookup (struct stream *s, vrf_id_t vrf_id) +static struct interface *zebra_interface_if_lookup(struct stream *s, + vrf_id_t vrf_id) { - char ifname_tmp[INTERFACE_NAMSIZ]; + char ifname_tmp[INTERFACE_NAMSIZ]; - /* Read interface name. */ - stream_get (ifname_tmp, s, INTERFACE_NAMSIZ); + /* Read interface name. */ + stream_get(ifname_tmp, s, INTERFACE_NAMSIZ); - /* And look it up. */ - return if_lookup_by_name_len(ifname_tmp, - strnlen(ifname_tmp, INTERFACE_NAMSIZ), - VRF_DEFAULT); + /* And look it up. */ + return if_lookup_by_name_len( + ifname_tmp, strnlen(ifname_tmp, INTERFACE_NAMSIZ), VRF_DEFAULT); } -static int -ospf_interface_state_up (int command, struct zclient *zclient, - zebra_size_t length, vrf_id_t vrf_id) +static int ospf_interface_state_up(int command, struct zclient *zclient, + zebra_size_t length, vrf_id_t vrf_id) { - struct interface *ifp; - struct ospf_interface *oi; - struct route_node *rn; - - ifp = zebra_interface_if_lookup (zclient->ibuf, vrf_id); - - if (ifp == NULL) - return 0; - - /* Interface is already up. */ - if (if_is_operative (ifp)) - { - /* Temporarily keep ifp values. */ - struct interface if_tmp; - memcpy (&if_tmp, ifp, sizeof (struct interface)); - - zebra_interface_if_set_value (zclient->ibuf, ifp); - - if (IS_DEBUG_OSPF (zebra, ZEBRA_INTERFACE)) - zlog_debug ("Zebra: Interface[%s] state update speed %u -> %u, bw %d -> %d", - ifp->name, if_tmp.speed, ifp->speed, if_tmp.bandwidth, ifp->bandwidth); - - ospf_if_recalculate_output_cost (ifp); - - if (if_tmp.mtu != ifp->mtu) - { - if (IS_DEBUG_OSPF (zebra, ZEBRA_INTERFACE)) - zlog_debug ("Zebra: Interface[%s] MTU change %u -> %u.", - ifp->name, if_tmp.mtu, ifp->mtu); - - /* Must reset the interface (simulate down/up) when MTU changes. */ - ospf_if_reset(ifp); + struct interface *ifp; + struct ospf_interface *oi; + struct route_node *rn; + + ifp = zebra_interface_if_lookup(zclient->ibuf, vrf_id); + + if (ifp == NULL) + return 0; + + /* Interface is already up. */ + if (if_is_operative(ifp)) { + /* Temporarily keep ifp values. */ + struct interface if_tmp; + memcpy(&if_tmp, ifp, sizeof(struct interface)); + + zebra_interface_if_set_value(zclient->ibuf, ifp); + + if (IS_DEBUG_OSPF(zebra, ZEBRA_INTERFACE)) + zlog_debug( + "Zebra: Interface[%s] state update speed %u -> %u, bw %d -> %d", + ifp->name, if_tmp.speed, ifp->speed, + if_tmp.bandwidth, ifp->bandwidth); + + ospf_if_recalculate_output_cost(ifp); + + if (if_tmp.mtu != ifp->mtu) { + if (IS_DEBUG_OSPF(zebra, ZEBRA_INTERFACE)) + zlog_debug( + "Zebra: Interface[%s] MTU change %u -> %u.", + ifp->name, if_tmp.mtu, ifp->mtu); + + /* Must reset the interface (simulate down/up) when MTU + * changes. */ + ospf_if_reset(ifp); + } + return 0; } - return 0; - } - zebra_interface_if_set_value (zclient->ibuf, ifp); + zebra_interface_if_set_value(zclient->ibuf, ifp); - if (IS_DEBUG_OSPF (zebra, ZEBRA_INTERFACE)) - zlog_debug ("Zebra: Interface[%s] state change to up.", ifp->name); + if (IS_DEBUG_OSPF(zebra, ZEBRA_INTERFACE)) + zlog_debug("Zebra: Interface[%s] state change to up.", + ifp->name); - for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn)) - { - if ((oi = rn->info) == NULL) - continue; + for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next(rn)) { + if ((oi = rn->info) == NULL) + continue; - ospf_if_up (oi); - } + ospf_if_up(oi); + } - return 0; + return 0; } -static int -ospf_interface_state_down (int command, struct zclient *zclient, - zebra_size_t length, vrf_id_t vrf_id) +static int ospf_interface_state_down(int command, struct zclient *zclient, + zebra_size_t length, vrf_id_t vrf_id) { - struct interface *ifp; - struct ospf_interface *oi; - struct route_node *node; + struct interface *ifp; + struct ospf_interface *oi; + struct route_node *node; - ifp = zebra_interface_state_read (zclient->ibuf, vrf_id); + ifp = zebra_interface_state_read(zclient->ibuf, vrf_id); - if (ifp == NULL) - return 0; + if (ifp == NULL) + return 0; - if (IS_DEBUG_OSPF (zebra, ZEBRA_INTERFACE)) - zlog_debug ("Zebra: Interface[%s] state change to down.", ifp->name); + if (IS_DEBUG_OSPF(zebra, ZEBRA_INTERFACE)) + zlog_debug("Zebra: Interface[%s] state change to down.", + ifp->name); - for (node = route_top (IF_OIFS (ifp)); node; node = route_next (node)) - { - if ((oi = node->info) == NULL) - continue; - ospf_if_down (oi); - } + for (node = route_top(IF_OIFS(ifp)); node; node = route_next(node)) { + if ((oi = node->info) == NULL) + continue; + ospf_if_down(oi); + } - return 0; + return 0; } -static int -ospf_interface_address_add (int command, struct zclient *zclient, - zebra_size_t length, vrf_id_t vrf_id) +static int ospf_interface_address_add(int command, struct zclient *zclient, + zebra_size_t length, vrf_id_t vrf_id) { - struct connected *c; + struct connected *c; - c = zebra_interface_address_read (command, zclient->ibuf, vrf_id); + c = zebra_interface_address_read(command, zclient->ibuf, vrf_id); - if (c == NULL) - return 0; + if (c == NULL) + return 0; - if (IS_DEBUG_OSPF (zebra, ZEBRA_INTERFACE)) - { - char buf[PREFIX2STR_BUFFER]; - prefix2str(c->address, buf, sizeof(buf)); - zlog_debug("Zebra: interface %s address add %s", c->ifp->name, buf); - } + if (IS_DEBUG_OSPF(zebra, ZEBRA_INTERFACE)) { + char buf[PREFIX2STR_BUFFER]; + prefix2str(c->address, buf, sizeof(buf)); + zlog_debug("Zebra: interface %s address add %s", c->ifp->name, + buf); + } - ospf_if_update (NULL, c->ifp); + ospf_if_update(NULL, c->ifp); - hook_call(ospf_if_update, c->ifp); + hook_call(ospf_if_update, c->ifp); - return 0; + return 0; } -static int -ospf_interface_address_delete (int command, struct zclient *zclient, - zebra_size_t length, vrf_id_t vrf_id) +static int ospf_interface_address_delete(int command, struct zclient *zclient, + zebra_size_t length, vrf_id_t vrf_id) { - struct connected *c; - struct interface *ifp; - struct ospf_interface *oi; - struct route_node *rn; - struct prefix p; - - c = zebra_interface_address_read (command, zclient->ibuf, vrf_id); - - if (c == NULL) - return 0; - - if (IS_DEBUG_OSPF (zebra, ZEBRA_INTERFACE)) - { - char buf[PREFIX2STR_BUFFER]; - prefix2str(c->address, buf, sizeof(buf)); - zlog_debug("Zebra: interface %s address delete %s", c->ifp->name, buf); - } + struct connected *c; + struct interface *ifp; + struct ospf_interface *oi; + struct route_node *rn; + struct prefix p; + + c = zebra_interface_address_read(command, zclient->ibuf, vrf_id); + + if (c == NULL) + return 0; + + if (IS_DEBUG_OSPF(zebra, ZEBRA_INTERFACE)) { + char buf[PREFIX2STR_BUFFER]; + prefix2str(c->address, buf, sizeof(buf)); + zlog_debug("Zebra: interface %s address delete %s", + c->ifp->name, buf); + } - ifp = c->ifp; - p = *c->address; - p.prefixlen = IPV4_MAX_PREFIXLEN; + ifp = c->ifp; + p = *c->address; + p.prefixlen = IPV4_MAX_PREFIXLEN; - rn = route_node_lookup (IF_OIFS (ifp), &p); - if (!rn) - { - connected_free (c); - return 0; - } + rn = route_node_lookup(IF_OIFS(ifp), &p); + if (!rn) { + connected_free(c); + return 0; + } - assert (rn->info); - oi = rn->info; - route_unlock_node (rn); + assert(rn->info); + oi = rn->info; + route_unlock_node(rn); - /* Call interface hook functions to clean up */ - ospf_if_free (oi); + /* Call interface hook functions to clean up */ + ospf_if_free(oi); - hook_call(ospf_if_update, c->ifp); + hook_call(ospf_if_update, c->ifp); - connected_free (c); + connected_free(c); - return 0; + return 0; } -static int -ospf_interface_link_params (int command, struct zclient *zclient, - zebra_size_t length) +static int ospf_interface_link_params(int command, struct zclient *zclient, + zebra_size_t length) { - struct interface *ifp; + struct interface *ifp; - ifp = zebra_interface_link_params_read (zclient->ibuf); + ifp = zebra_interface_link_params_read(zclient->ibuf); - if (ifp == NULL) - return 0; + if (ifp == NULL) + return 0; - /* Update TE TLV */ - ospf_mpls_te_update_if (ifp); + /* Update TE TLV */ + ospf_mpls_te_update_if(ifp); - return 0; + return 0; } -void -ospf_zebra_add (struct prefix_ipv4 *p, struct ospf_route *or) +void ospf_zebra_add(struct prefix_ipv4 *p, struct ospf_route * or) { - u_char message; - u_char distance; - u_int32_t flags; - int psize; - struct stream *s; - struct ospf_path *path; - struct listnode *node; - struct ospf *ospf = ospf_lookup (); - - if ((ospf->instance && - redist_check_instance(&zclient->mi_redist[AFI_IP][ZEBRA_ROUTE_OSPF], ospf->instance)) - || - vrf_bitmap_check (zclient->redist[AFI_IP][ZEBRA_ROUTE_OSPF], VRF_DEFAULT)) - { - message = 0; - flags = 0; - - /* OSPF pass nexthop and metric */ - SET_FLAG (message, ZAPI_MESSAGE_NEXTHOP); - SET_FLAG (message, ZAPI_MESSAGE_METRIC); - - /* Distance value. */ - distance = ospf_distance_apply (p, or); - if (distance) - SET_FLAG (message, ZAPI_MESSAGE_DISTANCE); - - /* Check if path type is ASE */ - if (((or->path_type == OSPF_PATH_TYPE1_EXTERNAL) || - (or->path_type == OSPF_PATH_TYPE2_EXTERNAL)) && - (or->u.ext.tag > 0) && (or->u.ext.tag <= ROUTE_TAG_MAX)) - SET_FLAG (message, ZAPI_MESSAGE_TAG); - - /* Make packet. */ - s = zclient->obuf; - stream_reset (s); - - /* Put command, type, flags, message. */ - zclient_create_header (s, ZEBRA_IPV4_ROUTE_ADD, VRF_DEFAULT); - stream_putc (s, ZEBRA_ROUTE_OSPF); - stream_putw (s, ospf->instance); - stream_putl (s, flags); - stream_putc (s, message); - stream_putw (s, SAFI_UNICAST); - - /* Put prefix information. */ - psize = PSIZE (p->prefixlen); - stream_putc (s, p->prefixlen); - stream_write (s, (u_char *) & p->prefix, psize); - - /* Nexthop count. */ - stream_putc (s, or->paths->count); - - /* Nexthop, ifindex, distance and metric information. */ - for (ALL_LIST_ELEMENTS_RO (or->paths, node, path)) - { + u_char message; + u_char distance; + u_int32_t flags; + int psize; + struct stream *s; + struct ospf_path *path; + struct listnode *node; + struct ospf *ospf = ospf_lookup(); + + if ((ospf->instance + && redist_check_instance( + &zclient->mi_redist[AFI_IP][ZEBRA_ROUTE_OSPF], + ospf->instance)) + || vrf_bitmap_check(zclient->redist[AFI_IP][ZEBRA_ROUTE_OSPF], + VRF_DEFAULT)) { + message = 0; + flags = 0; + + /* OSPF pass nexthop and metric */ + SET_FLAG(message, ZAPI_MESSAGE_NEXTHOP); + SET_FLAG(message, ZAPI_MESSAGE_METRIC); + + /* Distance value. */ + distance = ospf_distance_apply(p, or); + if (distance) + SET_FLAG(message, ZAPI_MESSAGE_DISTANCE); + + /* Check if path type is ASE */ + if (((or->path_type == OSPF_PATH_TYPE1_EXTERNAL) + || (or->path_type == OSPF_PATH_TYPE2_EXTERNAL)) + && (or->u.ext.tag > 0) && (or->u.ext.tag <= ROUTE_TAG_MAX)) + SET_FLAG(message, ZAPI_MESSAGE_TAG); + + /* Make packet. */ + s = zclient->obuf; + stream_reset(s); + + /* Put command, type, flags, message. */ + zclient_create_header(s, ZEBRA_IPV4_ROUTE_ADD, VRF_DEFAULT); + stream_putc(s, ZEBRA_ROUTE_OSPF); + stream_putw(s, ospf->instance); + stream_putl(s, flags); + stream_putc(s, message); + stream_putw(s, SAFI_UNICAST); + + /* Put prefix information. */ + psize = PSIZE(p->prefixlen); + stream_putc(s, p->prefixlen); + stream_write(s, (u_char *)&p->prefix, psize); + + /* Nexthop count. */ + stream_putc(s, or->paths->count); + + /* Nexthop, ifindex, distance and metric information. */ + for (ALL_LIST_ELEMENTS_RO(or->paths, node, path)) { #ifdef HAVE_NETLINK - if (path->unnumbered || - (path->nexthop.s_addr != INADDR_ANY && - path->ifindex != 0)) - { - stream_putc (s, NEXTHOP_TYPE_IPV4_IFINDEX); - stream_put_in_addr (s, &path->nexthop); - stream_putl (s, path->ifindex); - } - else if (path->nexthop.s_addr != INADDR_ANY) - { - stream_putc (s, NEXTHOP_TYPE_IPV4); - stream_put_in_addr (s, &path->nexthop); - } - else - { - stream_putc (s, NEXTHOP_TYPE_IFINDEX); - if (path->ifindex) - stream_putl (s, path->ifindex); - else - stream_putl (s, 0); - } + if (path->unnumbered + || (path->nexthop.s_addr != INADDR_ANY + && path->ifindex != 0)) { + stream_putc(s, NEXTHOP_TYPE_IPV4_IFINDEX); + stream_put_in_addr(s, &path->nexthop); + stream_putl(s, path->ifindex); + } else if (path->nexthop.s_addr != INADDR_ANY) { + stream_putc(s, NEXTHOP_TYPE_IPV4); + stream_put_in_addr(s, &path->nexthop); + } else { + stream_putc(s, NEXTHOP_TYPE_IFINDEX); + if (path->ifindex) + stream_putl(s, path->ifindex); + else + stream_putl(s, 0); + } #else /* HAVE_NETLINK */ - if (path->nexthop.s_addr != INADDR_ANY && - path->ifindex != 0) - { - stream_putc (s, NEXTHOP_TYPE_IPV4_IFINDEX); - stream_put_in_addr (s, &path->nexthop); - stream_putl (s, path->ifindex); - } - else if (path->nexthop.s_addr != INADDR_ANY) - { - stream_putc (s, NEXTHOP_TYPE_IPV4); - stream_put_in_addr (s, &path->nexthop); - } - else - { - stream_putc (s, NEXTHOP_TYPE_IFINDEX); - if (path->ifindex) - stream_putl (s, path->ifindex); - else - stream_putl (s, 0); - } + if (path->nexthop.s_addr != INADDR_ANY + && path->ifindex != 0) { + stream_putc(s, NEXTHOP_TYPE_IPV4_IFINDEX); + stream_put_in_addr(s, &path->nexthop); + stream_putl(s, path->ifindex); + } else if (path->nexthop.s_addr != INADDR_ANY) { + stream_putc(s, NEXTHOP_TYPE_IPV4); + stream_put_in_addr(s, &path->nexthop); + } else { + stream_putc(s, NEXTHOP_TYPE_IFINDEX); + if (path->ifindex) + stream_putl(s, path->ifindex); + else + stream_putl(s, 0); + } #endif /* HAVE_NETLINK */ - if (IS_DEBUG_OSPF (zebra, ZEBRA_REDISTRIBUTE)) - { - char buf[2][INET_ADDRSTRLEN]; - zlog_debug("Zebra: Route add %s/%d nexthop %s, ifindex=%d", - inet_ntop(AF_INET, &p->prefix, - buf[0], sizeof(buf[0])), - p->prefixlen, - inet_ntop(AF_INET, &path->nexthop, - buf[1], sizeof(buf[1])), - path->ifindex); - } - } - - if (CHECK_FLAG (message, ZAPI_MESSAGE_DISTANCE)) - stream_putc (s, distance); - if (CHECK_FLAG (message, ZAPI_MESSAGE_METRIC)) - { - if (or->path_type == OSPF_PATH_TYPE1_EXTERNAL) - stream_putl (s, or->cost + or->u.ext.type2_cost); - else if (or->path_type == OSPF_PATH_TYPE2_EXTERNAL) - stream_putl (s, or->u.ext.type2_cost); - else - stream_putl (s, or->cost); - } - - if (CHECK_FLAG (message, ZAPI_MESSAGE_TAG)) - stream_putl (s, or->u.ext.tag); - - stream_putw_at (s, 0, stream_get_endp (s)); - - zclient_send_message(zclient); - } + if (IS_DEBUG_OSPF(zebra, ZEBRA_REDISTRIBUTE)) { + char buf[2][INET_ADDRSTRLEN]; + zlog_debug( + "Zebra: Route add %s/%d nexthop %s, ifindex=%d", + inet_ntop(AF_INET, &p->prefix, buf[0], + sizeof(buf[0])), + p->prefixlen, + inet_ntop(AF_INET, &path->nexthop, + buf[1], sizeof(buf[1])), + path->ifindex); + } + } + + if (CHECK_FLAG(message, ZAPI_MESSAGE_DISTANCE)) + stream_putc(s, distance); + if (CHECK_FLAG(message, ZAPI_MESSAGE_METRIC)) { + if (or->path_type == OSPF_PATH_TYPE1_EXTERNAL) + stream_putl(s, or->cost + or->u.ext.type2_cost); + else if (or->path_type == OSPF_PATH_TYPE2_EXTERNAL) + stream_putl(s, or->u.ext.type2_cost); + else + stream_putl(s, or->cost); + } + + if (CHECK_FLAG(message, ZAPI_MESSAGE_TAG)) + stream_putl(s, or->u.ext.tag); + + stream_putw_at(s, 0, stream_get_endp(s)); + + zclient_send_message(zclient); + } } -void -ospf_zebra_delete (struct prefix_ipv4 *p, struct ospf_route *or) +void ospf_zebra_delete(struct prefix_ipv4 *p, struct ospf_route * or) { - u_char message; - u_char distance; - u_int32_t flags; - int psize; - struct stream *s; - struct ospf_path *path; - struct listnode *node; - struct ospf *ospf = ospf_lookup (); - - if ((ospf->instance && - redist_check_instance(&zclient->mi_redist[AFI_IP][ZEBRA_ROUTE_OSPF], ospf->instance)) - || - vrf_bitmap_check (zclient->redist[AFI_IP][ZEBRA_ROUTE_OSPF], VRF_DEFAULT)) - { - message = 0; - flags = 0; - /* Distance value. */ - distance = ospf_distance_apply (p, or); - /* Make packet. */ - s = zclient->obuf; - stream_reset (s); - - /* Put command, type, flags, message. */ - zclient_create_header (s, ZEBRA_IPV4_ROUTE_DELETE, VRF_DEFAULT); - stream_putc (s, ZEBRA_ROUTE_OSPF); - stream_putw (s, ospf->instance); - stream_putl (s, flags); - stream_putc (s, message); - stream_putw (s, SAFI_UNICAST); - - /* Put prefix information. */ - psize = PSIZE (p->prefixlen); - stream_putc (s, p->prefixlen); - stream_write (s, (u_char *) & p->prefix, psize); - - /* Nexthop count. */ - stream_putc (s, or->paths->count); - - /* Nexthop, ifindex, distance and metric information. */ - for (ALL_LIST_ELEMENTS_RO (or->paths, node, path)) - { - if (path->nexthop.s_addr != INADDR_ANY && - path->ifindex != 0) - { - stream_putc (s, NEXTHOP_TYPE_IPV4_IFINDEX); - stream_put_in_addr (s, &path->nexthop); - stream_putl (s, path->ifindex); - } - else if (path->nexthop.s_addr != INADDR_ANY) - { - stream_putc (s, NEXTHOP_TYPE_IPV4); - stream_put_in_addr (s, &path->nexthop); - } - else - { - stream_putc (s, NEXTHOP_TYPE_IFINDEX); - stream_putl (s, path->ifindex); - } - - if (IS_DEBUG_OSPF (zebra, ZEBRA_REDISTRIBUTE)) - { - char buf[2][INET_ADDRSTRLEN]; - zlog_debug("Zebra: Route delete %s/%d nexthop %s", - inet_ntop(AF_INET, &p->prefix, - buf[0], sizeof(buf[0])), - p->prefixlen, - inet_ntop(AF_INET, &path->nexthop, - buf[1], sizeof(buf[1]))); - } - } - - if (CHECK_FLAG (message, ZAPI_MESSAGE_DISTANCE)) - stream_putc (s, distance); - if (CHECK_FLAG (message, ZAPI_MESSAGE_METRIC)) - { - if (or->path_type == OSPF_PATH_TYPE1_EXTERNAL) - stream_putl (s, or->cost + or->u.ext.type2_cost); - else if (or->path_type == OSPF_PATH_TYPE2_EXTERNAL) - stream_putl (s, or->u.ext.type2_cost); - else - stream_putl (s, or->cost); + u_char message; + u_char distance; + u_int32_t flags; + int psize; + struct stream *s; + struct ospf_path *path; + struct listnode *node; + struct ospf *ospf = ospf_lookup(); + + if ((ospf->instance + && redist_check_instance( + &zclient->mi_redist[AFI_IP][ZEBRA_ROUTE_OSPF], + ospf->instance)) + || vrf_bitmap_check(zclient->redist[AFI_IP][ZEBRA_ROUTE_OSPF], + VRF_DEFAULT)) { + message = 0; + flags = 0; + /* Distance value. */ + distance = ospf_distance_apply(p, or); + /* Make packet. */ + s = zclient->obuf; + stream_reset(s); + + /* Put command, type, flags, message. */ + zclient_create_header(s, ZEBRA_IPV4_ROUTE_DELETE, VRF_DEFAULT); + stream_putc(s, ZEBRA_ROUTE_OSPF); + stream_putw(s, ospf->instance); + stream_putl(s, flags); + stream_putc(s, message); + stream_putw(s, SAFI_UNICAST); + + /* Put prefix information. */ + psize = PSIZE(p->prefixlen); + stream_putc(s, p->prefixlen); + stream_write(s, (u_char *)&p->prefix, psize); + + /* Nexthop count. */ + stream_putc(s, or->paths->count); + + /* Nexthop, ifindex, distance and metric information. */ + for (ALL_LIST_ELEMENTS_RO(or->paths, node, path)) { + if (path->nexthop.s_addr != INADDR_ANY + && path->ifindex != 0) { + stream_putc(s, NEXTHOP_TYPE_IPV4_IFINDEX); + stream_put_in_addr(s, &path->nexthop); + stream_putl(s, path->ifindex); + } else if (path->nexthop.s_addr != INADDR_ANY) { + stream_putc(s, NEXTHOP_TYPE_IPV4); + stream_put_in_addr(s, &path->nexthop); + } else { + stream_putc(s, NEXTHOP_TYPE_IFINDEX); + stream_putl(s, path->ifindex); + } + + if (IS_DEBUG_OSPF(zebra, ZEBRA_REDISTRIBUTE)) { + char buf[2][INET_ADDRSTRLEN]; + zlog_debug( + "Zebra: Route delete %s/%d nexthop %s", + inet_ntop(AF_INET, &p->prefix, buf[0], + sizeof(buf[0])), + p->prefixlen, + inet_ntop(AF_INET, &path->nexthop, + buf[1], sizeof(buf[1]))); + } + } + + if (CHECK_FLAG(message, ZAPI_MESSAGE_DISTANCE)) + stream_putc(s, distance); + if (CHECK_FLAG(message, ZAPI_MESSAGE_METRIC)) { + if (or->path_type == OSPF_PATH_TYPE1_EXTERNAL) + stream_putl(s, or->cost + or->u.ext.type2_cost); + else if (or->path_type == OSPF_PATH_TYPE2_EXTERNAL) + stream_putl(s, or->u.ext.type2_cost); + else + stream_putl(s, or->cost); + } + + stream_putw_at(s, 0, stream_get_endp(s)); + + zclient_send_message(zclient); } - - stream_putw_at (s, 0, stream_get_endp (s)); - - zclient_send_message(zclient); - } } -void -ospf_zebra_add_discard (struct prefix_ipv4 *p) +void ospf_zebra_add_discard(struct prefix_ipv4 *p) { - struct zapi_ipv4 api; - struct ospf *ospf = ospf_lookup (); - - if ((ospf->instance && - redist_check_instance(&zclient->mi_redist[AFI_IP][ZEBRA_ROUTE_OSPF], ospf->instance)) - || - vrf_bitmap_check (zclient->redist[AFI_IP][ZEBRA_ROUTE_OSPF], VRF_DEFAULT)) - { - api.vrf_id = VRF_DEFAULT; - api.type = ZEBRA_ROUTE_OSPF; - api.instance = ospf->instance; - api.flags = ZEBRA_FLAG_BLACKHOLE; - api.message = 0; - api.safi = SAFI_UNICAST; - SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP); - api.nexthop_num = 0; - api.ifindex_num = 0; - api.tag = 0; - - zapi_ipv4_route (ZEBRA_IPV4_ROUTE_ADD, zclient, p, &api); - - if (IS_DEBUG_OSPF (zebra, ZEBRA_REDISTRIBUTE)) - zlog_debug ("Zebra: Route add discard %s/%d", - inet_ntoa (p->prefix), p->prefixlen); - } + struct zapi_ipv4 api; + struct ospf *ospf = ospf_lookup(); + + if ((ospf->instance + && redist_check_instance( + &zclient->mi_redist[AFI_IP][ZEBRA_ROUTE_OSPF], + ospf->instance)) + || vrf_bitmap_check(zclient->redist[AFI_IP][ZEBRA_ROUTE_OSPF], + VRF_DEFAULT)) { + api.vrf_id = VRF_DEFAULT; + api.type = ZEBRA_ROUTE_OSPF; + api.instance = ospf->instance; + api.flags = ZEBRA_FLAG_BLACKHOLE; + api.message = 0; + api.safi = SAFI_UNICAST; + SET_FLAG(api.message, ZAPI_MESSAGE_NEXTHOP); + api.nexthop_num = 0; + api.ifindex_num = 0; + api.tag = 0; + + zapi_ipv4_route(ZEBRA_IPV4_ROUTE_ADD, zclient, p, &api); + + if (IS_DEBUG_OSPF(zebra, ZEBRA_REDISTRIBUTE)) + zlog_debug("Zebra: Route add discard %s/%d", + inet_ntoa(p->prefix), p->prefixlen); + } } -void -ospf_zebra_delete_discard (struct prefix_ipv4 *p) +void ospf_zebra_delete_discard(struct prefix_ipv4 *p) { - struct zapi_ipv4 api; - struct ospf *ospf = ospf_lookup (); - - if ((ospf->instance && - redist_check_instance(&zclient->mi_redist[AFI_IP][ZEBRA_ROUTE_OSPF], ospf->instance)) - || - vrf_bitmap_check (zclient->redist[AFI_IP][ZEBRA_ROUTE_OSPF], VRF_DEFAULT)) - { - api.vrf_id = VRF_DEFAULT; - api.type = ZEBRA_ROUTE_OSPF; - api.instance = ospf->instance; - api.flags = ZEBRA_FLAG_BLACKHOLE; - api.message = 0; - api.safi = SAFI_UNICAST; - SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP); - api.nexthop_num = 0; - api.ifindex_num = 0; - api.tag = 0; - - zapi_ipv4_route (ZEBRA_IPV4_ROUTE_DELETE, zclient, p, &api); - - if (IS_DEBUG_OSPF (zebra, ZEBRA_REDISTRIBUTE)) - zlog_debug ("Zebra: Route delete discard %s/%d", - inet_ntoa (p->prefix), p->prefixlen); - - } + struct zapi_ipv4 api; + struct ospf *ospf = ospf_lookup(); + + if ((ospf->instance + && redist_check_instance( + &zclient->mi_redist[AFI_IP][ZEBRA_ROUTE_OSPF], + ospf->instance)) + || vrf_bitmap_check(zclient->redist[AFI_IP][ZEBRA_ROUTE_OSPF], + VRF_DEFAULT)) { + api.vrf_id = VRF_DEFAULT; + api.type = ZEBRA_ROUTE_OSPF; + api.instance = ospf->instance; + api.flags = ZEBRA_FLAG_BLACKHOLE; + api.message = 0; + api.safi = SAFI_UNICAST; + SET_FLAG(api.message, ZAPI_MESSAGE_NEXTHOP); + api.nexthop_num = 0; + api.ifindex_num = 0; + api.tag = 0; + + zapi_ipv4_route(ZEBRA_IPV4_ROUTE_DELETE, zclient, p, &api); + + if (IS_DEBUG_OSPF(zebra, ZEBRA_REDISTRIBUTE)) + zlog_debug("Zebra: Route delete discard %s/%d", + inet_ntoa(p->prefix), p->prefixlen); + } } -struct ospf_external * -ospf_external_lookup (u_char type, u_short instance) +struct ospf_external *ospf_external_lookup(u_char type, u_short instance) { - struct list *ext_list; - struct listnode *node; - struct ospf_external *ext; + struct list *ext_list; + struct listnode *node; + struct ospf_external *ext; - ext_list = om->external[type]; - if (!ext_list) - return(NULL); + ext_list = om->external[type]; + if (!ext_list) + return (NULL); - for (ALL_LIST_ELEMENTS_RO(ext_list, node, ext)) - if (ext->instance == instance) - return ext; + for (ALL_LIST_ELEMENTS_RO(ext_list, node, ext)) + if (ext->instance == instance) + return ext; - return NULL; + return NULL; } -struct ospf_external * -ospf_external_add (u_char type, u_short instance) +struct ospf_external *ospf_external_add(u_char type, u_short instance) { - struct list *ext_list; - struct ospf_external *ext; + struct list *ext_list; + struct ospf_external *ext; - ext = ospf_external_lookup(type, instance); - if (ext) - return ext; + ext = ospf_external_lookup(type, instance); + if (ext) + return ext; - if (!om->external[type]) - om->external[type] = list_new(); + if (!om->external[type]) + om->external[type] = list_new(); - ext_list = om->external[type]; - ext = (struct ospf_external *)calloc (1, sizeof(struct ospf_external)); - ext->instance = instance; - EXTERNAL_INFO (ext) = route_table_init (); + ext_list = om->external[type]; + ext = (struct ospf_external *)calloc(1, sizeof(struct ospf_external)); + ext->instance = instance; + EXTERNAL_INFO(ext) = route_table_init(); - listnode_add(ext_list, ext); + listnode_add(ext_list, ext); - return ext; + return ext; } -void -ospf_external_del (u_char type, u_short instance) +void ospf_external_del(u_char type, u_short instance) { - struct ospf_external *ext; - - ext = ospf_external_lookup(type, instance); - - if (ext) - { - if (EXTERNAL_INFO (ext)) - route_table_finish(EXTERNAL_INFO (ext)); - - listnode_delete(om->external[type], ext); - if (!om->external[type]->count) - { - list_free(om->external[type]); - om->external[type] = NULL; - } - } + struct ospf_external *ext; + + ext = ospf_external_lookup(type, instance); + + if (ext) { + if (EXTERNAL_INFO(ext)) + route_table_finish(EXTERNAL_INFO(ext)); + + listnode_delete(om->external[type], ext); + if (!om->external[type]->count) { + list_free(om->external[type]); + om->external[type] = NULL; + } + } } -struct ospf_redist * -ospf_redist_lookup (struct ospf *ospf, u_char type, u_short instance) +struct ospf_redist *ospf_redist_lookup(struct ospf *ospf, u_char type, + u_short instance) { - struct list *red_list; - struct listnode *node; - struct ospf_redist *red; + struct list *red_list; + struct listnode *node; + struct ospf_redist *red; - red_list = ospf->redist[type]; - if (!red_list) - return(NULL); + red_list = ospf->redist[type]; + if (!red_list) + return (NULL); - for (ALL_LIST_ELEMENTS_RO(red_list, node, red)) - if (red->instance == instance) - return red; + for (ALL_LIST_ELEMENTS_RO(red_list, node, red)) + if (red->instance == instance) + return red; - return NULL; + return NULL; } -struct ospf_redist * -ospf_redist_add (struct ospf *ospf, u_char type, u_short instance) +struct ospf_redist *ospf_redist_add(struct ospf *ospf, u_char type, + u_short instance) { - struct list *red_list; - struct ospf_redist *red; + struct list *red_list; + struct ospf_redist *red; - red = ospf_redist_lookup(ospf, type, instance); - if (red) - return red; + red = ospf_redist_lookup(ospf, type, instance); + if (red) + return red; - if (!ospf->redist[type]) - ospf->redist[type] = list_new(); + if (!ospf->redist[type]) + ospf->redist[type] = list_new(); - red_list = ospf->redist[type]; - red = (struct ospf_redist *)calloc (1, sizeof(struct ospf_redist)); - red->instance = instance; - red->dmetric.type = -1; - red->dmetric.value = -1; + red_list = ospf->redist[type]; + red = (struct ospf_redist *)calloc(1, sizeof(struct ospf_redist)); + red->instance = instance; + red->dmetric.type = -1; + red->dmetric.value = -1; - listnode_add(red_list, red); + listnode_add(red_list, red); - return red; + return red; } -void -ospf_redist_del (struct ospf *ospf, u_char type, u_short instance) +void ospf_redist_del(struct ospf *ospf, u_char type, u_short instance) { - struct ospf_redist *red; - - red = ospf_redist_lookup(ospf, type, instance); - - if (red) - { - listnode_delete(ospf->redist[type], red); - if (!ospf->redist[type]->count) - { - list_free(ospf->redist[type]); - ospf->redist[type] = NULL; - } - } + struct ospf_redist *red; + + red = ospf_redist_lookup(ospf, type, instance); + + if (red) { + listnode_delete(ospf->redist[type], red); + if (!ospf->redist[type]->count) { + list_free(ospf->redist[type]); + ospf->redist[type] = NULL; + } + } } -int -ospf_is_type_redistributed (int type, u_short instance) +int ospf_is_type_redistributed(int type, u_short instance) { - return (DEFAULT_ROUTE_TYPE (type) ? - vrf_bitmap_check (zclient->default_information, VRF_DEFAULT) : - ((instance && redist_check_instance(&zclient->mi_redist[AFI_IP][type], instance)) - || (!instance && vrf_bitmap_check (zclient->redist[AFI_IP][type], VRF_DEFAULT)))); + return (DEFAULT_ROUTE_TYPE(type) + ? vrf_bitmap_check(zclient->default_information, + VRF_DEFAULT) + : ((instance + && redist_check_instance( + &zclient->mi_redist[AFI_IP][type], + instance)) + || (!instance + && vrf_bitmap_check( + zclient->redist[AFI_IP][type], + VRF_DEFAULT)))); } -int -ospf_redistribute_set (struct ospf *ospf, int type, u_short instance, int mtype, - int mvalue) +int ospf_redistribute_set(struct ospf *ospf, int type, u_short instance, + int mtype, int mvalue) { - int force = 0; - struct ospf_redist *red; - - red = ospf_redist_lookup(ospf, type, instance); - if (ospf_is_type_redistributed (type, instance)) - { - if (mtype != red->dmetric.type) - { - red->dmetric.type = mtype; - force = LSA_REFRESH_FORCE; - } - if (mvalue != red->dmetric.value) - { - red->dmetric.value = mvalue; - force = LSA_REFRESH_FORCE; - } - - ospf_external_lsa_refresh_type (ospf, type, instance, force); - - if (IS_DEBUG_OSPF (zebra, ZEBRA_REDISTRIBUTE)) - zlog_debug ("Redistribute[%s][%d]: Refresh Type[%d], Metric[%d]", - ospf_redist_string(type), instance, - metric_type (ospf, type, instance), - metric_value (ospf, type, instance)); - - return CMD_SUCCESS; - } - - red->dmetric.type = mtype; - red->dmetric.value = mvalue; - - ospf_external_add(type, instance); - - zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, AFI_IP, type, - instance, VRF_DEFAULT); - - if (IS_DEBUG_OSPF (zebra, ZEBRA_REDISTRIBUTE)) - zlog_debug ("Redistribute[%s][%d]: Start Type[%d], Metric[%d]", - ospf_redist_string(type), instance, - metric_type (ospf, type, instance), metric_value (ospf, type, instance)); - - ospf_asbr_status_update (ospf, ++ospf->redistribute); - - return CMD_SUCCESS; + int force = 0; + struct ospf_redist *red; + + red = ospf_redist_lookup(ospf, type, instance); + if (ospf_is_type_redistributed(type, instance)) { + if (mtype != red->dmetric.type) { + red->dmetric.type = mtype; + force = LSA_REFRESH_FORCE; + } + if (mvalue != red->dmetric.value) { + red->dmetric.value = mvalue; + force = LSA_REFRESH_FORCE; + } + + ospf_external_lsa_refresh_type(ospf, type, instance, force); + + if (IS_DEBUG_OSPF(zebra, ZEBRA_REDISTRIBUTE)) + zlog_debug( + "Redistribute[%s][%d]: Refresh Type[%d], Metric[%d]", + ospf_redist_string(type), instance, + metric_type(ospf, type, instance), + metric_value(ospf, type, instance)); + + return CMD_SUCCESS; + } + + red->dmetric.type = mtype; + red->dmetric.value = mvalue; + + ospf_external_add(type, instance); + + zclient_redistribute(ZEBRA_REDISTRIBUTE_ADD, zclient, AFI_IP, type, + instance, VRF_DEFAULT); + + if (IS_DEBUG_OSPF(zebra, ZEBRA_REDISTRIBUTE)) + zlog_debug("Redistribute[%s][%d]: Start Type[%d], Metric[%d]", + ospf_redist_string(type), instance, + metric_type(ospf, type, instance), + metric_value(ospf, type, instance)); + + ospf_asbr_status_update(ospf, ++ospf->redistribute); + + return CMD_SUCCESS; } -int -ospf_redistribute_unset (struct ospf *ospf, int type, u_short instance) +int ospf_redistribute_unset(struct ospf *ospf, int type, u_short instance) { - if (type == zclient->redist_default && instance == zclient->instance) - return CMD_SUCCESS; + if (type == zclient->redist_default && instance == zclient->instance) + return CMD_SUCCESS; - if (!ospf_is_type_redistributed (type, instance)) - return CMD_SUCCESS; + if (!ospf_is_type_redistributed(type, instance)) + return CMD_SUCCESS; - zclient_redistribute (ZEBRA_REDISTRIBUTE_DELETE, zclient, AFI_IP, type, - instance, VRF_DEFAULT); + zclient_redistribute(ZEBRA_REDISTRIBUTE_DELETE, zclient, AFI_IP, type, + instance, VRF_DEFAULT); - if (IS_DEBUG_OSPF (zebra, ZEBRA_REDISTRIBUTE)) - zlog_debug ("Redistribute[%s][%d]: Stop", - ospf_redist_string(type), instance); + if (IS_DEBUG_OSPF(zebra, ZEBRA_REDISTRIBUTE)) + zlog_debug("Redistribute[%s][%d]: Stop", + ospf_redist_string(type), instance); - ospf_redist_del (ospf, type, instance); + ospf_redist_del(ospf, type, instance); - /* Remove the routes from OSPF table. */ - ospf_redistribute_withdraw (ospf, type, instance); + /* Remove the routes from OSPF table. */ + ospf_redistribute_withdraw(ospf, type, instance); - ospf_external_del(type, instance); + ospf_external_del(type, instance); - ospf_asbr_status_update (ospf, --ospf->redistribute); + ospf_asbr_status_update(ospf, --ospf->redistribute); - return CMD_SUCCESS; + return CMD_SUCCESS; } -int -ospf_redistribute_default_set (struct ospf *ospf, int originate, - int mtype, int mvalue) +int ospf_redistribute_default_set(struct ospf *ospf, int originate, int mtype, + int mvalue) { - struct ospf_redist *red; + struct ospf_redist *red; - ospf->default_originate = originate; + ospf->default_originate = originate; - red = ospf_redist_add(ospf, DEFAULT_ROUTE, 0); - red->dmetric.type = mtype; - red->dmetric.value = mvalue; + red = ospf_redist_add(ospf, DEFAULT_ROUTE, 0); + red->dmetric.type = mtype; + red->dmetric.value = mvalue; - ospf_external_add(DEFAULT_ROUTE, 0); + ospf_external_add(DEFAULT_ROUTE, 0); - if (ospf_is_type_redistributed (DEFAULT_ROUTE, 0)) - { - /* if ospf->default_originate changes value, is calling - ospf_external_lsa_refresh_default sufficient to implement - the change? */ - ospf_external_lsa_refresh_default (ospf); + if (ospf_is_type_redistributed(DEFAULT_ROUTE, 0)) { + /* if ospf->default_originate changes value, is calling + ospf_external_lsa_refresh_default sufficient to implement + the change? */ + ospf_external_lsa_refresh_default(ospf); - if (IS_DEBUG_OSPF (zebra, ZEBRA_REDISTRIBUTE)) - zlog_debug ("Redistribute[%s]: Refresh Type[%d], Metric[%d]", - ospf_redist_string(DEFAULT_ROUTE), - metric_type (ospf, DEFAULT_ROUTE, 0), - metric_value (ospf, DEFAULT_ROUTE, 0)); - return CMD_SUCCESS; - } + if (IS_DEBUG_OSPF(zebra, ZEBRA_REDISTRIBUTE)) + zlog_debug( + "Redistribute[%s]: Refresh Type[%d], Metric[%d]", + ospf_redist_string(DEFAULT_ROUTE), + metric_type(ospf, DEFAULT_ROUTE, 0), + metric_value(ospf, DEFAULT_ROUTE, 0)); + return CMD_SUCCESS; + } - zclient_redistribute_default (ZEBRA_REDISTRIBUTE_DEFAULT_ADD, zclient, - VRF_DEFAULT); + zclient_redistribute_default(ZEBRA_REDISTRIBUTE_DEFAULT_ADD, zclient, + VRF_DEFAULT); - if (IS_DEBUG_OSPF (zebra, ZEBRA_REDISTRIBUTE)) - zlog_debug ("Redistribute[DEFAULT]: Start Type[%d], Metric[%d]", - metric_type (ospf, DEFAULT_ROUTE, 0), - metric_value (ospf, DEFAULT_ROUTE, 0)); + if (IS_DEBUG_OSPF(zebra, ZEBRA_REDISTRIBUTE)) + zlog_debug("Redistribute[DEFAULT]: Start Type[%d], Metric[%d]", + metric_type(ospf, DEFAULT_ROUTE, 0), + metric_value(ospf, DEFAULT_ROUTE, 0)); - if (ospf->router_id.s_addr == 0) - ospf->external_origin |= (1 << DEFAULT_ROUTE); - else - thread_add_timer(master, ospf_default_originate_timer, ospf, 1, NULL); + if (ospf->router_id.s_addr == 0) + ospf->external_origin |= (1 << DEFAULT_ROUTE); + else + thread_add_timer(master, ospf_default_originate_timer, ospf, 1, + NULL); - ospf_asbr_status_update (ospf, ++ospf->redistribute); + ospf_asbr_status_update(ospf, ++ospf->redistribute); - return CMD_SUCCESS; + return CMD_SUCCESS; } -int -ospf_redistribute_default_unset (struct ospf *ospf) +int ospf_redistribute_default_unset(struct ospf *ospf) { - if (!ospf_is_type_redistributed (DEFAULT_ROUTE, 0)) - return CMD_SUCCESS; + if (!ospf_is_type_redistributed(DEFAULT_ROUTE, 0)) + return CMD_SUCCESS; - ospf->default_originate = DEFAULT_ORIGINATE_NONE; - ospf_redist_del(ospf, DEFAULT_ROUTE, 0); + ospf->default_originate = DEFAULT_ORIGINATE_NONE; + ospf_redist_del(ospf, DEFAULT_ROUTE, 0); - zclient_redistribute_default (ZEBRA_REDISTRIBUTE_DEFAULT_DELETE, zclient, - VRF_DEFAULT); + zclient_redistribute_default(ZEBRA_REDISTRIBUTE_DEFAULT_DELETE, zclient, + VRF_DEFAULT); - if (IS_DEBUG_OSPF (zebra, ZEBRA_REDISTRIBUTE)) - zlog_debug ("Redistribute[DEFAULT]: Stop"); + if (IS_DEBUG_OSPF(zebra, ZEBRA_REDISTRIBUTE)) + zlog_debug("Redistribute[DEFAULT]: Stop"); - //Pending: how does the external_info cleanup work in this case? + // Pending: how does the external_info cleanup work in this case? - ospf_asbr_status_update (ospf, --ospf->redistribute); + ospf_asbr_status_update(ospf, --ospf->redistribute); - return CMD_SUCCESS; + return CMD_SUCCESS; } -static int -ospf_external_lsa_originate_check (struct ospf *ospf, - struct external_info *ei) +static int ospf_external_lsa_originate_check(struct ospf *ospf, + struct external_info *ei) { - /* If prefix is multicast, then do not originate LSA. */ - if (IN_MULTICAST (htonl (ei->p.prefix.s_addr))) - { - zlog_info ("LSA[Type5:%s]: Not originate AS-external-LSA, " - "Prefix belongs multicast", inet_ntoa (ei->p.prefix)); - return 0; - } - - /* Take care of default-originate. */ - if (is_prefix_default (&ei->p)) - if (ospf->default_originate == DEFAULT_ORIGINATE_NONE) - { - zlog_info ("LSA[Type5:0.0.0.0]: Not originate AS-external-LSA " - "for default"); - return 0; - } - - return 1; + /* If prefix is multicast, then do not originate LSA. */ + if (IN_MULTICAST(htonl(ei->p.prefix.s_addr))) { + zlog_info( + "LSA[Type5:%s]: Not originate AS-external-LSA, " + "Prefix belongs multicast", + inet_ntoa(ei->p.prefix)); + return 0; + } + + /* Take care of default-originate. */ + if (is_prefix_default(&ei->p)) + if (ospf->default_originate == DEFAULT_ORIGINATE_NONE) { + zlog_info( + "LSA[Type5:0.0.0.0]: Not originate AS-external-LSA " + "for default"); + return 0; + } + + return 1; } /* If connected prefix is OSPF enable interface, then do not announce. */ -int -ospf_distribute_check_connected (struct ospf *ospf, struct external_info *ei) +int ospf_distribute_check_connected(struct ospf *ospf, struct external_info *ei) { - struct listnode *node; - struct ospf_interface *oi; + struct listnode *node; + struct ospf_interface *oi; - for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi)) - if (prefix_match (oi->address, (struct prefix *) &ei->p)) - return 0; - return 1; + for (ALL_LIST_ELEMENTS_RO(ospf->oiflist, node, oi)) + if (prefix_match(oi->address, (struct prefix *)&ei->p)) + return 0; + return 1; } /* return 1 if external LSA must be originated, 0 otherwise */ -int -ospf_redistribute_check (struct ospf *ospf, - struct external_info *ei, int *changed) +int ospf_redistribute_check(struct ospf *ospf, struct external_info *ei, + int *changed) { - struct route_map_set_values save_values; - struct prefix_ipv4 *p = &ei->p; - struct ospf_redist *red; - u_char type = is_prefix_default (&ei->p) ? DEFAULT_ROUTE : ei->type; - u_short instance = is_prefix_default (&ei->p) ? 0 : ei->instance; - - if (changed) - *changed = 0; - - if (!ospf_external_lsa_originate_check (ospf, ei)) - return 0; - - /* Take care connected route. */ - if (type == ZEBRA_ROUTE_CONNECT && - !ospf_distribute_check_connected (ospf, ei)) - return 0; - - if (!DEFAULT_ROUTE_TYPE (type) && DISTRIBUTE_NAME (ospf, type)) - /* distirbute-list exists, but access-list may not? */ - if (DISTRIBUTE_LIST (ospf, type)) - if (access_list_apply (DISTRIBUTE_LIST (ospf, type), p) == FILTER_DENY) - { - if (IS_DEBUG_OSPF (zebra, ZEBRA_REDISTRIBUTE)) - zlog_debug ("Redistribute[%s]: %s/%d filtered by ditribute-list.", - ospf_redist_string(type), - inet_ntoa (p->prefix), p->prefixlen); - return 0; - } - - save_values = ei->route_map_set; - ospf_reset_route_map_set_values (&ei->route_map_set); - - /* apply route-map if needed */ - red = ospf_redist_lookup (ospf, type, instance); - if (red && ROUTEMAP_NAME(red)) - { - int ret; - - ret = route_map_apply (ROUTEMAP (red), (struct prefix *) p, - RMAP_OSPF, ei); - - if (ret == RMAP_DENYMATCH) - { - ei->route_map_set = save_values; - if (IS_DEBUG_OSPF (zebra, ZEBRA_REDISTRIBUTE)) - zlog_debug ("Redistribute[%s]: %s/%d filtered by route-map.", - ospf_redist_string(type), - inet_ntoa (p->prefix), p->prefixlen); - return 0; - } - - /* check if 'route-map set' changed something */ - if (changed) - *changed = !ospf_route_map_set_compare (&ei->route_map_set, - &save_values); - } - - return 1; + struct route_map_set_values save_values; + struct prefix_ipv4 *p = &ei->p; + struct ospf_redist *red; + u_char type = is_prefix_default(&ei->p) ? DEFAULT_ROUTE : ei->type; + u_short instance = is_prefix_default(&ei->p) ? 0 : ei->instance; + + if (changed) + *changed = 0; + + if (!ospf_external_lsa_originate_check(ospf, ei)) + return 0; + + /* Take care connected route. */ + if (type == ZEBRA_ROUTE_CONNECT + && !ospf_distribute_check_connected(ospf, ei)) + return 0; + + if (!DEFAULT_ROUTE_TYPE(type) && DISTRIBUTE_NAME(ospf, type)) + /* distirbute-list exists, but access-list may not? */ + if (DISTRIBUTE_LIST(ospf, type)) + if (access_list_apply(DISTRIBUTE_LIST(ospf, type), p) + == FILTER_DENY) { + if (IS_DEBUG_OSPF(zebra, ZEBRA_REDISTRIBUTE)) + zlog_debug( + "Redistribute[%s]: %s/%d filtered by ditribute-list.", + ospf_redist_string(type), + inet_ntoa(p->prefix), + p->prefixlen); + return 0; + } + + save_values = ei->route_map_set; + ospf_reset_route_map_set_values(&ei->route_map_set); + + /* apply route-map if needed */ + red = ospf_redist_lookup(ospf, type, instance); + if (red && ROUTEMAP_NAME(red)) { + int ret; + + ret = route_map_apply(ROUTEMAP(red), (struct prefix *)p, + RMAP_OSPF, ei); + + if (ret == RMAP_DENYMATCH) { + ei->route_map_set = save_values; + if (IS_DEBUG_OSPF(zebra, ZEBRA_REDISTRIBUTE)) + zlog_debug( + "Redistribute[%s]: %s/%d filtered by route-map.", + ospf_redist_string(type), + inet_ntoa(p->prefix), p->prefixlen); + return 0; + } + + /* check if 'route-map set' changed something */ + if (changed) + *changed = !ospf_route_map_set_compare( + &ei->route_map_set, &save_values); + } + + return 1; } /* OSPF route-map set for redistribution */ -void -ospf_routemap_set (struct ospf_redist *red, const char *name) +void ospf_routemap_set(struct ospf_redist *red, const char *name) { - if (ROUTEMAP_NAME (red)) - free (ROUTEMAP_NAME (red)); + if (ROUTEMAP_NAME(red)) + free(ROUTEMAP_NAME(red)); - ROUTEMAP_NAME (red) = strdup (name); - ROUTEMAP (red) = route_map_lookup_by_name (name); + ROUTEMAP_NAME(red) = strdup(name); + ROUTEMAP(red) = route_map_lookup_by_name(name); } -void -ospf_routemap_unset (struct ospf_redist *red) +void ospf_routemap_unset(struct ospf_redist *red) { - if (ROUTEMAP_NAME (red)) - free (ROUTEMAP_NAME (red)); + if (ROUTEMAP_NAME(red)) + free(ROUTEMAP_NAME(red)); - ROUTEMAP_NAME (red) = NULL; - ROUTEMAP (red) = NULL; + ROUTEMAP_NAME(red) = NULL; + ROUTEMAP(red) = NULL; } /* Zebra route add and delete treatment. */ -static int -ospf_zebra_read_ipv4 (int command, struct zclient *zclient, - zebra_size_t length, vrf_id_t vrf_id) +static int ospf_zebra_read_ipv4(int command, struct zclient *zclient, + zebra_size_t length, vrf_id_t vrf_id) { - struct stream *s; - struct zapi_ipv4 api; - unsigned long ifindex; - struct in_addr nexthop; - struct prefix_ipv4 p; - struct external_info *ei; - struct ospf *ospf; - int i; - - s = zclient->ibuf; - ifindex = 0; - nexthop.s_addr = 0; - - /* Type, flags, message. */ - api.type = stream_getc (s); - api.instance = stream_getw (s); - api.flags = stream_getl (s); - api.message = stream_getc (s); - - /* IPv4 prefix. */ - memset (&p, 0, sizeof (struct prefix_ipv4)); - p.family = AF_INET; - p.prefixlen = MIN(IPV4_MAX_PREFIXLEN, stream_getc (s)); - stream_get (&p.prefix, s, PSIZE (p.prefixlen)); - - if (IPV4_NET127(ntohl(p.prefix.s_addr))) - return 0; - - /* Nexthop, ifindex, distance, metric. */ - if (CHECK_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP)) - { - api.nexthop_num = stream_getc (s); - nexthop.s_addr = stream_get_ipv4 (s); - } - if (CHECK_FLAG (api.message, ZAPI_MESSAGE_IFINDEX)) - { - api.ifindex_num = stream_getc (s); - /* XXX assert(api.ifindex_num == 1); */ - ifindex = stream_getl (s); - } - if (CHECK_FLAG (api.message, ZAPI_MESSAGE_DISTANCE)) - api.distance = stream_getc (s); - if (CHECK_FLAG (api.message, ZAPI_MESSAGE_METRIC)) - api.metric = stream_getl (s); - if (CHECK_FLAG (api.message, ZAPI_MESSAGE_TAG)) - api.tag = stream_getl (s); - else - api.tag = 0; - - ospf = ospf_lookup (); - if (ospf == NULL) - return 0; - - if (command == ZEBRA_REDISTRIBUTE_IPV4_ADD) - { - /* XXX|HACK|TODO|FIXME: - * Maybe we should ignore reject/blackhole routes? Testing shows that - * there is no problems though and this is only way to "summarize" - * routes in ASBR at the moment. Maybe we need just a better generalised - * solution for these types? - * - * if ( CHECK_FLAG (api.flags, ZEBRA_FLAG_BLACKHOLE) - * || CHECK_FLAG (api.flags, ZEBRA_FLAG_REJECT)) - * return 0; - */ - - /* Protocol tag overwrites all other tag value send by zebra */ - if (ospf->dtag[api.type] > 0) - api.tag = ospf->dtag[api.type]; - - /* - * Given zebra sends update for a prefix via ADD message, it should - * be considered as an implicit DEL for that prefix with other source - * types. - */ - for (i = 0; i < ZEBRA_ROUTE_MAX; i++) - if (i != api.type) - ospf_external_info_delete(i, api.instance, p); - - ei = ospf_external_info_add (api.type, api.instance, p, ifindex, - nexthop, api.tag); - if (ei == NULL) + struct stream *s; + struct zapi_ipv4 api; + unsigned long ifindex; + struct in_addr nexthop; + struct prefix_ipv4 p; + struct external_info *ei; + struct ospf *ospf; + int i; + + s = zclient->ibuf; + ifindex = 0; + nexthop.s_addr = 0; + + /* Type, flags, message. */ + api.type = stream_getc(s); + api.instance = stream_getw(s); + api.flags = stream_getl(s); + api.message = stream_getc(s); + + /* IPv4 prefix. */ + memset(&p, 0, sizeof(struct prefix_ipv4)); + p.family = AF_INET; + p.prefixlen = MIN(IPV4_MAX_PREFIXLEN, stream_getc(s)); + stream_get(&p.prefix, s, PSIZE(p.prefixlen)); + + if (IPV4_NET127(ntohl(p.prefix.s_addr))) + return 0; + + /* Nexthop, ifindex, distance, metric. */ + if (CHECK_FLAG(api.message, ZAPI_MESSAGE_NEXTHOP)) { + api.nexthop_num = stream_getc(s); + nexthop.s_addr = stream_get_ipv4(s); + } + if (CHECK_FLAG(api.message, ZAPI_MESSAGE_IFINDEX)) { + api.ifindex_num = stream_getc(s); + /* XXX assert(api.ifindex_num == 1); */ + ifindex = stream_getl(s); + } + if (CHECK_FLAG(api.message, ZAPI_MESSAGE_DISTANCE)) + api.distance = stream_getc(s); + if (CHECK_FLAG(api.message, ZAPI_MESSAGE_METRIC)) + api.metric = stream_getl(s); + if (CHECK_FLAG(api.message, ZAPI_MESSAGE_TAG)) + api.tag = stream_getl(s); + else + api.tag = 0; + + ospf = ospf_lookup(); + if (ospf == NULL) + return 0; + + if (command == ZEBRA_REDISTRIBUTE_IPV4_ADD) { + /* XXX|HACK|TODO|FIXME: + * Maybe we should ignore reject/blackhole routes? Testing shows + * that + * there is no problems though and this is only way to + * "summarize" + * routes in ASBR at the moment. Maybe we need just a better + * generalised + * solution for these types? + * + * if ( CHECK_FLAG (api.flags, ZEBRA_FLAG_BLACKHOLE) + * || CHECK_FLAG (api.flags, ZEBRA_FLAG_REJECT)) + * return 0; + */ + + /* Protocol tag overwrites all other tag value send by zebra */ + if (ospf->dtag[api.type] > 0) + api.tag = ospf->dtag[api.type]; + + /* + * Given zebra sends update for a prefix via ADD message, it + * should + * be considered as an implicit DEL for that prefix with other + * source + * types. + */ + for (i = 0; i < ZEBRA_ROUTE_MAX; i++) + if (i != api.type) + ospf_external_info_delete(i, api.instance, p); + + ei = ospf_external_info_add(api.type, api.instance, p, ifindex, + nexthop, api.tag); + if (ei == NULL) { + /* Nothing has changed, so nothing to do; return */ + return 0; + } + if (ospf->router_id.s_addr == 0) + /* Set flags to generate AS-external-LSA originate event + for each redistributed protocols later. */ + ospf->external_origin |= (1 << api.type); + else { + if (ei) { + if (is_prefix_default(&p)) + ospf_external_lsa_refresh_default(ospf); + else { + struct ospf_lsa *current; + + current = ospf_external_info_find_lsa( + ospf, &ei->p); + if (!current) + ospf_external_lsa_originate( + ospf, ei); + else { + if (IS_DEBUG_OSPF( + zebra, + ZEBRA_REDISTRIBUTE)) + zlog_debug( + "ospf_zebra_read_ipv4() : %s refreshing LSA", + inet_ntoa( + p.prefix)); + ospf_external_lsa_refresh( + ospf, current, ei, + LSA_REFRESH_FORCE); + } + } + } + } + } else /* if (command == ZEBRA_REDISTRIBUTE_IPV4_DEL) */ { - /* Nothing has changed, so nothing to do; return */ - return 0; + ospf_external_info_delete(api.type, api.instance, p); + if (is_prefix_default(&p)) + ospf_external_lsa_refresh_default(ospf); + else + ospf_external_lsa_flush(ospf, api.type, &p, + ifindex /*, nexthop */); } - if (ospf->router_id.s_addr == 0) - /* Set flags to generate AS-external-LSA originate event - for each redistributed protocols later. */ - ospf->external_origin |= (1 << api.type); - else - { - if (ei) - { - if (is_prefix_default (&p)) - ospf_external_lsa_refresh_default (ospf); - else - { - struct ospf_lsa *current; - - current = ospf_external_info_find_lsa (ospf, &ei->p); - if (!current) - ospf_external_lsa_originate (ospf, ei); - else - { - if (IS_DEBUG_OSPF (zebra, ZEBRA_REDISTRIBUTE)) - zlog_debug ("ospf_zebra_read_ipv4() : %s refreshing LSA", - inet_ntoa (p.prefix)); - ospf_external_lsa_refresh (ospf, current, - ei, LSA_REFRESH_FORCE); - } - } - } - } - } - else /* if (command == ZEBRA_REDISTRIBUTE_IPV4_DEL) */ - { - ospf_external_info_delete (api.type, api.instance, p); - if (is_prefix_default (&p)) - ospf_external_lsa_refresh_default (ospf); - else - ospf_external_lsa_flush (ospf, api.type, &p, ifindex /*, nexthop */); - } - - return 0; + + return 0; } -int -ospf_distribute_list_out_set (struct ospf *ospf, int type, const char *name) +int ospf_distribute_list_out_set(struct ospf *ospf, int type, const char *name) { - /* Lookup access-list for distribute-list. */ - DISTRIBUTE_LIST (ospf, type) = access_list_lookup (AFI_IP, name); + /* Lookup access-list for distribute-list. */ + DISTRIBUTE_LIST(ospf, type) = access_list_lookup(AFI_IP, name); - /* Clear previous distribute-name. */ - if (DISTRIBUTE_NAME (ospf, type)) - free (DISTRIBUTE_NAME (ospf, type)); + /* Clear previous distribute-name. */ + if (DISTRIBUTE_NAME(ospf, type)) + free(DISTRIBUTE_NAME(ospf, type)); - /* Set distribute-name. */ - DISTRIBUTE_NAME (ospf, type) = strdup (name); + /* Set distribute-name. */ + DISTRIBUTE_NAME(ospf, type) = strdup(name); - /* If access-list have been set, schedule update timer. */ - if (DISTRIBUTE_LIST (ospf, type)) - ospf_distribute_list_update (ospf, type, 0); + /* If access-list have been set, schedule update timer. */ + if (DISTRIBUTE_LIST(ospf, type)) + ospf_distribute_list_update(ospf, type, 0); - return CMD_SUCCESS; + return CMD_SUCCESS; } -int -ospf_distribute_list_out_unset (struct ospf *ospf, int type, const char *name) +int ospf_distribute_list_out_unset(struct ospf *ospf, int type, + const char *name) { - /* Schedule update timer. */ - if (DISTRIBUTE_LIST (ospf, type)) - ospf_distribute_list_update (ospf, type, 0); + /* Schedule update timer. */ + if (DISTRIBUTE_LIST(ospf, type)) + ospf_distribute_list_update(ospf, type, 0); - /* Unset distribute-list. */ - DISTRIBUTE_LIST (ospf, type) = NULL; + /* Unset distribute-list. */ + DISTRIBUTE_LIST(ospf, type) = NULL; - /* Clear distribute-name. */ - if (DISTRIBUTE_NAME (ospf, type)) - free (DISTRIBUTE_NAME (ospf, type)); + /* Clear distribute-name. */ + if (DISTRIBUTE_NAME(ospf, type)) + free(DISTRIBUTE_NAME(ospf, type)); - DISTRIBUTE_NAME (ospf, type) = NULL; + DISTRIBUTE_NAME(ospf, type) = NULL; - return CMD_SUCCESS; + return CMD_SUCCESS; } /* distribute-list update timer. */ -static int -ospf_distribute_list_update_timer (struct thread *thread) +static int ospf_distribute_list_update_timer(struct thread *thread) { - struct route_node *rn; - struct external_info *ei; - struct route_table *rt; - struct ospf_lsa *lsa; - int type, default_refresh = 0; - struct ospf *ospf; - - ospf = ospf_lookup (); - if (ospf == NULL) - return 0; - - ospf->t_distribute_update = NULL; - - zlog_info ("Zebra[Redistribute]: distribute-list update timer fired!"); - - /* foreach all external info. */ - for (type = 0; type <= ZEBRA_ROUTE_MAX; type++) - { - struct list *ext_list; - struct listnode *node; - struct ospf_external *ext; - - ext_list = om->external[type]; - if (!ext_list) - continue; - - for (ALL_LIST_ELEMENTS_RO(ext_list, node, ext)) - { - rt = ext->external_info; - if (!rt) - continue; - for (rn = route_top (rt); rn; rn = route_next (rn)) - if ((ei = rn->info) != NULL) - { - if (is_prefix_default (&ei->p)) - default_refresh = 1; - else if ((lsa = ospf_external_info_find_lsa (ospf, &ei->p))) - ospf_external_lsa_refresh (ospf, lsa, ei, LSA_REFRESH_IF_CHANGED); - else - ospf_external_lsa_originate (ospf, ei); - } - } - } - if (default_refresh) - ospf_external_lsa_refresh_default (ospf); - return 0; + struct route_node *rn; + struct external_info *ei; + struct route_table *rt; + struct ospf_lsa *lsa; + int type, default_refresh = 0; + struct ospf *ospf; + + ospf = ospf_lookup(); + if (ospf == NULL) + return 0; + + ospf->t_distribute_update = NULL; + + zlog_info("Zebra[Redistribute]: distribute-list update timer fired!"); + + /* foreach all external info. */ + for (type = 0; type <= ZEBRA_ROUTE_MAX; type++) { + struct list *ext_list; + struct listnode *node; + struct ospf_external *ext; + + ext_list = om->external[type]; + if (!ext_list) + continue; + + for (ALL_LIST_ELEMENTS_RO(ext_list, node, ext)) { + rt = ext->external_info; + if (!rt) + continue; + for (rn = route_top(rt); rn; rn = route_next(rn)) + if ((ei = rn->info) != NULL) { + if (is_prefix_default(&ei->p)) + default_refresh = 1; + else if ( + (lsa = ospf_external_info_find_lsa( + ospf, &ei->p))) + ospf_external_lsa_refresh( + ospf, lsa, ei, + LSA_REFRESH_IF_CHANGED); + else + ospf_external_lsa_originate( + ospf, ei); + } + } + } + if (default_refresh) + ospf_external_lsa_refresh_default(ospf); + return 0; } /* Update distribute-list and set timer to apply access-list. */ -void -ospf_distribute_list_update (struct ospf *ospf, uintptr_t type, - u_short instance) +void ospf_distribute_list_update(struct ospf *ospf, uintptr_t type, + u_short instance) { - struct route_table *rt; - struct ospf_external *ext; - - /* External info does not exist. */ - ext = ospf_external_lookup(type, instance); - if (!ext || !(rt = EXTERNAL_INFO (ext))) - return; - - /* If exists previously invoked thread, then let it continue. */ - if (ospf->t_distribute_update) - return; - - /* Set timer. */ - ospf->t_distribute_update = NULL; - thread_add_timer_msec(master, ospf_distribute_list_update_timer, (void *)type, ospf->min_ls_interval, - &ospf->t_distribute_update); + struct route_table *rt; + struct ospf_external *ext; + + /* External info does not exist. */ + ext = ospf_external_lookup(type, instance); + if (!ext || !(rt = EXTERNAL_INFO(ext))) + return; + + /* If exists previously invoked thread, then let it continue. */ + if (ospf->t_distribute_update) + return; + + /* Set timer. */ + ospf->t_distribute_update = NULL; + thread_add_timer_msec(master, ospf_distribute_list_update_timer, + (void *)type, ospf->min_ls_interval, + &ospf->t_distribute_update); } /* If access-list is updated, apply some check. */ -static void -ospf_filter_update (struct access_list *access) +static void ospf_filter_update(struct access_list *access) { - struct ospf *ospf; - int type; - int abr_inv = 0; - struct ospf_area *area; - struct listnode *node; - - /* If OSPF instance does not exist, return right now. */ - ospf = ospf_lookup (); - if (ospf == NULL) - return; - - /* Update distribute-list, and apply filter. */ - for (type = 0; type <= ZEBRA_ROUTE_MAX; type++) - { - struct list *red_list; - struct listnode *node; - struct ospf_redist *red; - - red_list = ospf->redist[type]; - if (red_list) - for (ALL_LIST_ELEMENTS_RO(red_list, node, red)) - { - if (ROUTEMAP (red)) - { - /* if route-map is not NULL it may be using this access list */ - ospf_distribute_list_update (ospf, type, red->instance); - } - } - - /* There is place for route-map for default-information (ZEBRA_ROUTE_MAX), - * but no distribute list. */ - if (type == ZEBRA_ROUTE_MAX) - break; - - if (DISTRIBUTE_NAME (ospf, type)) - { - /* Keep old access-list for distribute-list. */ - struct access_list *old = DISTRIBUTE_LIST (ospf, type); - - /* Update access-list for distribute-list. */ - DISTRIBUTE_LIST (ospf, type) = - access_list_lookup (AFI_IP, DISTRIBUTE_NAME (ospf, type)); - - /* No update for this distribute type. */ - if (old == NULL && DISTRIBUTE_LIST (ospf, type) == NULL) - continue; - - /* Schedule distribute-list update timer. */ - if (DISTRIBUTE_LIST (ospf, type) == NULL || - strcmp (DISTRIBUTE_NAME (ospf, type), access->name) == 0) - ospf_distribute_list_update (ospf, type, 0); - } - } - - /* Update Area access-list. */ - for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area)) - { - if (EXPORT_NAME (area)) - { - EXPORT_LIST (area) = NULL; - abr_inv++; - } - - if (IMPORT_NAME (area)) - { - IMPORT_LIST (area) = NULL; - abr_inv++; - } - } - - /* Schedule ABR tasks -- this will be changed -- takada. */ - if (IS_OSPF_ABR (ospf) && abr_inv) - ospf_schedule_abr_task (ospf); + struct ospf *ospf; + int type; + int abr_inv = 0; + struct ospf_area *area; + struct listnode *node; + + /* If OSPF instance does not exist, return right now. */ + ospf = ospf_lookup(); + if (ospf == NULL) + return; + + /* Update distribute-list, and apply filter. */ + for (type = 0; type <= ZEBRA_ROUTE_MAX; type++) { + struct list *red_list; + struct listnode *node; + struct ospf_redist *red; + + red_list = ospf->redist[type]; + if (red_list) + for (ALL_LIST_ELEMENTS_RO(red_list, node, red)) { + if (ROUTEMAP(red)) { + /* if route-map is not NULL it may be + * using this access list */ + ospf_distribute_list_update( + ospf, type, red->instance); + } + } + + /* There is place for route-map for default-information + * (ZEBRA_ROUTE_MAX), + * but no distribute list. */ + if (type == ZEBRA_ROUTE_MAX) + break; + + if (DISTRIBUTE_NAME(ospf, type)) { + /* Keep old access-list for distribute-list. */ + struct access_list *old = DISTRIBUTE_LIST(ospf, type); + + /* Update access-list for distribute-list. */ + DISTRIBUTE_LIST(ospf, type) = access_list_lookup( + AFI_IP, DISTRIBUTE_NAME(ospf, type)); + + /* No update for this distribute type. */ + if (old == NULL && DISTRIBUTE_LIST(ospf, type) == NULL) + continue; + + /* Schedule distribute-list update timer. */ + if (DISTRIBUTE_LIST(ospf, type) == NULL + || strcmp(DISTRIBUTE_NAME(ospf, type), access->name) + == 0) + ospf_distribute_list_update(ospf, type, 0); + } + } + + /* Update Area access-list. */ + for (ALL_LIST_ELEMENTS_RO(ospf->areas, node, area)) { + if (EXPORT_NAME(area)) { + EXPORT_LIST(area) = NULL; + abr_inv++; + } + + if (IMPORT_NAME(area)) { + IMPORT_LIST(area) = NULL; + abr_inv++; + } + } + + /* Schedule ABR tasks -- this will be changed -- takada. */ + if (IS_OSPF_ABR(ospf) && abr_inv) + ospf_schedule_abr_task(ospf); } /* If prefix-list is updated, do some updates. */ -void -ospf_prefix_list_update (struct prefix_list *plist) +void ospf_prefix_list_update(struct prefix_list *plist) { - struct ospf *ospf; - int type; - int abr_inv = 0; - struct ospf_area *area; - struct listnode *node; - - /* If OSPF instatnce does not exist, return right now. */ - ospf = ospf_lookup (); - if (ospf == NULL) - return; - - /* Update all route-maps which are used as redistribution filters. - * They might use prefix-list. - */ - for (type = 0; type <= ZEBRA_ROUTE_MAX; type++) - { - struct list *red_list; - struct listnode *node; - struct ospf_redist *red; - - red_list = ospf->redist[type]; - if (red_list) - for (ALL_LIST_ELEMENTS_RO(red_list, node, red)) - { - if (ROUTEMAP (red)) - { - /* if route-map is not NULL it may be using this prefix list */ - ospf_distribute_list_update (ospf, type, red->instance); - } - } - } - - /* Update area filter-lists. */ - for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area)) - { - /* Update filter-list in. */ - if (PREFIX_NAME_IN (area)) - if (strcmp (PREFIX_NAME_IN (area), prefix_list_name (plist)) == 0) - { - PREFIX_LIST_IN (area) = - prefix_list_lookup (AFI_IP, PREFIX_NAME_IN (area)); - abr_inv++; - } - - /* Update filter-list out. */ - if (PREFIX_NAME_OUT (area)) - if (strcmp (PREFIX_NAME_OUT (area), prefix_list_name (plist)) == 0) - { - PREFIX_LIST_IN (area) = - prefix_list_lookup (AFI_IP, PREFIX_NAME_OUT (area)); - abr_inv++; - } - } - - /* Schedule ABR task. */ - if (IS_OSPF_ABR (ospf) && abr_inv) - ospf_schedule_abr_task (ospf); + struct ospf *ospf; + int type; + int abr_inv = 0; + struct ospf_area *area; + struct listnode *node; + + /* If OSPF instatnce does not exist, return right now. */ + ospf = ospf_lookup(); + if (ospf == NULL) + return; + + /* Update all route-maps which are used as redistribution filters. + * They might use prefix-list. + */ + for (type = 0; type <= ZEBRA_ROUTE_MAX; type++) { + struct list *red_list; + struct listnode *node; + struct ospf_redist *red; + + red_list = ospf->redist[type]; + if (red_list) + for (ALL_LIST_ELEMENTS_RO(red_list, node, red)) { + if (ROUTEMAP(red)) { + /* if route-map is not NULL it may be + * using this prefix list */ + ospf_distribute_list_update( + ospf, type, red->instance); + } + } + } + + /* Update area filter-lists. */ + for (ALL_LIST_ELEMENTS_RO(ospf->areas, node, area)) { + /* Update filter-list in. */ + if (PREFIX_NAME_IN(area)) + if (strcmp(PREFIX_NAME_IN(area), + prefix_list_name(plist)) + == 0) { + PREFIX_LIST_IN(area) = prefix_list_lookup( + AFI_IP, PREFIX_NAME_IN(area)); + abr_inv++; + } + + /* Update filter-list out. */ + if (PREFIX_NAME_OUT(area)) + if (strcmp(PREFIX_NAME_OUT(area), + prefix_list_name(plist)) + == 0) { + PREFIX_LIST_IN(area) = prefix_list_lookup( + AFI_IP, PREFIX_NAME_OUT(area)); + abr_inv++; + } + } + + /* Schedule ABR task. */ + if (IS_OSPF_ABR(ospf) && abr_inv) + ospf_schedule_abr_task(ospf); } -static struct ospf_distance * -ospf_distance_new (void) +static struct ospf_distance *ospf_distance_new(void) { - return XCALLOC (MTYPE_OSPF_DISTANCE, sizeof (struct ospf_distance)); + return XCALLOC(MTYPE_OSPF_DISTANCE, sizeof(struct ospf_distance)); } -static void -ospf_distance_free (struct ospf_distance *odistance) +static void ospf_distance_free(struct ospf_distance *odistance) { - XFREE (MTYPE_OSPF_DISTANCE, odistance); + XFREE(MTYPE_OSPF_DISTANCE, odistance); } -int -ospf_distance_set (struct vty *vty, struct ospf *ospf, - const char *distance_str, - const char *ip_str, - const char *access_list_str) +int ospf_distance_set(struct vty *vty, struct ospf *ospf, + const char *distance_str, const char *ip_str, + const char *access_list_str) { - int ret; - struct prefix_ipv4 p; - u_char distance; - struct route_node *rn; - struct ospf_distance *odistance; - - ret = str2prefix_ipv4 (ip_str, &p); - if (ret == 0) - { - vty_out (vty, "Malformed prefix\n"); - return CMD_WARNING_CONFIG_FAILED; - } - - distance = atoi (distance_str); - - /* Get OSPF distance node. */ - rn = route_node_get (ospf->distance_table, (struct prefix *) &p); - if (rn->info) - { - odistance = rn->info; - route_unlock_node (rn); - } - else - { - odistance = ospf_distance_new (); - rn->info = odistance; - } - - /* Set distance value. */ - odistance->distance = distance; - - /* Reset access-list configuration. */ - if (odistance->access_list) - { - free (odistance->access_list); - odistance->access_list = NULL; - } - if (access_list_str) - odistance->access_list = strdup (access_list_str); - - return CMD_SUCCESS; + int ret; + struct prefix_ipv4 p; + u_char distance; + struct route_node *rn; + struct ospf_distance *odistance; + + ret = str2prefix_ipv4(ip_str, &p); + if (ret == 0) { + vty_out(vty, "Malformed prefix\n"); + return CMD_WARNING_CONFIG_FAILED; + } + + distance = atoi(distance_str); + + /* Get OSPF distance node. */ + rn = route_node_get(ospf->distance_table, (struct prefix *)&p); + if (rn->info) { + odistance = rn->info; + route_unlock_node(rn); + } else { + odistance = ospf_distance_new(); + rn->info = odistance; + } + + /* Set distance value. */ + odistance->distance = distance; + + /* Reset access-list configuration. */ + if (odistance->access_list) { + free(odistance->access_list); + odistance->access_list = NULL; + } + if (access_list_str) + odistance->access_list = strdup(access_list_str); + + return CMD_SUCCESS; } -int -ospf_distance_unset (struct vty *vty, struct ospf *ospf, - const char *distance_str, - const char *ip_str, char - const *access_list_str) +int ospf_distance_unset(struct vty *vty, struct ospf *ospf, + const char *distance_str, const char *ip_str, + char const *access_list_str) { - int ret; - struct prefix_ipv4 p; - struct route_node *rn; - struct ospf_distance *odistance; - - ret = str2prefix_ipv4 (ip_str, &p); - if (ret == 0) - { - vty_out (vty, "Malformed prefix\n"); - return CMD_WARNING_CONFIG_FAILED; - } - - rn = route_node_lookup (ospf->distance_table, (struct prefix *) &p); - if (!rn) - { - vty_out (vty, "Can't find specified prefix\n"); - return CMD_WARNING_CONFIG_FAILED; - } - - odistance = rn->info; - - if (odistance->access_list) - free (odistance->access_list); - ospf_distance_free (odistance); - - rn->info = NULL; - route_unlock_node (rn); - route_unlock_node (rn); - - return CMD_SUCCESS; + int ret; + struct prefix_ipv4 p; + struct route_node *rn; + struct ospf_distance *odistance; + + ret = str2prefix_ipv4(ip_str, &p); + if (ret == 0) { + vty_out(vty, "Malformed prefix\n"); + return CMD_WARNING_CONFIG_FAILED; + } + + rn = route_node_lookup(ospf->distance_table, (struct prefix *)&p); + if (!rn) { + vty_out(vty, "Can't find specified prefix\n"); + return CMD_WARNING_CONFIG_FAILED; + } + + odistance = rn->info; + + if (odistance->access_list) + free(odistance->access_list); + ospf_distance_free(odistance); + + rn->info = NULL; + route_unlock_node(rn); + route_unlock_node(rn); + + return CMD_SUCCESS; } -void -ospf_distance_reset (struct ospf *ospf) +void ospf_distance_reset(struct ospf *ospf) { - struct route_node *rn; - struct ospf_distance *odistance; - - for (rn = route_top (ospf->distance_table); rn; rn = route_next (rn)) - if ((odistance = rn->info) != NULL) - { - if (odistance->access_list) - free (odistance->access_list); - ospf_distance_free (odistance); - rn->info = NULL; - route_unlock_node (rn); - } + struct route_node *rn; + struct ospf_distance *odistance; + + for (rn = route_top(ospf->distance_table); rn; rn = route_next(rn)) + if ((odistance = rn->info) != NULL) { + if (odistance->access_list) + free(odistance->access_list); + ospf_distance_free(odistance); + rn->info = NULL; + route_unlock_node(rn); + } } -u_char -ospf_distance_apply (struct prefix_ipv4 *p, struct ospf_route *or) +u_char ospf_distance_apply(struct prefix_ipv4 *p, struct ospf_route * or) { - struct ospf *ospf; + struct ospf *ospf; - ospf = ospf_lookup (); - if (ospf == NULL) - return 0; + ospf = ospf_lookup(); + if (ospf == NULL) + return 0; - if (ospf->distance_intra) - if (or->path_type == OSPF_PATH_INTRA_AREA) - return ospf->distance_intra; + if (ospf->distance_intra) + if (or->path_type == OSPF_PATH_INTRA_AREA) + return ospf->distance_intra; - if (ospf->distance_inter) - if (or->path_type == OSPF_PATH_INTER_AREA) - return ospf->distance_inter; + if (ospf->distance_inter) + if (or->path_type == OSPF_PATH_INTER_AREA) + return ospf->distance_inter; - if (ospf->distance_external) - if (or->path_type == OSPF_PATH_TYPE1_EXTERNAL - || or->path_type == OSPF_PATH_TYPE2_EXTERNAL) - return ospf->distance_external; + if (ospf->distance_external) + if (or->path_type == OSPF_PATH_TYPE1_EXTERNAL || + or->path_type == OSPF_PATH_TYPE2_EXTERNAL) + return ospf->distance_external; - if (ospf->distance_all) - return ospf->distance_all; + if (ospf->distance_all) + return ospf->distance_all; - return 0; + return 0; } -static void -ospf_zebra_connected (struct zclient *zclient) +static void ospf_zebra_connected(struct zclient *zclient) { - /* Send the client registration */ - bfd_client_sendmsg(zclient, ZEBRA_BFD_CLIENT_REGISTER); + /* Send the client registration */ + bfd_client_sendmsg(zclient, ZEBRA_BFD_CLIENT_REGISTER); - zclient_send_reg_requests (zclient, VRF_DEFAULT); + zclient_send_reg_requests(zclient, VRF_DEFAULT); } -void -ospf_zebra_init (struct thread_master *master, u_short instance) +void ospf_zebra_init(struct thread_master *master, u_short instance) { - /* Allocate zebra structure. */ - zclient = zclient_new(master); - zclient_init (zclient, ZEBRA_ROUTE_OSPF, instance); - zclient->zebra_connected = ospf_zebra_connected; - zclient->router_id_update = ospf_router_id_update_zebra; - zclient->interface_add = ospf_interface_add; - zclient->interface_delete = ospf_interface_delete; - zclient->interface_up = ospf_interface_state_up; - zclient->interface_down = ospf_interface_state_down; - zclient->interface_address_add = ospf_interface_address_add; - zclient->interface_address_delete = ospf_interface_address_delete; - zclient->interface_link_params = ospf_interface_link_params; - - zclient->redistribute_route_ipv4_add = ospf_zebra_read_ipv4; - zclient->redistribute_route_ipv4_del = ospf_zebra_read_ipv4; - - access_list_add_hook (ospf_filter_update); - access_list_delete_hook (ospf_filter_update); - prefix_list_add_hook (ospf_prefix_list_update); - prefix_list_delete_hook (ospf_prefix_list_update); + /* Allocate zebra structure. */ + zclient = zclient_new(master); + zclient_init(zclient, ZEBRA_ROUTE_OSPF, instance); + zclient->zebra_connected = ospf_zebra_connected; + zclient->router_id_update = ospf_router_id_update_zebra; + zclient->interface_add = ospf_interface_add; + zclient->interface_delete = ospf_interface_delete; + zclient->interface_up = ospf_interface_state_up; + zclient->interface_down = ospf_interface_state_down; + zclient->interface_address_add = ospf_interface_address_add; + zclient->interface_address_delete = ospf_interface_address_delete; + zclient->interface_link_params = ospf_interface_link_params; + + zclient->redistribute_route_ipv4_add = ospf_zebra_read_ipv4; + zclient->redistribute_route_ipv4_del = ospf_zebra_read_ipv4; + + access_list_add_hook(ospf_filter_update); + access_list_delete_hook(ospf_filter_update); + prefix_list_add_hook(ospf_prefix_list_update); + prefix_list_delete_hook(ospf_prefix_list_update); } |