136 enum { PreallocatedRoutes = 4, PreallocatedSources = 8 };
150 , parent_route(route)
151 , source_id(source_id) {
169 return source_id1 == source_id2;
175 struct AddressNode : core::HashmapNode<> {
180 const address::SocketAddr& key() {
182 return route().source_addr;
185 static core::hashsum_t key_hash(
const address::SocketAddr& source_addr) {
189 static bool key_equal(
const address::SocketAddr& source_addr1,
190 const address::SocketAddr& source_addr2) {
191 return source_addr1 == source_addr2;
197 struct CnameNode : core::HashmapNode<> {
204 return route().cname;
211 static bool key_equal(
const char* cname1,
const char* cname2) {
212 return strcmp(cname1, cname2) == 0;
218 struct SessionNode : core::HashmapNode<> {
223 const core::SharedPtr<ReceiverSession>& key() {
225 return route().session;
228 static core::hashsum_t key_hash(
const core::SharedPtr<ReceiverSession>& session) {
232 static bool key_equal(
const core::SharedPtr<ReceiverSession>& session1,
233 const core::SharedPtr<ReceiverSession>& session2) {
234 return session1 == session2;
250 struct Route : core::RefCounted<Route, core::PoolAllocation>, core::ListNode<> {
253 core::SharedPtr<ReceiverSession> session;
257 address::SocketAddr source_addr;
261 char cname[rtcp::MaxCnameLen + 1];
266 bool has_main_source_id;
270 core::List<SourceNode> source_nodes;
271 AddressNode address_node;
272 CnameNode cname_node;
273 SessionNode session_node;
275 Route(core::IPool&
pool)
277 , has_main_source_id(false)
278 , main_source_id(0) {
287 const address::SocketAddr& source_addr,
289 const core::SharedPtr<ReceiverSession>& session);
290 void remove_route_(core::SharedPtr<Route> route);
291 void remove_all_routes_();
293 void collect_route_(Route& route);
296 core::SlabPool<Route, PreallocatedRoutes> route_pool_;
297 core::SlabPool<SourceNode, PreallocatedSources> source_node_pool_;
301 core::List<Route> route_list_;
305 core::Hashmap<SourceNode, PreallocatedRoutes, core::NoOwnership> source_route_map_;
306 core::Hashmap<AddressNode, PreallocatedRoutes, core::NoOwnership> address_route_map_;
307 core::Hashmap<CnameNode, PreallocatedRoutes, core::NoOwnership> cname_route_map_;
308 core::Hashmap<SessionNode, PreallocatedRoutes, core::NoOwnership> session_route_map_;
status::StatusCode add_session(const core::SharedPtr< ReceiverSession > &session, packet::stream_source_t source_id, const address::SocketAddr &source_addr)
Register session in router.