Igmpproxy currently only sends IGMP membership reports upstream
for a new flow. Once mdb entry is created, it does not forward
the reports upstream as the flow is already active. However,
some ISPs require IGMP membership reports even for an active flow
as their infrastructure might timeout if the reports are not received
periodically. This patch ensures that every received membership
report from downstream is forwarded upstream as well.

Reviewed on https://chromium-review.googlesource.com/2182981

---
diff -Naur -U 10 --show-c-function src/rttable.c src-new/rttable.c
--- src/rttable.c	2020-05-01 10:45:14.431750115 -0700
+++ src-new/rttable.c	2020-05-04 18:04:55.124490050 -0700
@@ -178,20 +178,46 @@ static void sendJoinLeaveUpstream(struct
             }
         }
         else
         {
             i = MAX_UPS_VIFS;
         }
     }
 }
 
 /**
+*   Internal function to send updated membership report to
+*   a specified route upstream...
+*/
+static void sendReportUpstream(uint32_t group) {
+    struct IfDesc*      upstrIf;
+    int i;
+
+    for(i=0; i<MAX_UPS_VIFS; i++)
+    {
+        if (-1 != upStreamIfIdx[i])
+        {
+            // Get the upstream IF...
+            upstrIf = getIfByIx( upStreamIfIdx[i] );
+            if(upstrIf == NULL) {
+                my_log(LOG_ERR, 0 ,"FATAL: Unable to get Upstream IF.");
+            }
+            my_log(LOG_NOTICE, 0,
+                   "Sending report %s upstream on IF address %s",
+                   inetFmt(group, s1), inetFmt(upstrIf->InAdr.s_addr, s2));
+            sendIgmp(upstrIf->InAdr.s_addr, group, IGMP_V2_MEMBERSHIP_REPORT,
+                     0, group, 0);
+        }
+    }
+}
+
+/**
 *   Clear all routes from routing table, and alerts Leaves upstream.
 */
 void clearAllRoutes(void) {
     struct RouteTable   *croute, *remainroute;
 
     // Loop through all routes...
     for(croute = routing_table; croute; croute = remainroute) {
 
         remainroute = croute->nextroute;
 
@@ -357,20 +383,23 @@ int insertRoute(uint32_t group, int ifx)
         if(!internUpdateKernelRoute(croute, 1)) {
             my_log(LOG_WARNING, 0, "The insertion into Kernel failed.");
             return 0;
         }
     }
 
     // Send join message upstream, if the route has no joined flag...
     if(croute->upstrState != ROUTESTATE_JOINED) {
         // Send Join request upstream
         sendJoinLeaveUpstream(croute, 1);
+    } else {
+        // Send Report upstream
+        sendReportUpstream(group);
     }
 
     logRouteTable("Insert Route");
 
     return 1;
 }
 
 /**
 *   Activates a passive group. If the group is already
 *   activated, it's reinstalled in the kernel. If
