/* Interface State Machine */ int interface_up (struct thread *thread) { struct ospf6_interface *oi; oi = (struct ospf6_interface *) THREAD_ARG (thread); assert (oi && oi->interface); if (IS_OSPF6_DEBUG_INTERFACE) zlog_debug ("Interface Event %s: [InterfaceUp]", oi->interface->name); /* check physical interface is up */ if (! if_is_up (oi->interface)) { if (IS_OSPF6_DEBUG_INTERFACE) zlog_debug ("Interface %s is down, can't execute [InterfaceUp]", oi->interface->name); return 0; } /* if already enabled, do nothing */ if (oi->state > OSPF6_INTERFACE_DOWN) { if (IS_OSPF6_DEBUG_INTERFACE) zlog_debug ("Interface %s already enabled", oi->interface->name); return 0; } /* Join AllSPFRouters */ // send join allspfrouters message to shim thread_add_event (master, rospf6_join_allspfrouters_send, oi, 0); // ospf6_join_allspfrouters (oi->interface->ifindex); /* Update interface route */ ospf6_interface_connected_route_update (oi->interface); zlog_debug("about to send hello message..."); /* Schedule Hello */ if (! CHECK_FLAG (oi->flag, OSPF6_INTERFACE_PASSIVE)) thread_add_event (master, rospf6_hello_send, oi, 0); /* decide next interface state */ if (if_is_pointopoint (oi->interface)) ospf6_interface_state_change (OSPF6_INTERFACE_POINTTOPOINT, oi); else if (oi->priority == 0) ospf6_interface_state_change (OSPF6_INTERFACE_DROTHER, oi); else { ospf6_interface_state_change (OSPF6_INTERFACE_WAITING, oi); thread_add_timer (master, wait_timer, oi, oi->dead_interval); } return 0; }
int if_address_add_v6(struct ctrl_client * ctrl_client, struct rfpbuf * buffer) { const struct rfp_ipv6_address * address = buffer->data; struct interface * ifp = if_lookup_by_index(ctrl_client->if_list, address->ifindex); struct connected * ifc; struct prefix p; memcpy(&p.u.prefix, &address->p, 16); p.prefixlen = address->prefixlen; p.family = AF_INET6; ifc = connected_add_by_prefix(ifp, &p, NULL); if(ifc == NULL) return 1; if(IS_OSPF6_SIBLING_DEBUG_MSG) { char prefix_str[INET6_ADDRSTRLEN+3]; // three extra chars for slash + two digits if(prefix2str(ifc->address, prefix_str, INET6_ADDRSTRLEN) != 1) { zlog_debug("v6 addr: %s", prefix_str, ifc->address->prefixlen); } } // check here for: // 1. prefix matches // 2. extract hostnum from host portion of address // 3. if hostnum matches, this is the internal interface that should be recorded char inter_target_str[INET6_ADDRSTRLEN+3]; // three extra chars for slash + two digits struct prefix inter_target_p; sprintf(inter_target_str, "2001:db8:beef:10::%x/64", ctrl_client->hostnum); str2prefix(inter_target_str, &inter_target_p); // link up the internal connected address with a pointer at ctrl_client if(prefix_same(ifc->address, &inter_target_p)) { ctrl_client->inter_con = ifc; } // since connected address is AF_INET6, needs to be updated ospf6_interface_connected_route_update(ifc->ifp); return 0; }
static int ospf6_zebra_if_address_update_delete (int command, struct zclient *zclient, zebra_size_t length) { struct connected *c; char buf[128]; c = zebra_interface_address_read (ZEBRA_INTERFACE_ADDRESS_DELETE, zclient->ibuf); if (c == NULL) return 0; if (IS_OSPF6_DEBUG_ZEBRA (RECV)) zlog_debug ("Zebra Interface address delete: %s %5s %s/%d", c->ifp->name, prefix_family_str (c->address), inet_ntop (c->address->family, &c->address->u.prefix, buf, sizeof (buf)), c->address->prefixlen); if (c->address->family == AF_INET6) ospf6_interface_connected_route_update (c->ifp); return 0; }