NetSim Source Code Help v14.4
All 13 Components
 
Loading...
Searching...
No Matches
IGMP.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/*
15Updated by: 3376 PROPOSED STANDARD
16Errata Exist
17Network Working Group W. Fenner
18Request for Comments: 2236 Xerox PARC
19Updates: 1112 November 1997
20Category: Standards Track
21
22
23Internet Group Management Protocol, Version 2
24*/
25#pragma once
26
27#ifndef _NETSIM_IGMP_H_
28#define _NETSIM_IGMP_H_
29#ifdef __cplusplus
30extern "C" {
31#endif
32
33//SECTION 8:List of timers and default values
34#define IGMP_ROBUSTNESS_VARIABLE_DEFAULT 2
35#define IGMP_QUERY_INTERVAL_DEFAULT 125 // 1/10 sec
36#define IGMP_QUERY_RESPONSE_INTERVAL_DEFAULT 100 // 1/10sec
37#define IGMP_GROUP_MEMBERSHIP_INTERVAL_DEFAULT IGMP_ROBUSTNESS_VARIABLE_DEFAULT*IGMP_QUERY_INTERVAL_DEFAULT +\
38 (IGMP_QUERY_RESPONSE_INTERVAL_DEFAULT)
39#define IGMP_QUERIER_PRESENT_INTERVAL_DEFAULT IGMP_ROBUSTNESS_VARIABLE_DEFAULT*IGMP_QUERY_INTERVAL_DEFAULT +\
40 (1/2.0*IGMP_QUERY_RESPONSE_INTERVAL_DEFAULT)
41#define IGMP_STARTUP_QUERY_INTERVAL_DEFAULT (1/4.0*IGMP_QUERY_INTERVAL_DEFAULT)
42#define IGMP_STARTUP_QUERY_COUNT_DEFAULT IGMP_ROBUSTNESS_VARIABLE_DEFAULT
43#define IGMP_LAST_MEMBER_QUERY_INTERVAL_DEFAULT 10
44#define IGMP_LAST_MEMBER_QUERY_COUNT_DEFAULT IGMP_ROBUSTNESS_VARIABLE_DEFAULT
45#define IGMP_UNSOLICITED_REPORT_INTERVAL_DEFAULT (10) //Second
46
47#define IGMP_STARTUP_DELAY 1*MILLISECOND
48
49#define isBroadcastInterface(d,i) (DEVICE_INTERFACE(d,i)->nInterfaceType != INTERFACE_WAN_ROUTER)
50
51 typedef enum
52 {
53 IP_HOST,
54 IP_ROUTER,
55 }DEV_TYPE;
56
57 typedef enum
58 {
59 IGMPMSG_MembershipQuery = 0x11,
60 IGMPMSG_V2MembershipReport = 0x16,
61 IGMPMSG_LeaveGroup = 0x17,
62 IGMPMSG_V1MembershipReport = 0x12,
63 }IGMPMSG_TYPE;
64#define isIGMPPacket(packet) (packet->nControlDataType / 100 == NW_PROTOCOL_IPV4 && packet->nControlDataType % 100 >= 30 && packet->nControlDataType % 100 < 40)
65
66 /*
67 0 1 2 3
68 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
69 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
70 | Type | Max Resp Time | Checksum |
71 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
72 | Group Address |
73 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
74 */
75 typedef struct stru_igmp_msg
76 {
77 IGMPMSG_TYPE Type;
78 UINT8 MaxRespTime;
79 UINT16 Checksum;
80 NETSIM_IPAddress GroupAddress;
81 }IGMP_MSG, *ptrIGMP_MSG;
82#define IGMP_HDR_SIZE 8 //Bytes
83
84 typedef enum
85 {
86 HostState_NonMember,
87 HostState_IdleMember,
88 HostState_DelayingMember,
89 }IGMP_HOST_STATE;
90
91 typedef struct stru_host_database
92 {
93 NETSIM_IPAddress group;
94 IGMP_HOST_STATE state;
95 UINT8 maxResponseTime;
96 double queryRecvTime;
97 double delayTime;
98 bool isReportreqd;
99 UINT reportSentCount;
100 _ele* ele;
101}IGMP_HOST_DB, *ptrIGMP_HOST_DB;
102#define IGMP_HOST_DB_ALLOC() (ptrIGMP_HOST_DB)list_alloc(sizeof(IGMP_HOST_DB),offsetof(IGMP_HOST_DB,ele))
103#define IGMP_HOST_DB_ADD(d,db) LIST_ADD_LAST((void**)&GET_IGMP_HOST(d)->database,db)
104
105 typedef struct stru_igmp_host
106 {
107 ptrIGMP_HOST_DB database;
108 }IGMP_HOST, *ptrIGMP_HOST;
109
110 typedef enum
111 {
112 RouterState_Querier,
113 RouterState_NonQuerier,
114 }IGMP_ROUTER_STATE;
115
116 typedef struct stru_router_database
117 {
118 NETSIM_IPAddress group;
119 IGMP_ROUTER_STATE state;
120
121 bool isOtherquerierTimerStarted;
122 double otherQuerierPresentTime;
123
124 UINT sentCount;
125
126 bool isGroupMembershipTimerStarted;
127 double reportRcvTime;
128
129 bool isRouteAlreadyAdded;
130 NETSIM_ID* ifids;
131 UINT count;
132 _ele* ele;
133 }IGMP_ROUTER_DB, *ptrIGMP_ROUTER_DB;
134#define IGMP_ROUTER_DB_ALLOC() (ptrIGMP_ROUTER_DB)list_alloc(sizeof(IGMP_ROUTER_DB),offsetof(IGMP_ROUTER_DB,ele))
135#define IGMP_ROUTER_DB_ADD(d,db) LIST_ADD_LAST((void**)&GET_IGMP_ROUTER(d)->database,db)
136
137 typedef struct stru_igmp_router
138 {
139 UINT startup_query_sent_count;
140 ptrIGMP_ROUTER_DB database;
141 }IGMP_ROUTER, *ptrIGMP_ROUTER;
142
143 typedef struct stru_igmpvar
144 {
145 DEV_TYPE devType;
146 union
147 {
148 ptrIGMP_ROUTER router;
149 ptrIGMP_HOST host;
150 }DEV;
151
152 //Config parameter for host only
153 double UnsolicitedReportInterval;
154
155 //Config parameter for router only
156 UINT QueryResponseInterval;
157 UINT StartupQueryInterval;
158 UINT StartupQueryCount;
159
160 //Config parameter
161 UINT QueryInterval;
162 UINT RobustnessVar;
163 double GroupMembershipInterval;
164 UINT QueryPresentInterval;
165 double lastMemQueryInterval;
166 UINT lastMemQueryCount;
167
168
169 }IGMP_VAR, *ptrIGMP_VAR;
170#define GET_IGMP_VAR(d) ((ptrIGMP_VAR)GET_IP_DEVVAR(d)->igmp)
171#define SET_IGMP_VAR(d,var) (GET_IP_DEVVAR(d)->igmp = (void*)var)
172#define isIPHOST(d) (GET_IGMP_VAR(d)->devType == IP_HOST)
173#define isIPRouter(d) (GET_IGMP_VAR(d)->devType == IP_ROUTER)
174#define GET_IGMP_HOST(d) ((ptrIGMP_HOST)(GET_IGMP_VAR(d)->DEV.host))
175#define GET_IGMP_ROUTER(d) ((ptrIGMP_ROUTER)(GET_IGMP_VAR(d)->DEV.router))
176#define SET_IGMP_HOST(d,var) (GET_IGMP_VAR(d)->DEV.host = var)
177#define SET_IGMP_ROUTER(d,var) (GET_IGMP_VAR(d)->DEV.router = var)
178
179 //Function used by IGMP module only
180 //IGMP Router
181 void igmp_router_init(NETSIM_ID d);
182 ptrIGMP_ROUTER_DB find_or_alloc_multicast_db_router(NETSIM_IPAddress addr,
183 NETSIM_ID d,
184 bool* isAlreadyJoined);
185 ptrIGMP_ROUTER_DB router_get_multicast_db(NETSIM_ID d,
186 NETSIM_IPAddress ip);
187 bool router_process_report(NetSim_PACKET* packet,
188 ptrIGMP_MSG msg,
189 NETSIM_ID d);
190 bool router_process_query(NetSim_PACKET* packet, ptrIGMP_MSG msg, NETSIM_ID d);
191 void router_free(NETSIM_ID d);
192
193
194 //IGMP Host
195 void igmp_host_init(NETSIM_ID d);
196 ptrIGMP_HOST_DB host_get_multicast_db(NETSIM_ID d, NETSIM_IPAddress addr);
197 bool host_process_report(NetSim_PACKET* packet,
198 ptrIGMP_MSG msg,
199 NETSIM_ID d);
200 bool host_process_query(NetSim_PACKET* packet,
201 ptrIGMP_MSG msg,
202 NETSIM_ID d);
203 void host_free(NETSIM_ID d);
204
205 //IGMP MSG
206 void send_membership_report(NETSIM_ID d, NETSIM_IPAddress group);
207
208 //IGMP
209 void print_igmp_log(char* format, ...);
210 void igmp_start_timer(NETSIM_ID d,
211 IP_SUBEVENT sev,
212 NETSIM_IPAddress addr,
213 double time);
214
215#ifdef __cplusplus
216}
217#endif
218#endif
219