/* get interface flags */ void if_get_flags(struct interface *ifp) { int ret4 = 0, ret6 = 0; uint64_t newflags = 0; uint64_t tmpflags; if (ifp->flags & IFF_IPV4) { ret4 = if_get_flags_direct(ifp->name, &tmpflags, AF_INET); if (!ret4) newflags |= tmpflags; else if (errno == ENXIO) { /* it's gone */ UNSET_FLAG(ifp->flags, IFF_UP); if_flags_update(ifp, ifp->flags); } } if (ifp->flags & IFF_IPV6) { ret6 = if_get_flags_direct(ifp->name, &tmpflags, AF_INET6); if (!ret6) newflags |= tmpflags; else if (errno == ENXIO) { /* it's gone */ UNSET_FLAG(ifp->flags, IFF_UP); if_flags_update(ifp, ifp->flags); } } /* only update flags if one of above succeeded */ if (!(ret4 && ret6)) if_flags_update(ifp, newflags); }
/* communicate the withdrawal of a connected address */ static void connected_withdraw(struct connected *ifc) { if (!ifc) return; /* Update interface address information to protocol daemon. */ if (CHECK_FLAG(ifc->conf, ZEBRA_IFC_REAL)) { zebra_interface_address_delete_update(ifc->ifp, ifc); if (ifc->address->family == AF_INET) if_subnet_delete(ifc->ifp, ifc); if (ifc->address->family == AF_INET) connected_down_ipv4(ifc->ifp, ifc); #ifdef HAVE_IPV6 else connected_down_ipv6(ifc->ifp, ifc); #endif UNSET_FLAG(ifc->conf, ZEBRA_IFC_REAL); } /* The address is not in the kernel anymore, so clear the flag */ UNSET_FLAG(ifc->conf, ZEBRA_IFC_QUEUED); if (!CHECK_FLAG(ifc->conf, ZEBRA_IFC_CONFIGURED)) { listnode_delete(ifc->ifp->connected, ifc); connected_free(ifc); } }
void ospf_abr_unapprove_summaries (struct ospf *ospf) { listnode node; struct ospf_area *area; struct route_node *rn; struct ospf_lsa *lsa; if (IS_DEBUG_OSPF_EVENT) zlog_info ("ospf_abr_unapprove_summaries(): Start"); for (node = listhead (ospf->areas); node; nextnode (node)) { area = getdata (node); LSDB_LOOP (SUMMARY_LSDB (area), rn, lsa) if (ospf_lsa_is_self_originated (ospf, lsa)) UNSET_FLAG (lsa->flags, OSPF_LSA_APPROVED); LSDB_LOOP (ASBR_SUMMARY_LSDB (area), rn, lsa) if (ospf_lsa_is_self_originated (ospf, lsa)) UNSET_FLAG (lsa->flags, OSPF_LSA_APPROVED); } if (IS_DEBUG_OSPF_EVENT) zlog_info ("ospf_abr_unapprove_summaries(): Stop"); }
/* Handle implicit withdrawals of addresses, where a system ADDs an address * to an interface which already has the same address configured. * * Returns the struct connected which must be announced to clients, * or NULL if nothing to do. */ static struct connected * connected_implicit_withdraw (struct interface *ifp, struct connected *ifc) { struct connected *current; /* Check same connected route. */ if ((current = connected_check (ifp, (struct prefix *) ifc->address))) { if (CHECK_FLAG(current->conf, ZEBRA_IFC_CONFIGURED)) SET_FLAG(ifc->conf, ZEBRA_IFC_CONFIGURED); if (CHECK_FLAG (current->ipv6_config, RTMD_IPV6_ADDR_CONFIG)) SET_FLAG (ifc->ipv6_config, RTMD_IPV6_ADDR_CONFIG); /* Avoid spurious withdraws, this might be just the kernel 'reflecting' * back an address we have already added. */ if (connected_same (current, ifc)) { /* nothing to do */ connected_free (ifc); return NULL; } UNSET_FLAG(current->conf, ZEBRA_IFC_CONFIGURED); UNSET_FLAG(current->ipv6_config, RTMD_IPV6_ADDR_CONFIG); connected_withdraw (current); /* implicit withdraw - freebsd does this */ } return ifc; }
/* Handle an interface delete event */ void if_delete_update (struct interface *ifp) { struct listnode *node; struct listnode *next; struct connected *ifc; struct prefix *p; if (if_is_up(ifp)) { zlog_err ("interface %s index %d is still up while being deleted.", ifp->name, ifp->ifindex); return; } /* Mark interface as inactive */ UNSET_FLAG (ifp->status, ZEBRA_INTERFACE_ACTIVE); if (IS_ZEBRA_DEBUG_KERNEL) zlog_info ("interface %s index %d is now inactive.", ifp->name, ifp->ifindex); /* Delete connected routes from the kernel. */ if (ifp->connected) { for (node = listhead (ifp->connected); node; node = next) { next = node->next; ifc = getdata (node); p = ifc->address; if (p->family == AF_INET) connected_down_ipv4 (ifp, ifc); #ifdef HAVE_IPV6 else if (p->family == AF_INET6) connected_down_ipv6 (ifp, ifc); #endif /* HAVE_IPV6 */ zebra_interface_address_delete_update (ifp, ifc); UNSET_FLAG (ifc->conf, ZEBRA_IFC_REAL); if (! CHECK_FLAG (ifc->conf, ZEBRA_IFC_CONFIGURED)) { listnode_delete (ifp->connected, ifc); connected_free (ifc); } } } zebra_interface_delete_update (ifp); }
int ospf_area_range_substitute_unset (struct ospf *ospf, struct in_addr area_id, struct prefix_ipv4 *p) { struct ospf_area *area; struct ospf_area_range *range; area = ospf_area_lookup_by_area_id (ospf, area_id); if (area == NULL) return 0; range = ospf_area_range_lookup (area, p); if (range == NULL) return 0; if (CHECK_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE)) if (ospf_area_range_active (range)) ospf_schedule_abr_task (ospf); UNSET_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE); range->subst_addr.s_addr = 0; range->subst_masklen = 0; return 1; }
int ospf_area_range_set (struct ospf *ospf, struct in_addr area_id, struct prefix_ipv4 *p, int advertise) { struct ospf_area *area; struct ospf_area_range *range; int ret = OSPF_AREA_ID_FORMAT_ADDRESS; area = ospf_area_get (ospf, area_id, ret); if (area == NULL) return 0; range = ospf_area_range_lookup (area, p); if (range != NULL) { if ((CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE) && !CHECK_FLAG (advertise, OSPF_AREA_RANGE_ADVERTISE)) || (!CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE) && CHECK_FLAG (advertise, OSPF_AREA_RANGE_ADVERTISE))) ospf_schedule_abr_task (ospf); } else { range = ospf_area_range_new (p); ospf_area_range_add (area, range); ospf_schedule_abr_task (ospf); } if (CHECK_FLAG (advertise, OSPF_AREA_RANGE_ADVERTISE)) SET_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE); else UNSET_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE); return 1; }
static int bgp_graceful_restart_timer_expire (struct thread *thread) { struct peer *peer; afi_t afi; safi_t safi; peer = THREAD_ARG (thread); peer->t_gr_restart = NULL; /* NSF delete stale route */ for (afi = AFI_IP ; afi < AFI_MAX ; afi++) for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_3 ; safi++) if (peer->nsf[afi][safi]) bgp_clear_stale_route (peer, afi, safi); UNSET_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT); BGP_TIMER_OFF (peer->t_gr_stale); if (BGP_DEBUG (events, EVENTS)) { zlog_debug ("%s graceful restart timer expired", peer->host); zlog_debug ("%s graceful restart stalepath timer stopped", peer->host); } bgp_timer_set (peer); return 0; }
/* Tie an interface address to its derived subnet list of addresses. */ int if_subnet_add (struct interface *ifp, struct connected *ifc) { struct route_node *rn; struct zebra_if *zebra_if; struct prefix cp; struct list *addr_list; assert (ifp && ifp->info && ifc); zebra_if = ifp->info; /* Get address derived subnet node and associated address list, while marking address secondary attribute appropriately. */ cp = *ifc->address; apply_mask (&cp); rn = route_node_get (zebra_if->ipv4_subnets, &cp); if ((addr_list = rn->info)) SET_FLAG (ifc->flags, ZEBRA_IFA_SECONDARY); else { UNSET_FLAG (ifc->flags, ZEBRA_IFA_SECONDARY); rn->info = addr_list = list_new (); route_lock_node (rn); } /* Tie address at the tail of address list. */ listnode_add (addr_list, ifc); /* Return list element count. */ return (addr_list->count); }
static void ospf6_abr_range_update (struct ospf6_route *range) { u_int32_t cost = 0; struct ospf6_route *ro; assert (range->type == OSPF6_DEST_TYPE_RANGE); /* update range's cost and active flag */ for (ro = ospf6_route_match_head (&range->prefix, ospf6->route_table); ro; ro = ospf6_route_match_next (&range->prefix, ro)) { if (ro->path.area_id == range->path.area_id && ! CHECK_FLAG (ro->flag, OSPF6_ROUTE_REMOVE)) cost = MAX (cost, ro->path.cost); } if (range->path.cost != cost) { range->path.cost = cost; if (range->path.cost) SET_FLAG (range->flag, OSPF6_ROUTE_ACTIVE_SUMMARY); else UNSET_FLAG (range->flag, OSPF6_ROUTE_ACTIVE_SUMMARY); ospf6_abr_originate_summary (range); } }
static int bgp_capability_restart (struct peer *peer, struct capability_header *caphdr) { struct stream *s = BGP_INPUT (peer); u_int16_t restart_flag_time; int restart_bit = 0; size_t end = stream_get_getp (s) + caphdr->length; SET_FLAG (peer->cap, PEER_CAP_RESTART_RCV); restart_flag_time = stream_getw(s); if (CHECK_FLAG (restart_flag_time, RESTART_R_BIT)) restart_bit = 1; UNSET_FLAG (restart_flag_time, 0xF000); peer->v_gr_restart = restart_flag_time; if (BGP_DEBUG (normal, NORMAL)) { zlog_debug ("%s OPEN has Graceful Restart capability", peer->host); zlog_debug ("%s Peer has%srestarted. Restart Time : %d", peer->host, restart_bit ? " " : " not ", peer->v_gr_restart); } while (stream_get_getp (s) + 4 <= end) { afi_t afi = stream_getw (s); safi_t safi = stream_getc (s); u_char flag = stream_getc (s); if (!bgp_afi_safi_valid_indices (afi, &safi)) { if (BGP_DEBUG (normal, NORMAL)) zlog_debug ("%s Addr-family %d/%d(afi/safi) not supported." " Ignore the Graceful Restart capability", peer->host, afi, safi); } else if (!peer->afc[afi][safi]) { if (BGP_DEBUG (normal, NORMAL)) zlog_debug ("%s Addr-family %d/%d(afi/safi) not enabled." " Ignore the Graceful Restart capability", peer->host, afi, safi); } else { if (BGP_DEBUG (normal, NORMAL)) zlog_debug ("%s Address family %s is%spreserved", peer->host, afi_safi_print (afi, safi), CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_RESTART_AF_PRESERVE_RCV) ? " " : " not "); SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_RESTART_AF_RCV); if (CHECK_FLAG (flag, RESTART_F_BIT)) SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_RESTART_AF_PRESERVE_RCV); } } return 0; }
/* Add connected IPv6 route to the interface. */ void connected_add_ipv6 (struct interface *ifp, int flags, struct in6_addr *addr, u_char prefixlen, struct in6_addr *broad, const char *label) { struct prefix_ipv6 *p; struct connected *ifc; /* Make connected structure. */ ifc = connected_new (); ifc->ifp = ifp; ifc->flags = flags; /* If we get a notification from the kernel, * we can safely assume the address is known to the kernel */ SET_FLAG(ifc->conf, ZEBRA_IFC_QUEUED); /* Allocate new connected address. */ p = prefix_ipv6_new (); p->family = AF_INET6; IPV6_ADDR_COPY (&p->prefix, addr); p->prefixlen = prefixlen; ifc->address = (struct prefix *) p; /* If there is broadcast or peer address. */ if (broad) { if (IN6_IS_ADDR_UNSPECIFIED(broad)) zlog_warn("warning: %s called for interface %s with unspecified " "destination address; ignoring!", __func__, ifp->name); else { p = prefix_ipv6_new (); p->family = AF_INET6; IPV6_ADDR_COPY (&p->prefix, broad); p->prefixlen = prefixlen; ifc->destination = (struct prefix *) p; } } if (CHECK_FLAG(ifc->flags, ZEBRA_IFA_PEER) && !ifc->destination) { zlog_warn("warning: %s called for interface %s " "with peer flag set, but no peer address supplied", __func__, ifp->name); UNSET_FLAG(ifc->flags, ZEBRA_IFA_PEER); } /* Label of this address. */ if (label) ifc->label = XSTRDUP (MTYPE_CONNECTED_LABEL, label); /* On Linux, we only get here when DAD is complete, therefore we can set * ZEBRA_IFC_REAL. * * On BSD, there currently doesn't seem to be a way to check for completion of * DAD, so we replicate the old behaviour and set ZEBRA_IFC_REAL, although DAD * might still be running. */ SET_FLAG(ifc->conf, ZEBRA_IFC_REAL); connected_update(ifp, ifc); }
/* Handle changes to addresses and send the neccesary announcements * to clients. */ static void connected_update(struct interface *ifp, struct connected *ifc) { struct connected *current; /* Check same connected route. */ if ((current = connected_check(ifp, (struct prefix *)ifc->address))) { if (CHECK_FLAG(current->conf, ZEBRA_IFC_CONFIGURED)) SET_FLAG(ifc->conf, ZEBRA_IFC_CONFIGURED); /* Avoid spurious withdraws, this might be just the kernel 'reflecting' * back an address we have already added. */ if (connected_same(current, ifc)) { /* nothing to do */ connected_free(ifc); return; } /* Clear the configured flag on the old ifc, so it will be freed by * connected withdraw. */ UNSET_FLAG(current->conf, ZEBRA_IFC_CONFIGURED); connected_withdraw(current); /* implicit withdraw - freebsd does this */ } /* If the connected is new or has changed, announce it, if it is usable */ if (CHECK_FLAG(ifc->conf, ZEBRA_IFC_REAL)) connected_announce(ifp, ifc); }
/* Handle implicit withdrawals of addresses, where a system ADDs an address * to an interface which already has the same address configured. * * Returns the struct connected which must be announced to clients, * or NULL if nothing to do. */ static struct connected * connected_implicit_withdraw (struct interface *ifp, struct connected *ifc) { struct connected *current; /* Check same connected route. */ if ((current = connected_check (ifp, (struct prefix *) ifc->address))) { if (CHECK_FLAG(current->conf, ZEBRA_IFC_CONFIGURED)) SET_FLAG(ifc->conf, ZEBRA_IFC_CONFIGURED); /* Avoid spurious withdraws, this might be just the kernel 'reflecting' * back an address we have already added. */ if (connected_same (current, ifc) && CHECK_FLAG(current->conf, ZEBRA_IFC_REAL)) { /* nothing to do */ connected_free (ifc); return NULL; } UNSET_FLAG(current->conf, ZEBRA_IFC_CONFIGURED); if(CHECK_FLAG (current->flags, ZEBRA_IFA_EXPIRES)) { SET_FLAG (ifc->flags, ZEBRA_IFA_EXPIRES); } ifc->expires = current->expires; // HSA - need to copy over address expiration info if we are to explicitly withdraw a route connected_withdraw (current); /* implicit withdraw - freebsd does this */ } return ifc; }
void nsm_reset_nbr (struct ospf_neighbor *nbr) { /* Clear Database Summary list. */ if (!ospf_db_summary_isempty (nbr)) ospf_db_summary_clear (nbr); /* Clear Link State Request list. */ if (!ospf_ls_request_isempty (nbr)) ospf_ls_request_delete_all (nbr); /* Clear Link State Retransmission list. */ if (!ospf_ls_retransmit_isempty (nbr)) ospf_ls_retransmit_clear (nbr); /* Cancel thread. */ OSPF_NSM_TIMER_OFF (nbr->t_db_desc); OSPF_NSM_TIMER_OFF (nbr->t_ls_req); OSPF_NSM_TIMER_OFF (nbr->t_ls_upd); OSPF_NSM_TIMER_OFF (nbr->t_hello_reply); #ifdef HAVE_OPAQUE_LSA if (CHECK_FLAG (nbr->options, OSPF_OPTION_O)) UNSET_FLAG (nbr->options, OSPF_OPTION_O); #endif /* HAVE_OPAQUE_LSA */ }
/* set or unset the alpha flag on the umage (alpha = 1 / 0 ) */ void __imlib_SetImageAlphaFlag(ImlibImage * im, char alpha) { if (alpha) SET_FLAG(im->flags, F_HAS_ALPHA); else UNSET_FLAG(im->flags, F_HAS_ALPHA); }
void ospf_vl_unapprove(struct ospf *ospf) { struct listnode *node; struct ospf_vl_data *vl_data; for (ALL_LIST_ELEMENTS_RO(ospf->vlinks, node, vl_data)) UNSET_FLAG(vl_data->flags, OSPF_VL_FLAG_APPROVED); }
void ospf6_interface_enable (struct ospf6_interface *oi) { UNSET_FLAG (oi->flag, OSPF6_INTERFACE_DISABLE); oi->thread_send_hello = thread_add_event (master, ospf6_hello_send, oi, 0); }
void ospf6_interface_enable (struct ospf6_interface *oi) { UNSET_FLAG (oi->flag, OSPF6_INTERFACE_DISABLE); zlog_debug("about to send hello message..."); oi->thread_send_hello = thread_add_event (master, rospf6_hello_send, oi, 0); }
/* BSD link detect translation */ static void bsd_linkdetect_translate (struct if_msghdr *ifm) { if ((ifm->ifm_data.ifi_link_state >= LINK_STATE_UP) || (ifm->ifm_data.ifi_link_state == LINK_STATE_UNKNOWN)) SET_FLAG(ifm->ifm_flags, IFF_RUNNING); else UNSET_FLAG(ifm->ifm_flags, IFF_RUNNING); }
/* Send ECMP routes to zebra. */ static void rip_zebra_ipv4_send (struct route_node *rp, u_char cmd) { static struct in_addr **nexthops = NULL; static unsigned int nexthops_len = 0; struct list *list = (struct list *)rp->info; struct zapi_ipv4 api; struct listnode *listnode = NULL; struct rip_info *rinfo = NULL; int count = 0; if (vrf_bitmap_check (zclient->redist[ZEBRA_ROUTE_RIP], VRF_DEFAULT)) { api.vrf_id = VRF_DEFAULT; api.type = ZEBRA_ROUTE_RIP; api.flags = 0; api.message = 0; api.safi = SAFI_UNICAST; if (nexthops_len < listcount (list)) { nexthops_len = listcount (list); nexthops = XREALLOC (MTYPE_TMP, nexthops, nexthops_len * sizeof (struct in_addr *)); } SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP); for (ALL_LIST_ELEMENTS_RO (list, listnode, rinfo)) { nexthops[count++] = &rinfo->nexthop; if (cmd == ZEBRA_IPV4_ROUTE_ADD) SET_FLAG (rinfo->flags, RIP_RTF_FIB); else UNSET_FLAG (rinfo->flags, RIP_RTF_FIB); } api.nexthop = nexthops; api.nexthop_num = count; api.ifindex_num = 0; rinfo = listgetdata (listhead (list)); SET_FLAG (api.message, ZAPI_MESSAGE_METRIC); api.metric = rinfo->metric; if (rinfo->distance && rinfo->distance != ZEBRA_RIP_DISTANCE_DEFAULT) { SET_FLAG (api.message, ZAPI_MESSAGE_DISTANCE); api.distance = rinfo->distance; } zapi_ipv4_route (cmd, zclient, (struct prefix_ipv4 *)&rp->p, &api); rip_global_route_changes++; }
void ospf_vl_unapprove (struct ospf *ospf) { struct listnode *node; struct ospf_vl_data *vl_data; for (node = listhead (ospf->vlinks); node; nextnode (node)) if ((vl_data = getdata (node)) != NULL) UNSET_FLAG (vl_data->flags, OSPF_VL_FLAG_APPROVED); }
g_error textedit_set ( struct widget *self, int property, glob data ) { struct pgstring *text; switch (property) { case PG_WP_TEXT: if (iserror(rdhandle((void **) &text, PG_TYPE_PGSTRING, -1, (handle) data))) text = NULL; if (text) { text_backend_set_text(DATA, text); } break; case PG_WP_FONT: if (iserror(rdhandle((void **)&DATA->fd, PG_TYPE_FONTDESC,-1,data)) || !DATA->fd) return mkerror(PG_ERRT_HANDLE,44); text_backend_build(DATA, DATA->width, DATA->height); break; case PG_WP_SELECTION: if (iserror(rdhandle((void **) &text, PG_TYPE_PGSTRING, -1, (handle) data))) text = NULL; if (text) text_backend_set_selection(DATA, text); break; case PG_WP_READONLY: if (data) { SET_FLAG(DATA->flags, TEXT_WIDGET_READONLY); UNSET_FLAG(DATA->flags, TEXT_WIDGET_FLASH_ON); } else { UNSET_FLAG(DATA->flags, TEXT_WIDGET_READONLY); SET_FLAG(DATA->flags, TEXT_WIDGET_FLASH_ON); DATA->cursor_state = 1; install_timer(self, FLASHTIME_ON); } break; } return success; }
ospf6_enable (struct ospf6 *o) { struct listnode *node, *nnode; struct ospf6_area *oa; if (CHECK_FLAG (o->flag, OSPF6_DISABLED)) { UNSET_FLAG (o->flag, OSPF6_DISABLED); for (ALL_LIST_ELEMENTS (o->area_list, node, nnode, oa)) ospf6_area_enable (oa); }
void ospf6_area_disable (struct ospf6_area *oa) { struct listnode *node, *nnode; struct ospf6_interface *oi; UNSET_FLAG (oa->flag, OSPF6_AREA_ENABLE); for (ALL_LIST_ELEMENTS (oa->if_list, node, nnode, oi)) ospf6_interface_disable (oi); }
/* Add self to nbr list. */ void ospf_nbr_add_self(struct ospf_interface *oi, struct in_addr router_id) { struct prefix p; struct route_node *rn; if (!oi->nbr_self) oi->nbr_self = ospf_nbr_new(oi); /* Initial state */ oi->nbr_self->address = *oi->address; oi->nbr_self->priority = OSPF_IF_PARAM(oi, priority); oi->nbr_self->router_id = router_id; oi->nbr_self->src = oi->address->u.prefix4; oi->nbr_self->state = NSM_TwoWay; switch (oi->area->external_routing) { case OSPF_AREA_DEFAULT: SET_FLAG(oi->nbr_self->options, OSPF_OPTION_E); break; case OSPF_AREA_STUB: UNSET_FLAG(oi->nbr_self->options, OSPF_OPTION_E); break; case OSPF_AREA_NSSA: UNSET_FLAG(oi->nbr_self->options, OSPF_OPTION_E); SET_FLAG(oi->nbr_self->options, OSPF_OPTION_NP); break; } /* Add nbr_self to nbrs table */ ospf_nbr_key(oi, oi->nbr_self, &p); rn = route_node_get(oi->nbrs, &p); if (rn->info) { /* There is already pseudo neighbor. */ zlog_warn( "router_id %s already present in neighbor table. node refcount %u", inet_ntoa(router_id), rn->lock); route_unlock_node(rn); } else rn->info = oi->nbr_self; }
/* Add self to nbr list. */ void ospf_nbr_add_self (struct ospf_interface *oi) { struct prefix p; struct route_node *rn; /* Initial state */ oi->nbr_self->address = *oi->address; oi->nbr_self->priority = OSPF_IF_PARAM (oi, priority); oi->nbr_self->router_id = oi->ospf->router_id; oi->nbr_self->src = oi->address->u.prefix4; oi->nbr_self->state = NSM_TwoWay; switch (oi->area->external_routing) { case OSPF_AREA_DEFAULT: SET_FLAG (oi->nbr_self->options, OSPF_OPTION_E); break; case OSPF_AREA_STUB: UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_E); break; case OSPF_AREA_NSSA: UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_E); SET_FLAG (oi->nbr_self->options, OSPF_OPTION_NP); break; } /* Add nbr_self to nbrs table */ ospf_nbr_key (oi, oi->nbr_self, &p); rn = route_node_get (oi->nbrs, &p); if (rn->info) { /* There is already pseudo neighbor. */ assert (oi->nbr_self == rn->info); route_unlock_node (rn); } else rn->info = oi->nbr_self; }
/* withdraw a connected address */ static void connected_withdraw (struct connected *ifc) { if (! ifc) return; /* Update interface address information to protocol daemon. */ if (CHECK_FLAG (ifc->conf, ZEBRA_IFC_REAL)) { zebra_interface_address_delete_update (ifc->ifp, ifc); if_subnet_delete (ifc->ifp, ifc); if (ifc->address->family == AF_INET) connected_down_ipv4 (ifc->ifp, ifc); #ifdef HAVE_IPV6 else connected_down_ipv6 (ifc->ifp, ifc); #endif UNSET_FLAG (ifc->conf, ZEBRA_IFC_REAL); } if (!CHECK_FLAG (ifc->conf, ZEBRA_IFC_CONFIGURED)) { /* router_id_del_address(ifc); listnode_delete (ifc->ifp->connected, ifc); connected_free (ifc);*/ if(ifc->address->family == AF_INET) { router_id_del_address(ifc); listnode_delete (ifc->ifp->connected, ifc); connected_free (ifc); } else { if(!CHECK_FLAG(ifc->ipv6_config, RTMD_IPV6_ADDR_CONFIG)) { router_id_del_address(ifc); listnode_delete (ifc->ifp->connected, ifc); connected_free (ifc); } else { zlog_debug("%s: line %d, Cannot delete IPv6 config addr .\n",__func__,__LINE__); } } } }
/* Add connected IPv6 route to the interface. */ void connected_add_ipv6 (struct interface *ifp, int flags, struct in6_addr *addr, u_char prefixlen, struct in6_addr *broad, const char *label) { struct prefix_ipv6 *p; struct connected *ifc; /* Make connected structure. */ ifc = connected_new (); ifc->ifp = ifp; ifc->flags = flags; /* Allocate new connected address. */ p = prefix_ipv6_new (); p->family = AF_INET6; IPV6_ADDR_COPY (&p->prefix, addr); p->prefixlen = prefixlen; ifc->address = (struct prefix *) p; /* If there is broadcast or peer address. */ if (broad) { if (IN6_IS_ADDR_UNSPECIFIED(broad)) zlog_warn("warning: %s called for interface %s with unspecified " "destination address; ignoring!", __func__, ifp->name); else { p = prefix_ipv6_new (); p->family = AF_INET6; IPV6_ADDR_COPY (&p->prefix, broad); p->prefixlen = prefixlen; ifc->destination = (struct prefix *) p; } } if (CHECK_FLAG(ifc->flags, ZEBRA_IFA_PEER) && !ifc->destination) { zlog_warn("warning: %s called for interface %s " "with peer flag set, but no peer address supplied", __func__, ifp->name); UNSET_FLAG(ifc->flags, ZEBRA_IFA_PEER); } /* Label of this address. */ if (label) ifc->label = XSTRDUP (MTYPE_CONNECTED_LABEL, label); if ((ifc = connected_implicit_withdraw (ifp, ifc)) == NULL) return; connected_announce (ifp, ifc); }
void vrf_bitmap_unset (vrf_bitmap_t bmap, vrf_id_t vrf_id) { struct vrf_bitmap *bm = (struct vrf_bitmap *) bmap; u_char group = VRF_BITMAP_GROUP (vrf_id); u_char offset = VRF_BITMAP_BIT_OFFSET (vrf_id); if (bmap == VRF_BITMAP_NULL || bm->groups[group] == NULL) return; UNSET_FLAG (bm->groups[group][VRF_BITMAP_INDEX_IN_GROUP (offset)], VRF_BITMAP_FLAG (offset)); }