NetSim Source Code Help v14.4
All 13 Components
 
Loading...
Searching...
No Matches
PIM_Msg.c
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
15#include "main.h"
16#include "List.h"
17#include "IP.h"
18#include "PIM_SM.h"
19#include "PIM_Msg.h"
20
21void* get_PIM_MSG(NetSim_PACKET* packet)
22{
23 return (packet->pstruNetworkData->Packet_NetworkProtocol);
24}
25
26void set_PIM_MSG(NetSim_PACKET* packet, void* msg)
27{
28 packet->pstruNetworkData->Packet_NetworkProtocol = msg;
29}
30
31static int pimtype_to_ctrltype(PIMMSG type, char* stype)
32{
33 switch (type)
34 {
35 case PIMMSG_Assert:
36 strcpy(stype, "PIMMSG_Asset");
37 return PACKET_PIM_ASSERT;
38
39 case PIMMSG_Bootstrap:
40 strcpy(stype, "PIMMSG_Bootstrap");
41 return PACKET_PIM_BOOTSTRAP;
42
43 case PIMMSG_CandidateRPAdvertisement:
44 strcpy(stype, "PIMMSG_CandidateRPAdvertisement");
45 return PACKET_PIM_CANDRPADVER;
46
47 case PIMMSG_Graft:
48 strcpy(stype, "PIMMSG_Graft");
49 return PACKET_PIM_GRAFT;
50
51 case PIMMSG_GraftAck:
52 strcpy(stype, "PIMMSG_GraftAck");
53 return PACKET_PIM_GRAFTACK;
54
55 case PIMMSG_Hello:
56 strcpy(stype, "PIMMSG_Hello");
57 return PACKET_PIM_HELLO;
58
59 case PIMMSG_JoinPrune:
60 strcpy(stype, "PIMMSG_JoinPrune");
61 return PACKET_PIM_JOINPRUNE;
62
63 case PIMMSG_Register:
64 strcpy(stype, "PIMMSG_Register");
65 return PACKET_PIM_REGISTER;
66
67 case PIMMSG_RegisterStop:
68 strcpy(stype, "PIMMSG_RegisterStop");
69 return PACKET_PIM_REGISTERSTOP;
70
71 default:
72 fnNetSimError("Unknown pim msg type %d\n", type);
73 return 0;
74 }
75}
76
77static double get_pim_size(PIMMSG type)
78{
79 switch (type)
80 {
81 case PIMMSG_Hello:
82 return PIM_HDR_LEN + PIM_HELLO_LEN;
83 case PIMMSG_JoinPrune:
84 return PIM_HDR_LEN + PIM_JP_MSG_LEN;
85 default:
86 fnNetSimError("Unknown PIM MSG %d in %s", type, __FUNCTION__);
87 return 0;
88 }
89}
90
91NetSim_PACKET* create_pim_packet(PIMMSG type,
92 void* opt,
93 double time,
94 NETSIM_ID source,
95 NETSIM_IPAddress sourceAddrss,
96 UINT destCount,
97 NETSIM_ID* destList,
98 NETSIM_IPAddress group,
99 UINT ttl)
100{
101 NetSim_PACKET* packet = fn_NetSim_Packet_CreatePacket(NETWORK_LAYER);
102 set_PIM_MSG(packet, opt);
103 packet->nControlDataType = pimtype_to_ctrltype(type, packet->szPacketType);
104
105 packet->dEventTime = time;
106 packet->nPacketType = PacketType_Control;
107 packet->nSourceId = source;
108 packet->pstruNetworkData->dArrivalTime = time;
109 packet->pstruNetworkData->dEndTime = time;
110 packet->pstruNetworkData->dOverhead = get_pim_size(type);
111 packet->pstruNetworkData->dPacketSize = packet->pstruNetworkData->dOverhead +
112 packet->pstruNetworkData->dPayload;
113 packet->pstruNetworkData->dStartTime = time;
114 packet->pstruNetworkData->IPProtocol = IPPROTOCOL_PIM;
115 packet->pstruNetworkData->nNetworkProtocol = NW_PROTOCOL_IPV4;
116 packet->pstruNetworkData->nTTL = ttl;
117 packet->pstruNetworkData->szDestIP = group;
118 packet->pstruNetworkData->szSourceIP = sourceAddrss;
119 UINT i;
120 for (i = 0; i < destCount; i++)
121 add_dest_to_packet(packet, destList[i]);
122 return packet;
123}
124
125void send_pim_msg(NETSIM_ID d, double time, NetSim_PACKET* packet)
126{
127 NetSim_EVENTDETAILS pevent;
128 memset(&pevent, 0, sizeof pevent);
129 pevent.dEventTime = time;
130 pevent.dPacketSize = packet->pstruNetworkData->dPacketSize;
131 if (packet->pstruAppData)
132 {
133 pevent.nApplicationId = packet->pstruAppData->nApplicationId;
134 pevent.nSegmentId = packet->pstruAppData->nSegmentId;
135 }
136 pevent.nDeviceId = d;
137 pevent.nDeviceType = DEVICE_TYPE(d);
138 pevent.nEventType = NETWORK_OUT_EVENT;
139 pevent.nPacketId = packet->nPacketId;
140 pevent.nProtocolId = NW_PROTOCOL_IPV4;
141 pevent.pPacket = packet;
142 fnpAddEvent(&pevent);
143}
144
145void set_pim_hdr(ptrPIM_HDR hdr, PIMMSG type)
146{
147 hdr->PIM_Ver = PIM_VER;
148 hdr->Type = type;
149}
150
151ptrENCODED_UNICAST_ADDR encode_unicast_addr(NETSIM_IPAddress ip)
152{
153 ptrENCODED_UNICAST_ADDR addr = calloc(1, sizeof* addr);
154 addr->addrFamily = ip->IP.IPV4.byte1;
155 addr->encodingType = 1; //IPv4
156 addr->unicastAddr = ip;
157 return addr;
158}
159
160static UINT8 get_masklen(NETSIM_IPAddress subnet)
161{
162 char* bin = subnet->bin_ip;
163 UINT8 ret = 0;
164 while (*bin && *bin != 0)
165 {
166 bin++;
167 ret++;
168 }
169 return ret;
170}
171
172ptrENCODED_SOURCE_ADDR encode_source_addr(NETSIM_IPAddress ip, NETSIM_IPAddress subnet)
173{
174 ptrENCODED_SOURCE_ADDR addr = calloc(1, sizeof* addr);
175 addr->addrFamily = ip->IP.IPV4.byte1;
176 addr->encodingType = 1; //IPv4
177 addr->SourceAddr = ip;
178 addr->maskLen = get_masklen(subnet);
179 return addr;
180}
181
182ptrENCODED_GROUP_ADDR encode_group_addr(NETSIM_IPAddress ip)
183{
184 ptrENCODED_GROUP_ADDR addr = calloc(1, sizeof* addr);
185 addr->addrFamily = ip->IP.IPV4.byte1;
186 addr->EncodingType = 1;
187 addr->GroupMulticastAddr = ip;
188 addr->MaskLen = 32;
189 return addr;
190}