27#ifndef _NETSIM_PIM_SM_H_
28#define _NETSIM_PIM_SM_H_
35#define time_interval UINT16
36#define Propagation_delay_default 500
37#define t_override_default 2500
40#define PIM_HELLO_PERIOD_DEFAULT 30
41#define PIM_TRIGGERED_HELLO_DELAY_DEFAULT 5
42#define PIM_DR_PRIORITY_DEFAULT 1
43#define PIM_PROPAGATION_DELAY_DEFAULT Propagation_delay_default
44#define PIM_OVERRIDE_INTERVAL_DEFAULT t_override_default
45#define PIM_T_PERIODIC_DEFAULT 60
48 NETSIM_IPAddress ALL_PIM_ROUTERS_ADDRESS;
89 NETSIM_IPAddress address;
94 }PIM_NEIGH_STATE,*ptrPIM_NEIGH_STATE;
98 NETSIM_ID interfaceId;
100 NETSIM_IPAddress groupAddress;
102 NETSIM_IPAddress sourceAddress;
106 double effOverrideInterval;
107 double effProppagationDelay;
108 EN_DIS suppressionState;
109 ptrPIM_NEIGH_STATE* neighState;
112 NETSIM_IPAddress DRIPaddress;
123 NETSIM_IPAddress assertWinner;
124 UINT assertWinnerMetric;
145 }PIM_STATE,*ptrPIM_STATE;
146#define PIM_STATE_ALLOC() (ptrPIM_STATE)list_alloc(sizeof(PIM_STATE),offsetof(PIM_STATE,ele))
147#define PIM_STATE_NEXT(state) state = (ptrPIM_STATE)LIST_NEXT(state)
148#define PIM_STATE_ADD(l,m) LIST_ADD_LAST((void**)l,m)
155 }PIM_JP_STATE, *ptrPIM_JP_STATE;
159 NETSIM_ID neighborId;
160 NETSIM_IPAddress neighborAddr;
161 NETSIM_ID incomingInterface;
164 bool dr_priority_present;
168 bool lan_prune_delay_present;
169 bool tracking_support;
170 UINT16 propagation_delay;
171 UINT16 override_interval;
173 UINT secondary_address_count;
174 NETSIM_IPAddress* secondary_address_list;
177 }PIM_NEIGHBOR, *ptrPIM_NEIGHBOR;
178#define PIM_NEIGHBOR_ALLOC() (ptrPIM_NEIGHBOR)list_alloc(sizeof(PIM_NEIGHBOR),offsetof(PIM_NEIGHBOR,ele))
179#define PIM_NEIGHBOR_NEXT(neigh) neigh = (ptrPIM_NEIGHBOR)LIST_NEXT(neigh)
180#define PIM_NEIGHBOR_ADD(l,m) LIST_ADD_LAST((void**)l,m)
185 NETSIM_IPAddress groupAddress;
190 ptrPIM_JP_STATE* jpState_G;
197 }PIM_GROUP, *ptrPIM_GROUP;
198#define PIM_GROUP_ALLOC() (ptrPIM_GROUP)list_alloc(sizeof(PIM_GROUP),offsetof(PIM_GROUP,ele))
199#define PIM_GROUP_NEXT(gr) gr = (ptrPIM_GROUP)LIST_NEXT(gr)
200#define PIM_GROUP_ADD(l,m) LIST_ADD_LAST((void**)l,m)
208 ptrPIM_NEIGHBOR neighborList;
209 NETSIM_IPAddress* DR;
212 ptrPIM_GROUP groupList;
214 ptrPIM_STATE pimState;
220 double triggeredHelloDelay;
223 UINT16 propagationDelay;
224 UINT16 overrideInterval;
225 }PIM_VAR, *ptrPIM_VAR;
226#define GET_PIM_VAR(d) ((ptrPIM_VAR)(GET_IP_DEVVAR(d)->pim))
227#define SET_PIM_VAR(d,var) (GET_IP_DEVVAR(d)->pim = (void*)var)
230 void pim_add_timeout_event(NETSIM_ID d,
233 NETSIM_IPAddress groupAddress);
234 void configure_PIM();
237 void pim_route_add(NETSIM_ID d,
240 NETSIM_IPAddress dest);
241 NETSIM_IPAddress pimroute_find_nexthop(NETSIM_ID d, NETSIM_IPAddress dest);
245 ptrPIM_NEIGHBOR find_neighbor(NETSIM_ID d, NETSIM_IPAddress ip);
246 ptrPIM_NEIGHBOR create_and_add_neighbor(NETSIM_ID d,
248 NETSIM_IPAddress address);
249 void elect_DR(NETSIM_ID d, NETSIM_ID ifid);
252 ptrPIM_GROUP create_group(NETSIM_ID d, NETSIM_IPAddress addr, NETSIM_IPAddress RP);
253 ptrPIM_GROUP pim_find_group(NETSIM_ID d, NETSIM_IPAddress addr);
254 void pim_add_interface_to_group(NETSIM_ID d, NETSIM_ID i, ptrPIM_GROUP g);
257 void send_hello_msg(NETSIM_ID d,
double time);
258 bool process_pim_hello_packet();
261 void pim_send_joinprune(NETSIM_ID d,
double time, ptrPIM_GROUP group);
262 bool pim_process_join();
265 void print_pim_sm_log(
char* format, ...);
266 void print_RPT_Tree(NETSIM_ID rp, ptrPIM_GROUP group);