20static FILE* igmp_log = NULL;
21static void init_igmp_log()
24 sprintf(str,
"%s/%s", pszIOPath,
"igmp_log.txt");
25 igmp_log = fopen(str,
"w");
28static void close_igmp_log()
33void print_igmp_log(
char* format, ...)
37 vfprintf(igmp_log, format, l);
38 fprintf(igmp_log,
"\n");
43void igmp_configure(NETSIM_ID d,
void* xmlNode)
45 ptrIGMP_VAR var = GET_IGMP_VAR(d);
47 ptrIGMP_ROUTER router;
50 var = calloc(1,
sizeof* var);
56 var->devType = IP_HOST;
57 host = GET_IGMP_HOST(d);
60 host = (ptrIGMP_HOST)calloc(1,
sizeof* host);
61 SET_IGMP_HOST(d, host);
66 var->devType = IP_ROUTER;
67 router = GET_IGMP_ROUTER(d);
70 router = (ptrIGMP_ROUTER)calloc(1,
sizeof* router);
71 SET_IGMP_ROUTER(d, router);
75 fnNetSimError(
"IGMP is only for either host or router");
77 getXmlVar(&var->RobustnessVar, ROBUSTNESS_VARIABLE, xmlNode, 1, _UINT, IGMP);
78 getXmlVar(&var->QueryInterval, QUERY_INTERVAL, xmlNode, 1, _UINT, IGMP);
79 getXmlVar(&var->lastMemQueryInterval, LAST_MEMBER_QUERY_INTERVAL, xmlNode, 1, _DOUBLE, IGMP);
83 getXmlVar(&var->UnsolicitedReportInterval, UNSOLICITED_REPORT_INTERVAL, xmlNode, 1, _DOUBLE, IGMP);
84 var->UnsolicitedReportInterval *= SECOND;
89 getXmlVar(&var->QueryResponseInterval, QUERY_RESPONSE_INTERVAL, xmlNode, 1, _UINT, IGMP);
93static double get_subevent_delay(NETSIM_ID d,
95 NETSIM_IPAddress group)
97 ptrIGMP_VAR igmp = GET_IGMP_VAR(d);
100 case EVENT_IGMP_SendStartupQuery:
101 return igmp->StartupQueryInterval*0.1*SECOND;
102 case EVENT_IGMP_SendQuery:
103 return igmp->QueryInterval*0.1*SECOND;
104 case EVENT_IGMP_Unsolicited_report:
105 return igmp->UnsolicitedReportInterval*NETSIM_RAND_01();
106 case EVENT_IGMP_OtherQuerierPresentTimer:
107 return igmp->QueryPresentInterval*0.1*SECOND;
108 case EVENT_IGMP_DelayTimer:
110 ptrIGMP_HOST_DB db = host_get_multicast_db(d, group);
111 double t = db->maxResponseTime*0.1*SECOND*NETSIM_RAND_01();
115 case EVENT_IGMP_GroupMembershipTimer:
116 return igmp->GroupMembershipInterval*0.1*SECOND;
118 fnNetSimError(
"Unknown subevnet %d\n", sev);
123void igmp_start_timer(NETSIM_ID d,
125 NETSIM_IPAddress addr,
128 NetSim_EVENTDETAILS pevent;
129 memset(&pevent, 0,
sizeof pevent);
131 pevent.dEventTime = time + get_subevent_delay(d, sev, addr);
132 pevent.nDeviceId = d;
133 pevent.nDeviceType = DEVICE_TYPE(d);
134 pevent.nEventType = TIMER_EVENT;
135 pevent.nProtocolId = NW_PROTOCOL_IPV4;
136 pevent.nSubEventType = sev;
137 pevent.szOtherDetails = addr;
138 fnpAddEvent(&pevent);
141void igmp_init(NETSIM_ID d)
148 else if (isIPHOST(d))
151 fnNetSimError(
"Device %d is neither host nor router\n", d);
153 ptrIGMP_VAR var = GET_IGMP_VAR(d);
155 var->GroupMembershipInterval = var->RobustnessVar*
156 var->QueryInterval + var->QueryResponseInterval;
158 var->QueryPresentInterval = var->RobustnessVar*
159 var->QueryInterval + var->QueryResponseInterval / 2;
161 var->lastMemQueryCount = var->RobustnessVar;
164void igmp_free(NETSIM_ID d)
166 ptrIGMP_VAR v = GET_IGMP_VAR(d);
172 else if (isIPRouter(d))
176 SET_IGMP_VAR(d, NULL);