void pim_sock_reset(struct interface *ifp) { struct pim_interface *pim_ifp; zassert(ifp); zassert(ifp->info); pim_ifp = ifp->info; pim_ifp->primary_address = pim_find_primary_addr(ifp); pim_ifp->pim_sock_fd = -1; pim_ifp->pim_sock_creation = 0; pim_ifp->t_pim_sock_read = 0; pim_ifp->t_pim_hello_timer = 0; pim_ifp->pim_hello_period = PIM_DEFAULT_HELLO_PERIOD; pim_ifp->pim_default_holdtime = -1; /* unset: means 3.5 * pim_hello_period */ pim_ifp->pim_triggered_hello_delay = PIM_DEFAULT_TRIGGERED_HELLO_DELAY; pim_ifp->pim_dr_priority = PIM_DEFAULT_DR_PRIORITY; pim_ifp->pim_propagation_delay_msec = PIM_DEFAULT_PROPAGATION_DELAY_MSEC; pim_ifp->pim_override_interval_msec = PIM_DEFAULT_OVERRIDE_INTERVAL_MSEC; if (PIM_DEFAULT_CAN_DISABLE_JOIN_SUPPRESSION) { PIM_IF_DO_PIM_CAN_DISABLE_JOIN_SUPRESSION(pim_ifp->options); } else { PIM_IF_DONT_PIM_CAN_DISABLE_JOIN_SUPRESSION(pim_ifp->options); } /* neighbors without lan_delay */ pim_ifp->pim_number_of_nonlandelay_neighbors = 0; pim_ifp->pim_neighbors_highest_propagation_delay_msec = 0; pim_ifp->pim_neighbors_highest_override_interval_msec = 0; /* DR Election */ pim_ifp->pim_dr_election_last = 0; /* timestamp */ pim_ifp->pim_dr_election_count = 0; pim_ifp->pim_dr_election_changes = 0; pim_ifp->pim_dr_num_nondrpri_neighbors = 0; /* neighbors without dr_pri */ pim_ifp->pim_dr_addr = pim_ifp->primary_address; pim_ifstat_reset(ifp); }
static int detect_primary_address_change(struct interface *ifp, int force_prim_as_any, const char *caller) { struct pim_interface *pim_ifp; struct in_addr new_prim_addr; int changed; pim_ifp = ifp->info; if (!pim_ifp) return 0; if (force_prim_as_any) new_prim_addr = qpim_inaddr_any; else new_prim_addr = pim_find_primary_addr(ifp); changed = new_prim_addr.s_addr != pim_ifp->primary_address.s_addr; if (PIM_DEBUG_ZEBRA) { char new_prim_str[100]; char old_prim_str[100]; pim_inet4_dump("<new?>", new_prim_addr, new_prim_str, sizeof(new_prim_str)); pim_inet4_dump("<old?>", pim_ifp->primary_address, old_prim_str, sizeof(old_prim_str)); zlog_debug("%s: old=%s new=%s on interface %s: %s", __PRETTY_FUNCTION__, old_prim_str, new_prim_str, ifp->name, changed ? "changed" : "unchanged"); } if (changed) { struct in_addr old_addr = pim_ifp->primary_address; pim_ifp->primary_address = new_prim_addr; on_primary_address_change(ifp, caller, old_addr, new_prim_addr); } return changed; }
static int pim_zebra_if_address_add(int command, struct zclient *zclient, zebra_size_t length, vrf_id_t vrf_id) { struct connected *c; struct prefix *p; /* zebra api notifies address adds/dels events by using the same call interface_add_read below, see comments in lib/zclient.c zebra_interface_address_read(ZEBRA_INTERFACE_ADDRESS_ADD, ...) will add address to interface list by calling connected_add_by_prefix() */ c = zebra_interface_address_read(command, zclient->ibuf, vrf_id); if (!c) return 0; p = c->address; if (p->family != AF_INET) return 0; if (PIM_DEBUG_ZEBRA) { char buf[BUFSIZ]; prefix2str(p, buf, BUFSIZ); zlog_debug("%s: %s connected IP address %s flags %u %s", __PRETTY_FUNCTION__, c->ifp->name, buf, c->flags, CHECK_FLAG(c->flags, ZEBRA_IFA_SECONDARY) ? "secondary" : "primary"); #ifdef PIM_DEBUG_IFADDR_DUMP dump_if_address(c->ifp); #endif } if (!CHECK_FLAG(c->flags, ZEBRA_IFA_SECONDARY)) { /* trying to add primary address */ struct in_addr primary_addr = pim_find_primary_addr(c->ifp); if (primary_addr.s_addr != p->u.prefix4.s_addr) { if (PIM_DEBUG_ZEBRA) { /* but we had a primary address already */ char buf[BUFSIZ]; char old[100]; prefix2str(p, buf, BUFSIZ); pim_inet4_dump("<old?>", primary_addr, old, sizeof(old)); zlog_warn("%s: %s primary addr old=%s: forcing secondary flag on new=%s", __PRETTY_FUNCTION__, c->ifp->name, old, buf); } SET_FLAG(c->flags, ZEBRA_IFA_SECONDARY); } } pim_if_addr_add(c); return 0; }