20ptrPIM_NEIGHBOR find_neighbor(NETSIM_ID d, NETSIM_IPAddress ip)
22 ptrPIM_NEIGHBOR neigh = GET_PIM_VAR(d)->neighborList;
26 if (!IP_COMPARE(neigh->neighborAddr, ip))
31 for (i = 0; i < neigh->secondary_address_count; i++)
32 if (!IP_COMPARE(ip, neigh->secondary_address_list[i]))
35 PIM_NEIGHBOR_NEXT(neigh);
40static void add_neighbor(NETSIM_ID d, ptrPIM_NEIGHBOR neigh)
42 GET_PIM_VAR(d)->neighCount++;
43 PIM_NEIGHBOR_ADD(&GET_PIM_VAR(d)->neighborList, neigh);
46ptrPIM_NEIGHBOR create_and_add_neighbor(NETSIM_ID d,
48 NETSIM_IPAddress address)
50 ptrPIM_NEIGHBOR neigh = PIM_NEIGHBOR_ALLOC();
51 neigh->incomingInterface = ifId;
52 neigh->neighborAddr = address;
53 add_neighbor(d, neigh);
57static ptrPIM_NEIGHBOR* get_all_neigh_for_interface(NETSIM_ID d,
63 ptrPIM_NEIGHBOR neigh = GET_PIM_VAR(d)->neighborList;
66 if (neigh->incomingInterface == ifid)
69 n = realloc(n, (k + 1) *
sizeof* n);
71 n = calloc(1,
sizeof* n);
75 PIM_NEIGHBOR_NEXT(neigh);
81static bool dr_is_better(ptrPIM_NEIGHBOR a, ptrPIM_NEIGHBOR b)
83 if (!a->dr_priority_present || !b->dr_priority_present)
85 return a->neighborAddr->str_ip > b->neighborAddr->str_ip;
89 return ((a->dr_priority > b->dr_priority) ||
90 (a->dr_priority == b->dr_priority &&
91 a->neighborAddr->str_ip > b->neighborAddr->str_ip));
95void elect_DR(NETSIM_ID d, NETSIM_ID ifid)
97 ptrPIM_VAR var = GET_PIM_VAR(d);
99 ptrPIM_NEIGHBOR* neigh = get_all_neigh_for_interface(d, ifid, &c);
103 memset(&me, 0,
sizeof me);
104 me.neighborAddr = DEVICE_NWADDRESS(d, ifid);
105 ptrPIM_NEIGHBOR dr = &me;
106 for (i = 0; i < c; i++)
108 if (dr_is_better(neigh[i], dr))
111 var->DR[ifid - 1] = dr->neighborAddr;
115static bool lan_delay_enabled(NETSIM_ID d, NETSIM_ID I)
118 ptrPIM_NEIGHBOR* neigh = get_all_neigh_for_interface(d, I, &c);
121 for (i = 0; i < c; i++)
123 if (neigh[i]->lan_prune_delay_present ==
false)
133time_interval Effective_Propagation_Delay(NETSIM_ID d,NETSIM_ID I)
135 if (!lan_delay_enabled(d,I) ==
false)
136 return Propagation_delay_default;
138 time_interval delay = GET_PIM_VAR(d)->propagationDelay;
140 ptrPIM_NEIGHBOR* neigh = get_all_neigh_for_interface(d, I, &c);
143 for (i = 0; i < c; i++)
145 if (neigh[i]->propagation_delay > delay)
146 delay = neigh[i]->propagation_delay;
152time_interval Effective_Override_Interval(NETSIM_ID d, NETSIM_ID I)
154 if (!lan_delay_enabled(d, I) ==
false)
155 return t_override_default;
157 time_interval delay = GET_PIM_VAR(d)->overrideInterval;
159 ptrPIM_NEIGHBOR* neigh = get_all_neigh_for_interface(d, I, &c);
162 for (i = 0; i < c; i++)
164 if (neigh[i]->override_interval > delay)
165 delay = neigh[i]->override_interval;
171bool Suppression_Enabled(NETSIM_ID d, NETSIM_ID I)
173 if (lan_delay_enabled(d, I) ==
false)
177 ptrPIM_NEIGHBOR* neigh = get_all_neigh_for_interface(d, I, &c);
180 for (i = 0; i < c; i++)
182 if (neigh[i]->tracking_support ==
false)