LCOV - code coverage report
Current view: top level - bgp/rtarget - rtarget_prefix.cc (source / functions) Hit Total Coverage
Test: OpenSDN C/C++ coverage (all TARGET_SET jobs) Lines: 67 67 100.0 %
Date: 2026-09-28 02:13:17 Functions: 7 7 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
       3             :  */
       4             : 
       5             : #include "bgp/rtarget/rtarget_prefix.h"
       6             : 
       7             : #include <algorithm>
       8             : #include "base/string_util.h"
       9             : 
      10             : using boost::system::error_code;
      11             : using std::copy;
      12             : using std::string;
      13             : 
      14             : const string RTargetPrefix::kDefaultPrefixString = "0:target:0:0";
      15             : 
      16       44176 : RTargetPrefix::RTargetPrefix() : as_(0), rtarget_(RouteTarget::null_rtarget) {
      17       44176 : }
      18             : 
      19       38579 : int RTargetPrefix::FromProtoPrefix(const BgpProtoPrefix &proto_prefix,
      20             :                                    RTargetPrefix *prefix) {
      21       38579 :     size_t nlri_size = proto_prefix.prefix.size();
      22       38580 :     if (nlri_size == 0) {
      23          17 :         prefix->as_ = 0;
      24          17 :         prefix->rtarget_ =  RouteTarget::null_rtarget;
      25          17 :         return 0;
      26             :     }
      27             : 
      28       38563 :     size_t expected_nlri_size = sizeof(as_t) + RouteTarget::kSize;
      29       38563 :     if (nlri_size != expected_nlri_size)
      30           4 :         return -1;
      31             : 
      32       38559 :     size_t as_offset = 0;
      33       38559 :     prefix->as_ = get_value(&proto_prefix.prefix[as_offset], sizeof(as_t));
      34       38556 :     size_t rtarget_offset = as_offset + sizeof(as_t);
      35       38556 :     RouteTarget::bytes_type bt = { { 0 } };
      36       38556 :     copy(proto_prefix.prefix.begin() + rtarget_offset,
      37             :         proto_prefix.prefix.end(), bt.begin());
      38       38542 :     prefix->rtarget_ = RouteTarget(bt);
      39             : 
      40       38545 :     return 0;
      41             : }
      42             : 
      43       38573 : int RTargetPrefix::FromProtoPrefix(BgpServer *server,
      44             :                                    const BgpProtoPrefix &proto_prefix,
      45             :                                    const BgpAttr *attr,
      46             :                                    const Address::Family family,
      47             :                                    RTargetPrefix *prefix,
      48             :                                    BgpAttrPtr *new_attr, uint32_t *label,
      49             :                                    uint32_t *l3_label) {
      50       38573 :     return FromProtoPrefix(proto_prefix, prefix);
      51             : }
      52             : 
      53       38189 : void RTargetPrefix::BuildProtoPrefix(BgpProtoPrefix *proto_prefix) const {
      54       38189 :     proto_prefix->prefix.clear();
      55       38189 :     if (as_ == 0 && rtarget_ == RouteTarget::null_rtarget) {
      56           9 :         proto_prefix->prefixlen = 0;
      57           9 :         return;
      58             :     }
      59             : 
      60       38180 :     size_t nlri_size = sizeof(as_t) + RouteTarget::kSize;
      61       38180 :     proto_prefix->prefix.resize(nlri_size);
      62       38180 :     proto_prefix->prefixlen = nlri_size * 8;
      63       38180 :     size_t as_offset = 0;
      64       38180 :     put_value(&proto_prefix->prefix[as_offset], sizeof(as_t), as_);
      65       38180 :     size_t rtarget_offset = as_offset + sizeof(as_t);
      66       38180 :     put_value(&proto_prefix->prefix[rtarget_offset], RouteTarget::kSize,
      67             :         rtarget_.GetExtCommunityValue());
      68             : }
      69             : 
      70             : // as:rtarget
      71        5498 : RTargetPrefix RTargetPrefix::FromString(const string &str, error_code *errorp) {
      72        5498 :     RTargetPrefix prefix;
      73             : 
      74        5498 :     if (str == kDefaultPrefixString)
      75         101 :         return RTargetPrefix();
      76             : 
      77        5397 :     size_t pos = str.find(':');
      78        5397 :     if (pos == string::npos) {
      79           1 :         if (errorp != NULL)
      80           1 :             *errorp = make_error_code(boost::system::errc::invalid_argument);
      81           1 :         return prefix;
      82             :     }
      83             : 
      84             :     as_t as;
      85        5396 :     string asstr = str.substr(0, pos);
      86        5396 :     stringToInteger(asstr, as);
      87             : 
      88        5396 :     string rtargetstr(str, pos + 1);
      89        5396 :     error_code rtarget_err;
      90        5396 :     RouteTarget rtarget;
      91        5396 :     rtarget = RouteTarget::FromString(rtargetstr, &rtarget_err);
      92        5396 :     if (rtarget_err.failed()) {
      93           3 :         if (errorp != NULL)
      94           1 :             *errorp = rtarget_err;
      95           3 :         return prefix;
      96             :     }
      97             : 
      98        5393 :     prefix.rtarget_ = rtarget;
      99        5393 :     prefix.as_ = as;
     100        5393 :     return prefix;
     101        5396 : }
     102             : 
     103       26503 : string RTargetPrefix::ToString() const {
     104       53006 :     return (integerToString(as_) + ":" + rtarget_.ToString());
     105             : }
     106             : 
     107     1634896 : int RTargetPrefix::CompareTo(const RTargetPrefix &rhs) const {
     108     1634896 :     if (as_ < rhs.as_) {
     109      171007 :         return -1;
     110             :     }
     111     1463889 :     if (as_ > rhs.as_) {
     112      135708 :         return 1;
     113             :     }
     114     1328181 :     if (rtarget_ < rhs.rtarget_) {
     115      596501 :         return -1;
     116             :     }
     117      731680 :     if (rtarget_ > rhs.rtarget_) {
     118      411768 :         return 1;
     119             :     }
     120      319912 :     return 0;
     121             : }
     122             : 

Generated by: LCOV version 1.14