Line data Source code
1 : /* 2 : * Copyright (c) 2015 Juniper Networks, Inc. All rights reserved. 3 : */ 4 : 5 : #ifndef SRC_BGP_ROUTING_POLICY_ROUTING_POLICY_ACTION_H_ 6 : #define SRC_BGP_ROUTING_POLICY_ROUTING_POLICY_ACTION_H_ 7 : 8 : #include <stdint.h> 9 : #include <string> 10 : #include <typeinfo> 11 : #include <vector> 12 : #include "bgp/community.h" 13 : #include "net/community_type.h" 14 : 15 : class BgpAttr; 16 : 17 : class RoutingPolicyAction { 18 : public: 19 1017 : virtual ~RoutingPolicyAction() {} 20 : // Whether the action is terminal (Accept/Reject) 21 : virtual bool terminal() const = 0; 22 : virtual bool accept() const = 0; 23 : virtual std::string ToString() const = 0; 24 431 : virtual bool operator==(const RoutingPolicyAction &action) const { 25 431 : if (typeid(*this) == typeid(action)) 26 430 : return IsEqual(action); 27 1 : return false; 28 : } 29 431 : virtual bool operator!=(const RoutingPolicyAction &action) const { 30 431 : return !operator==(action); 31 : } 32 : virtual bool IsEqual(const RoutingPolicyAction &action) const = 0; 33 : }; 34 : 35 : class RoutingPolicyUpdateAction : public RoutingPolicyAction { 36 : public: 37 540 : virtual ~RoutingPolicyUpdateAction() {} 38 0 : bool terminal() const { return false; } 39 0 : bool accept() const { return true; } 40 : virtual void operator()(BgpAttr *out_attr) const = 0; 41 : }; 42 : 43 : class RoutingPolicyAcceptAction : public RoutingPolicyAction { 44 : public: 45 482 : virtual ~RoutingPolicyAcceptAction() {} 46 844 : bool terminal() const { return true; } 47 262 : bool accept() const { return true; } 48 10 : std::string ToString() const { 49 10 : return "accept"; 50 : } 51 132 : virtual bool IsEqual(const RoutingPolicyAction &action) const { 52 132 : return true; 53 : } 54 : }; 55 : 56 : class RoutingPolicyRejectAction : public RoutingPolicyAction { 57 : public: 58 268 : virtual ~RoutingPolicyRejectAction() {} 59 297 : bool terminal() const { return true; } 60 28 : bool accept() const { return false; } 61 9 : std::string ToString() const { 62 9 : return "reject"; 63 : } 64 74 : virtual bool IsEqual(const RoutingPolicyAction &action) const { 65 74 : return true; 66 : } 67 : }; 68 : 69 : class RoutingPolicyNexTermAction : public RoutingPolicyAction { 70 : public: 71 204 : virtual ~RoutingPolicyNexTermAction() {} 72 111 : bool terminal() const { return false; } 73 0 : bool accept() const { return false; } 74 4 : std::string ToString() const { 75 4 : return "next-term"; 76 : } 77 51 : virtual bool IsEqual(const RoutingPolicyAction &action) const { 78 51 : return true; 79 : } 80 : }; 81 : 82 : class UpdateAsPath : public RoutingPolicyUpdateAction { 83 : public: 84 : UpdateAsPath(const std::vector<uint32_t> &asn_list); 85 23 : virtual ~UpdateAsPath() {} 86 : 87 : virtual void operator()(BgpAttr *out_attr) const; 88 : std::string ToString() const; 89 : virtual bool IsEqual(const RoutingPolicyAction &as_path) const; 90 5 : const std::vector<uint32_t> &asn_list() const { return asn_list_; } 91 : 92 : private: 93 : std::vector<uint32_t> asn_list_; 94 : }; 95 : 96 : class UpdateCommunity : public RoutingPolicyUpdateAction { 97 : public: 98 : typedef std::vector<uint32_t> CommunityList; 99 : enum CommunityUpdateOp { 100 : ADD, 101 : REMOVE, 102 : SET 103 : }; 104 : UpdateCommunity(const std::vector<std::string> communities, std::string op); 105 311 : virtual ~UpdateCommunity() {} 106 : virtual void operator()(BgpAttr *out_attr) const; 107 : std::string ToString() const; 108 : virtual bool IsEqual(const RoutingPolicyAction &community) const; 109 134 : const CommunityList &communities() const { 110 134 : return communities_; 111 : } 112 : 113 : private: 114 : CommunityList communities_; 115 : CommunityUpdateOp op_; 116 : }; 117 : 118 : class UpdateExtCommunity : public RoutingPolicyUpdateAction { 119 : public: 120 : enum CommunityUpdateOp { 121 : ADD, 122 : REMOVE, 123 : SET 124 : }; 125 : UpdateExtCommunity(const std::vector<std::string> &communities, 126 : std::string op); 127 77 : virtual ~UpdateExtCommunity() {} 128 : virtual void operator()(BgpAttr *out_attr) const; 129 : std::string ToString() const; 130 : virtual bool IsEqual(const RoutingPolicyAction &community) const; 131 37 : const ExtCommunity::ExtCommunityList &communities() const { 132 37 : return communities_; 133 : } 134 : 135 : private: 136 : ExtCommunity::ExtCommunityList communities_; 137 : CommunityUpdateOp op_; 138 : }; 139 : 140 : class UpdateLocalPref : public RoutingPolicyUpdateAction { 141 : public: 142 : explicit UpdateLocalPref(uint32_t local_pref); 143 456 : virtual ~UpdateLocalPref() {} 144 : virtual void operator()(BgpAttr *out_attr) const; 145 : std::string ToString() const; 146 : virtual bool IsEqual(const RoutingPolicyAction &local_pref) const; 147 : 148 : private: 149 : uint32_t local_pref_; 150 : }; 151 : 152 : class UpdateMed : public RoutingPolicyUpdateAction { 153 : public: 154 : explicit UpdateMed(uint32_t med); 155 5 : virtual ~UpdateMed() {} 156 : virtual void operator()(BgpAttr *out_attr) const; 157 : std::string ToString() const; 158 : virtual bool IsEqual(const RoutingPolicyAction &med) const; 159 : 160 : private: 161 : uint32_t med_; 162 : }; 163 : 164 : #endif // SRC_BGP_ROUTING_POLICY_ROUTING_POLICY_ACTION_H_