/** * Main daemon loop. */ void igmpProxyRun() { // Get the config. //struct Config *config = getCommonConfig(); // Set some needed values. register int recvlen; int MaxFD, Rt, secs; fd_set ReadFDS; socklen_t dummy = 0; struct timeval curtime, lasttime, difftime, tv; // The timeout is a pointer in order to set it to NULL if nessecary. struct timeval *timeout = &tv; // Initialize timer vars difftime.tv_usec = 0; gettimeofday(&curtime, NULL); lasttime = curtime; // First thing we send a membership query in downstream VIF's... sendGeneralMembershipQuery(); // Loop until the end... for (;;) { // Process signaling... if (sighandled) { if (sighandled & GOT_SIGINT) { sighandled &= ~GOT_SIGINT; my_log(LOG_NOTICE, 0, "Got a interupt signal. Exiting."); break; } } // Prepare timeout... secs = timer_nextTimer(); if(secs == -1) { timeout = NULL; } else { timeout->tv_usec = 0; timeout->tv_sec = secs; } // Prepare for select. MaxFD = MRouterFD; FD_ZERO( &ReadFDS ); FD_SET( MRouterFD, &ReadFDS ); // wait for input Rt = select( MaxFD +1, &ReadFDS, NULL, NULL, timeout ); // log and ignore failures if( Rt < 0 ) { my_log( LOG_WARNING, errno, "select() failure" ); continue; } else if( Rt > 0 ) { // Read IGMP request, and handle it... if( FD_ISSET( MRouterFD, &ReadFDS ) ) { recvlen = recvfrom(MRouterFD, recv_buf, RECV_BUF_SIZE, 0, NULL, &dummy); if (recvlen < 0) { if (errno != EINTR) my_log(LOG_ERR, errno, "recvfrom"); continue; } acceptIgmp(recvlen); } } // At this point, we can handle timeouts... do { /* * If the select timed out, then there's no other * activity to account for and we don't need to * call gettimeofday. */ if (Rt == 0) { curtime.tv_sec = lasttime.tv_sec + secs; curtime.tv_usec = lasttime.tv_usec; Rt = -1; /* don't do this next time through the loop */ } else { gettimeofday(&curtime, NULL); } difftime.tv_sec = curtime.tv_sec - lasttime.tv_sec; difftime.tv_usec += curtime.tv_usec - lasttime.tv_usec; while (difftime.tv_usec > 1000000) { difftime.tv_sec++; difftime.tv_usec -= 1000000; } if (difftime.tv_usec < 0) { difftime.tv_sec--; difftime.tv_usec += 1000000; } lasttime = curtime; if (secs == 0 || difftime.tv_sec > 0) age_callout_queue(difftime.tv_sec); secs = -1; } while (difftime.tv_sec > 0); } }
/** * Main daemon loop. */ void igmpProxyRun() { // Get the config. //struct Config *config = getCommonConfig(); // Set some needed values. register int recvlen; int MaxFD, Rt, secs; fd_set ReadFDS; int dummy = 0; #ifdef TRENDCHIP struct timespec curtime, lasttime, difftime, tv; #else struct timeval curtime, lasttime, difftime, tv; #endif // The timeout is a pointer in order to set it to NULL if nessecary. struct timeval *timeout = &tv; // Initialize timer vars #ifdef TRENDCHIP difftime.tv_nsec = 0; clock_gettime(CLOCK_MONOTONIC, &curtime); #else difftime.tv_usec = 0; gettimeofday(&curtime, NULL); #endif lasttime = curtime; // First thing we send a membership query in downstream VIF's... sendGeneralMembershipQuery(); // Loop until the end... for (;;) { // Process signaling... if (sighandled) { if (sighandled & GOT_SIGINT) { sighandled &= ~GOT_SIGINT; log(LOG_NOTICE, 0, "Got a interupt signal. Exiting."); break; } } // Prepare timeout... secs = timer_nextTimer(); if(secs == -1) { timeout = NULL; } else { timeout->tv_usec = 0; timeout->tv_sec = secs; } // Prepare for select. MaxFD = MRouterFD; FD_ZERO( &ReadFDS ); FD_SET( MRouterFD, &ReadFDS ); // wait for input Rt = select( MaxFD +1, &ReadFDS, NULL, NULL, timeout ); // log and ignore failures if( Rt < 0 ) { log( LOG_WARNING, errno, "select() failure" ); continue; } else if( Rt > 0 ) { // Read IGMP request, and handle it... if( FD_ISSET( MRouterFD, &ReadFDS ) ) { recvlen = recvfrom(MRouterFD, recv_buf, RECV_BUF_SIZE, 0, NULL, &dummy); if (recvlen < 0) { if (errno != EINTR) log(LOG_ERR, errno, "recvfrom"); continue; } #ifdef TCSUPPORT_IGMP_QOS int len = sizeof(uint32); if (getsockopt(MRouterFD, SOL_IP, IP_SKB_MARK, &skb_mark, &len)) { /* dbg_info */ ;//tcdbg_printf("%s,getsockopt error\n", __FUNCTION__); } //tcdbg_printf("xyz_dbg:%s, skb_mark is %x\n", __FUNCTION__, skb_mark); #endif acceptIgmp(recvlen); } } // At this point, we can handle timeouts... do { /* * If the select timed out, then there's no other * activity to account for and we don't need to * call gettimeofday. */ if (Rt == 0) { curtime.tv_sec = lasttime.tv_sec + secs; #ifdef TRENDCHIP curtime.tv_nsec = lasttime.tv_nsec; #else curtime.tv_usec = lasttime.tv_usec; #endif Rt = -1; /* don't do this next time through the loop */ } else { #ifdef TRENDCHIP clock_gettime(CLOCK_MONOTONIC, &curtime); #else gettimeofday(&curtime, NULL); #endif } #ifdef TRENDCHIP difftime.tv_sec = curtime.tv_sec - lasttime.tv_sec; difftime.tv_nsec += curtime.tv_nsec - lasttime.tv_nsec; while (difftime.tv_nsec > 1000000000) { difftime.tv_sec++; difftime.tv_nsec -= 1000000000; } if (difftime.tv_nsec < 0) { difftime.tv_sec--; difftime.tv_nsec += 1000000000; } #else difftime.tv_sec = curtime.tv_sec - lasttime.tv_sec; difftime.tv_usec += curtime.tv_usec - lasttime.tv_usec; while (difftime.tv_usec > 1000000) { difftime.tv_sec++; difftime.tv_usec -= 1000000; } if (difftime.tv_usec < 0) { difftime.tv_sec--; difftime.tv_usec += 1000000; } #endif lasttime = curtime; if (secs == 0 || difftime.tv_sec > 0) age_callout_queue(difftime.tv_sec); secs = -1; } while (difftime.tv_sec > 0); } }