20static ptrIGMP_HOST_DB find_or_alloc_multicast_db_host(NETSIM_ID d, NETSIM_IPAddress group)
22 ptrIGMP_HOST_DB r = GET_IGMP_HOST(d)->database;
26 if (!IP_COMPARE(r->group, group))
31 r = (ptrIGMP_HOST_DB)IGMP_HOST_DB_ALLOC();
32 r->group = IP_COPY(group);
33 r->state = HostState_IdleMember;
35 IGMP_HOST_DB_ADD(d, r);
40static void host_join_multicast_group(NETSIM_ID d, NETSIM_IPAddress group)
42 find_or_alloc_multicast_db_host(d, group);
45ptrIGMP_HOST_DB host_get_multicast_db(NETSIM_ID d, NETSIM_IPAddress addr)
47 ptrIGMP_HOST_DB r = GET_IGMP_HOST(d)->database;
51 if (!IP_COMPARE(r->group, addr))
58void igmp_host_init(NETSIM_ID d)
60 ptrIGMP_HOST host = GET_IGMP_HOST(d);
62 print_igmp_log(
"\nHost %d, Time 0: joining multicast group %s.",
66 host_join_multicast_group(d, STR_TO_IP4(
"224.0.0.1"));
69IP_PROTOCOL_ACTION host_is_ip_present_in_db(NETSIM_ID d, NETSIM_IPAddress ip, NetSim_PACKET* packet)
71 IP_DEVVAR* dip = GET_IP_DEVVAR(d);
72 ptrIGMP_HOST_DB db = dip->isIGMPConfigured ? GET_IGMP_HOST(d)->database : NULL;
75 if (!IP_COMPARE(db->group, ip))
82bool host_process_query(NetSim_PACKET* packet,
86 bool isTimerReqd =
false;
87 ptrIGMP_HOST_DB db = host_get_multicast_db(d, msg->GroupAddress);
89 print_igmp_log(
"\nHost %d, Time %0.0lf: Query received for group address %s.",
91 pstruEventDetails->dEventTime,
92 msg->GroupAddress->str_ip);
94 if (!db->isReportreqd ||
95 pstruEventDetails->dEventTime -
98 msg->MaxRespTime*0.1*SECOND)
101 db->maxResponseTime = msg->MaxRespTime;
102 db->queryRecvTime = pstruEventDetails->dEventTime;
106 print_igmp_log(
"Starting Delay timer.");
108 EVENT_IGMP_DelayTimer,
110 pstruEventDetails->dEventTime);
111 db->isReportreqd =
true;
112 print_igmp_log(
"Changing host state to delaying member");
113 db->state = HostState_DelayingMember;
119void host_send_report()
121 NETSIM_IPAddress g = pstruEventDetails->szOtherDetails;
122 ptrIGMP_HOST_DB db = host_get_multicast_db(pstruEventDetails->nDeviceId,
125 if (db->isReportreqd)
127 print_igmp_log(
"\nHost %d, Time %0.0lf: Sending report for group address %s.",
128 pstruEventDetails->nDeviceId,
129 pstruEventDetails->dEventTime,
132 send_membership_report(pstruEventDetails->nDeviceId,
134 db->isReportreqd =
false;
135 print_igmp_log(
"Changing host state to idle member");
136 db->state = HostState_IdleMember;
140bool host_process_report(NetSim_PACKET* packet,
144 ptrIGMP_HOST_DB db = host_get_multicast_db(d, msg->GroupAddress);
147 print_igmp_log(
"\nHost %d, Time %0.0lf: report received for group address %s.",
149 pstruEventDetails->dEventTime,
150 msg->GroupAddress->str_ip);
151 print_igmp_log(
"Report is not required.");
152 db->isReportreqd =
false;
153 print_igmp_log(
"Changing host state to Idle member");
154 db->state = HostState_IdleMember;
159void igmp_host_join_group(NETSIM_ID d, NETSIM_IPAddress group)
162 fnNetSimError(
"%s is called for Non-Host device %d.\n", __FUNCTION__, d);
164 print_igmp_log(
"\nHost %d, Time %0.0lf: Joining multicast group %s.",
166 pstruEventDetails->dEventTime,
168 print_igmp_log(
"Sending membership report.");
170 ptrIGMP_HOST_DB db = find_or_alloc_multicast_db_host(d, group);
172 send_membership_report(d, group);
173 db->reportSentCount++;
174 print_igmp_log(
"Changing host state to delaying member");
175 db->state = HostState_DelayingMember;
176 print_igmp_log(
"Starting Unsolicited report timer");
178 EVENT_IGMP_Unsolicited_report,
180 pstruEventDetails->dEventTime);
183void host_handle_unsolicited_report_timer()
185 NETSIM_ID d = pstruEventDetails->nDeviceId;
186 NETSIM_IPAddress group = pstruEventDetails->szOtherDetails;
188 ptrIGMP_HOST_DB db = find_or_alloc_multicast_db_host(d, group);
190 if (db->reportSentCount < 2 && db->isReportreqd)
192 print_igmp_log(
"\nHost %d, Time %0.0lf: Unsolicited report timer triggered. Sending membership report.");
193 send_membership_report(d, group);
194 db->reportSentCount++;
195 print_igmp_log(
"Changing host state to delaying member");
196 db->state = HostState_DelayingMember;
197 print_igmp_log(
"Starting Unsolicited report timer");
199 EVENT_IGMP_Unsolicited_report,
201 pstruEventDetails->dEventTime);
205void host_free(NETSIM_ID d)
207 ptrIGMP_HOST h = GET_IGMP_HOST(d);
208 ptrIGMP_HOST_DB db = h->database;
214 SET_IGMP_HOST(d, NULL);