Line data Source code
1 : /* 2 : * Copyright (c) 2017 Juniper Networks, Inc. All rights reserved. 3 : */ 4 : 5 : #include <base/string_util.h> 6 : #include <cmn/agent.h> 7 : #include <ksync/ksync_entry.h> 8 : #include <ksync/ksync_object.h> 9 : #include <ksync/ksync_netlink.h> 10 : #include <vrouter/ksync/ksync_init.h> 11 : #include <vrouter/ksync/bridge_route_audit_ksync.h> 12 : 13 0 : BridgeRouteAuditKSyncEntry::BridgeRouteAuditKSyncEntry 14 0 : (BridgeRouteAuditKSyncObject *obj, uint32_t vrf_id, const MacAddress &mac) 15 0 : : ksync_obj_(obj), vrf_id_(vrf_id), mac_(mac) { 16 0 : } 17 : 18 0 : BridgeRouteAuditKSyncEntry::BridgeRouteAuditKSyncEntry 19 0 : (BridgeRouteAuditKSyncObject* obj, const BridgeRouteAuditKSyncEntry *entry) 20 0 : : ksync_obj_(obj), vrf_id_(entry->vrf_id_), mac_(entry->mac_) { 21 0 : } 22 : 23 0 : BridgeRouteAuditKSyncEntry::~BridgeRouteAuditKSyncEntry() { 24 0 : } 25 : 26 0 : bool BridgeRouteAuditKSyncEntry::Sync() { 27 0 : return false; 28 : } 29 : 30 0 : KSyncEntry *BridgeRouteAuditKSyncEntry::UnresolvedReference() { 31 0 : return NULL; 32 : } 33 : 34 0 : std::string BridgeRouteAuditKSyncEntry::ToString() const { 35 0 : std::stringstream s; 36 : 37 : const VrfEntry* vrf = 38 0 : ksync_obj_->ksync()->agent()->vrf_table()->FindVrfFromId(vrf_id_); 39 0 : string vrf_info = vrf? vrf->GetName() : integerToString(vrf_id_); 40 0 : s << "Route Vrf : " << vrf_info << " Mac: " << mac_.ToString(); 41 0 : return s.str(); 42 0 : } 43 : 44 0 : bool BridgeRouteAuditKSyncEntry::IsLess(const KSyncEntry &rhs) const { 45 0 : const BridgeRouteAuditKSyncEntry &entry = static_cast 46 : <const BridgeRouteAuditKSyncEntry &>(rhs); 47 : 48 0 : if (vrf_id_ != entry.vrf_id_) { 49 0 : return vrf_id_ < entry.vrf_id_; 50 : } 51 : 52 0 : return mac_ < entry.mac_; 53 : } 54 : 55 0 : KSyncObject *BridgeRouteAuditKSyncEntry::GetObject() const { 56 0 : return ksync_obj_; 57 : } 58 : 59 0 : void BridgeRouteAuditKSyncEntry::FillObjectLog(sandesh_op::type type, 60 : KSyncRouteInfo &info) const { 61 0 : info.set_operation("DELETE"); 62 0 : info.set_plen(0); 63 0 : info.set_vrf(vrf_id_); 64 0 : info.set_mac(mac_.ToString()); 65 0 : info.set_type("BRIDGE"); 66 0 : } 67 : 68 0 : int BridgeRouteAuditKSyncEntry::AddMsg(char *buf, int buf_len) { 69 : /* No message has to be sent to vrouter. Add is taken care in 70 : * RouteKSyncEntry */ 71 0 : return 0; 72 : } 73 : 74 0 : int BridgeRouteAuditKSyncEntry::ChangeMsg(char *buf, int buf_len){ 75 : /* No message has to be sent to vrouter. Change is taken care in 76 : * RouteKSyncEntry */ 77 0 : return 0; 78 : } 79 : 80 0 : int BridgeRouteAuditKSyncEntry::EncodeDelete(char *buf, int buf_len) { 81 0 : vr_route_req encoder; 82 : int encode_len; 83 : 84 0 : encoder.set_h_op(sandesh_op::DEL); 85 0 : encoder.set_rtr_rid(0); 86 0 : encoder.set_rtr_vrf_id(vrf_id_); 87 0 : encoder.set_rtr_family(AF_BRIDGE); 88 : 89 : std::vector<int8_t> mac((int8_t *)mac_, 90 0 : (int8_t *)mac_ + mac_.size()); 91 0 : encoder.set_rtr_mac(mac); 92 0 : encoder.set_rtr_replace_plen(0); 93 : 94 0 : int error = 0; 95 0 : encode_len = encoder.WriteBinary((uint8_t *)buf, buf_len, &error); 96 0 : assert(error == 0); 97 0 : assert(encode_len <= buf_len); 98 0 : return encode_len; 99 0 : } 100 : 101 0 : int BridgeRouteAuditKSyncEntry::DeleteMsg(char *buf, int buf_len) { 102 0 : KSyncRouteInfo info; 103 0 : FillObjectLog(sandesh_op::DEL, info); 104 0 : KSYNC_TRACE(Route, GetObject(), info); 105 : 106 0 : return EncodeDelete(buf, buf_len); 107 0 : } 108 : 109 : /////////////////////////////////////////////////////////////////////////////// 110 : // BridgeRouteAuditKSyncObject routines 111 : /////////////////////////////////////////////////////////////////////////////// 112 : 113 3 : BridgeRouteAuditKSyncObject::BridgeRouteAuditKSyncObject(KSync *ksync) : 114 3 : KSyncObject("KSync BridgeRouteTable"), ksync_(ksync) { 115 3 : } 116 : 117 6 : BridgeRouteAuditKSyncObject::~BridgeRouteAuditKSyncObject() { 118 6 : } 119 : 120 0 : KSyncEntry *BridgeRouteAuditKSyncObject::Alloc(const KSyncEntry *key, 121 : uint32_t idx) { 122 0 : const BridgeRouteAuditKSyncEntry *route = 123 : static_cast<const BridgeRouteAuditKSyncEntry *>(key); 124 : BridgeRouteAuditKSyncEntry *ksync = new BridgeRouteAuditKSyncEntry(this, 125 0 : route); 126 0 : return static_cast<KSyncEntry *>(ksync); 127 : }