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