blob: 0b6e2eff0de91a92104871d65ab6ec5b464a6623 [file] [log] [blame]
Neale Ranns812ed392017-10-16 04:20:13 -07001/*
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 "vom/dhcp_config.hpp"
Neale Ranns9ef1c0a2017-11-03 04:39:05 -070017#include "vom/dhcp_config_cmds.hpp"
Neale Ranns812ed392017-10-16 04:20:13 -070018
19namespace VOM {
20/**
21 * A DB of all DHCP configs
22 */
Neale Rannsfd920602017-11-23 12:15:00 -080023singular_db<interface::key_t, dhcp_config> dhcp_config::m_db;
Neale Ranns812ed392017-10-16 04:20:13 -070024
25dhcp_config::event_handler dhcp_config::m_evh;
26
27dhcp_config::dhcp_config(const interface& itf, const std::string& hostname)
28 : m_itf(itf.singular())
29 , m_hostname(hostname)
30 , m_client_id(l2_address_t::ZERO)
31 , m_binding(0)
32{
33}
34
35dhcp_config::dhcp_config(const interface& itf,
36 const std::string& hostname,
37 const l2_address_t& client_id)
38 : m_itf(itf.singular())
39 , m_hostname(hostname)
40 , m_client_id(client_id)
41 , m_binding(0)
42{
43}
44
45dhcp_config::dhcp_config(const dhcp_config& o)
46 : m_itf(o.m_itf)
47 , m_hostname(o.m_hostname)
48 , m_client_id(o.m_client_id)
49 , m_binding(0)
50{
51}
52
53dhcp_config::~dhcp_config()
54{
55 sweep();
56
57 // not in the DB anymore.
58 m_db.release(m_itf->key(), this);
59}
60
Neale Rannsfd920602017-11-23 12:15:00 -080061bool
62dhcp_config::operator==(const dhcp_config& l) const
63{
64 return ((key() == l.key()) && (m_hostname == l.m_hostname) &&
65 (m_client_id == l.m_client_id));
66}
67
68const dhcp_config::key_t&
69dhcp_config::key() const
70{
71 return (m_itf->key());
72}
73
Neale Ranns812ed392017-10-16 04:20:13 -070074void
75dhcp_config::sweep()
76{
77 if (m_binding) {
Neale Ranns9ef1c0a2017-11-03 04:39:05 -070078 HW::enqueue(
79 new dhcp_config_cmds::unbind_cmd(m_binding, m_itf->handle(), m_hostname));
Neale Ranns812ed392017-10-16 04:20:13 -070080 }
81 HW::write();
82}
83
84void
85dhcp_config::dump(std::ostream& os)
86{
87 m_db.dump(os);
88}
89
90void
91dhcp_config::replay()
92{
93 if (m_binding) {
Neale Ranns9ef1c0a2017-11-03 04:39:05 -070094 HW::enqueue(new dhcp_config_cmds::bind_cmd(m_binding, m_itf->handle(),
95 m_hostname, m_client_id));
Neale Ranns812ed392017-10-16 04:20:13 -070096 }
97}
98
99std::string
100dhcp_config::to_string() const
101{
102 std::ostringstream s;
103 s << "Dhcp-config: " << m_itf->to_string() << " hostname:" << m_hostname
104 << " client_id:[" << m_client_id << "] " << m_binding.to_string();
105
106 return (s.str());
107}
108
109void
110dhcp_config::update(const dhcp_config& desired)
111{
112 /*
113 * the desired state is always that the interface should be created
114 */
115 if (!m_binding) {
Neale Ranns9ef1c0a2017-11-03 04:39:05 -0700116 HW::enqueue(new dhcp_config_cmds::bind_cmd(m_binding, m_itf->handle(),
117 m_hostname, m_client_id));
Neale Ranns812ed392017-10-16 04:20:13 -0700118 }
119}
120
121std::shared_ptr<dhcp_config>
122dhcp_config::find_or_add(const dhcp_config& temp)
123{
124 return (m_db.find_or_add(temp.m_itf->key(), temp));
125}
126
127std::shared_ptr<dhcp_config>
Neale Rannsfd920602017-11-23 12:15:00 -0800128dhcp_config::find(const key_t& k)
129{
130 return (m_db.find(k));
131}
132
133std::shared_ptr<dhcp_config>
Neale Ranns812ed392017-10-16 04:20:13 -0700134dhcp_config::singular() const
135{
136 return find_or_add(*this);
137}
138
139dhcp_config::event_listener::event_listener()
140 : m_status(rc_t::NOOP)
141{
142}
143
144HW::item<bool>&
145dhcp_config::event_listener::status()
146{
147 return (m_status);
148}
149
150dhcp_config::event_handler::event_handler()
151{
152 OM::register_listener(this);
153 inspect::register_handler({ "dhcp" }, "DHCP configurations", this);
154}
155
156void
157dhcp_config::event_handler::handle_replay()
158{
159 m_db.replay();
160}
161
162void
163dhcp_config::event_handler::handle_populate(const client_db::key_t& key)
164{
165 // FIXME
166}
167
168dependency_t
169dhcp_config::event_handler::order() const
170{
171 return (dependency_t::BINDING);
172}
173
174void
175dhcp_config::event_handler::show(std::ostream& os)
176{
177 m_db.dump(os);
178}
179}
180
181/*
182 * fd.io coding-style-patch-verification: ON
183 *
184 * Local Variables:
185 * eval: (c-set-style "mozilla")
186 * End:
187 */