aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/igmp/igmp_config.c
diff options
context:
space:
mode:
authorNeale Ranns <nranns@cisco.com>2018-06-07 23:48:20 -0700
committerFlorin Coras <florin.coras@gmail.com>2018-07-09 21:10:53 +0000
commit947ea6222dad1ef04595c34273e9231395aef443 (patch)
tree8990854b2901ff8cc2241b9abfc99b0b4b54d517 /src/plugins/igmp/igmp_config.c
parentdd47ecadcf63772a6037a1bb3715772d80e87f51 (diff)
IGMP improvements
- Enable/Disable an interface for IGMP - improve logging - refactor common code - no orphaned timers - IGMP state changes in main thread only - Large groups split over multiple state-change reports - SSM range configuration API. - more tests Change-Id: If5674f1044e7e97274a711f47807c9ba689d7b9a Signed-off-by: Neale Ranns <nranns@cisco.com>
Diffstat (limited to 'src/plugins/igmp/igmp_config.c')
-rw-r--r--src/plugins/igmp/igmp_config.c96
1 files changed, 96 insertions, 0 deletions
diff --git a/src/plugins/igmp/igmp_config.c b/src/plugins/igmp/igmp_config.c
new file mode 100644
index 00000000000..76e8ace14d9
--- /dev/null
+++ b/src/plugins/igmp/igmp_config.c
@@ -0,0 +1,96 @@
+/*
+ *------------------------------------------------------------------
+ * Copyright (c) 2018 Cisco and/or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *------------------------------------------------------------------
+ */
+
+#include <igmp/igmp_config.h>
+#include <igmp/igmp.h>
+
+void
+igmp_clear_config (igmp_config_t * config)
+{
+ igmp_group_t *group;
+ u32 ii;
+
+ IGMP_DBG ("clear-config: %U",
+ format_vnet_sw_if_index_name,
+ vnet_get_main (), config->sw_if_index);
+
+ /* *INDENT-OFF* */
+ FOR_EACH_GROUP (group, config,
+ ({
+ igmp_group_clear (group);
+ }));
+ /* *INDENT-ON* */
+
+ for (ii = 0; ii < IGMP_CONFIG_N_TIMERS; ii++)
+ {
+ igmp_timer_retire (&config->timers[ii]);
+ }
+}
+
+igmp_config_t *
+igmp_config_lookup (u32 sw_if_index)
+{
+ igmp_main_t *im;
+
+ im = &igmp_main;
+
+ if (vec_len (im->igmp_config_by_sw_if_index) > sw_if_index)
+ {
+ u32 index;
+
+ index = im->igmp_config_by_sw_if_index[sw_if_index];
+
+ if (~0 != index)
+ return (vec_elt_at_index (im->configs, index));
+ }
+ return NULL;
+}
+
+u32
+igmp_config_index (const igmp_config_t * c)
+{
+ return (c - igmp_main.configs);
+}
+
+igmp_config_t *
+igmp_config_get (u32 index)
+{
+ return (pool_elt_at_index (igmp_main.configs, index));
+}
+
+igmp_group_t *
+igmp_group_lookup (igmp_config_t * config, const igmp_key_t * key)
+{
+ uword *p;
+ igmp_group_t *group = NULL;
+ if (!config)
+ return NULL;
+
+ p = hash_get_mem (config->igmp_group_by_key, key);
+ if (p)
+ group = pool_elt_at_index (igmp_main.groups, p[0]);
+
+ return group;
+}
+
+/*
+ * fd.io coding-style-patch-verification: ON
+ *
+ * Local Variables:
+ * eval: (c-set-style "gnu")
+ * End:
+ */