Line data Source code
1 : /*
2 : * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3 : */
4 :
5 : #include <base/logging.h>
6 : #include <oper/nexthop.h>
7 : #include <oper/mirror_table.h>
8 : #include <ksync/ksync_index.h>
9 : #include <vrouter/ksync/interface_ksync.h>
10 : #include <vrouter/ksync/nexthop_ksync.h>
11 : #include <vrouter/ksync/mpls_ksync.h>
12 : #include <vrouter/ksync/ksync_init.h>
13 : #include <ksync/ksync_sock.h>
14 :
15 0 : MplsKSyncEntry::MplsKSyncEntry(MplsKSyncObject* obj, const MplsKSyncEntry *me,
16 0 : uint32_t index) :
17 0 : KSyncNetlinkDBEntry(index), ksync_obj_(obj), label_(me->label_),
18 0 : nh_(NULL) {
19 0 : }
20 :
21 0 : MplsKSyncEntry::MplsKSyncEntry(MplsKSyncObject* obj, const MplsLabel *mpls) :
22 0 : KSyncNetlinkDBEntry(kInvalidIndex), ksync_obj_(obj),
23 0 : label_(mpls->label()), nh_(NULL) {
24 0 : }
25 :
26 0 : MplsKSyncEntry::~MplsKSyncEntry() {
27 0 : }
28 :
29 0 : KSyncDBObject *MplsKSyncEntry::GetObject() const {
30 0 : return ksync_obj_;
31 : }
32 :
33 0 : bool MplsKSyncEntry::IsLess(const KSyncEntry &rhs) const {
34 0 : const MplsKSyncEntry &entry = static_cast<const MplsKSyncEntry &>(rhs);
35 0 : return label_ < entry.label_;
36 : }
37 :
38 0 : std::string MplsKSyncEntry::ToString() const {
39 0 : std::stringstream s;
40 0 : NHKSyncEntry *next_hop = nh();
41 :
42 0 : s << "Mpls : " << label_ << " Index : " << GetIndex();
43 0 : if (next_hop) {
44 0 : s << next_hop->ToString();
45 : } else {
46 0 : s << "NextHop : NULL";
47 : }
48 0 : return s.str();
49 0 : }
50 :
51 0 : bool MplsKSyncEntry::Sync(DBEntry *e) {
52 0 : bool ret = false;
53 0 : const MplsLabel *mpls = static_cast<MplsLabel *>(e);
54 :
55 0 : NHKSyncObject *nh_object = ksync_obj_->ksync()->nh_ksync_obj();
56 0 : if (mpls->nexthop() == NULL) {
57 0 : LOG(DEBUG, "nexthop in mpls label is null");
58 0 : assert(0);
59 : }
60 0 : NHKSyncEntry next_hop(nh_object, mpls->nexthop());
61 0 : NHKSyncEntry *old_nh = nh();
62 :
63 0 : nh_ = nh_object->GetReference(&next_hop);
64 0 : if (old_nh != nh()) {
65 0 : ret = true;
66 : }
67 :
68 0 : return ret;
69 0 : };
70 :
71 0 : int MplsKSyncEntry::Encode(sandesh_op::type op, char *buf, int buf_len) {
72 0 : vr_mpls_req encoder;
73 : int encode_len;
74 0 : NHKSyncEntry *next_hop = nh();
75 :
76 0 : encoder.set_h_op(op);
77 0 : encoder.set_mr_label(label_);
78 0 : encoder.set_mr_rid(0);
79 0 : encoder.set_mr_nhid(next_hop->nh_id());
80 0 : int error = 0;
81 0 : encode_len = encoder.WriteBinary((uint8_t *)buf, buf_len, &error);
82 0 : assert(error == 0);
83 0 : assert(encode_len <= buf_len);
84 0 : return encode_len;
85 0 : }
86 :
87 0 : void MplsKSyncEntry::FillObjectLog(sandesh_op::type op,
88 : KSyncMplsInfo &info) const {
89 0 : info.set_label(label_);
90 0 : info.set_nh(nh()->nh_id());
91 :
92 0 : if (op == sandesh_op::ADD) {
93 0 : info.set_operation("ADD/CHANGE");
94 : } else {
95 0 : info.set_operation("DELETE");
96 : }
97 0 : }
98 :
99 0 : int MplsKSyncEntry::AddMsg(char *buf, int buf_len) {
100 0 : KSyncMplsInfo info;
101 0 : FillObjectLog(sandesh_op::ADD, info);
102 0 : KSYNC_TRACE(Mpls, GetObject(), info);
103 :
104 0 : return Encode(sandesh_op::ADD, buf, buf_len);
105 0 : }
106 :
107 0 : int MplsKSyncEntry::ChangeMsg(char *buf, int buf_len){
108 0 : KSyncMplsInfo info;
109 0 : FillObjectLog(sandesh_op::ADD, info);
110 0 : KSYNC_TRACE(Mpls, GetObject(), info);
111 :
112 0 : return Encode(sandesh_op::ADD, buf, buf_len);
113 0 : }
114 :
115 0 : int MplsKSyncEntry::DeleteMsg(char *buf, int buf_len) {
116 0 : KSyncMplsInfo info;
117 0 : FillObjectLog(sandesh_op::DEL, info);
118 0 : KSYNC_TRACE(Mpls, GetObject(), info);
119 :
120 0 : return Encode(sandesh_op::DEL, buf, buf_len);
121 0 : }
122 :
123 0 : KSyncEntry *MplsKSyncEntry::UnresolvedReference() {
124 0 : NHKSyncEntry *next_hop = nh();
125 0 : if (!next_hop->IsResolvedAndInSync()) {
126 0 : return next_hop;
127 : }
128 0 : return NULL;
129 : }
130 :
131 0 : MplsKSyncObject::MplsKSyncObject(KSync *ksync) :
132 0 : KSyncDBObject("KSync Mpls"), ksync_(ksync) {
133 0 : }
134 :
135 0 : MplsKSyncObject::~MplsKSyncObject() {
136 0 : }
137 :
138 0 : void MplsKSyncObject::RegisterDBClients() {
139 0 : RegisterDb(ksync_->agent()->mpls_table());
140 0 : }
141 :
142 0 : KSyncEntry *MplsKSyncObject::Alloc(const KSyncEntry *entry, uint32_t index) {
143 0 : const MplsKSyncEntry *mpls = static_cast<const MplsKSyncEntry *>(entry);
144 0 : MplsKSyncEntry *ksync = new MplsKSyncEntry(this, mpls, index);
145 0 : return static_cast<KSyncEntry *>(ksync);
146 : };
147 :
148 0 : KSyncEntry *MplsKSyncObject::DBToKSyncEntry(const DBEntry *e) {
149 0 : const MplsLabel *mpls = static_cast<const MplsLabel *>(e);
150 0 : MplsKSyncEntry *key = new MplsKSyncEntry(this, mpls);
151 0 : return static_cast<KSyncEntry *>(key);
152 : }
153 :
154 0 : void vr_mpls_req::Process(SandeshContext *context) {
155 0 : AgentSandeshContext *ioc = static_cast<AgentSandeshContext *>(context);
156 0 : ioc->MplsMsgHandler(this);
157 0 : }
158 :
|