Line data Source code
1 : /* 2 : * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved. 3 : * Copyright Contributors to the OpenSDN project 4 : */ 5 : 6 : #ifndef SRC_BGP_EVPN_EVPN_TABLE_H_ 7 : #define SRC_BGP_EVPN_EVPN_TABLE_H_ 8 : 9 : #include <atomic> 10 : #include <string> 11 : 12 : #include "bgp/bgp_config_ifmap.h" 13 : #include "bgp/bgp_table.h" 14 : #include "bgp/evpn/evpn_route.h" 15 : 16 : class EvpnManager; 17 : class PathResolver; 18 : 19 : class EvpnTable : public BgpTable { 20 : public: 21 : struct RequestKey : BgpTable::RequestKey { 22 161954 : RequestKey(const EvpnPrefix &prefix, const IPeer *ipeer) 23 161954 : : prefix(prefix), peer(ipeer) { 24 161949 : } 25 : EvpnPrefix prefix; 26 : const IPeer *peer; 27 70040 : virtual const IPeer *GetPeer() const { return peer; } 28 : }; 29 : 30 : EvpnTable(DB *db, const std::string &name); 31 : 32 : virtual std::unique_ptr<DBEntry> AllocEntry(const DBRequestKey *key) const; 33 : virtual std::unique_ptr<DBEntry> AllocEntryStr(const std::string &key) const; 34 : virtual void AddRemoveCallback(const DBEntryBase *entry, bool add) const; 35 : 36 1147981 : virtual Address::Family family() const { return Address::EVPN; } 37 : bool IsMaster() const; 38 1230096 : virtual bool IsVpnTable() const { return IsMaster(); } 39 : 40 : virtual size_t Hash(const DBEntry *entry) const; 41 : virtual size_t Hash(const DBRequestKey *key) const; 42 : 43 : virtual BgpRoute *RouteReplicate(BgpServer *server, BgpTable *src_table, 44 : BgpRoute *src_rt, const BgpPath *path, 45 : ExtCommunityPtr ptr); 46 : 47 : virtual bool Export(RibOut *ribout, Route *route, 48 : const RibPeerSet &peerset, 49 : UpdateInfoSList &info_slist); 50 : 51 : virtual PathResolver *CreatePathResolver(); 52 : 53 : static size_t HashFunction(const EvpnPrefix &prefix); 54 : static DBTableBase *CreateTable(DB *db, const std::string &name); 55 : EvpnRoute *FindRoute(const EvpnPrefix &prefix); 56 : const EvpnRoute *FindRoute(const EvpnPrefix &prefix) const; 57 : 58 : void CreateEvpnManager(); 59 : void DestroyEvpnManager(); 60 : EvpnManager *GetEvpnManager(); 61 : const EvpnManager *GetEvpnManager() const; 62 : virtual void set_routing_instance(RoutingInstance *rtinstance); 63 : 64 420 : uint64_t mac_route_count() const { return mac_route_count_; } 65 420 : uint64_t unique_mac_route_count() const { return unique_mac_route_count_; } 66 420 : uint64_t im_route_count() const { return im_route_count_; } 67 420 : uint64_t ip_route_count() const { return ip_route_count_; } 68 : 69 : private: 70 : virtual BgpRoute *TableFind(DBTablePartition *rtp, 71 : const DBRequestKey *prefix); 72 : bool ShouldReplicate(const BgpServer *server, const BgpTable *src_table, 73 : const ExtCommunityPtr community, 74 : const EvpnPrefix &evpn_prefix) const; 75 : EvpnManager *evpn_manager_; 76 : mutable std::atomic<uint64_t> mac_route_count_; 77 : mutable std::atomic<uint64_t> unique_mac_route_count_; 78 : mutable std::atomic<uint64_t> im_route_count_; 79 : mutable std::atomic<uint64_t> ip_route_count_; 80 : 81 : DISALLOW_COPY_AND_ASSIGN(EvpnTable); 82 : }; 83 : 84 : #endif // SRC_BGP_EVPN_EVPN_TABLE_H_