2 * Copyright (c) 2014 Red Hat, Inc.
4 * Based on mac-learning implementation.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at:
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
19 #ifndef MCAST_SNOOPING_H
20 #define MCAST_SNOOPING_H 1
23 #include "dp-packet.h"
25 #include "openvswitch/list.h"
26 #include "ovs-atomic.h"
27 #include "ovs-thread.h"
31 struct mcast_snooping
;
33 /* Default maximum size of a mcast snooping table, in entries. */
34 #define MCAST_DEFAULT_MAX_ENTRIES 2048
36 /* Time, in seconds, before expiring a mcast_group due to inactivity. */
37 #define MCAST_ENTRY_DEFAULT_IDLE_TIME 300
39 /* Time, in seconds, before expiring a mrouter_port due to inactivity. */
40 #define MCAST_MROUTER_PORT_IDLE_TIME 180
42 /* Multicast group entry.
43 * Guarded by owning 'mcast_snooping''s rwlock. */
45 /* Node in parent struct mcast_snooping hmap. */
46 struct hmap_node hmap_node
;
48 /* Multicast group IPv6/IPv4 address. */
54 /* Node in parent struct mcast_snooping group_lru. */
55 struct ovs_list group_node OVS_GUARDED
;
57 /* Contains struct mcast_group_bundle (ports), least recently used
58 * at the front, most recently used at the back. */
59 struct ovs_list bundle_lru OVS_GUARDED
;
62 /* The bundle associated to the multicast group.
63 * Guarded by owning 'mcast_snooping''s rwlock. */
64 struct mcast_group_bundle
{
65 /* Node in parent struct mcast_group bundle_lru list. */
66 struct ovs_list bundle_node OVS_GUARDED
;
68 /* When this node expires. */
72 void *port OVS_GUARDED
;
75 /* The bundle connected to a multicast router.
76 * Guarded by owning 'mcast_snooping''s rwlock. */
77 struct mcast_mrouter_bundle
{
78 /* Node in parent struct mcast_group mrouter_lru list. */
79 struct ovs_list mrouter_node OVS_GUARDED
;
81 /* When this node expires. */
88 void *port OVS_GUARDED
;
91 /* The bundle to send multicast traffic or Reports.
92 * Guarded by owning 'mcast_snooping''s rwlock */
93 struct mcast_port_bundle
{
94 /* Node in parent struct mcast_snooping. */
104 /* Multicast snooping table. */
105 struct mcast_snooping
{
106 /* Snooping/learning table. */
109 /* Contains struct mcast_group, least recently used at the front,
110 * most recently used at the back. */
111 struct ovs_list group_lru OVS_GUARDED
;
113 /* Contains struct mcast_mrouter_bundle, least recently used at the
114 * front, most recently used at the back. */
115 struct ovs_list mrouter_lru OVS_GUARDED
;
117 /* Contains struct mcast_port_bundle to be flooded with multicast
118 * packets in no special order. */
119 struct ovs_list fport_list OVS_GUARDED
;
121 /* Contains struct mcast_port_bundle to forward Reports in
122 * no special order. */
123 struct ovs_list rport_list OVS_GUARDED
;
125 /* Secret for randomizing hash table. */
128 /* Maximum age before deleting an entry. */
129 unsigned int idle_time
;
131 /* Maximum number of multicast groups learned. */
134 /* True if flow revalidation is needed. */
135 bool need_revalidate
;
137 /* True if unregistered multicast packets should be flooded to all
138 * ports, otherwise send them to ports connected to multicast routers. */
141 struct ovs_refcount ref_cnt
;
142 struct ovs_rwlock rwlock
;
146 bool mcast_snooping_enabled(const struct mcast_snooping
*ms
);
147 bool mcast_snooping_flood_unreg(const struct mcast_snooping
*ms
);
148 int mcast_mrouter_age(const struct mcast_snooping
*ms
,
149 const struct mcast_mrouter_bundle
*m
);
150 int mcast_bundle_age(const struct mcast_snooping
*ms
,
151 const struct mcast_group_bundle
*b
);
152 struct mcast_snooping
*mcast_snooping_create(void);
153 struct mcast_snooping
*mcast_snooping_ref(const struct mcast_snooping
*);
154 void mcast_snooping_unref(struct mcast_snooping
*);
155 bool mcast_snooping_run(struct mcast_snooping
*ms
);
156 void mcast_snooping_wait(struct mcast_snooping
*ms
);
159 void mcast_snooping_set_idle_time(struct mcast_snooping
*ms
,
160 unsigned int idle_time
)
161 OVS_REQ_WRLOCK(ms
->rwlock
);
162 void mcast_snooping_set_max_entries(struct mcast_snooping
*ms
,
164 OVS_REQ_WRLOCK(ms
->rwlock
);
166 mcast_snooping_set_flood_unreg(struct mcast_snooping
*ms
, bool enable
)
167 OVS_REQ_WRLOCK(ms
->rwlock
);
168 void mcast_snooping_set_port_flood(struct mcast_snooping
*ms
, void *port
,
170 OVS_REQ_WRLOCK(ms
->rwlock
);
171 void mcast_snooping_set_port_flood_reports(struct mcast_snooping
*ms
,
172 void *port
, bool flood
)
173 OVS_REQ_WRLOCK(ms
->rwlock
);
177 mcast_snooping_lookup(const struct mcast_snooping
*ms
,
178 const struct in6_addr
*dip
, uint16_t vlan
)
179 OVS_REQ_RDLOCK(ms
->rwlock
);
181 mcast_snooping_lookup4(const struct mcast_snooping
*ms
, ovs_be32 ip4
,
183 OVS_REQ_RDLOCK(ms
->rwlock
);
186 bool mcast_snooping_add_group(struct mcast_snooping
*ms
,
187 const struct in6_addr
*addr
,
188 uint16_t vlan
, void *port
)
189 OVS_REQ_WRLOCK(ms
->rwlock
);
190 bool mcast_snooping_add_group4(struct mcast_snooping
*ms
, ovs_be32 ip4
,
191 uint16_t vlan
, void *port
)
192 OVS_REQ_WRLOCK(ms
->rwlock
);
193 int mcast_snooping_add_report(struct mcast_snooping
*ms
,
194 const struct dp_packet
*p
,
195 uint16_t vlan
, void *port
)
196 OVS_REQ_WRLOCK(ms
->rwlock
);
197 int mcast_snooping_add_mld(struct mcast_snooping
*ms
,
198 const struct dp_packet
*p
,
199 uint16_t vlan
, void *port
)
200 OVS_REQ_WRLOCK(ms
->rwlock
);
201 bool mcast_snooping_leave_group(struct mcast_snooping
*ms
,
202 const struct in6_addr
*addr
,
203 uint16_t vlan
, void *port
)
204 OVS_REQ_WRLOCK(ms
->rwlock
);
205 bool mcast_snooping_leave_group4(struct mcast_snooping
*ms
, ovs_be32 ip4
,
206 uint16_t vlan
, void *port
)
207 OVS_REQ_WRLOCK(ms
->rwlock
);
208 bool mcast_snooping_add_mrouter(struct mcast_snooping
*ms
, uint16_t vlan
,
210 OVS_REQ_WRLOCK(ms
->rwlock
);
211 bool mcast_snooping_is_query(ovs_be16 igmp_type
);
212 bool mcast_snooping_is_membership(ovs_be16 igmp_type
);
215 void mcast_snooping_mdb_flush(struct mcast_snooping
*ms
);
216 void mcast_snooping_flush(struct mcast_snooping
*ms
);
218 #endif /* mcast-snooping.h */