NetSim Source Code Help v14.4
All 13 Components
 
Loading...
Searching...
No Matches
PIM_SM.h
1/************************************************************************************
2* Copyright (C) 2023 *
3* TETCOS, Bangalore. India *
4* *
5* Tetcos owns the intellectual property rights in the Product and its content. *
6* The copying, redistribution, reselling or publication of any or all of the *
7* Product or its content without express prior written consent of Tetcos is *
8* prohibited. Ownership and / or any other right relating to the software and all *
9* intellectual property rights therein shall remain at all times with Tetcos. *
10* *
11* Author: Shashi Kant Suman *
12* *
13* ---------------------------------------------------------------------------------*/
14/*
15Internet Engineering Task Force (IETF)
16Request for Comments: 7761
17STD: 83
18Obsoletes: 4601
19Category: Standards Track
20ISSN: 2070-1721
21
22Protocol Independent Multicast - Sparse Mode (PIM-SM):
23Protocol Specification (Revised)
24
25*/
26#pragma once
27#ifndef _NETSIM_PIM_SM_H_
28#define _NETSIM_PIM_SM_H_
29#ifdef __cplusplus
30extern "C" {
31#endif
32
33//#define PRINT_RPT_TREE
34
35#define time_interval UINT16 // In millisecond
36#define Propagation_delay_default 500 // millisecond
37#define t_override_default 2500 // millisecond
38
39 //Config parameter
40#define PIM_HELLO_PERIOD_DEFAULT 30 //Second
41#define PIM_TRIGGERED_HELLO_DELAY_DEFAULT 5 //Second
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 //Second
46
47 //Const
48 NETSIM_IPAddress ALL_PIM_ROUTERS_ADDRESS;
49
50 typedef enum
51 {
52 DISABLE,
53 ENABLE,
54 }EN_DIS;
55
56 typedef enum
57 {
58 LMS_NoInfo,
59 LMS_Include,
60 LMS_Exclude,
61 }LMS;
62
63 typedef enum
64 {
65 JPS_NI, // NoInfo
66 JPS_J, // Join
67 JPS_PP, // Prune-pending
68 JPS_P, // Prune
69 JPS_JP, // Join-Pending
70 }JPS;
71
72 typedef enum
73 {
74 AWS_NI, // NoInfo
75 AWS_L, // I lost assert
76 AWS_W, // I Won assert
77 }AWS;
78
79 typedef enum
80 {
81 UJPS_NotJoined,
82 UJPS_Joined,
83 UJPS_NotPruned,
84 UJPS_Pruned,
85 }UJPS;
86
88 {
89 NETSIM_IPAddress address;
90
91 void* infoNeighHello;
92 UINT neighGenId;
93 double NLT;
94 }PIM_NEIGH_STATE,*ptrPIM_NEIGH_STATE;
95
96 typedef struct stru_pim_state
97 {
98 NETSIM_ID interfaceId;
99 NETSIM_ID groupId;
100 NETSIM_IPAddress groupAddress;
101 NETSIM_ID sourceId;
102 NETSIM_IPAddress sourceAddress;
103 NETSIM_ID rptId;
104
105 //General purpose state -- For each Interface
106 double effOverrideInterval;
107 double effProppagationDelay;
108 EN_DIS suppressionState;
109 ptrPIM_NEIGH_STATE* neighState;
111 {
112 NETSIM_IPAddress DRIPaddress;
113 UINT DRPriority;
114 }DR_STATE;
115
116 //(*,G) State -- For each interface
117 LMS LMSState;
118 JPS JPSState;
119 double PPT; // Prune-pending timer
120 double ET; // Join/Prune expiry timer
121 AWS AWSState;
122 double AT; // Assert Timer
123 NETSIM_IPAddress assertWinner; // Assert winner IP address
124 UINT assertWinnerMetric; // Assert winner assert metric
125
126 //(*,G) state -- For not interface specific
127 UJPS UJPSState;
128 double JT; // Upstream join/prune timer
129 UINT lastRPUsed;
130 UINT lastRPFNeigh;
131
132 //(S,G) state -- For each interface
133 //same as (*,G) state
134
135 //(S,G) State -- For not interface specific. Extra from (*,G) state
136 bool sptBit;
137 double KAT; // (S,G) keep alive timer
138 JPS registerState;
139 double RST; //Register-stop timer
140
141 //(S,G,RPT) state -- Extra from above
142 double OT; // Override timer
143
144 _ele* ele;
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)
149
150 typedef struct stru_pim_JP_state
151 {
152 JPS state;
153 double PPT;
154 double ET;
155 }PIM_JP_STATE, *ptrPIM_JP_STATE;
156
157 typedef struct stru_pim_neighbor
158 {
159 NETSIM_ID neighborId;
160 NETSIM_IPAddress neighborAddr;
161 NETSIM_ID incomingInterface;
162 UINT gen_id;
163 UINT16 dr_priority;
164 bool dr_priority_present;
165 bool isTimeoutAdded;
166 double timeout;
167
168 bool lan_prune_delay_present;
169 bool tracking_support;
170 UINT16 propagation_delay; //In millisecond
171 UINT16 override_interval; //In millisecond
172
173 UINT secondary_address_count;
174 NETSIM_IPAddress* secondary_address_list;
175
176 _ele* ele;
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)
181
182 typedef struct stru_pim_group
183 {
184 NETSIM_ID groupId;
185 NETSIM_IPAddress groupAddress;
186 NETSIM_IPAddress RP;
187 NETSIM_ID RPId;
188
189 //(*,G) State
190 ptrPIM_JP_STATE* jpState_G;
191
192 //Forward Interface
193 UINT count;
194 NETSIM_ID* ifid;
195
196 _ele* ele;
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)
201
202
203 typedef struct stru_pim_var
204 {
205 UINT interfaceCount;
206
207 UINT neighCount;
208 ptrPIM_NEIGHBOR neighborList;
209 NETSIM_IPAddress* DR;
210
211 UINT groupCount;
212 ptrPIM_GROUP groupList;
213
214 ptrPIM_STATE pimState;
215
216 UINT genId;
217
218 //Config parameter
219 double helloPeriod;
220 double triggeredHelloDelay;
221 double t_periodic;
222 UINT DRPriority;
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)
228
229 //Function prototype
230 void pim_add_timeout_event(NETSIM_ID d,
231 double time,
232 IP_SUBEVENT eve,
233 NETSIM_IPAddress groupAddress);
234 void configure_PIM();
235
236 //PIM Route
237 void pim_route_add(NETSIM_ID d,
238 NETSIM_ID i,
239 UINT metric,
240 NETSIM_IPAddress dest);
241 NETSIM_IPAddress pimroute_find_nexthop(NETSIM_ID d, NETSIM_IPAddress dest);
242 int pim_route_msg();
243
244 //PIM Neighbor
245 ptrPIM_NEIGHBOR find_neighbor(NETSIM_ID d, NETSIM_IPAddress ip);
246 ptrPIM_NEIGHBOR create_and_add_neighbor(NETSIM_ID d,
247 NETSIM_ID ifId,
248 NETSIM_IPAddress address);
249 void elect_DR(NETSIM_ID d, NETSIM_ID ifid);
250
251 //PIM Group
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);
255
256 //PIM MSG
257 void send_hello_msg(NETSIM_ID d, double time);
258 bool process_pim_hello_packet();
259
260 //PIM Join
261 void pim_send_joinprune(NETSIM_ID d, double time, ptrPIM_GROUP group);
262 bool pim_process_join();
263
264 //Utility
265 void print_pim_sm_log(char* format, ...);
266 void print_RPT_Tree(NETSIM_ID rp, ptrPIM_GROUP group);
267
268#ifdef __cplusplus
269}
270#endif
271#endif