35 kRdSize + kEsiSize + kTagSize;
37 kRdSize + kEsiSize + kTagSize + 1 + kMacSize + 1;
39 kRdSize + kTagSize + 1;
41 kRdSize + kTagSize + 3;
43 kRdSize + kEsiSize + 1;
45 kRdSize + kEsiSize + kTagSize + 1 + 2 * kIp4AddrSize;
47 kRdSize + kEsiSize + kTagSize + 1 + 2 * kIp6AddrSize;
69 return proto_prefix.
ReadLabel(offset,
true);
72 return proto_prefix.
ReadLabel(offset,
true);
75 return proto_prefix.
ReadLabel(offset,
false);
83 const BgpAttr *attr,
size_t offset, uint32_t label) {
88 proto_prefix->
WriteLabel(offset, label,
false);
96 size_t gw_offset,
size_t ip_size) {
100 Ip4Address::bytes_type bytes;
101 copy(proto_prefix.
prefix.begin() + gw_offset,
102 proto_prefix.
prefix.begin() + gw_offset + ip_size, bytes.begin());
105 Ip6Address::bytes_type bytes;
106 copy(proto_prefix.
prefix.begin() + gw_offset,
107 proto_prefix.
prefix.begin() + gw_offset + ip_size, bytes.begin());
114 : type_(Unspecified),
122 : type_(AutoDiscoveryRoute),
132 : type_(MacAdvertisementRoute),
137 ip_address_(ip_address),
148 : type_(MacAdvertisementRoute), rd_(rd), tag_(tag),
149 mac_addr_(mac_addr), family_(
Address::UNSPEC),
150 ip_address_(ip_address), ip_prefixlen_(0) {
160 : type_(InclusiveMulticastRoute),
164 ip_address_(ip_address),
175 : type_(SegmentRoute),
180 ip_address_(ip_address),
190 const IpAddress &ip_address, uint8_t ip_prefixlen)
191 : type_(IpPrefixRoute),
195 ip_address_(ip_address),
196 ip_prefixlen_(ip_prefixlen) {
208 : type_(SelectiveMulticastRoute),
212 ip_address_(ip_address),
215 ip_prefixlen_(0), flags_(0x2) {
221 string ip = group.to_v4().to_string();
222 char *str =
const_cast<char *
>(ip.c_str());
223 char * mac_ip = strstr(str,
".");
224 std::ostringstream oss;
225 oss <<
"01:00:5e:" << strtok(mac_ip,
".");
226 oss <<
":" << strtok(NULL,
".");
227 oss <<
":" << strtok(NULL,
"");
234 uint32_t *label, uint32_t *l3_label) {
240 size_t nlri_size = proto_prefix.
prefix.size();
242 switch (prefix->
type_) {
244 size_t expected_min_nlri_size =
246 if (nlri_size < expected_min_nlri_size)
248 size_t rd_offset = 0;
250 size_t esi_offset = rd_offset +
kRdSize;
252 size_t tag_offset = esi_offset +
kEsiSize;
254 size_t label_offset = tag_offset +
kTagSize;
255 *label =
ReadLabel(proto_prefix, attr, label_offset, prefix->
tag_);
259 size_t expected_min_nlri_size =
261 if (nlri_size < expected_min_nlri_size)
263 size_t rd_offset = 0;
265 size_t esi_offset = rd_offset +
kRdSize;
270 size_t tag_offset = esi_offset +
kEsiSize;
272 size_t mac_len_offset = tag_offset +
kTagSize;
273 size_t mac_len = proto_prefix.
prefix[mac_len_offset];
276 size_t mac_offset = mac_len_offset + 1;
278 size_t ip_len_offset = mac_offset +
kMacSize;
279 size_t ip_len = proto_prefix.
prefix[ip_len_offset];
280 if (ip_len != 0 && ip_len != 32 && ip_len != 128)
282 size_t ip_size = ip_len / 8;
283 if (nlri_size < expected_min_nlri_size + ip_size)
285 size_t ip_offset = ip_len_offset + 1;
286 prefix->
ReadIpAddress(proto_prefix, ip_offset, ip_size, ip_size);
287 size_t label_offset = ip_offset + ip_size;
288 *label =
ReadLabel(proto_prefix, attr, label_offset, prefix->
tag_);
289 size_t l3_label_offset = label_offset +
kLabelSize;
290 if (l3_label && nlri_size >= l3_label_offset + kLabelSize) {
291 *l3_label =
ReadLabel(proto_prefix, attr, l3_label_offset);
298 size_t rd_offset = 0;
300 size_t tag_offset = rd_offset +
kRdSize;
302 size_t ip_len_offset = tag_offset +
kTagSize;
303 size_t ip_len = proto_prefix.
prefix[ip_len_offset];
304 if (ip_len != 32 && ip_len != 128)
306 size_t ip_size = ip_len / 8;
309 size_t ip_offset = ip_len_offset + 1;
310 prefix->
ReadIpAddress(proto_prefix, ip_offset, ip_size, ip_size);
319 *label = prefix->
tag_;
321 *label = pmsi_tunnel->
GetLabel(extcomm);
324 *label = pmsi_tunnel->
GetLabel(extcomm);
332 size_t rd_offset = 0;
334 size_t esi_offset = rd_offset +
kRdSize;
336 size_t ip_len_offset = esi_offset +
kEsiSize;
337 size_t ip_len = proto_prefix.
prefix[ip_len_offset];
338 if (ip_len != 32 && ip_len != 128)
340 size_t ip_size = ip_len / 8;
343 size_t ip_offset = ip_len_offset + 1;
344 prefix->
ReadIpAddress(proto_prefix, ip_offset, ip_size, ip_size);
369 size_t rd_offset = 0;
371 size_t esi_offset = rd_offset +
kRdSize;
375 size_t tag_offset = esi_offset +
kEsiSize;
378 size_t ip_plen_offset = tag_offset +
kTagSize;
384 size_t ip_offset = ip_plen_offset + 1;
386 prefix->
ReadIpAddress(proto_prefix, ip_offset, ip_size, ip_psize);
387 size_t gw_offset = ip_offset + ip_size;
389 if (!gw_address.is_unspecified())
391 size_t label_offset = gw_offset + ip_size;
392 *label =
ReadLabel(proto_prefix, attr, label_offset);
398 size_t rd_offset = 0;
400 size_t tag_offset = rd_offset +
kRdSize;
402 size_t src_len_offset = tag_offset +
kTagSize;
403 size_t src_len = proto_prefix.
prefix[src_len_offset];
404 if (src_len != 32 && src_len != 128 && src_len != 0)
406 size_t src_size = src_len / 8;
407 size_t src_offset = src_len_offset + 1;
409 if (nlri_size < src_offset + src_size)
411 prefix->
ReadSource(proto_prefix, src_offset, src_size);
413 size_t grp_len_offset = src_offset + src_size;
414 size_t grp_len = proto_prefix.
prefix[grp_len_offset];
415 if (grp_len != 32 && grp_len != 128)
417 size_t grp_size = grp_len / 8;
418 size_t grp_offset = grp_len_offset + 1;
419 if (nlri_size < grp_offset + grp_size)
421 prefix->
ReadGroup(proto_prefix, grp_offset, grp_size);
422 size_t ip_len_offset = grp_offset + grp_size;
423 size_t ip_len = proto_prefix.
prefix[ip_len_offset];
424 if (ip_len != 32 && ip_len != 128)
426 size_t ip_size = ip_len / 8;
427 size_t ip_offset = ip_len_offset + 1;
428 if (nlri_size < ip_offset + ip_size)
430 prefix->
ReadIpAddress(proto_prefix, ip_offset, ip_size, ip_size);
431 size_t flag_offset = ip_offset + ip_size;
432 if (nlri_size <= flag_offset + 4)
452 const BgpAttr *attr, uint32_t label, uint32_t l3_label)
const {
454 proto_prefix->
prefix.clear();
460 proto_prefix->
prefix.resize(nlri_size, 0);
462 size_t rd_offset = 0;
464 proto_prefix->
prefix.begin() + rd_offset);
465 size_t esi_offset = rd_offset +
kRdSize;
467 proto_prefix->
prefix.begin() + esi_offset);
468 size_t tag_offset = esi_offset +
kEsiSize;
470 size_t label_offset = tag_offset +
kTagSize;
471 WriteLabel(proto_prefix, attr, label_offset, label);
480 proto_prefix->
prefix.resize(nlri_size, 0);
482 size_t rd_offset = 0;
484 proto_prefix->
prefix.begin() + rd_offset);
485 size_t esi_offset = rd_offset +
kRdSize;
488 proto_prefix->
prefix.begin() + esi_offset);
490 size_t tag_offset = esi_offset +
kEsiSize;
492 size_t mac_len_offset = tag_offset +
kTagSize;
493 proto_prefix->
prefix[mac_len_offset] = 48;
494 size_t mac_offset = mac_len_offset + 1;
496 proto_prefix->
prefix.begin() + mac_offset);
497 size_t ip_len_offset = mac_offset +
kMacSize;
498 proto_prefix->
prefix[ip_len_offset] = ip_size * 8;
499 size_t ip_offset = ip_len_offset + 1;
501 size_t label_offset = ip_offset + ip_size;
502 WriteLabel(proto_prefix, attr, label_offset, label);
504 size_t l3_label_offset = label_offset +
kLabelSize;
505 WriteLabel(proto_prefix, attr, l3_label_offset, l3_label);
513 proto_prefix->
prefix.resize(nlri_size, 0);
515 size_t rd_offset = 0;
517 proto_prefix->
prefix.begin() + rd_offset);
518 size_t tag_offset = rd_offset +
kRdSize;
520 size_t ip_len_offset = tag_offset +
kTagSize;
521 proto_prefix->
prefix[ip_len_offset] = ip_size * 8;
522 size_t ip_offset = ip_len_offset + 1;
530 proto_prefix->
prefix.resize(nlri_size, 0);
532 size_t rd_offset = 0;
534 proto_prefix->
prefix.begin() + rd_offset);
535 size_t esi_offset = rd_offset +
kRdSize;
537 proto_prefix->
prefix.begin() + esi_offset);
538 size_t ip_len_offset = esi_offset +
kEsiSize;
539 proto_prefix->
prefix[ip_len_offset] = ip_size * 8;
540 size_t ip_offset = ip_len_offset + 1;
545 size_t ip_size, nlri_size;
554 proto_prefix->
prefix.resize(nlri_size, 0);
556 size_t rd_offset = 0;
558 proto_prefix->
prefix.begin() + rd_offset);
559 size_t esi_offset = rd_offset +
kRdSize;
562 proto_prefix->
prefix.begin() + esi_offset);
564 size_t tag_offset = esi_offset +
kEsiSize;
567 size_t ip_plen_offset = tag_offset +
kTagSize;
569 size_t ip_offset = ip_plen_offset + 1;
571 size_t gw_offset = ip_offset + ip_size;
572 size_t label_offset = gw_offset + ip_size;
573 WriteLabel(proto_prefix, attr, label_offset, label);
580 nlri_size += ip_size;
582 proto_prefix->
prefix.resize(nlri_size, 0);
584 size_t rd_offset = 0;
586 proto_prefix->
prefix.begin() + rd_offset);
587 size_t tag_offset = rd_offset +
kRdSize;
589 size_t src_len_offset = tag_offset +
kTagSize;
590 size_t grp_len_offset = src_len_offset + 1;
591 if (
source_.is_unspecified()) {
592 proto_prefix->
prefix[src_len_offset] = 0;
594 proto_prefix->
prefix[src_len_offset] = ip_size * 8;
595 size_t src_offset = src_len_offset + 1;
597 grp_len_offset += ip_size;
599 proto_prefix->
prefix[grp_len_offset] = ip_size * 8;
600 size_t grp_offset = grp_len_offset + 1;
602 size_t ip_len_offset = grp_offset + ip_size;
603 proto_prefix->
prefix[ip_len_offset] = ip_size * 8;
604 size_t ip_offset = ip_len_offset + 1;
606 size_t flag_offset = ip_offset + ip_size;
678 size_t pos1,
size_t *pos2, boost::system::error_code *errorp) {
679 *pos2 = str.find(
'-', pos1 + 1);
680 if (*pos2 == string::npos) {
681 if (errorp != NULL) {
682 *errorp = make_error_code(boost::system::errc::invalid_argument);
686 string temp_str = str.substr(pos1 + 1, *pos2 - pos1 - 1);
687 boost::system::error_code source_err;
688 prefix->
source_ = Ip4Address::from_string(temp_str, source_err);
689 if (source_err.failed()) {
690 if (errorp != NULL) {
691 *errorp = source_err;
699 size_t pos1,
size_t *pos2, boost::system::error_code *errorp) {
700 *pos2 = str.find(
'-', pos1 + 1);
701 if (*pos2 == string::npos) {
702 if (errorp != NULL) {
703 *errorp = make_error_code(boost::system::errc::invalid_argument);
707 string temp_str = str.substr(pos1 + 1, *pos2 - pos1 - 1);
708 boost::system::error_code group_err;
709 prefix->
group_ = Ip4Address::from_string(temp_str, group_err);
710 if (group_err.failed()) {
711 if (errorp != NULL) {
720 boost::system::error_code *errorp) {
724 size_t pos1 = str.find(
'-');
725 if (pos1 == string::npos) {
726 if (errorp != NULL) {
727 *errorp = make_error_code(boost::system::errc::invalid_argument);
732 string type_str = str.substr(0, pos1);
735 if (errorp != NULL) {
736 *errorp = make_error_code(boost::system::errc::invalid_argument);
743 if (errorp != NULL) {
744 *errorp = make_error_code(boost::system::errc::invalid_argument);
750 size_t pos2 = str.find(
'-', pos1 + 1);
751 if (pos2 == string::npos) {
752 if (errorp != NULL) {
753 *errorp = make_error_code(boost::system::errc::invalid_argument);
757 string rd_str = str.substr(pos1 + 1, pos2 - pos1 - 1);
758 boost::system::error_code rd_err;
760 if (rd_err.failed()) {
761 if (errorp != NULL) {
767 switch (prefix.
type_) {
770 size_t pos3 = str.find(
'-', pos2 + 1);
771 if (pos3 == string::npos) {
772 if (errorp != NULL) {
774 make_error_code(boost::system::errc::invalid_argument);
778 string esi_str = str.substr(pos2 + 1, pos3 - pos2 - 1);
779 boost::system::error_code esi_err;
781 if (esi_err.failed()) {
782 if (errorp != NULL) {
789 string tag_str = str.substr(pos3 + 1, string::npos);
792 if (errorp != NULL) {
794 make_error_code(boost::system::errc::invalid_argument);
804 size_t pos3 = str.find(
'-', pos2 + 1);
805 if (pos3 == string::npos) {
806 if (errorp != NULL) {
808 make_error_code(boost::system::errc::invalid_argument);
812 string tag_str = str.substr(pos2 + 1, pos3 - pos2 - 1);
815 if (errorp != NULL) {
817 make_error_code(boost::system::errc::invalid_argument);
823 size_t pos4 = str.rfind(
',');
824 string mac_str = str.substr(pos3 + 1, pos4 - pos3 -1);
825 boost::system::error_code mac_err;
827 if (mac_err.failed()) {
828 if (errorp != NULL) {
835 string ip_str = str.substr(pos4 + 1, string::npos);
836 boost::system::error_code ip_err;
837 prefix.
ip_address_ = IpAddress::from_string(ip_str, ip_err);
838 if (ip_err.failed()) {
839 if (errorp != NULL) {
854 size_t pos3 = str.find(
'-', pos2 + 1);
855 if (pos3 == string::npos) {
856 if (errorp != NULL) {
858 make_error_code(boost::system::errc::invalid_argument);
862 string tag_str = str.substr(pos2 + 1, pos3 - pos2 - 1);
865 if (errorp != NULL) {
867 make_error_code(boost::system::errc::invalid_argument);
873 string ip_str = str.substr(pos3 + 1, string::npos);
874 boost::system::error_code ip_err;
875 prefix.
ip_address_ = IpAddress::from_string(ip_str, ip_err);
876 if (ip_err.failed()) {
877 if (errorp != NULL) {
890 size_t pos3 = str.find(
'-', pos2 + 1);
891 if (pos3 == string::npos) {
892 if (errorp != NULL) {
894 make_error_code(boost::system::errc::invalid_argument);
898 string esi_str = str.substr(pos2 + 1, pos3 - pos2 - 1);
899 boost::system::error_code esi_err;
901 if (esi_err.failed()) {
902 if (errorp != NULL) {
909 string ip_str = str.substr(pos3 + 1, string::npos);
910 boost::system::error_code ip_err;
911 prefix.
ip_address_ = IpAddress::from_string(ip_str, ip_err);
912 if (ip_err.failed()) {
913 if (errorp != NULL) {
926 size_t pos3 = str.find(
'-', pos2 + 1);
927 if (pos3 == string::npos) {
928 if (errorp != NULL) {
930 make_error_code(boost::system::errc::invalid_argument);
934 string tag_str = str.substr(pos2 + 1, pos3 - pos2 - 1);
937 if (errorp != NULL) {
939 make_error_code(boost::system::errc::invalid_argument);
945 string ip_str = str.substr(pos3 + 1, string::npos);
946 boost::system::error_code ip_err;
964 if (errorp != NULL) {
965 *errorp = make_error_code(boost::system::errc::invalid_argument);
973 size_t pos3 = str.find(
'-', pos2 + 1);
974 if (pos3 == string::npos) {
975 if (errorp != NULL) {
977 make_error_code(boost::system::errc::invalid_argument);
981 string tag_str = str.substr(pos2 + 1, pos3 - pos2 - 1);
984 if (errorp != NULL) {
986 make_error_code(boost::system::errc::invalid_argument);
1002 string ip_str = str.substr(pos5 + 1, string::npos);
1003 boost::system::error_code ip_err;
1004 prefix.
ip_address_ = IpAddress::from_string(ip_str, ip_err);
1005 if (ip_err.failed()) {
1006 if (errorp != NULL) {
1053 if (!
source_.is_unspecified())
1054 str +=
"-" +
source_.to_string();
1055 str +=
"-" +
group_.to_string();
1072 if (!
group_.is_unspecified()) {
1073 str +=
"," +
group_.to_string() +
"," +
1098 size_t ip_offset,
size_t ip_size) {
1103 Ip4Address::bytes_type bytes = { { 0 } };
1104 copy(proto_prefix.
prefix.begin() + ip_offset,
1105 proto_prefix.
prefix.begin() + ip_offset + ip_size, bytes.begin());
1109 Ip6Address::bytes_type bytes = { { 0 } };
1110 copy(proto_prefix.
prefix.begin() + ip_offset,
1111 proto_prefix.
prefix.begin() + ip_offset + ip_size, bytes.begin());
1117 size_t ip_offset,
size_t ip_size) {
1122 Ip4Address::bytes_type bytes = { { 0 } };
1123 copy(proto_prefix.
prefix.begin() + ip_offset,
1124 proto_prefix.
prefix.begin() + ip_offset + ip_size, bytes.begin());
1128 Ip6Address::bytes_type bytes = { { 0 } };
1129 copy(proto_prefix.
prefix.begin() + ip_offset,
1130 proto_prefix.
prefix.begin() + ip_offset + ip_size, bytes.begin());
1136 size_t ip_offset,
size_t ip_size,
size_t ip_psize) {
1137 assert(ip_psize <= ip_size);
1142 Ip4Address::bytes_type bytes = { { 0 } };
1143 copy(proto_prefix.
prefix.begin() + ip_offset,
1144 proto_prefix.
prefix.begin() + ip_offset + ip_psize, bytes.begin());
1148 Ip6Address::bytes_type bytes = { { 0 } };
1149 copy(proto_prefix.
prefix.begin() + ip_offset,
1150 proto_prefix.
prefix.begin() + ip_offset + ip_psize, bytes.begin());
1156 size_t ip_offset)
const {
1158 const Ip4Address::bytes_type &bytes =
ip_address_.to_v4().to_bytes();
1160 proto_prefix->
prefix.begin() + ip_offset);
1162 const Ip6Address::bytes_type &bytes =
ip_address_.to_v6().to_bytes();
1164 proto_prefix->
prefix.begin() + ip_offset);
1169 size_t ip_offset)
const {
1171 const Ip4Address::bytes_type &bytes =
source_.to_v4().to_bytes();
1173 proto_prefix->
prefix.begin() + ip_offset);
1175 const Ip6Address::bytes_type &bytes =
source_.to_v6().to_bytes();
1177 proto_prefix->
prefix.begin() + ip_offset);
1182 size_t ip_offset)
const {
1184 const Ip4Address::bytes_type &bytes =
group_.to_v4().to_bytes();
1186 proto_prefix->
prefix.begin() + ip_offset);
1188 const Ip6Address::bytes_type &bytes =
group_.to_v6().to_bytes();
1190 proto_prefix->
prefix.begin() + ip_offset);
1274 const BgpAttr *attr, uint32_t label, uint32_t l3_label)
const {
1281 const Ip4Address::bytes_type &addr_bytes = nexthop.to_v4().to_bytes();
1282 copy(addr_bytes.begin(), addr_bytes.end(), nh.begin());
EvpnRoute(const EvpnPrefix &prefix)
static const size_t kLabelSize
const BgpPath * BestPath() const
virtual KeyPtr GetDBRequestKey() const
void WriteGroup(BgpProtoPrefix *proto_prefix, size_t ip_offset) const
void WriteLabel(size_t label_offset, uint32_t label, bool is_vni=false)
virtual int CompareTo(const Route &rhs) const
static const size_t kMacSize
#define KEY_COMPARE(x, y)
boost::asio::ip::address IpAddress
bool stringToInteger(const std::string &str, NumberType &num)
static RouteDistinguisher FromString(const std::string &str, boost::system::error_code *error=NULL)
static const size_t kIp6AddrSize
void WriteIpAddress(BgpProtoPrefix *proto_prefix, size_t ip_offset) const
static IpAddress ReadGwAddress(const BgpProtoPrefix &proto_prefix, size_t gw_offset, size_t ip_size)
uint32_t ReadLabel(size_t label_offset, bool is_vni=false) const
static const uint32_t kInvalidLabel
const uint8_t tunnel_type() const
std::string ToXmppIdString() const
void WriteSource(BgpProtoPrefix *proto_prefix, size_t ip_offset) const
static const EvpnPrefix kNullPrefix
static const size_t kMinInclusiveMulticastRouteSize
void BuildProtoPrefix(BgpProtoPrefix *proto_prefix, const BgpAttr *attr, uint32_t label, uint32_t l3_label=0) const
static const size_t kMinSegmentRouteSize
std::unique_ptr< DBRequestKey > KeyPtr
static uint64_t get_value(const uint8_t *data, int size)
static const size_t kMinInet6PrefixRouteSize
static const size_t kMinInetPrefixRouteSize
std::string ToString() const
static const size_t kMinMacAdvertisementRouteSize
static EthernetSegmentId FromString(const std::string &str, boost::system::error_code *errorp=NULL)
static const uint32_t kMaxVni
static const size_t kSize
boost::intrusive_ptr< const BgpAttr > BgpAttrPtr
virtual void BuildProtoPrefix(BgpProtoPrefix *proto_prefix, const BgpAttr *attr=NULL, uint32_t label=0, uint32_t l3_label=0) const
void ReadSource(const BgpProtoPrefix &proto_prefix, size_t ip_offset, size_t ip_size)
const uint8_t tunnel_flags() const
static bool GetGroupFromString(EvpnPrefix *prefix, const std::string &str, size_t pos1, size_t *pos2, boost::system::error_code *errorp)
static Inet6Prefix FromString(const std::string &str, boost::system::error_code *errorp=NULL)
BgpAttrPtr ReplaceEsiAndLocate(const BgpAttr *attr, const EthernetSegmentId &esi)
static const std::string integerToString(const NumberType &num)
static const size_t kIp4AddrSize
Inet6Prefix inet6_prefix() const
static const size_t kMinAutoDiscoveryRouteSize
static const size_t kLabelSize
static const size_t kRdSize
std::vector< uint8_t > prefix
static void WriteLabel(BgpProtoPrefix *proto_prefix, const BgpAttr *attr, size_t offset, uint32_t label)
const EthernetSegmentId & esi() const
boost::asio::ip::address_v6 Ip6Address
static const uint32_t kMaxTag
std::string ToString() const
static Ip4Prefix FromString(const std::string &str, boost::system::error_code *errorp=NULL)
Ip4Prefix inet_prefix() const
static const size_t kMinSelectiveMulticastRouteSize
virtual std::string ToXmppIdString() const
void ReadGroup(const BgpProtoPrefix &proto_prefix, size_t ip_offset, size_t ip_size)
static const size_t kTagSize
uint8_t ip_address_length() const
int CompareTo(const EvpnPrefix &rhs) const
std::string ToString() const
std::string ToString() const
static const int32_t kMaxVniSigned
virtual void BuildBgpProtoNextHop(std::vector< uint8_t > &nh, IpAddress nexthop) const
static const size_t kEsiSize
boost::asio::ip::address_v4 Ip4Address
void ReadIpAddress(const BgpProtoPrefix &proto_prefix, size_t ip_offset, size_t ip_size, size_t ip_psize)
const EvpnPrefix & GetPrefix() const
static EvpnPrefix FromString(const std::string &str, boost::system::error_code *errorp=NULL)
const ExtCommunity * ext_community() const
const EthernetSegmentId & esi() const
static uint32_t ReadLabel(const BgpProtoPrefix &proto_prefix, const BgpAttr *attr, size_t offset, uint32_t tag=EvpnPrefix::kNullTag)
const BgpAttr * GetAttr() const
bool IsMoreSpecific(const Ip4Prefix &rhs) const
std::string ToString() const
std::string ToString() const
const uint8_t * GetData() const
size_t GetIpAddressSize() const
bool IsMoreSpecific(const EvpnPrefix &rhs) const
virtual void SetKey(const DBRequestKey *reqkey)
const uint8_t * GetData() const
const PmsiTunnel * pmsi_tunnel() const
static MacAddress FromString(const std::string &str, boost::system::error_code *error=NULL)
static bool GetSourceFromString(EvpnPrefix *prefix, const std::string &str, size_t pos1, size_t *pos2, boost::system::error_code *errorp)
static int FromProtoPrefix(BgpServer *server, const BgpProtoPrefix &proto_prefix, const BgpAttr *attr, const Address::Family family, EvpnPrefix *evpn_prefix, BgpAttrPtr *new_attr, uint32_t *label, uint32_t *l3_label=NULL)
static const uint32_t kNullTag
virtual bool IsValid() const
bool IsMoreSpecific(const Inet6Prefix &rhs) const
const uint8_t * GetData() const
uint32_t GetLabel(const ExtCommunity *ext) const
virtual bool IsValid() const
static void put_value(uint8_t *data, int size, uint64_t value)
virtual std::string ToString() const