/
bridge_route.h
149 lines (133 loc) · 6.52 KB
/
bridge_route.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/*
* Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
*/
#ifndef vnsw_bridge_route_hpp
#define vnsw_bridge_route_hpp
//////////////////////////////////////////////////////////////////
// BRIDGE
/////////////////////////////////////////////////////////////////
class BridgeAgentRouteTable : public AgentRouteTable {
public:
BridgeAgentRouteTable(DB *db, const std::string &name) :
AgentRouteTable(db, name) {
}
virtual ~BridgeAgentRouteTable() { }
virtual std::string GetTableName() const {return "BridgeAgentRouteTable";}
virtual Agent::RouteTableType GetTableType() const {
return Agent::BRIDGE;
}
virtual AgentSandeshPtr GetAgentSandesh(const AgentSandeshArguments *args,
const std::string &context);
static DBTableBase *CreateTable(DB *db, const std::string &name);
void AddMacVmBindingRoute(const Peer *peer,
const std::string &vrf_name,
const MacAddress &mac,
const VmInterface *vm_intf);
void AddOvsPeerMulticastRoute(const Peer* peer,
uint32_t vxlan_id,
const std::string &vn_name,
Ip4Address vtep,
Ip4Address tor_ip);
void AddBridgeRoute(const AgentRoute *rt);
static void AddBridgeBroadcastRoute(const Peer *peer,
const std::string &vrf_name,
const std::string &vn_name,
uint32_t label,
int vxlan_id,
uint32_t ethernet_tag,
uint32_t tunnel_type,
Composite::Type type,
ComponentNHKeyList
&component_nh_key_list);
static void AddBridgeReceiveRoute(const Peer *peer,
const std::string &vrf_name,
const MacAddress &mac,
const std::string &vn_name,
const std::string &interface,
bool policy);
void AddBridgeReceiveRouteReq(const Peer *peer, const std::string &vrf_name,
uint32_t vxlan_id, const MacAddress &mac,
const std::string &vn_name);
void AddBridgeReceiveRoute(const Peer *peer, const std::string &vrf_name,
uint32_t vxlan_id, const MacAddress &mac,
const std::string &vn_name);
static void DeleteReq(const Peer *peer, const std::string &vrf_name,
const MacAddress &mac, uint32_t ethernet_tag);
static void Delete(const Peer *peer, const std::string &vrf_name,
const MacAddress &mac, uint32_t ethernet_tag);
static void DeleteBroadcastReq(const Peer *peer,
const std::string &vrf_name,
uint32_t ethernet_tag,
COMPOSITETYPE type);
void DeleteBridgeRoute(const AgentRoute *rt);
void DeleteOvsPeerMulticastRoute(const Peer *peer,
uint32_t vxlan_id);
void DeleteMacVmBindingRoute(const Peer *peer,
const std::string &vrf_name,
const MacAddress &mac,
const VmInterface *vm_intf);
const VmInterface *FindVmFromDhcpBinding(const MacAddress &mac);
BridgeRouteEntry *FindRoute(const MacAddress &mac);
private:
DBTableWalker::WalkId walkid_;
DISALLOW_COPY_AND_ASSIGN(BridgeAgentRouteTable);
};
class BridgeRouteEntry : public AgentRoute {
public:
BridgeRouteEntry(VrfEntry *vrf, const MacAddress &mac,
Peer::Type type, bool is_multicast) :
AgentRoute(vrf, is_multicast), mac_(mac) {
}
virtual ~BridgeRouteEntry() { }
virtual int CompareTo(const Route &rhs) const;
virtual std::string ToString() const;
virtual void UpdateDependantRoutes() { }
virtual void UpdateNH() { }
virtual KeyPtr GetDBRequestKey() const;
virtual void SetKey(const DBRequestKey *key);
virtual const std::string GetAddressString() const;
virtual Agent::RouteTableType GetTableType() const {
return Agent::BRIDGE;
}
virtual bool DBEntrySandesh(Sandesh *sresp, bool stale) const;
virtual uint32_t GetActiveLabel() const;
virtual bool ReComputePathDeletion(AgentPath *path);
virtual bool ReComputePathAdd(AgentPath *path);
virtual AgentPath *FindPathUsingKeyData(const AgentRouteKey *key,
const AgentRouteData *data) const;
virtual void DeletePathUsingKeyData(const AgentRouteKey *key,
const AgentRouteData *data,
bool force_delete);
const MacAddress &mac() const {return mac_;}
const AgentPath *FindMacVmBindingPath() const;
const AgentPath *FindOvsPath() const;
private:
bool ReComputeMulticastPaths(AgentPath *path, bool del);
AgentPath *FindEvpnPathUsingKeyData(const AgentRouteKey *key,
const AgentRouteData *data) const;
AgentPath *FindMulticastPathUsingKeyData(const AgentRouteKey *key,
const AgentRouteData *data) const;
MacAddress mac_;
DISALLOW_COPY_AND_ASSIGN(BridgeRouteEntry);
};
class BridgeRouteKey : public AgentRouteKey {
public:
BridgeRouteKey(const Peer *peer, const std::string &vrf_name,
const MacAddress &mac, uint32_t ethernet_tag = 0) :
AgentRouteKey(peer, vrf_name), dmac_(mac), ethernet_tag_(ethernet_tag) {
}
virtual ~BridgeRouteKey() { }
virtual AgentRoute *AllocRouteEntry(VrfEntry *vrf, bool is_multicast) const;
virtual Agent::RouteTableType GetRouteTableType() { return Agent::BRIDGE; }
virtual std::string ToString() const;
virtual BridgeRouteKey *Clone() const;
const MacAddress &GetMac() const { return dmac_;}
uint32_t ethernet_tag() const {return ethernet_tag_;}
private:
MacAddress dmac_;
//TODO retained only for multicast route. Once multicast route shift to
//evpn table this will go off.
uint32_t ethernet_tag_;
DISALLOW_COPY_AND_ASSIGN(BridgeRouteKey);
};
#endif // vnsw_bridge_route_hpp