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 2101914 : BgpProtoPrefix::BgpProtoPrefix() : prefixlen(0), type(0) { 12 2101904 : } 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 135412 : uint32_t BgpProtoPrefix::ReadLabel(size_t label_offset, bool is_vni) const { 19 135412 : assert((label_offset + kLabelSize) <= prefix.size()); 20 135412 : if (is_vni) 21 133 : return get_value(&prefix[label_offset], kLabelSize); 22 135279 : uint32_t label = (prefix[label_offset] << 16 | 23 135279 : prefix[label_offset + 1] << 8 | 24 135279 : prefix[label_offset + 2]) >> 4; 25 135279 : 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 159869 : void BgpProtoPrefix::WriteLabel(size_t label_offset, uint32_t label, 33 : bool is_vni) { 34 159869 : assert((label_offset + kLabelSize) <= prefix.size()); 35 159870 : if (is_vni) { 36 165 : put_value(&prefix[label_offset], kLabelSize, label); 37 165 : return; 38 : } 39 159705 : uint32_t tmp = (label << 4 | 0x1); 40 638781 : for (size_t idx = 0; idx < kLabelSize; ++idx) { 41 479080 : int offset = (kLabelSize - (idx + 1)) * 8; 42 479080 : prefix[label_offset + idx] = ((tmp >> offset) & 0xff); 43 : } 44 : } 45 : 46 366060 : int BgpAttribute::CompareTo(const BgpAttribute &rhs) const { 47 366060 : KEY_COMPARE(code, rhs.code); 48 366060 : KEY_COMPARE(subcode, rhs.subcode); 49 366060 : KEY_COMPARE(flags & ~ExtendedLength, rhs.flags & ~ExtendedLength); 50 366060 : return 0; 51 : } 52 : 53 743549 : size_t BgpAttribute::EncodeLength() const { 54 743549 : return 0; 55 : } 56 : 57 1979453 : uint8_t BgpAttribute::GetEncodeFlags() const { 58 1979453 : uint8_t value = flags; 59 1979453 : if (EncodeLength() >= sizeof(uint8_t) << 8) { 60 69902 : value |= BgpAttribute::ExtendedLength; 61 : } 62 1979922 : return value; 63 : } 64 : 65 157849 : std::string BgpAttribute::ToString() const { 66 : char repr[80]; 67 157849 : snprintf(repr, sizeof(repr), "<code: %d, flags: %02x>", code, flags); 68 157849 : return std::string(repr); 69 : }