IGMP: proxy device
[vpp.git] / src / plugins / igmp / igmp_config.h
1 /*
2  *------------------------------------------------------------------
3  * Copyright (c) 2018 Cisco and/or its affiliates.
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at:
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *------------------------------------------------------------------
16  */
17
18 #ifndef __IGMP_CONFIG_H__
19 #define __IGMP_CONFIG_H__
20
21 #include <igmp/igmp_types.h>
22 #include <igmp/igmp_timer.h>
23 #include <igmp/igmp_group.h>
24
25 typedef enum igmp_config_timer_type_t_
26 {
27   /**
28    * On expiry send a general report
29    */
30   IGMP_CONFIG_TIMER_GENERAL_REPORT,
31
32   /**
33    * On expiry send a general query
34    */
35   IGMP_CONFIG_TIMER_GENERAL_QUERY,
36 } igmp_config_timer_type_t;
37
38 #define IGMP_CONFIG_N_TIMERS (IGMP_CONFIG_TIMER_GENERAL_QUERY + 1)
39
40 /**
41  * @brief IGMP interface configuration
42 */
43 typedef struct igmp_config_t_
44 {
45   /**
46    * @param sw_if_index - interface sw_if_index
47    */
48   u32 sw_if_index;
49
50   /**
51    * @param adj_index - multicast adjacency index on the link
52    */
53   adj_index_t adj_index;
54
55   /**
56    * @param mode - host or router
57    */
58   igmp_mode_t mode;
59
60   /**
61    * Robustness variable (section 5.1)
62    */
63   u8 robustness_var;
64
65   /**
66    * Database of groups joined on the link
67    */
68   uword *igmp_group_by_key;
69
70   /**
71    * A vector of scheduled query-response timers
72    */
73   igmp_timer_id_t timers[IGMP_CONFIG_N_TIMERS];
74
75   /**
76    * ID of a proxy device this configuration is on
77    */
78   u32 proxy_device_id;
79 } igmp_config_t;
80
81 #define FOR_EACH_GROUP(_group, _config, _body)                          \
82 do {                                                                    \
83   igmp_key_t *__key__;                                                  \
84   u32 __gid__;                                                          \
85   hash_foreach_mem(__key__, __gid__, _config->igmp_group_by_key,        \
86   ({                                                                    \
87     _group = pool_elt_at_index(igmp_main.groups, __gid__);              \
88     do { _body; } while (0);                                            \
89   }));                                                                  \
90  } while (0);
91
92 /**
93  * @brief igmp clear config
94  *  @param config - igmp configuration
95  *
96  *   Clear all (S,G)s on specified config and remove this config from pool.
97  */
98 extern void igmp_clear_config (igmp_config_t * config);
99
100 /**
101  * @brief igmp config lookup
102  *  @param im - igmp main
103  *  @param sw_if_index - interface sw_if_index
104  */
105 extern igmp_config_t *igmp_config_lookup (u32 sw_if_index);
106
107 /**
108  * Get the pool index for a config
109  */
110 extern u32 igmp_config_index (const igmp_config_t * c);
111
112 /**
113  * Get the config from the pool index
114  */
115 extern igmp_config_t *igmp_config_get (u32 index);
116
117 /**
118  * @brief igmp group lookup
119  *  @param config - igmp configuration
120  *  @param key - igmp key
121 */
122 extern igmp_group_t *igmp_group_lookup (igmp_config_t * config,
123                                         const igmp_key_t * key);
124
125 #endif
126
127 /*
128  * fd.io coding-style-patch-verification: ON
129  *
130  * Local Variables:
131  * eval: (c-set-style "gnu")
132  * End:
133  */