Line data Source code
1 : /*
2 : * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3 : */
4 :
5 : #ifndef vnsw_bridge_route_hpp
6 : #define vnsw_bridge_route_hpp
7 :
8 : class MacVmBindingPath;
9 :
10 : //////////////////////////////////////////////////////////////////
11 : // BRIDGE
12 : /////////////////////////////////////////////////////////////////
13 : class BridgeAgentRouteTable : public AgentRouteTable {
14 : public:
15 8 : BridgeAgentRouteTable(DB *db, const std::string &name) :
16 8 : AgentRouteTable(db, name) {
17 8 : }
18 16 : virtual ~BridgeAgentRouteTable() { }
19 :
20 16 : virtual std::string GetTableName() const {return "BridgeAgentRouteTable";}
21 66 : virtual Agent::RouteTableType GetTableType() const {
22 66 : return Agent::BRIDGE;
23 : }
24 : virtual AgentSandeshPtr GetAgentSandesh(const AgentSandeshArguments *args,
25 : const std::string &context);
26 :
27 : static DBTableBase *CreateTable(DB *db, const std::string &name);
28 :
29 : void AddMacVmBindingRoute(const Peer *peer,
30 : const std::string &vrf_name,
31 : const MacAddress &mac,
32 : const VmInterface *vm_intf,
33 : bool flood_dhcp);
34 : void AddBridgeRoute(const AgentRoute *rt);
35 : static AgentRouteData *BuildNonBgpPeerData(const string &vrf_name,
36 : const std::string &vn_name,
37 : uint32_t label,
38 : int vxlan_id,
39 : uint32_t tunnel_type,
40 : Composite::Type type,
41 : ComponentNHKeyList
42 : &component_nh_key_list,
43 : bool pbb_nh,
44 : bool learning_enabled);
45 : static AgentRouteData *BuildBgpPeerData(const Peer *peer,
46 : const string &vrf_name,
47 : const std::string &vn_name,
48 : uint32_t label,
49 : int vxlan_id,
50 : uint32_t ethernet_tag,
51 : uint32_t tunnel_type,
52 : Composite::Type type,
53 : ComponentNHKeyList
54 : &component_nh_key_list,
55 : bool pbb_nh,
56 : bool learning_enabled);
57 : static void AddBridgeRoute(const Peer *peer, const string &vrf_name,
58 : const MacAddress &mac,
59 : uint32_t ethernet_tag,
60 : AgentRouteData *data);
61 : static void AddBridgeBroadcastRoute(const Peer *peer,
62 : const string &vrf_name,
63 : uint32_t ethernet_tag,
64 : AgentRouteData *data);
65 : static void AddBridgeReceiveRoute(const Peer *peer,
66 : const std::string &vrf_name,
67 : const MacAddress &mac,
68 : const std::string &vn_name,
69 : const std::string &interface,
70 : bool policy);
71 : void AddBridgeReceiveRoute(const Peer *peer, const std::string &vrf_name,
72 : uint32_t vxlan_id, const MacAddress &mac,
73 : const std::string &vn_name);
74 : static void Delete(const Peer *peer, const std::string &vrf_name,
75 : const MacAddress &mac, uint32_t ethernet_tag);
76 : static void DeleteBroadcastReq(const Peer *peer,
77 : const std::string &vrf_name,
78 : uint32_t ethernet_tag,
79 : COMPOSITETYPE type);
80 : void DeleteBridgeRoute(const AgentRoute *rt);
81 : static void DeleteBridgeRoute(const Peer *peer, const string &vrf_name,
82 : const MacAddress &mac,
83 : uint32_t ethernet_tag,
84 : COMPOSITETYPE type);
85 : void DeleteMacVmBindingRoute(const Peer *peer,
86 : const std::string &vrf_name,
87 : const MacAddress &mac,
88 : const VmInterface *vm_intf);
89 : const VmInterface *FindVmFromDhcpBinding(const MacAddress &mac);
90 : BridgeRouteEntry *FindRoute(const MacAddress &mac);
91 : BridgeRouteEntry *FindRouteNoLock(const MacAddress &mac);
92 : BridgeRouteEntry *FindRoute(const MacAddress &mac, Peer::Type peer);
93 :
94 : private:
95 : DBTableWalker::WalkId walkid_;
96 : DISALLOW_COPY_AND_ASSIGN(BridgeAgentRouteTable);
97 : };
98 :
99 : class BridgeRouteEntry : public AgentRoute,
100 : public AgentRoutePrefix<MacAddress> {
101 : public:
102 556 : BridgeRouteEntry(VrfEntry *vrf, const MacAddress &mac,
103 556 : Peer::Type type, bool is_multicast) :
104 556 : AgentRoute(vrf, is_multicast), AgentRoutePrefix(mac,0) {
105 556 : }
106 969 : virtual ~BridgeRouteEntry() { }
107 :
108 : virtual int CompareTo(const Route &rhs) const;
109 : virtual std::string ToString() const;
110 0 : virtual void UpdateDependantRoutes() { }
111 0 : virtual void UpdateNH() { }
112 : virtual KeyPtr GetDBRequestKey() const;
113 : virtual void SetKey(const DBRequestKey *key);
114 : virtual const std::string GetAddressString() const;
115 : virtual const std::string GetSourceAddressString() const;
116 632 : virtual Agent::RouteTableType GetTableType() const {
117 632 : return Agent::BRIDGE;
118 : }
119 : virtual bool DBEntrySandesh(Sandesh *sresp, bool stale) const;
120 : virtual uint32_t GetActiveLabel() const;
121 : virtual bool ReComputePathDeletion(AgentPath *path);
122 : virtual bool ReComputePathAdd(AgentPath *path);
123 : virtual AgentPath *FindPathUsingKeyData(const AgentRouteKey *key,
124 : const AgentRouteData *data) const;
125 72 : virtual bool ValidateMcastSrc() const {
126 72 : return (prefix_address_ == MacAddress::BroadcastMac());
127 : }
128 : ///! @brief The length of L3 IP prefix (if present) associated with this
129 : /// L2 address.
130 407 : uint8_t prefix_length() const {return prefix_length_;}
131 : const MacVmBindingPath *FindMacVmBindingPath() const;
132 :
133 : private:
134 : AgentPath *FindEvpnPathUsingKeyData(const AgentRouteKey *key,
135 : const AgentRouteData *data) const;
136 : AgentPath *FindMulticastPathUsingKeyData(const AgentRouteKey *key,
137 : const AgentRouteData *data) const;
138 :
139 : DISALLOW_COPY_AND_ASSIGN(BridgeRouteEntry);
140 : };
141 :
142 : class BridgeRouteKey : public AgentRouteKey {
143 : public:
144 371 : BridgeRouteKey(const Peer *peer, const std::string &vrf_name,
145 371 : const MacAddress &mac, uint32_t ethernet_tag = 0) :
146 371 : AgentRouteKey(peer, vrf_name), dmac_(mac), ethernet_tag_(ethernet_tag) {
147 371 : }
148 :
149 742 : virtual ~BridgeRouteKey() { }
150 :
151 : virtual AgentRoute *AllocRouteEntry(VrfEntry *vrf, bool is_multicast) const;
152 429 : virtual Agent::RouteTableType GetRouteTableType() { return Agent::BRIDGE; }
153 : virtual std::string ToString() const;
154 : virtual BridgeRouteKey *Clone() const;
155 0 : const MacAddress &GetMac() const { return dmac_;}
156 : uint32_t ethernet_tag() const {return ethernet_tag_;}
157 :
158 : private:
159 : MacAddress dmac_;
160 : //TODO retained only for multicast route. Once multicast route shift to
161 : //evpn table this will go off.
162 : uint32_t ethernet_tag_;
163 : DISALLOW_COPY_AND_ASSIGN(BridgeRouteKey);
164 : };
165 :
166 : #endif // vnsw_bridge_route_hpp
|