OpenSDN source code
vrf_assign_ksync.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #include <boost/asio.hpp>
6 #include <boost/bind/bind.hpp>
7 
8 #include <base/logging.h>
9 #include <db/db_entry.h>
10 #include <db/db_table.h>
11 #include <db/db_table_partition.h>
12 #include <ksync/ksync_index.h>
13 #include <ksync/ksync_entry.h>
14 #include <ksync/ksync_object.h>
15 #include <ksync/ksync_netlink.h>
16 #include <ksync/ksync_sock.h>
17 #include "oper/interface_common.h"
18 #include "oper/vrf.h"
19 #include "oper/vrf_assign.h"
20 #include "oper/mirror_table.h"
24 #include "ksync_init.h"
25 
26 using namespace boost::placeholders;
27 
29  const VrfAssignKSyncEntry *entry,
30  uint32_t index) :
31  KSyncNetlinkDBEntry(index), ksync_obj_(obj), interface_(entry->interface_),
32  vlan_tag_(entry->vlan_tag_), vrf_id_(entry->vrf_id_),
33  nh_(entry->nh_) {
34 }
35 
37  const VrfAssign *vassign) :
38  KSyncNetlinkDBEntry(kInvalidIndex), ksync_obj_(obj) {
39 
40  InterfaceKSyncObject *intf_object =
42  InterfaceKSyncEntry intf(intf_object, vassign->GetInterface());
43 
44  interface_ = static_cast<InterfaceKSyncEntry *>
45  (intf_object->GetReference(&intf));
46  assert(interface_);
47 
48  assert(vassign->GetType() == VrfAssign::VLAN);
49  const VlanVrfAssign *vlan = static_cast<const VlanVrfAssign *>(vassign);
50  vlan_tag_ = vlan->GetVlanTag();
51 
52  if (vassign->GetVrf()) {
53  vrf_id_ = vassign->GetVrf()->vrf_id();
54  } else {
55  vrf_id_ = VIF_VRF_INVALID;
56  }
57 }
58 
60 }
61 
63  return ksync_obj_;
64 }
65 
66 bool VrfAssignKSyncEntry::IsLess(const KSyncEntry &rhs) const {
67  const VrfAssignKSyncEntry &entry =
68  static_cast<const VrfAssignKSyncEntry &>(rhs);
69 
70  if (interface() != entry.interface()) {
71  return interface() < entry.interface();
72  }
73 
74  return vlan_tag() < entry.vlan_tag();
75 }
76 
77 std::string VrfAssignKSyncEntry::ToString() const {
78  std::stringstream s;
80 
81  s << "VRF Assign : ";
82  if (intf) {
83  s << "Interface : " << intf->interface_name() <<
84  " Intf-Service-Vlan : " <<
85  (intf->has_service_vlan() == true ? "Enable" : "Disable");
86  } else {
87  s << "Interface : <NULL> ";
88  }
89 
90  s << " Tag : " << vlan_tag();
91  const VrfEntry* vrf =
93  if (vrf) {
94  s << " Vrf : " << vrf->GetName();
95  }
96 
97  return s.str();
98 }
99 
101  bool ret = false;
102  const VrfAssign *vassign = static_cast<VrfAssign *>(e);
103  uint32_t vrf_id = 0;
104 
105  if (vassign->GetVrf()) {
106  vrf_id = vassign->GetVrf()->vrf_id();
107  } else {
108  vrf_id = VIF_VRF_INVALID;
109  }
110 
111  if (vrf_id_ != vrf_id) {
112  vrf_id_ = vrf_id;
113  ret = true;
114  }
115 
116  const VlanVrfAssign *vlan = static_cast<const VlanVrfAssign *>(vassign);
117  vlan_tag_ = vlan->GetVlanTag();
118  NHKSyncObject *nh_object =
120  NHKSyncEntry nh(nh_object, vlan->nh());
121  if (nh_ != static_cast<NHKSyncEntry*>(nh_object->GetReference(&nh))) {
122  nh_ = static_cast<NHKSyncEntry*>(nh_object->GetReference(&nh));
123  ret = true;
124  }
125 
126  return ret;
127 }
128 
130  return static_cast<InterfaceKSyncEntry *>(interface_.get());
131 }
132 
134  return static_cast<NHKSyncEntry *>(nh_.get());
135 }
136 
137 int VrfAssignKSyncEntry::Encode(sandesh_op::type op, char *buf, int buf_len) {
138  vr_vrf_assign_req encoder;
139  int encode_len;
140  InterfaceKSyncEntry *intf = interface();
141 
142  encoder.set_h_op(op);
143  encoder.set_var_vif_index(intf->interface_id());
144  encoder.set_var_vlan_id(vlan_tag_);
145  encoder.set_var_vif_vrf(vrf_id_);
146  encoder.set_var_nh_id(nh()->nh_id());
147  int error = 0;
148  encode_len = encoder.WriteBinary((uint8_t *)buf, buf_len, &error);
149  assert(error == 0);
150  assert(encode_len <= buf_len);
151  LOG(DEBUG, "VRF Assign for Interface <" << intf->interface_name() <<
152  "> Tag <" << vlan_tag() << "> Vrf <" << vrf_id_ << ">");
153  return encode_len;
154 }
155 
156 int VrfAssignKSyncEntry::AddMsg(char *buf, int buf_len) {
157  LOG(DEBUG, "VrfAssign: Add");
158  return Encode(sandesh_op::ADD, buf, buf_len);
159 }
160 
161 int VrfAssignKSyncEntry::ChangeMsg(char *buf, int buf_len){
162  return AddMsg(buf, buf_len);
163 }
164 
165 int VrfAssignKSyncEntry::DeleteMsg(char *buf, int buf_len) {
166  LOG(DEBUG, "VrfAssign: Delete");
167  return Encode(sandesh_op::DEL, buf, buf_len);
168 }
169 
171  InterfaceKSyncEntry *intf = interface();
172  if (!intf->IsResolved()) {
173  return intf;
174  }
175  NHKSyncEntry *ksync_nh = nh();
176  if (!ksync_nh->IsResolved()) {
177  return ksync_nh;
178  }
179  return NULL;
180 }
181 
183  : KSyncDBObject("KSync VrfAssign"), ksync_(ksync) {
184 }
185 
187 }
188 
191 }
192 
193 KSyncEntry *VrfAssignKSyncObject::Alloc(const KSyncEntry *ke, uint32_t index) {
194  const VrfAssignKSyncEntry *rule =
195  static_cast<const VrfAssignKSyncEntry *>(ke);
196  VrfAssignKSyncEntry *ksync = new VrfAssignKSyncEntry(this, rule, index);
197  return static_cast<KSyncEntry *>(ksync);
198 }
199 
201  const VrfAssign *rule = static_cast<const VrfAssign *>(e);
202  VrfAssignKSyncEntry *key = new VrfAssignKSyncEntry(this, rule);
203  return static_cast<KSyncEntry *>(key);
204 }
205 
206 void vr_vrf_assign_req::Process(SandeshContext *context) {
207  AgentSandeshContext *ioc = static_cast<AgentSandeshContext *>(context);
208  ioc->VrfAssignMsgHandler(this);
209 }
virtual void VrfAssignMsgHandler(vr_vrf_assign_req *req)=0
VrfTable * vrf_table() const
Definition: agent.h:487
VrfAssignTable * vrf_assign_table() const
Definition: agent.h:532
bool has_service_vlan() const
uint32_t interface_id() const
const string & interface_name() const
void RegisterDb(DBTableBase *table)
bool IsResolved()
KSyncEntry * GetReference(const KSyncEntry *key)
Agent * agent() const
Definition: ksync_init.h:39
NHKSyncObject * nh_ksync_obj() const
Definition: ksync_init.h:43
InterfaceKSyncObject * interface_ksync_obj() const
Definition: ksync_init.h:46
const uint32_t GetVlanTag() const
Definition: vrf_assign.h:85
const NextHop * nh() const
Definition: vrf_assign.h:86
virtual int DeleteMsg(char *buf, int buf_len)
virtual KSyncEntry * UnresolvedReference()
VrfAssignKSyncEntry(VrfAssignKSyncObject *obj, const VrfAssignKSyncEntry *entry, uint32_t index)
virtual int AddMsg(char *buf, int buf_len)
VrfAssignKSyncObject * ksync_obj_
KSyncEntryPtr interface_
virtual int ChangeMsg(char *buf, int buf_len)
virtual ~VrfAssignKSyncEntry()
InterfaceKSyncEntry * interface() const
virtual std::string ToString() const
KSyncDBObject * GetObject() const
NHKSyncEntry * nh() const
virtual bool Sync(DBEntry *e)
virtual bool IsLess(const KSyncEntry &rhs) const
uint16_t vlan_tag() const
int Encode(sandesh_op::type op, char *buf, int buf_len)
VrfAssignKSyncObject(KSync *ksync)
virtual KSyncEntry * DBToKSyncEntry(const DBEntry *e)
virtual KSyncEntry * Alloc(const KSyncEntry *entry, uint32_t index)
KSync * ksync() const
const VrfEntry * GetVrf() const
Definition: vrf_assign.h:61
const Type GetType() const
Definition: vrf_assign.h:59
const Interface * GetInterface() const
Definition: vrf_assign.h:60
Definition: vrf.h:89
const string & GetName() const
Definition: vrf.h:103
const uint32_t vrf_id() const
Definition: vrf.h:102
VrfEntry * FindVrfFromId(size_t index)
Definition: vrf.cc:884
uint8_t type
Definition: load_balance.h:2
#define LOG(_Level, _Msg)
Definition: logging.h:34