NetSim Source Code Help v14.4
All 13 Components
 
Loading...
Searching...
No Matches
PIM_Msg.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#pragma once
15#ifndef _NETSIM_PIM_MSG_H_
16#define _NETSIM_PIM_MSG_H_
17#ifdef __cplusplus
18extern "C" {
19#endif
20
21 /*
22 Type
23 Types for specific PIM messages. PIM Types are:
24
25 Message Type Destination
26 ---------------------------------------------------------------------
27 0 = Hello Multicast to ALL-PIM-ROUTERS
28 1 = Register Unicast to RP
29 2 = Register-Stop Unicast to source of Register
30 packet
31 3 = Join/Prune Multicast to ALL-PIM-ROUTERS
32 4 = Bootstrap Multicast to ALL-PIM-ROUTERS
33 5 = Assert Multicast to ALL-PIM-ROUTERS
34 6 = Graft (used in PIM-DM only) Unicast to RPF'(S)
35 7 = Graft-Ack (used in PIM-DM only) Unicast to source of Graft
36 packet
37 8 = Candidate-RP-Advertisement Unicast to Domain's BSR
38 */
39 typedef enum enum_pim_msg_type
40 {
41 PIMMSG_Hello,
42 PIMMSG_Register,
43 PIMMSG_RegisterStop,
44 PIMMSG_JoinPrune,
45 PIMMSG_Bootstrap,
46 PIMMSG_Assert,
47 PIMMSG_Graft,
48 PIMMSG_GraftAck,
49 PIMMSG_CandidateRPAdvertisement,
50 }PIMMSG;
51
52 /*
53 The PIM header common to all PIM messages is:
54
55 0 1 2 3
56 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
57 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
58 |PIM Ver| Type | Reserved | Checksum |
59 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
60 */
61 typedef struct stru_pim_hdr
62 {
63 UINT PIM_Ver : 4;
64 PIMMSG Type : 4;
65 UINT8 Reserved;
66 UINT16 Checksum;
67 }PIM_HDR, *ptrPIM_HDR;
68#define PIM_VER 2
69#define PIM_HDR_LEN 4 //Bytes
70
71 /*
72 Encoded Unicast Address
73
74 An encoded unicast address takes the following format:
75
76 0 1 2 3
77 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
78 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
79 | Addr Family | Encoding Type | Unicast Address
80 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+...
81 */
83 {
84 UINT8 addrFamily;
85 UINT8 encodingType;
86 NETSIM_IPAddress unicastAddr;
87 }ENCODED_UNICAST_ADDR, *ptrENCODED_UNICAST_ADDR;
88#define ENCODED_UNICAST_ADDR_LEN 6 //Byes for IPV4
89
90 /*
91 Encoded Group Address
92
93 Encoded group addresses take the following format:
94
95 0 1 2 3
96 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
97 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
98 | Addr Family | Encoding Type |B| Reserved |Z| Mask Len |
99 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
100 | Group multicast Address
101 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+...
102 */
104 {
105 UINT8 addrFamily;
106 UINT8 EncodingType;
107 UINT B : 1;
108 UINT Reserved : 6;
109 UINT Z : 1;
110 UINT8 MaskLen;
111 NETSIM_IPAddress GroupMulticastAddr;
112 }ENCODED_GROUP_ADDR, *ptrENCODED_GROUP_ADDR;
113#define ENCODED_GROUP_ADDR_LEN 8 //Bytes
114
115 /*
116 Encoded Source Address
117
118 An encoded source address takes the following format:
119
120 0 1 2 3
121 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
122 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
123 | Addr Family | Encoding Type | Rsrvd |S|W|R| Mask Len |
124 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
125 | Source Address
126 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-...
127 */
129 {
130 UINT8 addrFamily;
131 UINT8 encodingType;
132 UINT rsrvd : 5;
133 UINT S : 1;
134 UINT W : 1;
135 UINT R : 1;
136 UINT8 maskLen;
137 NETSIM_IPAddress SourceAddr;
138 }ENCODED_SOURCE_ADDR, *ptrENCODED_SOURCE_ADDR;
139#define ENCODED_SOURCE_ADDR_LEN 8 //Bytes
140
142 {
143 UINT16 optionType;
144 UINT16 optionLength;
145 void* optionValue;
146 }PIM_HELLO_OPTION, *ptrPIM_HELLO_OPTION;
147#define PIM_HELLO_OPTION_LEN 4 //Bytes
148
149 /*
150 OptionType 1: Holdtime
151
152 0 1 2 3
153 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
154 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
155 | Type = 1 | Length = 2 |
156 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
157 | Holdtime |
158 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
159 */
160 typedef struct stru_option_holdtime
161 {
162 UINT16 holdTime;
163 }OPTION_HOLDTIME, *ptrOPTION_HOLDTIME;
164#define PIM_OPTION_HOLDTIME_LEN 2 //Bytes
165#define PIM_OPTION_HOLDTIME_TYPE 1
166
167 /*
168 OptionType 2: LAN Prune Delay
169
170 0 1 2 3
171 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
172 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
173 | Type = 2 | Length = 4 |
174 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
175 |T| Propagation_Delay | Override_Interval |
176 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
177 */
179 {
180 bool T;
181 UINT propagationDelay : 15;
182 UINT16 overrideInterval;
183 }OPTION_LANPRUNEDELAY, *ptrOPTION_LANPRUNEDELAY;
184#define PIM_OPTION_LANPRUNEDELAY_LEN 4 // Bytes
185#define PIM_OPTION_LANPRUNEDELAY_TYPE 2
186
187 /*
188 OptionType 19: DR Priority
189
190 0 1 2 3
191 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
192 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
193 | Type = 19 | Length = 4 |
194 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
195 | DR Priority |
196 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
197 */
199 {
200 UINT DRPriority;
201 }OPTION_DRPRIORITY, *ptrOPTION_DRPRIORITY;
202#define PIM_OPTION_DRPRIORITY_LEN 4 //Bytes
203#define PIM_OPTION_DRPRIORITY_TYPE 19
204
205 /*
206 OptionType 20: Generation ID
207
208 0 1 2 3
209 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
210 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
211 | Type = 20 | Length = 4 |
212 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
213 | Generation ID |
214 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
215 */
216 typedef struct stru_option_gen_id
217 {
218 UINT GenerationId;
219 }OPTION_GENERATIONID, *ptrOPTION_GENERATIONID;
220#define PIM_OPTION_GENERATIONID_LEN 4 //Bytes
221#define PIM_OPTION_GENERATIONID_TYPE 20
222
223 /*
224 OptionType 24: Address List
225
226 0 1 2 3
227 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
228 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
229 | Type = 24 | Length = <Variable> |
230 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
231 | Secondary Address 1 (Encoded-Unicast format) |
232 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
233 ...
234 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
235 | Secondary Address N (Encoded-Unicast format) |
236 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
237 */
238 typedef struct stru_option_addrlist
239 {
240 UINT c;
241 ptrENCODED_UNICAST_ADDR* SeconadayAddr;
242 }OPTION_ADDRLIST, *ptrOPTION_ADDRLIST;
243#define PIM_OPTION_ADDRLIST_LEN 0 //Bytes .... Not fixed
244#define PIM_OPTION_ADDRLIST_TYPE 24
245
246 /*
247 4.9.2. Hello Message Format
248
249 A Hello message is sent periodically by routers on all interfaces.
250
251 0 1 2 3
252 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
253 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
254 |PIM Ver| Type | Reserved | Checksum |
255 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
256 | OptionType | OptionLength |
257 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
258 | OptionValue |
259 | ... |
260 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
261 | . |
262 | . |
263 | . |
264 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
265 | OptionType | OptionLength |
266 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
267 | OptionValue |
268 | ... |
269 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
270 */
271
272 typedef struct stru_pim_Hello
273 {
274 PIM_HDR hdr;
275 UINT optCount;
276 ptrPIM_HELLO_OPTION* option;
277 }PIM_HELLO, *ptrPIM_HELLO;
278#define PIM_HELLO_LEN 0 //Bytes
279
280 /*
281 4.9.3. Register Message Format
282
283 A Register message is sent by the DR to the RP when a multicast
284 packet needs to be transmitted on the RP-tree. The IP source address
285 is set to the address of the DR, the destination address to the RP's
286 address. The IP TTL of the PIM packet is the system's normal
287 unicast TTL.
288
289 0 1 2 3
290 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
291 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
292 |PIM Ver| Type | Reserved | Checksum |
293 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
294 |B|N| Reserved2 |
295 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
296 | |
297 . Multicast data packet .
298 | |
299 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
300 */
302 {
303 PIM_HDR hdr;
304 UINT B : 1;
305 UINT N : 1;
306 UINT Reserved2 : 30;
307 void* multicastDataPacket;
308 }PIM_REGISTERMSG, *ptrPIM_REGISTERMSG;
309
310 /*
311 4.9.4. Register-Stop Message Format
312
313 A Register-Stop is unicast from the RP to the sender of the Register
314 message. The IP source address is the address to which the register
315 was addressed. The IP destination address is the source address of
316 the register message.
317
318 0 1 2 3
319 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
320 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
321 |PIM Ver| Type | Reserved | Checksum |
322 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
323 | Group Address (Encoded-Group format) |
324 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
325 | Source Address (Encoded-Unicast format) |
326 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
327 */
329 {
330 PIM_HDR hdr;
331 ptrENCODED_GROUP_ADDR groupAddr;
332 ptrENCODED_SOURCE_ADDR sourceAddr;
333 }PIM_REGISTERSTOPMSG, *ptrPIM_REGISTERSTOPMSG;
334
335 /*
336 4.9.5. Join/Prune Message Format
337
338 A Join/Prune message is sent by routers towards upstream sources and
339 RPs. Joins are sent to build shared trees (RP trees) or source trees
340 (SPT). Prunes are sent to prune source trees when members leave
341 groups as well as sources that do not use the shared tree.
342 0 1 2 3
343 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
344 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
345 |PIM Ver| Type | Reserved | Checksum |
346 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
347 | Upstream Neighbor Address (Encoded-Unicast format) |
348 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
349 | Reserved | Num groups | Holdtime |
350 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
351 | Multicast Group Address 1 (Encoded-Group format) |
352 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
353 | Number of Joined Sources | Number of Pruned Sources |
354 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
355 | Joined Source Address 1 (Encoded-Source format) |
356 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
357 | . |
358 | . |
359 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
360 | Joined Source Address n (Encoded-Source format) |
361 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
362 | Pruned Source Address 1 (Encoded-Source format) |
363 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
364 | . |
365 | . |
366 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
367 | Pruned Source Address n (Encoded-Source format) |
368 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
369 | . |
370 | . |
371 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
372 | Multicast Group Address m (Encoded-Group format) |
373 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
374 | Number of Joined Sources | Number of Pruned Sources |
375 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
376 | Joined Source Address 1 (Encoded-Source format) |
377 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
378 | . |
379 | . |
380 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
381 | Joined Source Address n (Encoded-Source format) |
382 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
383 | Pruned Source Address 1 (Encoded-Source format) |
384 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
385 | . |
386 | . |
387 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
388 | Pruned Source Address n (Encoded-Source format) |
389 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
390 */
391 typedef struct stru_msg_groups
392 {
393 ptrENCODED_GROUP_ADDR multicastAddr;
394 UINT numJoinedSource;
395 UINT numPrunedSource;
396 ptrENCODED_SOURCE_ADDR* joinedSourceAddr;
397 ptrENCODED_SOURCE_ADDR* pruneSourceAddr;
398 }PIM_JOINMSG_GROUP, *ptrPIM_JOINMSG_GROUP;
399
401 {
402 PIM_HDR hdr;
403 ptrENCODED_UNICAST_ADDR unicastAddr;
404 UINT8 reserved;
405 UINT8 numGroups;
406 UINT16 holdTime;
407 ptrPIM_JOINMSG_GROUP* groups;
408 }PIM_JOINPRUNE_MSG,*ptrPIM_JOINPRUNE_MSG;
409#define PIM_JP_MSG_LEN (ENCODED_UNICAST_ADDR_LEN+4) //Bytes
410
411 //Function pointer
412 void* get_PIM_MSG(NetSim_PACKET* packet);
413 void set_PIM_MSG(NetSim_PACKET* packet, void* msg);
414 void set_pim_hdr(ptrPIM_HDR hdr, PIMMSG type);
415 NetSim_PACKET* create_pim_packet(PIMMSG type,
416 void* opt,
417 double time,
418 NETSIM_ID source,
419 NETSIM_IPAddress sourceAddrss,
420 UINT destCount,
421 NETSIM_ID* destList,
422 NETSIM_IPAddress group,
423 UINT ttl);
424 void send_pim_msg(NETSIM_ID d, double time, NetSim_PACKET* packet);
425 ptrENCODED_UNICAST_ADDR encode_unicast_addr(NETSIM_IPAddress ip);
426 ptrENCODED_SOURCE_ADDR encode_source_addr(NETSIM_IPAddress ip, NETSIM_IPAddress subnet);
427 ptrENCODED_GROUP_ADDR encode_group_addr(NETSIM_IPAddress ip);
428
429#ifdef __cplusplus
430}
431#endif
432#endif