Line data Source code
1 : /* 2 : * Copyright (c) 2014 Juniper Networks, Inc. All rights reserved. 3 : */ 4 : 5 : #include "bgp/bgp_attr_base.h" 6 : 7 : #include <cstdio> 8 : 9 : const size_t BgpProtoPrefix::kLabelSize = 3; 10 : 11 2100719 : BgpProtoPrefix::BgpProtoPrefix() : prefixlen(0), type(0) { 12 2100698 : } 13 : 14 : // 15 : // Extract the label from the BgpProtorefix. 16 : // EVPN extensions for VXLAN use the label to convey a 24-bit VNI. 17 : // 18 135229 : uint32_t BgpProtoPrefix::ReadLabel(size_t label_offset, bool is_vni) const { 19 135229 : assert((label_offset + kLabelSize) <= prefix.size()); 20 135229 : if (is_vni) 21 133 : return get_value(&prefix[label_offset], kLabelSize); 22 135096 : uint32_t label = (prefix[label_offset] << 16 | 23 135096 : prefix[label_offset + 1] << 8 | 24 135096 : prefix[label_offset + 2]) >> 4; 25 135096 : return label; 26 : } 27 : 28 : // 29 : // Write the label to the BgpProtorefix. 30 : // EVPN extensions for VXLAN use the label to convey a 24-bit VNI. 31 : // 32 159236 : void BgpProtoPrefix::WriteLabel(size_t label_offset, uint32_t label, 33 : bool is_vni) { 34 159236 : assert((label_offset + kLabelSize) <= prefix.size()); 35 159238 : if (is_vni) { 36 165 : put_value(&prefix[label_offset], kLabelSize, label); 37 165 : return; 38 : } 39 159073 : uint32_t tmp = (label << 4 | 0x1); 40 636258 : for (size_t idx = 0; idx < kLabelSize; ++idx) { 41 477187 : int offset = (kLabelSize - (idx + 1)) * 8; 42 477187 : prefix[label_offset + idx] = ((tmp >> offset) & 0xff); 43 : } 44 : } 45 : 46 269975 : int BgpAttribute::CompareTo(const BgpAttribute &rhs) const { 47 269975 : KEY_COMPARE(code, rhs.code); 48 269975 : KEY_COMPARE(subcode, rhs.subcode); 49 269975 : KEY_COMPARE(flags & ~ExtendedLength, rhs.flags & ~ExtendedLength); 50 269975 : return 0; 51 : } 52 : 53 743398 : size_t BgpAttribute::EncodeLength() const { 54 743398 : return 0; 55 : } 56 : 57 1973695 : uint8_t BgpAttribute::GetEncodeFlags() const { 58 1973695 : uint8_t value = flags; 59 1973695 : if (EncodeLength() >= sizeof(uint8_t) << 8) { 60 68894 : value |= BgpAttribute::ExtendedLength; 61 : } 62 1973716 : return value; 63 : } 64 : 65 157716 : std::string BgpAttribute::ToString() const { 66 : char repr[80]; 67 157716 : snprintf(repr, sizeof(repr), "<code: %d, flags: %02x>", code, flags); 68 157716 : return std::string(repr); 69 : }