27#ifndef _NETSIM_IGMP_H_
28#define _NETSIM_IGMP_H_
34#define IGMP_ROBUSTNESS_VARIABLE_DEFAULT 2
35#define IGMP_QUERY_INTERVAL_DEFAULT 125
36#define IGMP_QUERY_RESPONSE_INTERVAL_DEFAULT 100
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)
47#define IGMP_STARTUP_DELAY 1*MILLISECOND
49#define isBroadcastInterface(d,i) (DEVICE_INTERFACE(d,i)->nInterfaceType != INTERFACE_WAN_ROUTER)
59 IGMPMSG_MembershipQuery = 0x11,
60 IGMPMSG_V2MembershipReport = 0x16,
61 IGMPMSG_LeaveGroup = 0x17,
62 IGMPMSG_V1MembershipReport = 0x12,
64#define isIGMPPacket(packet) (packet->nControlDataType / 100 == NW_PROTOCOL_IPV4 && packet->nControlDataType % 100 >= 30 && packet->nControlDataType % 100 < 40)
80 NETSIM_IPAddress GroupAddress;
81 }IGMP_MSG, *ptrIGMP_MSG;
82#define IGMP_HDR_SIZE 8
88 HostState_DelayingMember,
93 NETSIM_IPAddress group;
94 IGMP_HOST_STATE state;
95 UINT8 maxResponseTime;
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)
107 ptrIGMP_HOST_DB database;
108 }IGMP_HOST, *ptrIGMP_HOST;
113 RouterState_NonQuerier,
118 NETSIM_IPAddress group;
119 IGMP_ROUTER_STATE state;
121 bool isOtherquerierTimerStarted;
122 double otherQuerierPresentTime;
126 bool isGroupMembershipTimerStarted;
127 double reportRcvTime;
129 bool isRouteAlreadyAdded;
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)
139 UINT startup_query_sent_count;
140 ptrIGMP_ROUTER_DB database;
141 }IGMP_ROUTER, *ptrIGMP_ROUTER;
148 ptrIGMP_ROUTER router;
153 double UnsolicitedReportInterval;
156 UINT QueryResponseInterval;
157 UINT StartupQueryInterval;
158 UINT StartupQueryCount;
163 double GroupMembershipInterval;
164 UINT QueryPresentInterval;
165 double lastMemQueryInterval;
166 UINT lastMemQueryCount;
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)
181 void igmp_router_init(NETSIM_ID d);
182 ptrIGMP_ROUTER_DB find_or_alloc_multicast_db_router(NETSIM_IPAddress addr,
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,
190 bool router_process_query(NetSim_PACKET* packet, ptrIGMP_MSG msg, NETSIM_ID d);
191 void router_free(NETSIM_ID d);
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,
200 bool host_process_query(NetSim_PACKET* packet,
203 void host_free(NETSIM_ID d);
206 void send_membership_report(NETSIM_ID d, NETSIM_IPAddress group);
209 void print_igmp_log(
char* format, ...);
210 void igmp_start_timer(NETSIM_ID d,
212 NETSIM_IPAddress addr,