summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeale Ranns <nranns@cisco.com>2018-09-26 06:51:39 -0700
committerDamjan Marion <dmarion@me.com>2018-10-01 09:42:27 +0000
commitc17776e9fe5accb285e0ef45b56e9380e94801ff (patch)
treea9ba9717eef11e40e382d64258bd1a5ff476cfa3
parent9382673d93d94f10348d61b7e7e7375883f74f5e (diff)
IGMP: handle (*,G) report with no source addresses
Change-Id: I363370b9d4a27b992bad55c48fc930a2fbea2165 Signed-off-by: Neale Ranns <nranns@cisco.com>
-rw-r--r--src/plugins/igmp/igmp_report.c22
-rw-r--r--test/test_igmp.py16
2 files changed, 30 insertions, 8 deletions
diff --git a/src/plugins/igmp/igmp_report.c b/src/plugins/igmp/igmp_report.c
index ae8a9339f3f..e0c127d8015 100644
--- a/src/plugins/igmp/igmp_report.c
+++ b/src/plugins/igmp/igmp_report.c
@@ -32,15 +32,21 @@ igmp_group_mk_source_list (const igmp_membership_group_v3_t * r)
n = clib_net_to_host_u16 (r->n_src_addresses);
if (0 == n)
- return (NULL);
-
- vec_validate (srcs, n - 1);
- s = r->src_addresses;
-
- for (ii = 0; ii < n; ii++)
{
- srcs[ii].ip4 = *s;
- s++;
+ /* a (*,G) join has no source address specified */
+ vec_validate (srcs, 0);
+ srcs[0].ip4.as_u32 = 0;
+ }
+ else
+ {
+ vec_validate (srcs, n - 1);
+ s = r->src_addresses;
+
+ for (ii = 0; ii < n; ii++)
+ {
+ srcs[ii].ip4 = *s;
+ s++;
+ }
}
return (srcs);
diff --git a/test/test_igmp.py b/test/test_igmp.py
index cfdd1a8aed3..128ac5e8eff 100644
--- a/test/test_igmp.py
+++ b/test/test_igmp.py
@@ -629,6 +629,22 @@ class TestIgmp(VppTestCase):
self.assertFalse(self.vapi.igmp_dump())
#
+ # A (*,G) host report
+ #
+ p_j = (Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac) /
+ IP(src=self.pg0.remote_ip4, dst="224.0.0.22", tos=0xc0, ttl=1,
+ options=[IPOption(copy_flag=1, optclass="control",
+ option="router_alert")]) /
+ IGMPv3(type="Version 3 Membership Report") /
+ IGMPv3mr(numgrp=1) /
+ IGMPv3gr(rtype="Allow New Sources", maddr="239.1.1.2"))
+
+ self.send(self.pg0, p_j)
+
+ self.assertTrue(wait_for_igmp_event(self, 1, self.pg0,
+ "239.1.1.2", "0.0.0.0", 1))
+
+ #
# disable router config
#
self.vapi.igmp_enable_disable(self.pg0.sw_if_index,