blob: 5b03f5db02110c48e416719ec701f1d49d408de2 [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/acl_list.hpp"
Neale Ranns9ef1c0a2017-11-03 04:39:05 -070017#include "vom/acl_list_cmds.hpp"
Neale Ranns812ed392017-10-16 04:20:13 -070018#include "vom/logger.hpp"
19
20namespace VOM {
21namespace ACL {
Mohsin Kazmib5eb3b12018-02-26 18:36:17 +010022
23template <>
24l2_list::event_handler::event_handler()
25{
26 OM::register_listener(this);
27 inspect::register_handler({ "l2-acl-list" }, "L2 ACL lists", this);
28}
29
Neale Ranns812ed392017-10-16 04:20:13 -070030template <>
31void
32l2_list::event_handler::handle_populate(const client_db::key_t& key)
33{
34 /* hack to get this function instantiated */
35 m_evh.order();
36
37 /*
Neale Ranns1d781552017-11-27 04:52:35 -080038 * dump VPP Bridge domains
39 */
40 std::shared_ptr<list_cmds::l2_dump_cmd> cmd =
41 std::make_shared<list_cmds::l2_dump_cmd>();
Neale Ranns812ed392017-10-16 04:20:13 -070042
43 HW::enqueue(cmd);
44 HW::write();
45
46 for (auto& record : *cmd) {
47 auto& payload = record.get_payload();
48
49 const handle_t hdl(payload.acl_index);
50 l2_list acl(hdl, std::string(reinterpret_cast<const char*>(payload.tag)));
51
52 for (unsigned int ii = 0; ii < payload.count; ii++) {
53 const route::prefix_t pfx(payload.r[ii].is_ipv6,
54 payload.r[ii].src_ip_addr,
55 payload.r[ii].src_ip_prefix_len);
56 l2_rule rule(ii, action_t::from_int(payload.r[ii].is_permit), pfx,
57 { payload.r[ii].src_mac }, { payload.r[ii].src_mac_mask });
58
59 acl.insert(rule);
60 }
61 VOM_LOG(log_level_t::DEBUG) << "dump: " << acl.to_string();
62
63 /*
Neale Ranns1d781552017-11-27 04:52:35 -080064 * Write each of the discovered ACLs into the OM,
65 * but disable the HW Command q whilst we do, so that no
66 * commands are sent to VPP
67 */
Neale Ranns812ed392017-10-16 04:20:13 -070068 OM::commit(key, acl);
69 }
70}
71
72template <>
Mohsin Kazmib5eb3b12018-02-26 18:36:17 +010073l3_list::event_handler::event_handler()
74{
75 OM::register_listener(this);
76 inspect::register_handler({ "l3-acl-list" }, "L3 ACL lists", this);
77}
78
79template <>
Neale Ranns812ed392017-10-16 04:20:13 -070080void
81l3_list::event_handler::handle_populate(const client_db::key_t& key)
82{
83 /* hack to get this function instantiated */
84 m_evh.order();
85
86 /*
Neale Ranns1d781552017-11-27 04:52:35 -080087 * dump L3 ACLs Bridge domains
88 */
89 std::shared_ptr<list_cmds::l3_dump_cmd> cmd =
90 std::make_shared<list_cmds::l3_dump_cmd>();
Neale Ranns812ed392017-10-16 04:20:13 -070091
92 HW::enqueue(cmd);
93 HW::write();
94
95 for (auto& record : *cmd) {
96 auto& payload = record.get_payload();
97
98 const handle_t hdl(payload.acl_index);
99 l3_list acl(hdl, std::string(reinterpret_cast<const char*>(payload.tag)));
100
101 for (unsigned int ii = 0; ii < payload.count; ii++) {
102 const route::prefix_t src(payload.r[ii].is_ipv6,
103 payload.r[ii].src_ip_addr,
104 payload.r[ii].src_ip_prefix_len);
105 const route::prefix_t dst(payload.r[ii].is_ipv6,
106 payload.r[ii].dst_ip_addr,
107 payload.r[ii].dst_ip_prefix_len);
108 l3_rule rule(ii, action_t::from_int(payload.r[ii].is_permit), src, dst);
109
Mohsin Kazmi1019baf2018-01-15 14:16:45 +0100110 rule.set_proto(payload.r[ii].proto);
111 rule.set_src_from_port(payload.r[ii].srcport_or_icmptype_first);
112 rule.set_src_to_port(payload.r[ii].srcport_or_icmptype_last);
113 rule.set_dst_from_port(payload.r[ii].dstport_or_icmpcode_first);
114 rule.set_dst_to_port(payload.r[ii].dstport_or_icmpcode_last);
115 rule.set_tcp_flags_mask(payload.r[ii].tcp_flags_mask);
116 rule.set_tcp_flags_value(payload.r[ii].tcp_flags_value);
117
Neale Ranns812ed392017-10-16 04:20:13 -0700118 acl.insert(rule);
119 }
120 VOM_LOG(log_level_t::DEBUG) << "dump: " << acl.to_string();
121
122 /*
Neale Ranns1d781552017-11-27 04:52:35 -0800123 * Write each of the discovered ACLs into the OM,
124 * but disable the HW Command q whilst we do, so that no
125 * commands are sent to VPP
126 */
Neale Ranns812ed392017-10-16 04:20:13 -0700127 OM::commit(key, acl);
128 }
129}
Neale Ranns9ef1c0a2017-11-03 04:39:05 -0700130
131template <>
132void
133l3_list::update(const l3_list& obj)
134{
135 /*
136 * always update the instance with the latest rule set
137 */
Mohsin Kazmib5eb3b12018-02-26 18:36:17 +0100138 if (rc_t::OK != m_hdl.rc() || obj.m_rules != m_rules) {
Neale Ranns9ef1c0a2017-11-03 04:39:05 -0700139 HW::enqueue(new list_cmds::l3_update_cmd(m_hdl, m_key, m_rules));
140 }
141 /*
142 * We don't, can't, read the priority from VPP,
143 * so the is equals check above does not include the priorty.
144 * but we save it now.
145 */
146 m_rules = obj.m_rules;
147}
148template <>
149void
150l2_list::update(const l2_list& obj)
151{
152 /*
153 * always update the instance with the latest rule set
154 */
Mohsin Kazmib5eb3b12018-02-26 18:36:17 +0100155 if (rc_t::OK != m_hdl.rc() || obj.m_rules != m_rules) {
Neale Ranns9ef1c0a2017-11-03 04:39:05 -0700156 HW::enqueue(new list_cmds::l2_update_cmd(m_hdl, m_key, m_rules));
157 }
158 /*
159 * We don't, can't, read the priority from VPP,
160 * so the is equals check above does not include the priorty.
161 * but we save it now.
162 */
163 m_rules = obj.m_rules;
164}
165/**
166 * Sweep/reap the object if still stale
167 */
168template <>
169void
170l3_list::sweep(void)
171{
172 if (m_hdl) {
173 HW::enqueue(new list_cmds::l3_delete_cmd(m_hdl));
174 }
175 HW::write();
176}
177template <>
178void
179l2_list::sweep(void)
180{
181 if (m_hdl) {
182 HW::enqueue(new list_cmds::l2_delete_cmd(m_hdl));
183 }
184 HW::write();
185}
186
187/**
188 * Replay the objects state to HW
189 */
190template <>
191void
192l3_list::replay(void)
193{
194 if (m_hdl) {
Mohsin Kazmi1019baf2018-01-15 14:16:45 +0100195 m_hdl.data().reset();
Neale Ranns9ef1c0a2017-11-03 04:39:05 -0700196 HW::enqueue(new list_cmds::l3_update_cmd(m_hdl, m_key, m_rules));
197 }
198}
199template <>
200void
201l2_list::replay(void)
202{
203 if (m_hdl) {
Mohsin Kazmi1019baf2018-01-15 14:16:45 +0100204 m_hdl.data().reset();
Neale Ranns9ef1c0a2017-11-03 04:39:05 -0700205 HW::enqueue(new list_cmds::l2_update_cmd(m_hdl, m_key, m_rules));
206 }
207}
208
209}; // namespace ACL
210}; // namespace VOM
Neale Ranns812ed392017-10-16 04:20:13 -0700211
212/*
213 * fd.io coding-style-patch-verification: ON
214 *
215 * Local Variables:
216 * eval: (c-set-style "mozilla")
217 * End:
218 */