7 #include <boost/foreach.hpp>
23 #include "schema/xmpp_multicast_types.h"
24 #include "schema/xmpp_mvpn_types.h"
25 #include "schema/xmpp_enet_types.h"
28 using pugi::xml_attribute;
29 using pugi::xml_document;
31 using std::ostringstream;
35 using std::stringstream;
38 static inline const char *
AfiName(uint16_t afi) {
120 repr_ +=
"\n\t<event xmlns=\"http://jabber.org/protocol/pubsub\">";
121 repr_ +=
"\n\t\t<items node=\"";
174 autogen::ItemType *item) {
175 autogen::NextHopType item_nexthop;
178 if (address.is_v4()) {
180 item_nexthop.address = address.to_v4().to_string();
183 item_nexthop.address = address.to_v6().to_string();
185 item_nexthop.label = nexthop.
label();
187 item_nexthop.tag_list.tag = nexthop.
tag_list();
191 if (item_nexthop.label) {
192 vector<string> &encap_list =
193 item_nexthop.tunnel_encapsulation_list.tunnel_encapsulation;
194 if (nexthop.
encap().empty()) {
195 encap_list.push_back(
string(
"gre"));
197 encap_list = nexthop.
encap();
201 item->entry.next_hops.next_hop.push_back(item_nexthop);
206 if (!roattr->
repr().empty()) {
212 autogen::ItemType item;
215 item.entry.nlri.address = route->
ToString();
216 item.entry.version = 1;
219 item.entry.med = roattr->
attr()->
med();
233 item.entry.security_group_list.security_group.push_back(*it);
238 item.entry.community_tag_list.community_tag.push_back(*it);
245 xml_node node =
doc_.append_child(
"item");
251 size_t pos =
repr_.size();
253 doc_.print(
writer_,
"\t", pugi::format_default, pugi::encoding_auto, 3);
254 doc_.remove_child(node);
291 autogen::EnetItemType *item) {
292 autogen::EnetNextHopType item_nexthop;
295 item_nexthop.address = nexthop.
address().to_v4().to_string();
296 item_nexthop.label = nexthop.
label();
297 item_nexthop.l3_label = nexthop.
l3_label();
302 vector<string> &encap_list =
303 item_nexthop.tunnel_encapsulation_list.tunnel_encapsulation;
304 if (nexthop.
encap().empty()) {
305 encap_list.push_back(
string(
"gre"));
307 encap_list = nexthop.
encap();
309 item_nexthop.tag_list.tag = nexthop.
tag_list();
310 item->entry.next_hops.next_hop.push_back(item_nexthop);
315 if (!roattr->
repr().empty()) {
321 autogen::EnetItemType item;
328 item.entry.nlri.ethernet_tag = evpn_prefix.
tag();
330 item.entry.nlri.address = evpn_prefix.
ip_address().to_string() +
"/" +
332 item.entry.nlri.source = evpn_prefix.
source().to_string();
333 item.entry.nlri.group = evpn_prefix.
group().to_string();
337 item.entry.med = roattr->
attr()->
med();
345 item.entry.security_group_list.security_group.push_back(*it);
349 assert((olist == NULL) != roattr->
nexthop_list().empty());
354 autogen::EnetNextHopType nh;
356 nh.address = elem->
address.to_string();
357 nh.label = elem->
label;
358 nh.tunnel_encapsulation_list.tunnel_encapsulation = elem->
encap;
359 item.entry.olist.next_hop.push_back(nh);
364 assert((leaf_olist == NULL) != roattr->
nexthop_list().empty());
369 autogen::EnetNextHopType nh;
371 nh.address = elem->
address.to_string();
372 nh.label = elem->
label;
373 nh.tunnel_encapsulation_list.tunnel_encapsulation = elem->
encap;
374 item.entry.leaf_olist.next_hop.push_back(nh);
382 xml_node node =
doc_.append_child(
"item");
388 size_t pos =
repr_.size();
390 doc_.print(
writer_,
"\t", pugi::format_default, pugi::encoding_auto, 3);
391 doc_.remove_child(node);
421 autogen::McastItemType item;
427 item.entry.nlri.group = ermvpn_route->
GetPrefix().
group().to_string();
428 item.entry.nlri.source = ermvpn_route->
GetPrefix().
source().to_string();
429 item.entry.nlri.source_label = roattr->
label();
431 item.entry.nlri.source_address =
438 autogen::McastNextHopType nh;
440 nh.address = elem->
address.to_string();
442 nh.tunnel_encapsulation_list.tunnel_encapsulation = elem->
encap;
443 item.entry.olist.next_hop.push_back(nh);
448 xml_node node =
doc_.append_child(
"item");
451 doc_.print(
writer_,
"\t", pugi::format_default, pugi::encoding_auto, 3);
452 doc_.remove_child(node);
474 autogen::MvpnItemType item;
480 item.entry.nlri.group = mvpn_route->
GetPrefix().
group().to_string();
490 autogen::MvpnNextHopType nh;
492 nh.address = elem->
address.to_string();
493 nh.label = elem->
label;
494 nh.tunnel_encapsulation_list.tunnel_encapsulation = elem->
encap;
495 item.entry.olist.next_hop.push_back(nh);
501 xml_node node =
doc_.append_child(
"item");
504 doc_.print(
writer_,
"\t", pugi::format_default, pugi::encoding_auto, 3);
505 doc_.remove_child(node);
525 const string **msg_str,
string *temp) {
540 repr_ +=
"\t\t</items>\n\t</event>\n</message>\n";
553 char *data =
const_cast<char *
>(
repr_.c_str());
554 fill(data, data + extra,
' ');
556 *lenp =
repr_.size() - extra;
558 return reinterpret_cast<const uint8_t *
>(
repr_.c_str()) + extra;
561 *lenp = temp->size();
563 return reinterpret_cast<const uint8_t *
>(temp->c_str());
569 if (community == NULL)
571 BOOST_FOREACH(uint32_t value, community->
communities()) {
582 if (ext_community == NULL)
586 bool sg_asn_match =
true;
587 for (ExtCommunity::ExtCommunityList::const_iterator iter =
589 iter != ext_community->
communities().end(); ++iter) {
599 sg_asn_match =
false;
623 }
else if (index == 0) {
virtual std::string ToXmppIdString() const
const Community * community() const
std::vector< std::string > encap
static const size_t kMaxFromToLength
static const uint32_t kMaxUnreachCount
const BgpOListSpec & olist() const
void EncodeEnetNextHop(const BgpRoute *route, const RibOutAttr::NextHop &nexthop, autogen::EnetItemType *item)
uint32_t local_pref() const
void AddIpReach(const BgpRoute *route, const RibOutAttr *roattr)
const MacAddress & mac_addr() const
LoadBalance::LoadBalanceAttribute load_balance_attribute_
const ErmVpnPrefix & GetPrefix() const
const BgpAttr * attr() const
const MacAddress & mac() const
void EncodeNextHop(const BgpRoute *route, const RibOutAttr::NextHop &nexthop, autogen::ItemType *item)
const NextHopList & nexthop_list() const
const bool IsDefault() const
bool AddMvpnRoute(const BgpRoute *route, const RibOutAttr *roattr)
RoutingInstance * routing_instance()
static const uint32_t kMaxReachCount
boost::asio::ip::address IpAddress
BgpOListPtr olist() const
void ProcessExtCommunity(const ExtCommunity *ext_community)
std::vector< std::string > encap() const
const std::string & name() const
bool AddEnetRoute(const BgpRoute *route, const RibOutAttr *roattr)
virtual const std::string & ToString() const =0
virtual bool Start(const RibOut *ribout, bool cache_routes, const RibOutAttr *roattr, const BgpRoute *route)
const std::string & repr() const
void AddMvpnReach(const BgpRoute *route, const RibOutAttr *roattr)
uint64_t num_unreach_route_
virtual Address::Family family() const =0
uint32_t security_group_id() const
void Encode(autogen::LoadBalanceType *lb_type) const
virtual const uint8_t * GetData(IPeerUpdate *peer, size_t *lenp, const std::string **msg_str, std::string *temp)
void AddIpUnreach(const BgpRoute *route)
const Ip4Address & source_address() const
std::string ToString() const
virtual bool AddRoute(const BgpRoute *route, const RibOutAttr *roattr)
void ProcessCommunity(const Community *community)
bool vrf_originated() const
std::vector< int > security_group_list_
static const std::string integerToString(const NumberType &num)
static const char * AfiName(uint16_t afi)
void AddEnetReach(const BgpRoute *route, const RibOutAttr *roattr)
uint64_t num_reach_route_
uint32_t l3_label() const
bool AddMcastRoute(const BgpRoute *route, const RibOutAttr *roattr)
std::string GetVirtualNetwork(const RibOutAttr::NextHop &nexthop) const
void AddMvpnUnreach(const BgpRoute *route)
virtual std::string ToString() const =0
uint8_t ip_address_length() const
static uint8_t FamilyToXmppSafi(Address::Family family)
virtual Message * Create() const
void set_repr(const std::string &repr, size_t pos=0) const
Ip4Address source() const
uint32_t sequence_number() const
std::vector< int > tag_list() const
bool AddInetRoute(const BgpRoute *route, const RibOutAttr *roattr)
static Afi FamilyToAfi(Address::Family family)
virtual ~BgpXmppMessage()
const RoutingInstanceMgr * manager() const
const EvpnPrefix & GetPrefix() const
void AddEnetUnreach(const BgpRoute *route)
const ExtCommunity * ext_community() const
void AddMcastReach(const BgpRoute *route, const RibOutAttr *roattr)
std::vector< std::string > community_list_
const Elements & elements() const
const IpAddress address() const
std::string GetVirtualNetworkByVnIndex(int vn_index) const
const std::string GetVirtualNetworkName() const
IpAddress ip_address() const
int origin_vn_index() const
bool AddInet6Route(const BgpRoute *route, const RibOutAttr *roattr)
void AddMcastUnreach(const BgpRoute *route)
Ip4Address source() const
const MvpnPrefix & GetPrefix() const
BgpOListPtr leaf_olist() const
as_t autonomous_system() const
static const char * XmppSafiName(uint8_t safi)
static const char * kBgpPeer
static const char * kControlNodeJID
void FillAttribute(LoadBalanceAttribute *attr)