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