FD.io VPP  v19.04.4-rc0-5-ge88582fac
Vector Packet Processing
om.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017 Cisco and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include <algorithm>
17 
18 #include "vom/logger.hpp"
19 #include "vom/om.hpp"
20 
21 namespace VOM {
22 client_db* OM::m_db;
23 
24 std::unique_ptr<OM::listener_list> OM::m_listeners;
25 
26 /**
27  * Initialse the connection to VPP
28  */
29 void
31 {
32  m_db = new client_db();
33 }
34 
35 void
37 {
38  /*
39  * Find if the object already stored on behalf of this key.
40  * and mark them stale
41  */
42  object_ref_list& objs = m_db->find(key);
43 
44  auto mark_obj = [](const object_ref& oref) { oref.mark(); };
45 
46  std::for_each(objs.begin(), objs.end(), mark_obj);
47 }
48 
49 void
51 {
52  /*
53  * Find if the object already stored on behalf of this key.
54  * and mark them stale
55  */
56  object_ref_list& objs = m_db->find(key);
57 
58  for (auto it = objs.begin(); it != objs.end();) {
59  if (it->stale()) {
60  it = objs.erase(it);
61  } else {
62  ++it;
63  }
64  }
65 
66  HW::write();
67 }
68 
69 void
71 {
72  /*
73  * Simply reset the list for this key. This will desctruct the
74  * object list and shared_ptrs therein. When the last shared_ptr
75  * goes the objects desctructor is called and the object is
76  * removed from OM
77  */
78  m_db->flush(key);
79 
80  HW::write();
81 }
82 
83 void
85 {
86  VOM_LOG(log_level_t::INFO) << "replay";
87  /*
88  * the listeners are sorted in dependency order
89  */
90  for (listener* l : *m_listeners) {
91  l->handle_replay();
92  HW::write();
93  }
94 }
95 
96 void
97 OM::dump(const client_db::key_t& key, std::ostream& os)
98 {
99  m_db->dump(key, os);
100 }
101 
102 void
103 OM::dump(std::ostream& os)
104 {
105  m_db->dump(os);
106 }
107 
108 void
110 {
111  VOM_LOG(log_level_t::INFO) << "populate";
112 
113  /*
114  * the listeners are sorted in dependency order
115  */
116  for (listener* l : *m_listeners) {
117  l->handle_populate(key);
118  }
119 
120  /*
121  * once we have it all, mark it stale.
122  */
123  mark(key);
124 }
125 
126 bool
128 {
129  if (!m_listeners) {
130  m_listeners.reset(new listener_list);
131  }
132 
133  m_listeners->insert(listener);
134 
135  return (true);
136 }
137 
139  : m_key(key)
140 {
141  OM::mark(m_key);
142 }
143 
145 {
146  OM::sweep(m_key);
147 }
148 }
149 
150 /*
151  * fd.io coding-style-patch-verification: ON
152  *
153  * Local Variables:
154  * eval: (c-set-style "mozilla")
155  * End:
156  */
static void init()
Init.
Definition: om.cpp:30
void dump(const key_t &key, std::ostream &os)
Print each of the object in the DB into the stream provided.
Definition: client_db.cpp:35
std::set< object_ref > object_ref_list
A convenitent typedef for set of objects owned.
Definition: client_db.hpp:32
#define VOM_LOG(lvl)
Definition: logger.hpp:181
object_ref_list & find(const key_t &k)
Find the objects owned by the key.
Definition: client_db.cpp:20
const std::string key_t
In the opflex world each entity is known by a URI which can be converted into a string.
Definition: client_db.hpp:51
void flush(const key_t &k)
flush, i.e.
Definition: client_db.cpp:26
static rc_t write()
Write/Execute all commands hitherto enqueued.
Definition: hw.cpp:255
A DB storing the objects that each owner/key owns.
Definition: client_db.hpp:39
A represenation of a reference to a VPP object.
Definition: object_base.hpp:86
static void remove(const client_db::key_t &key)
Remove all object in the OM referenced by the key.
Definition: om.cpp:70
static void mark(const client_db::key_t &key)
Mark all state owned by this key as stale.
Definition: om.cpp:36
static const log_level_t INFO
Definition: logger.hpp:31
Class definition for listeners to OM events.
Definition: om.hpp:284
static void sweep(const client_db::key_t &key)
Sweep all the key&#39;s objects that are stale.
Definition: om.cpp:50
mark_n_sweep(const client_db::key_t &key)
Constructor - will call mark on the key.
Definition: om.cpp:138
~mark_n_sweep()
Destructor - will call sweep on the key.
Definition: om.cpp:144
The VPP Object Model (VOM) library.
Definition: acl_binding.cpp:19
typedef key
Definition: ipsec.api:244
static void replay(void)
Replay all of the objects to HW.
Definition: om.cpp:84
static void dump(const client_db::key_t &key, std::ostream &os)
Print each of the object in the DB into the stream provided.
Definition: om.cpp:97
static void populate(const client_db::key_t &key)
populate the OM with state read from HW.
Definition: om.cpp:109
static bool register_listener(listener *listener)
Register a listener of events.
Definition: om.cpp:127