OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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.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 
27  const VrfAssignKSyncEntry *entry,
28  uint32_t index) :
29  KSyncNetlinkDBEntry(index), ksync_obj_(obj), interface_(entry->interface_),
30  vlan_tag_(entry->vlan_tag_), vrf_id_(entry->vrf_id_),
31  nh_(entry->nh_) {
32 }
33 
35  const VrfAssign *vassign) :
36  KSyncNetlinkDBEntry(kInvalidIndex), ksync_obj_(obj) {
37 
38  InterfaceKSyncObject *intf_object =
40  InterfaceKSyncEntry intf(intf_object, vassign->GetInterface());
41 
42  interface_ = static_cast<InterfaceKSyncEntry *>
43  (intf_object->GetReference(&intf));
44  assert(interface_);
45 
46  assert(vassign->GetType() == VrfAssign::VLAN);
47  const VlanVrfAssign *vlan = static_cast<const VlanVrfAssign *>(vassign);
48  vlan_tag_ = vlan->GetVlanTag();
49 
50  if (vassign->GetVrf()) {
51  vrf_id_ = vassign->GetVrf()->vrf_id();
52  } else {
53  vrf_id_ = VIF_VRF_INVALID;
54  }
55 }
56 
58 }
59 
61  return ksync_obj_;
62 }
63 
64 bool VrfAssignKSyncEntry::IsLess(const KSyncEntry &rhs) const {
65  const VrfAssignKSyncEntry &entry =
66  static_cast<const VrfAssignKSyncEntry &>(rhs);
67 
68  if (interface() != entry.interface()) {
69  return interface() < entry.interface();
70  }
71 
72  return vlan_tag() < entry.vlan_tag();
73 }
74 
75 std::string VrfAssignKSyncEntry::ToString() const {
76  std::stringstream s;
78 
79  s << "VRF Assign : ";
80  if (intf) {
81  s << "Interface : " << intf->interface_name() <<
82  " Intf-Service-Vlan : " <<
83  (intf->has_service_vlan() == true ? "Enable" : "Disable");
84  } else {
85  s << "Interface : <NULL> ";
86  }
87 
88  s << " Tag : " << vlan_tag();
89  const VrfEntry* vrf =
91  if (vrf) {
92  s << " Vrf : " << vrf->GetName();
93  }
94 
95  return s.str();
96 }
97 
99  bool ret = false;
100  const VrfAssign *vassign = static_cast<VrfAssign *>(e);
101  uint32_t vrf_id = 0;
102 
103  if (vassign->GetVrf()) {
104  vrf_id = vassign->GetVrf()->vrf_id();
105  } else {
106  vrf_id = VIF_VRF_INVALID;
107  }
108 
109  if (vrf_id_ != vrf_id) {
110  vrf_id_ = vrf_id;
111  ret = true;
112  }
113 
114  const VlanVrfAssign *vlan = static_cast<const VlanVrfAssign *>(vassign);
115  vlan_tag_ = vlan->GetVlanTag();
116  NHKSyncObject *nh_object =
118  NHKSyncEntry nh(nh_object, vlan->nh());
119  if (nh_ != static_cast<NHKSyncEntry*>(nh_object->GetReference(&nh))) {
120  nh_ = static_cast<NHKSyncEntry*>(nh_object->GetReference(&nh));
121  ret = true;
122  }
123 
124  return ret;
125 }
126 
128  return static_cast<InterfaceKSyncEntry *>(interface_.get());
129 }
130 
132  return static_cast<NHKSyncEntry *>(nh_.get());
133 }
134 
135 int VrfAssignKSyncEntry::Encode(sandesh_op::type op, char *buf, int buf_len) {
136  vr_vrf_assign_req encoder;
137  int encode_len;
138  InterfaceKSyncEntry *intf = interface();
139 
140  encoder.set_h_op(op);
141  encoder.set_var_vif_index(intf->interface_id());
142  encoder.set_var_vlan_id(vlan_tag_);
143  encoder.set_var_vif_vrf(vrf_id_);
144  encoder.set_var_nh_id(nh()->nh_id());
145  int error = 0;
146  encode_len = encoder.WriteBinary((uint8_t *)buf, buf_len, &error);
147  assert(error == 0);
148  assert(encode_len <= buf_len);
149  LOG(DEBUG, "VRF Assign for Interface <" << intf->interface_name() <<
150  "> Tag <" << vlan_tag() << "> Vrf <" << vrf_id_ << ">");
151  return encode_len;
152 }
153 
154 int VrfAssignKSyncEntry::AddMsg(char *buf, int buf_len) {
155  LOG(DEBUG, "VrfAssign: Add");
156  return Encode(sandesh_op::ADD, buf, buf_len);
157 }
158 
159 int VrfAssignKSyncEntry::ChangeMsg(char *buf, int buf_len){
160  return AddMsg(buf, buf_len);
161 }
162 
163 int VrfAssignKSyncEntry::DeleteMsg(char *buf, int buf_len) {
164  LOG(DEBUG, "VrfAssign: Delete");
165  return Encode(sandesh_op::DEL, buf, buf_len);
166 }
167 
169  InterfaceKSyncEntry *intf = interface();
170  if (!intf->IsResolved()) {
171  return intf;
172  }
173  NHKSyncEntry *ksync_nh = nh();
174  if (!ksync_nh->IsResolved()) {
175  return ksync_nh;
176  }
177  return NULL;
178 }
179 
181  : KSyncDBObject("KSync VrfAssign"), ksync_(ksync) {
182 }
183 
185 }
186 
189 }
190 
191 KSyncEntry *VrfAssignKSyncObject::Alloc(const KSyncEntry *ke, uint32_t index) {
192  const VrfAssignKSyncEntry *rule =
193  static_cast<const VrfAssignKSyncEntry *>(ke);
194  VrfAssignKSyncEntry *ksync = new VrfAssignKSyncEntry(this, rule, index);
195  return static_cast<KSyncEntry *>(ksync);
196 }
197 
199  const VrfAssign *rule = static_cast<const VrfAssign *>(e);
200  VrfAssignKSyncEntry *key = new VrfAssignKSyncEntry(this, rule);
201  return static_cast<KSyncEntry *>(key);
202 }
203 
204 void vr_vrf_assign_req::Process(SandeshContext *context) {
205  AgentSandeshContext *ioc = static_cast<AgentSandeshContext *>(context);
206  ioc->VrfAssignMsgHandler(this);
207 }
const VrfEntry * GetVrf() const
Definition: vrf_assign.h:61
virtual bool IsLess(const KSyncEntry &rhs) const
void RegisterDb(DBTableBase *table)
Definition: vrf.h:86
bool IsResolved()
virtual int ChangeMsg(char *buf, int buf_len)
Agent * agent() const
Definition: ksync_init.h:39
NHKSyncEntry * nh() const
virtual std::string ToString() const
uint16_t vlan_tag() const
const Type GetType() const
Definition: vrf_assign.h:59
bool has_service_vlan() const
VrfAssignKSyncObject(KSync *ksync)
const NextHop * nh() const
Definition: vrf_assign.h:86
virtual KSyncEntry * UnresolvedReference()
const string & GetName() const
Definition: vrf.h:100
VrfEntry * FindVrfFromId(size_t index)
Definition: vrf.cc:884
uint8_t type
Definition: load_balance.h:109
const uint32_t GetVlanTag() const
Definition: vrf_assign.h:85
VrfAssignKSyncObject * ksync_obj_
NHKSyncObject * nh_ksync_obj() const
Definition: ksync_init.h:43
virtual KSyncEntry * DBToKSyncEntry(const DBEntry *e)
virtual int DeleteMsg(char *buf, int buf_len)
VrfAssignTable * vrf_assign_table() const
Definition: agent.h:530
KSyncEntryPtr interface_
virtual ~VrfAssignKSyncEntry()
const uint32_t vrf_id() const
Definition: vrf.h:99
int Encode(sandesh_op::type op, char *buf, int buf_len)
KSyncEntry * GetReference(const KSyncEntry *key)
VrfTable * vrf_table() const
Definition: agent.h:485
KSync * ksync() const
virtual void VrfAssignMsgHandler(vr_vrf_assign_req *req)=0
VrfAssignKSyncEntry(VrfAssignKSyncObject *obj, const VrfAssignKSyncEntry *entry, uint32_t index)
#define LOG(_Level, _Msg)
Definition: logging.h:33
const string & interface_name() const
const Interface * GetInterface() const
Definition: vrf_assign.h:60
InterfaceKSyncEntry * interface() const
virtual bool Sync(DBEntry *e)
InterfaceKSyncObject * interface_ksync_obj() const
Definition: ksync_init.h:46
uint32_t interface_id() const
virtual KSyncEntry * Alloc(const KSyncEntry *entry, uint32_t index)
KSyncDBObject * GetObject() const
virtual int AddMsg(char *buf, int buf_len)