Code Review
/
vpp.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
review
|
tree
raw
|
inline
| side by side
IGMP: proxy device
[vpp.git]
/
src
/
plugins
/
igmp
/
igmp_report.c
diff --git
a/src/plugins/igmp/igmp_report.c
b/src/plugins/igmp/igmp_report.c
index
328b890
..
7c08f34
100644
(file)
--- a/
src/plugins/igmp/igmp_report.c
+++ b/
src/plugins/igmp/igmp_report.c
@@
-25,18
+25,28
@@
igmp_group_mk_source_list (const igmp_membership_group_v3_t * r)
const ip4_address_t *s;
u16 ii, n;
const ip4_address_t *s;
u16 ii, n;
+ /*
+ * we validated this packet when we accepted it in the DP, so
+ * this number is safe to use
+ */
n = clib_net_to_host_u16 (r->n_src_addresses);
if (0 == n)
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);
}
return (srcs);
@@
-97,7
+107,7
@@
igmp_handle_group_block (igmp_config_t * config,
{
igmp_src_t *src;
/*
{
igmp_src_t *src;
/*
- * s
ne
d a group+source specific query
+ * s
en
d a group+source specific query
*/
igmp_pkt_build_query_init (&bq, config->sw_if_index);
igmp_pkt_query_v3_add_group (&bq, group, srcs);
*/
igmp_pkt_build_query_init (&bq, config->sw_if_index);
igmp_pkt_query_v3_add_group (&bq, group, srcs);
@@
-172,6
+182,10
@@
igmp_handle_report (const igmp_report_args_t * args)
return;
}
return;
}
+ /*
+ * we validated this packet when we accepted it in the DP, so
+ * this number is safe to use
+ */
n_groups = clib_net_to_host_u16 (args->report[0].n_groups);
igmp_group = args->report[0].groups;
n_groups = clib_net_to_host_u16 (args->report[0].n_groups);
igmp_group = args->report[0].groups;
@@
-182,6
+196,8
@@
igmp_handle_report (const igmp_report_args_t * args)
igmp_group = group_cptr (igmp_group,
igmp_membership_group_v3_length (igmp_group));
}
igmp_group = group_cptr (igmp_group,
igmp_membership_group_v3_length (igmp_group));
}
+
+ igmp_proxy_device_merge_config (config, 0);
}
/*
}
/*