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 "vom/nat_static_cmds.hpp"
17
18DEFINE_VAPI_MSG_IDS_NAT_API_JSON;
19
20namespace VOM {
21namespace nat_static_cmds {
22
23create_44_cmd::create_44_cmd(HW::item<bool>& item,
24                             route::table_id_t id,
25                             const boost::asio::ip::address_v4& inside,
26                             const boost::asio::ip::address_v4& outside)
27  : rpc_cmd(item)
28  , m_id(id)
29  , m_inside(inside)
30  , m_outside(outside)
31{
32}
33
34bool
35create_44_cmd::operator==(const create_44_cmd& other) const
36{
37  return ((m_id == other.m_id) && (m_inside == other.m_inside) &&
38          (m_outside == other.m_outside));
39}
40
41rc_t
42create_44_cmd::issue(connection& con)
43{
44  msg_t req(con.ctx(), std::ref(*this));
45
46  auto& payload = req.get_request().get_payload();
47  payload.is_add = 1;
48  payload.flags = NAT_IS_ADDR_ONLY;
49  payload.local_port = 0;
50  payload.external_port = 0;
51  payload.vrf_id = m_id;
52  payload.external_sw_if_index = ~0;
53  to_bytes(m_inside, payload.local_ip_address);
54  to_bytes(m_outside, payload.external_ip_address);
55
56  VAPI_CALL(req.execute());
57
58  return (wait());
59}
60
61std::string
62create_44_cmd::to_string() const
63{
64  std::ostringstream s;
65  s << "nat-44-static-create: " << m_hw_item.to_string() << " table:" << m_id
66    << " inside:" << m_inside.to_string()
67    << " outside:" << m_outside.to_string();
68
69  return (s.str());
70}
71
72delete_44_cmd::delete_44_cmd(HW::item<bool>& item,
73                             route::table_id_t id,
74                             const boost::asio::ip::address_v4& inside,
75                             const boost::asio::ip::address_v4& outside)
76  : rpc_cmd(item)
77  , m_id(id)
78  , m_inside(inside)
79  , m_outside(outside)
80{
81}
82
83bool
84delete_44_cmd::operator==(const delete_44_cmd& other) const
85{
86  return ((m_id == other.m_id) && (m_inside == other.m_inside) &&
87          (m_outside == other.m_outside));
88}
89
90rc_t
91delete_44_cmd::issue(connection& con)
92{
93  msg_t req(con.ctx(), std::ref(*this));
94
95  auto& payload = req.get_request().get_payload();
96  payload.is_add = 0;
97  payload.flags = NAT_IS_ADDR_ONLY;
98  payload.local_port = 0;
99  payload.external_port = 0;
100  payload.vrf_id = m_id;
101  payload.external_sw_if_index = ~0;
102  to_bytes(m_inside, payload.local_ip_address);
103  to_bytes(m_outside, payload.external_ip_address);
104
105  VAPI_CALL(req.execute());
106
107  wait();
108  m_hw_item.set(rc_t::NOOP);
109
110  return rc_t::OK;
111}
112
113std::string
114delete_44_cmd::to_string() const
115{
116  std::ostringstream s;
117  s << "nat-44-static-delete: " << m_hw_item.to_string() << " table:" << m_id
118    << " inside:" << m_inside.to_string()
119    << " outside:" << m_outside.to_string();
120
121  return (s.str());
122}
123
124bool
125dump_44_cmd::operator==(const dump_44_cmd& other) const
126{
127  return (true);
128}
129
130rc_t
131dump_44_cmd::issue(connection& con)
132{
133  m_dump.reset(new msg_t(con.ctx(), std::ref(*this)));
134
135  VAPI_CALL(m_dump->execute());
136
137  wait();
138
139  return rc_t::OK;
140}
141
142std::string
143dump_44_cmd::to_string() const
144{
145  return ("nat-44-static-dump");
146}
147
148create_66_cmd::create_66_cmd(HW::item<bool>& item,
149                             route::table_id_t id,
150                             const boost::asio::ip::address_v6& inside,
151                             const boost::asio::ip::address_v6& outside)
152  : rpc_cmd(item)
153  , m_id(id)
154  , m_inside(inside)
155  , m_outside(outside)
156{
157}
158
159bool
160create_66_cmd::operator==(const create_66_cmd& other) const
161{
162  return ((m_id == other.m_id) && (m_inside == other.m_inside) &&
163          (m_outside == other.m_outside));
164}
165
166rc_t
167create_66_cmd::issue(connection& con)
168{
169  msg_t req(con.ctx(), std::ref(*this));
170
171  auto& payload = req.get_request().get_payload();
172  payload.is_add = 1;
173  payload.vrf_id = m_id;
174  to_bytes(m_inside, payload.local_ip_address);
175  to_bytes(m_outside, payload.external_ip_address);
176
177  VAPI_CALL(req.execute());
178
179  return (wait());
180}
181
182std::string
183create_66_cmd::to_string() const
184{
185  std::ostringstream s;
186  s << "nat-66-static-create: " << m_hw_item.to_string() << " table:" << m_id
187    << " inside:" << m_inside.to_string()
188    << " outside:" << m_outside.to_string();
189
190  return (s.str());
191}
192
193delete_66_cmd::delete_66_cmd(HW::item<bool>& item,
194                             route::table_id_t id,
195                             const boost::asio::ip::address_v6& inside,
196                             const boost::asio::ip::address_v6& outside)
197  : rpc_cmd(item)
198  , m_id(id)
199  , m_inside(inside)
200  , m_outside(outside)
201{
202}
203
204bool
205delete_66_cmd::operator==(const delete_66_cmd& other) const
206{
207  return ((m_id == other.m_id) && (m_inside == other.m_inside) &&
208          (m_outside == other.m_outside));
209}
210
211rc_t
212delete_66_cmd::issue(connection& con)
213{
214  msg_t req(con.ctx(), std::ref(*this));
215
216  auto& payload = req.get_request().get_payload();
217  payload.is_add = 0;
218  payload.vrf_id = m_id;
219  to_bytes(m_inside, payload.local_ip_address);
220  to_bytes(m_outside, payload.external_ip_address);
221
222  VAPI_CALL(req.execute());
223
224  wait();
225  m_hw_item.set(rc_t::NOOP);
226
227  return rc_t::OK;
228}
229
230std::string
231delete_66_cmd::to_string() const
232{
233  std::ostringstream s;
234  s << "nat-66-static-delete: " << m_hw_item.to_string() << " table:" << m_id
235    << " inside:" << m_inside.to_string()
236    << " outside:" << m_outside.to_string();
237
238  return (s.str());
239}
240
241bool
242dump_66_cmd::operator==(const dump_66_cmd& other) const
243{
244  return (true);
245}
246
247rc_t
248dump_66_cmd::issue(connection& con)
249{
250  m_dump.reset(new msg_t(con.ctx(), std::ref(*this)));
251
252  VAPI_CALL(m_dump->execute());
253
254  wait();
255
256  return rc_t::OK;
257}
258
259std::string
260dump_66_cmd::to_string() const
261{
262  return ("nat-static-dump");
263}
264
265}; // namespace nat_static_cmds
266}; // namespace VOM
267
268/*
269 * fd.io coding-style-patch-verification: ON
270 *
271 * Local Variables:
272 * eval: (c-set-style "mozilla")
273 * End:
274 */
275