/* Hook function for updating route_map assignment. */ static void ospf_route_map_update (const char *name) { struct ospf *ospf; int type; /* If OSPF instatnce does not exist, return right now. */ ospf = ospf_lookup (); if (ospf == NULL) return; /* Update route-map */ for (type = 0; type <= ZEBRA_ROUTE_MAX; type++) { if (ROUTEMAP_NAME (ospf, type) && strcmp (ROUTEMAP_NAME (ospf, type), name) == 0) { /* Keep old route-map. */ struct route_map *old = ROUTEMAP (ospf, type); /* Update route-map. */ ROUTEMAP (ospf, type) = route_map_lookup_by_name (ROUTEMAP_NAME (ospf, type)); /* No update for this distribute type. */ if (old == NULL && ROUTEMAP (ospf, type) == NULL) continue; ospf_distribute_list_update (ospf, type); } } }
/* Inteface addition message from zebra. */ static int ospf_interface_add (int command, struct zclient *zclient, zebra_size_t length) { struct interface *ifp; struct ospf *ospf; ifp = zebra_interface_add_read (zclient->ibuf); if (IS_DEBUG_OSPF (zebra, ZEBRA_INTERFACE)) zlog_debug ("Zebra: interface add %s index %d flags %ld metric %d mtu %d", ifp->name, ifp->ifindex, ifp->flags, ifp->metric, ifp->mtu); 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); } ospf = ospf_lookup (); if (ospf != NULL) ospf_if_update (ospf); #ifdef HAVE_SNMP ospf_snmp_if_update (ifp); #endif /* HAVE_SNMP */ return 0; }
static int ospf_interface_address_add (int command, struct zclient *zclient, zebra_size_t length) { struct ospf *ospf; struct connected *c; c = zebra_interface_address_read (command, zclient->ibuf); if (c == NULL) return 0; if (IS_DEBUG_OSPF (zebra, ZEBRA_INTERFACE)) { char buf[128]; prefix2str(c->address, buf, sizeof(buf)); zlog_debug("Zebra: interface %s address add %s", c->ifp->name, buf); } ospf = ospf_lookup (); if (ospf != NULL) ospf_if_update (ospf); #ifdef HAVE_SNMP ospf_snmp_if_update (c->ifp); #endif /* HAVE_SNMP */ return 0; }
static int ospf_interface_address_delete (int command, struct zclient *zclient, zebra_size_t length) { struct ospf *ospf; 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); if (c == NULL) return 0; if (IS_DEBUG_OSPF (zebra, ZEBRA_INTERFACE)) { char buf[128]; 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; rn = route_node_lookup (IF_OIFS (ifp), &p); if (!rn) { connected_free (c); return 0; } assert (rn->info); oi = rn->info; /* Call interface hook functions to clean up */ ospf_if_free (oi); #ifdef HAVE_SNMP ospf_snmp_if_update (c->ifp); #endif /* HAVE_SNMP */ connected_free (c); ospf = ospf_lookup (); if (ospf != NULL) ospf_if_update (ospf); return 0; }
struct ospf_interface *ospf_if_exists(struct ospf_interface *oic) { struct listnode *node; struct ospf *ospf; struct ospf_interface *oi; if ((ospf = ospf_lookup()) == NULL) return NULL; for (ALL_LIST_ELEMENTS_RO(ospf->oiflist, node, oi)) if (oi == oic) return oi; return NULL; }
struct ospf_interface * ospf_if_exists (struct ospf_interface *oic) { struct listnode *node; struct ospf *ospf; struct ospf_interface *oi; ospf = ospf_lookup (); for (node = listhead (ospf->oiflist); node; nextnode (node)) { if (((oi = getdata (node)) != NULL) && (oi == oic)) return oi; } return NULL; }
int ospf_if_up(struct ospf_interface *oi) { if (oi == NULL) return 0; if (oi->type == OSPF_IFTYPE_LOOPBACK) OSPF_ISM_EVENT_SCHEDULE(oi, ISM_LoopInd); else { struct ospf *ospf = ospf_lookup(); if (ospf != NULL) ospf_adjust_sndbuflen(ospf, oi->ifp->mtu); else zlog_warn("%s: ospf_lookup() returned NULL", __func__); ospf_if_stream_set(oi); OSPF_ISM_EVENT_SCHEDULE(oi, ISM_InterfaceUp); } return 1; }
static void ospf_route_map_event (route_map_event_t event, const char *name) { struct ospf *ospf; int type; /* If OSPF instatnce does not exist, return right now. */ ospf = ospf_lookup (); if (ospf == NULL) return; /* Update route-map. */ for (type = 0; type <= ZEBRA_ROUTE_MAX; type++) { if (ROUTEMAP_NAME (ospf, type) && ROUTEMAP (ospf, type) && !strcmp (ROUTEMAP_NAME (ospf, type), name)) { ospf_distribute_list_update (ospf, type); } } }
/* Router-id update message from zebra. */ static int ospf_router_id_update_zebra (int command, struct zclient *zclient, zebra_size_t length) { 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[128]; 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; }