NetSim Source Code Help
Loading...
Searching...
No Matches
PIM_Join.c
Go to the documentation of this file.
1/************************************************************************************
2* Copyright (C) 2020 *
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
15#include "main.h"
16#include "List.h"
17#include "IP.h"
18#include "PIM_SM.h"
19#include "PIM_Msg.h"
20
22{
25
26 return jp;
27}
28
30 double time,
32{
35 jp,
36 time,
37 dev,
38 DEVICE_NWADDRESS(dev, 1),
39 1,
40 &group->RPId,
41 group->RP,
42 MAX_TTL);
43 return packet;
44}
45
47 NETSIM_IPAddress groupAddr,
49 UINT c)
50{
51 UINT i;
52 ptrPIM_JOINMSG_GROUP msg = jp->groups[c];
53 if (!msg)
54 {
55 msg = calloc(1, sizeof* msg);
56 jp->groups[c] = msg;
57 msg->numJoinedSource = 1;
58 msg->joinedSourceAddr = calloc(1, sizeof* msg->joinedSourceAddr);
59 i = 0;
60 msg->multicastAddr = encode_group_addr(groupAddr);
61 }
62 else
63 {
65 (msg->numJoinedSource + 1) * sizeof* msg->joinedSourceAddr);
66 i = msg->numJoinedSource;
67 msg->numJoinedSource++;
68 }
70 DEVICE_INTERFACE(d, 1)->szSubnetMask);
71 return msg;
72}
73
75{
76 UINT i;
77 for (i = 0; i < jp->numGroups; i++)
78 {
80 {
81 *in = i;
82 return jp->groups[i];
83 }
84 }
85 return NULL;
86}
87
89 NetSim_PACKET* packet,
91 ptrPIM_NEIGHBOR neighbor)
92{
94 if (!jp)
95 {
96 jp->numGroups = 1;
97 jp->holdTime = (UINT16)(3.5*(GET_PIM_VAR(d)->t_periodic / SECOND));
99 jp->groups = calloc(jp->numGroups, sizeof* jp->groups);
100 jp->groups[0] = pim_join_add_group_member(d, group->groupAddress, jp, 0);
101 }
102 else
103 {
104 UINT i;
105 jp->holdTime = (UINT16)(3.5*(GET_PIM_VAR(d)->t_periodic / SECOND));
107 ptrPIM_JOINMSG_GROUP g = jP_find_groups(jp, group->groupAddress,&i);
108 if (!g)
109 {
110 if (jp->groups)
111 jp->groups = realloc(jp->groups, (jp->numGroups + 1) * sizeof* jp->groups);
112 else
113 jp->groups = calloc(1, sizeof* jp->groups);
114 g = jp->groups[jp->numGroups];
115 jp->numGroups++;
116 i = jp->numGroups - 1;
117 }
118 jp->groups[i] = pim_join_add_group_member(d, group->groupAddress, jp, i);
119 }
120}
121
123{
125 return find_neighbor(d, nexthop);
126}
127
129{
130 ptrPIM_VAR var = GET_PIM_VAR(d);
131 NetSim_PACKET* packet = create_pim_joinprune(d, time, group);
132
134
135 assert(neighbor);
136
137 pim_join_add_group(d, packet, group, neighbor);
138
139 send_pim_msg(d, time, packet);
140 print_pim_sm_log("sending PIM_Join msg.");
141 print_pim_sm_log("Adding JT timer event at %0.3lf", time + var->t_periodic);
142 pim_add_timeout_event(d, time + var->t_periodic, EVENT_PIM_JT, group->groupAddress);
143 print_pim_sm_log("\n");
144}
145
147{
148 ptrPIM_GROUP g = pim_find_group(d, gaddr);
149 if (!IP_COMPARE(g->RP, rp))
150 return true;
151 else
152 return false;
153}
154
156{
157 if (!gr->jpState_G)
158 gr->jpState_G = (ptrPIM_JP_STATE*)calloc(DEVICE(d)->nNumOfInterface, sizeof* gr->jpState_G);
159
160 if (!gr->jpState_G[i - 1])
161 gr->jpState_G[i - 1] = (ptrPIM_JP_STATE)calloc(1, sizeof* gr->jpState_G[i]);
162
163 return gr->jpState_G[i - 1];
164}
165
166static bool amIRP(NETSIM_ID d, ptrPIM_GROUP g)
167{
168 return g->RPId == d;
169}
170
172{
175 double time = pstruEventDetails->dEventTime;
176 ptrPIM_VAR var = GET_PIM_VAR(d);
177 ptrPIM_JOINPRUNE_MSG msg = get_PIM_MSG(packet);
179 ptrPIM_GROUP g = pim_find_group(d, maddr);
180
181 ptrPIM_NEIGHBOR neighbor = pimjoin_find_neighbor(d, g->RP);
182 pim_join_add_group(d, packet, g, neighbor);
183
184 packet->pstruNetworkData->szGatewayIP = NULL;
185 packet->pstruNetworkData->szNextHopIp = NULL;
186 send_pim_msg(d, time, packet);
187 print_pim_sm_log("sending PIM_Join msg.");
188 print_pim_sm_log("Adding JT timer event at %0.3lf", time + var->t_periodic);
190 print_pim_sm_log("\n");
191}
192
194{
197 double time = pstruEventDetails->dEventTime;
198 ptrPIM_VAR var = GET_PIM_VAR(d);
199 ptrPIM_JOINPRUNE_MSG msg = get_PIM_MSG(packet);
201
202 print_pim_sm_log("Received PIM_JOIN msg from %s for group address %s",
204 maddr->str_ip);
205
207
208 if (!validate_RP(d, msgRP, maddr))
209 {
210 print_pim_sm_log("RP is not matched for group");
211 return true; // RP is not matched for group
212 }
213 ptrPIM_GROUP g = pim_find_group(d, maddr);
214
217 g);
218
219 if (state->state == JPS_NI)
220 {
221 state->state = JPS_J;
222 state->ET = time + msg->holdTime*SECOND;
223 print_pim_sm_log("Adding JT timer event at %0.3lf", state->ET/1000);
225 }
226 else
227 {
228 state->ET = time + msg->holdTime*SECOND;
229 print_pim_sm_log("ET timer is updated to %0.3lf", state->ET / 1000);
230 }
231
233
234 //pim_route_add(d, pstruEventDetails->nInterfaceId, 330, g->groupAddress);
235
236 if (amIRP(d, g))
237 {
238#ifdef PRINT_RPT_TREE
239 print_RPT_Tree(d, g);
240#endif
241 return true;
242 }
243 else
244 {
246 return false;
247 }
248}
unsigned int NETSIM_ID
Definition: Animation.h:45
#define MAX_TTL
Definition: Application.h:34
GROUP_MOBILITY * group
Definition: GroupMobility.c:30
@ EVENT_PIM_JT
Definition: IP.h:108
@ EVENT_PIM_ET
Definition: IP.h:109
#define IP_COMPARE(ip1, ip2)
Definition: IP_Addressing.h:67
#define c
#define UINT
Definition: Linux.h:38
#define UINT16
Definition: Linux.h:33
#define realloc(p, s)
Definition: Memory.h:32
#define calloc(c, s)
Definition: Memory.h:29
void pim_add_interface_to_group(NETSIM_ID d, NETSIM_ID i, ptrPIM_GROUP g)
Definition: PIM_Group.c:56
ptrPIM_GROUP pim_find_group(NETSIM_ID d, NETSIM_IPAddress addr)
Definition: PIM_Group.c:20
void pim_forward_join()
Definition: PIM_Join.c:171
static bool amIRP(NETSIM_ID d, ptrPIM_GROUP g)
Definition: PIM_Join.c:166
static ptrPIM_JOINMSG_GROUP pim_join_add_group_member(NETSIM_ID d, NETSIM_IPAddress groupAddr, ptrPIM_JOINPRUNE_MSG jp, UINT c)
Definition: PIM_Join.c:46
static NetSim_PACKET * create_pim_joinprune(NETSIM_ID dev, double time, ptrPIM_GROUP group)
Definition: PIM_Join.c:29
static void pim_join_add_group(NETSIM_ID d, NetSim_PACKET *packet, ptrPIM_GROUP group, ptrPIM_NEIGHBOR neighbor)
Definition: PIM_Join.c:88
static bool validate_RP(NETSIM_ID d, NETSIM_IPAddress rp, NETSIM_IPAddress gaddr)
Definition: PIM_Join.c:146
static ptrPIM_NEIGHBOR pimjoin_find_neighbor(NETSIM_ID d, NETSIM_IPAddress rp)
Definition: PIM_Join.c:122
static ptrPIM_JOINMSG_GROUP jP_find_groups(ptrPIM_JOINPRUNE_MSG jp, NETSIM_IPAddress m, UINT *in)
Definition: PIM_Join.c:74
static ptrPIM_JP_STATE get_Pim_jp_state(NETSIM_ID d, NETSIM_ID i, ptrPIM_GROUP gr)
Definition: PIM_Join.c:155
void pim_send_joinprune(NETSIM_ID d, double time, ptrPIM_GROUP group)
Definition: PIM_Join.c:128
static ptrPIM_JOINPRUNE_MSG alloc_pim_joinprune()
Definition: PIM_Join.c:21
bool pim_process_join()
Definition: PIM_Join.c:193
void set_pim_hdr(ptrPIM_HDR hdr, PIMMSG type)
Definition: PIM_Msg.c:145
NetSim_PACKET * create_pim_packet(PIMMSG type, void *opt, double time, NETSIM_ID source, NETSIM_IPAddress sourceAddrss, UINT destCount, NETSIM_ID *destList, NETSIM_IPAddress group, UINT ttl)
Definition: PIM_Msg.c:91
ptrENCODED_GROUP_ADDR encode_group_addr(NETSIM_IPAddress ip)
Definition: PIM_Msg.c:182
ptrENCODED_SOURCE_ADDR encode_source_addr(NETSIM_IPAddress ip, NETSIM_IPAddress subnet)
Definition: PIM_Msg.c:172
void * get_PIM_MSG(NetSim_PACKET *packet)
Definition: PIM_Msg.c:21
void send_pim_msg(NETSIM_ID d, double time, NetSim_PACKET *packet)
Definition: PIM_Msg.c:125
ptrENCODED_UNICAST_ADDR encode_unicast_addr(NETSIM_IPAddress ip)
Definition: PIM_Msg.c:151
struct stru_pim_join_prune_msg * ptrPIM_JOINPRUNE_MSG
@ PIMMSG_JoinPrune
Definition: PIM_Msg.h:44
ptrPIM_NEIGHBOR find_neighbor(NETSIM_ID d, NETSIM_IPAddress ip)
Definition: PIM_Neighbor.c:20
void print_RPT_Tree(NETSIM_ID rp, ptrPIM_GROUP group)
Definition: PIM_Print.c:59
NETSIM_IPAddress pimroute_find_nexthop(NETSIM_ID d, NETSIM_IPAddress dest)
Definition: PIM_Route.c:165
void pim_add_timeout_event(NETSIM_ID d, double time, IP_SUBEVENT eve, NETSIM_IPAddress group)
Definition: PIM_SM.c:50
void print_pim_sm_log(char *format,...)
Definition: PIM_SM.c:38
#define GET_PIM_VAR(d)
Definition: PIM_SM.h:226
struct stru_pim_JP_state * ptrPIM_JP_STATE
@ JPS_J
Definition: PIM_SM.h:66
@ JPS_NI
Definition: PIM_SM.h:65
#define DEVICE(DeviceId)
Definition: Stack.h:769
#define DEVICE_NWADDRESS(DeviceId, InterfaceId)
Definition: Stack.h:805
#define SECOND
Definition: Stack.h:60
EXPORTED struct stru_NetSim_EventDetails * pstruEventDetails
Definition: Stack.h:837
#define DEVICE_INTERFACE(DeviceId, InterfaceId)
Definition: Stack.h:780
struct stru_NetSim_Packet * pPacket
Definition: Stack.h:754
NETSIM_ID nDeviceId
Definition: Stack.h:750
NETSIM_ID nInterfaceId
Definition: Stack.h:751
NETSIM_IPAddress szGatewayIP
Definition: Packet.h:200
NETSIM_IPAddress szDestIP
Definition: Packet.h:199
NETSIM_IPAddress szNextHopIp
Definition: Packet.h:201
struct stru_NetSim_Packet_NetworkLayer * pstruNetworkData
Definition: Packet.h:275
char str_ip[_NETSIM_IP_LEN]
Definition: IP_Addressing.h:54
ptrENCODED_SOURCE_ADDR * joinedSourceAddr
Definition: PIM_Msg.h:396
ptrENCODED_GROUP_ADDR multicastAddr
Definition: PIM_Msg.h:393
UINT numJoinedSource
Definition: PIM_Msg.h:394
NETSIM_IPAddress GroupMulticastAddr
Definition: PIM_Msg.h:111
NETSIM_IPAddress RP
Definition: PIM_SM.h:186
ptrPIM_JP_STATE * jpState_G
Definition: PIM_SM.h:190
NETSIM_ID RPId
Definition: PIM_SM.h:187
NETSIM_IPAddress groupAddress
Definition: PIM_SM.h:185
ptrENCODED_UNICAST_ADDR unicastAddr
Definition: PIM_Msg.h:403
ptrPIM_JOINMSG_GROUP * groups
Definition: PIM_Msg.h:407
NETSIM_IPAddress neighborAddr
Definition: PIM_SM.h:160
double t_periodic
Definition: PIM_SM.h:221