blob: 832e232f87175d04dbf66b2c5ab48c440946cf52 [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_binding.hpp"
Neale Ranns9ef1c0a2017-11-03 04:39:05 -070017#include "vom/acl_binding_cmds.hpp"
Neale Ranns812ed392017-10-16 04:20:13 -070018
19namespace VOM {
20namespace ACL {
21template <>
22void
23l2_binding::event_handler::handle_populate(const client_db::key_t& key)
24{
25 /*
26* dump VPP Bridge domains
27*/
Neale Ranns9ef1c0a2017-11-03 04:39:05 -070028 std::shared_ptr<binding_cmds::l2_dump_cmd> cmd(
29 new binding_cmds::l2_dump_cmd());
Neale Ranns812ed392017-10-16 04:20:13 -070030
31 HW::enqueue(cmd);
32 HW::write();
33
34 for (auto& record : *cmd) {
35 auto& payload = record.get_payload();
36
37 std::shared_ptr<interface> itf = interface::find(payload.sw_if_index);
38
39 for (int ii = 0; ii < payload.count; ii++) {
40 std::shared_ptr<l2_list> acl = l2_list::find(payload.acls[ii]);
41
42 l2_binding binding(direction_t::INPUT, *itf, *acl);
43
44 OM::commit(key, binding);
45 }
46 }
47}
48
49template <>
50void
51l3_binding::event_handler::handle_populate(const client_db::key_t& key)
52{
Neale Ranns9ef1c0a2017-11-03 04:39:05 -070053 std::shared_ptr<binding_cmds::l3_dump_cmd> cmd(
54 new binding_cmds::l3_dump_cmd());
Neale Ranns812ed392017-10-16 04:20:13 -070055
56 HW::enqueue(cmd);
57 HW::write();
58
59 for (auto& record : *cmd) {
60 auto& payload = record.get_payload();
61
62 std::shared_ptr<interface> itf = interface::find(payload.sw_if_index);
63 uint8_t n_input = payload.n_input;
64
65 for (int ii = 0; ii < payload.count; ii++) {
66 std::shared_ptr<l3_list> acl = l3_list::find(payload.acls[ii]);
67
68 if (n_input) {
69 l3_binding binding(direction_t::INPUT, *itf, *acl);
70 n_input--;
71 OM::commit(key, binding);
72 } else {
73 l3_binding binding(direction_t::OUTPUT, *itf, *acl);
74 OM::commit(key, binding);
75 }
76 }
77 }
78}
Neale Ranns9ef1c0a2017-11-03 04:39:05 -070079
80template <>
81void
82l3_binding::update(const binding& obj)
83{
84 if (!m_binding) {
85 HW::enqueue(new binding_cmds::l3_bind_cmd(
86 m_binding, m_direction, m_itf->handle(), m_acl->handle()));
87 }
88 HW::write();
89}
90
91template <>
92void
93l3_binding::sweep(void)
94{
95 if (m_binding) {
96 HW::enqueue(new binding_cmds::l3_unbind_cmd(
97 m_binding, m_direction, m_itf->handle(), m_acl->handle()));
98 }
99 HW::write();
100}
101
102template <>
103void
104l3_binding::replay(void)
105{
106 if (m_binding) {
107 HW::enqueue(new binding_cmds::l3_bind_cmd(
108 m_binding, m_direction, m_itf->handle(), m_acl->handle()));
109 }
110}
111
112template <>
113void
114l2_binding::update(const binding& obj)
115{
116 if (!m_binding) {
117 HW::enqueue(new binding_cmds::l2_bind_cmd(
118 m_binding, m_direction, m_itf->handle(), m_acl->handle()));
119 }
120 HW::write();
121}
122
123template <>
124void
125l2_binding::sweep(void)
126{
127 if (m_binding) {
128 HW::enqueue(new binding_cmds::l2_unbind_cmd(
129 m_binding, m_direction, m_itf->handle(), m_acl->handle()));
130 }
131 HW::write();
132}
133
134template <>
135void
136l2_binding::replay(void)
137{
138 if (m_binding) {
139 HW::enqueue(new binding_cmds::l2_bind_cmd(
140 m_binding, m_direction, m_itf->handle(), m_acl->handle()));
141 }
142}
Neale Ranns812ed392017-10-16 04:20:13 -0700143};
144
145std::ostream&
146operator<<(std::ostream& os,
147 const std::pair<direction_t, interface::key_type>& key)
148{
149 os << "[" << key.first.to_string() << " " << key.second << "]";
150
151 return (os);
152}
153};
154
155/*
156 * fd.io coding-style-patch-verification: ON
157 *
158 * Local Variables:
159 * eval: (c-set-style "mozilla")
160 * End:
161 */