1812ed39fSNeale Ranns/*
2812ed39fSNeale Ranns * Copyright (c) 2017 Cisco and/or its affiliates.
3812ed39fSNeale Ranns * Licensed under the Apache License, Version 2.0 (the "License");
4812ed39fSNeale Ranns * you may not use this file except in compliance with the License.
5812ed39fSNeale Ranns * You may obtain a copy of the License at:
6812ed39fSNeale Ranns *
7812ed39fSNeale Ranns *     http://www.apache.org/licenses/LICENSE-2.0
8812ed39fSNeale Ranns *
9812ed39fSNeale Ranns * Unless required by applicable law or agreed to in writing, software
10812ed39fSNeale Ranns * distributed under the License is distributed on an "AS IS" BASIS,
11812ed39fSNeale Ranns * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12812ed39fSNeale Ranns * See the License for the specific language governing permissions and
13812ed39fSNeale Ranns * limitations under the License.
14812ed39fSNeale Ranns */
15812ed39fSNeale Ranns
169ef1c0adSNeale Ranns#include "vom/nat_static_cmds.hpp"
17812ed39fSNeale Ranns
18812ed39fSNeale RannsDEFINE_VAPI_MSG_IDS_NAT_API_JSON;
19812ed39fSNeale Ranns
20812ed39fSNeale Rannsnamespace VOM {
219ef1c0adSNeale Rannsnamespace nat_static_cmds {
229ef1c0adSNeale Ranns
239ef1c0adSNeale Rannscreate_44_cmd::create_44_cmd(HW::item<bool>& item,
249ef1c0adSNeale Ranns                             route::table_id_t id,
259ef1c0adSNeale Ranns                             const boost::asio::ip::address_v4& inside,
269ef1c0adSNeale Ranns                             const boost::asio::ip::address_v4& outside)
27812ed39fSNeale Ranns  : rpc_cmd(item)
28812ed39fSNeale Ranns  , m_id(id)
29812ed39fSNeale Ranns  , m_inside(inside)
30812ed39fSNeale Ranns  , m_outside(outside)
31812ed39fSNeale Ranns{
32812ed39fSNeale Ranns}
33812ed39fSNeale Ranns
34812ed39fSNeale Rannsbool
359ef1c0adSNeale Rannscreate_44_cmd::operator==(const create_44_cmd& other) const
36812ed39fSNeale Ranns{
37812ed39fSNeale Ranns  return ((m_id == other.m_id) && (m_inside == other.m_inside) &&
38812ed39fSNeale Ranns          (m_outside == other.m_outside));
39812ed39fSNeale Ranns}
40812ed39fSNeale Ranns
41812ed39fSNeale Rannsrc_t
429ef1c0adSNeale Rannscreate_44_cmd::issue(connection& con)
43812ed39fSNeale Ranns{
44812ed39fSNeale Ranns  msg_t req(con.ctx(), std::ref(*this));
45812ed39fSNeale Ranns
46812ed39fSNeale Ranns  auto& payload = req.get_request().get_payload();
47812ed39fSNeale Ranns  payload.is_add = 1;
48dd1e3e78SFilip Varga  payload.flags = NAT_IS_ADDR_ONLY;
49812ed39fSNeale Ranns  payload.local_port = 0;
50812ed39fSNeale Ranns  payload.external_port = 0;
51812ed39fSNeale Ranns  payload.vrf_id = m_id;
52812ed39fSNeale Ranns  payload.external_sw_if_index = ~0;
53812ed39fSNeale Ranns  to_bytes(m_inside, payload.local_ip_address);
54812ed39fSNeale Ranns  to_bytes(m_outside, payload.external_ip_address);
55812ed39fSNeale Ranns
56812ed39fSNeale Ranns  VAPI_CALL(req.execute());
57812ed39fSNeale Ranns
58208c29aaSNeale Ranns  return (wait());
59812ed39fSNeale Ranns}
60812ed39fSNeale Ranns
61812ed39fSNeale Rannsstd::string
629ef1c0adSNeale Rannscreate_44_cmd::to_string() const
63812ed39fSNeale Ranns{
64812ed39fSNeale Ranns  std::ostringstream s;
65812ed39fSNeale Ranns  s << "nat-44-static-create: " << m_hw_item.to_string() << " table:" << m_id
66812ed39fSNeale Ranns    << " inside:" << m_inside.to_string()
67812ed39fSNeale Ranns    << " outside:" << m_outside.to_string();
68812ed39fSNeale Ranns
69812ed39fSNeale Ranns  return (s.str());
70812ed39fSNeale Ranns}
71812ed39fSNeale Ranns
729ef1c0adSNeale Rannsdelete_44_cmd::delete_44_cmd(HW::item<bool>& item,
739ef1c0adSNeale Ranns                             route::table_id_t id,
749ef1c0adSNeale Ranns                             const boost::asio::ip::address_v4& inside,
759ef1c0adSNeale Ranns                             const boost::asio::ip::address_v4& outside)
76812ed39fSNeale Ranns  : rpc_cmd(item)
77812ed39fSNeale Ranns  , m_id(id)
78812ed39fSNeale Ranns  , m_inside(inside)
79812ed39fSNeale Ranns  , m_outside(outside)
80812ed39fSNeale Ranns{
81812ed39fSNeale Ranns}
82812ed39fSNeale Ranns
83812ed39fSNeale Rannsbool
849ef1c0adSNeale Rannsdelete_44_cmd::operator==(const delete_44_cmd& other) const
85812ed39fSNeale Ranns{
86812ed39fSNeale Ranns  return ((m_id == other.m_id) && (m_inside == other.m_inside) &&
87812ed39fSNeale Ranns          (m_outside == other.m_outside));
88812ed39fSNeale Ranns}
89812ed39fSNeale Ranns
90812ed39fSNeale Rannsrc_t
919ef1c0adSNeale Rannsdelete_44_cmd::issue(connection& con)
92812ed39fSNeale Ranns{
93812ed39fSNeale Ranns  msg_t req(con.ctx(), std::ref(*this));
94812ed39fSNeale Ranns
95812ed39fSNeale Ranns  auto& payload = req.get_request().get_payload();
96812ed39fSNeale Ranns  payload.is_add = 0;
97dd1e3e78SFilip Varga  payload.flags = NAT_IS_ADDR_ONLY;
98812ed39fSNeale Ranns  payload.local_port = 0;
99812ed39fSNeale Ranns  payload.external_port = 0;
100812ed39fSNeale Ranns  payload.vrf_id = m_id;
101812ed39fSNeale Ranns  payload.external_sw_if_index = ~0;
102812ed39fSNeale Ranns  to_bytes(m_inside, payload.local_ip_address);
103812ed39fSNeale Ranns  to_bytes(m_outside, payload.external_ip_address);
104812ed39fSNeale Ranns
105812ed39fSNeale Ranns  VAPI_CALL(req.execute());
106812ed39fSNeale Ranns
107812ed39fSNeale Ranns  wait();
108812ed39fSNeale Ranns  m_hw_item.set(rc_t::NOOP);
109812ed39fSNeale Ranns
110812ed39fSNeale Ranns  return rc_t::OK;
111812ed39fSNeale Ranns}
112812ed39fSNeale Ranns
113812ed39fSNeale Rannsstd::string
1149ef1c0adSNeale Rannsdelete_44_cmd::to_string() const
115812ed39fSNeale Ranns{
116812ed39fSNeale Ranns  std::ostringstream s;
117812ed39fSNeale Ranns  s << "nat-44-static-delete: " << m_hw_item.to_string() << " table:" << m_id
118812ed39fSNeale Ranns    << " inside:" << m_inside.to_string()
119812ed39fSNeale Ranns    << " outside:" << m_outside.to_string();
120812ed39fSNeale Ranns
121812ed39fSNeale Ranns  return (s.str());
122812ed39fSNeale Ranns}
123812ed39fSNeale Ranns
124812ed39fSNeale Rannsbool
1259ef1c0adSNeale Rannsdump_44_cmd::operator==(const dump_44_cmd& other) const
126812ed39fSNeale Ranns{
127812ed39fSNeale Ranns  return (true);
128812ed39fSNeale Ranns}
129812ed39fSNeale Ranns
130812ed39fSNeale Rannsrc_t
1319ef1c0adSNeale Rannsdump_44_cmd::issue(connection& con)
132812ed39fSNeale Ranns{
133812ed39fSNeale Ranns  m_dump.reset(new msg_t(con.ctx(), std::ref(*this)));
134812ed39fSNeale Ranns
135812ed39fSNeale Ranns  VAPI_CALL(m_dump->execute());
136812ed39fSNeale Ranns
137812ed39fSNeale Ranns  wait();
138812ed39fSNeale Ranns
139812ed39fSNeale Ranns  return rc_t::OK;
140812ed39fSNeale Ranns}
141812ed39fSNeale Ranns
142812ed39fSNeale Rannsstd::string
1439ef1c0adSNeale Rannsdump_44_cmd::to_string() const
14425b04948SNeale Ranns{
14525b04948SNeale Ranns  return ("nat-44-static-dump");
14625b04948SNeale Ranns}
14725b04948SNeale Ranns
14825b04948SNeale Rannscreate_66_cmd::create_66_cmd(HW::item<bool>& item,
14925b04948SNeale Ranns                             route::table_id_t id,
15025b04948SNeale Ranns                             const boost::asio::ip::address_v6& inside,
15125b04948SNeale Ranns                             const boost::asio::ip::address_v6& outside)
15225b04948SNeale Ranns  : rpc_cmd(item)
15325b04948SNeale Ranns  , m_id(id)
15425b04948SNeale Ranns  , m_inside(inside)
15525b04948SNeale Ranns  , m_outside(outside)
15625b04948SNeale Ranns{
15725b04948SNeale Ranns}
15825b04948SNeale Ranns
15925b04948SNeale Rannsbool
16025b04948SNeale Rannscreate_66_cmd::operator==(const create_66_cmd& other) const
16125b04948SNeale Ranns{
16225b04948SNeale Ranns  return ((m_id == other.m_id) && (m_inside == other.m_inside) &&
16325b04948SNeale Ranns          (m_outside == other.m_outside));
16425b04948SNeale Ranns}
16525b04948SNeale Ranns
16625b04948SNeale Rannsrc_t
16725b04948SNeale Rannscreate_66_cmd::issue(connection& con)
16825b04948SNeale Ranns{
16925b04948SNeale Ranns  msg_t req(con.ctx(), std::ref(*this));
17025b04948SNeale Ranns
17125b04948SNeale Ranns  auto& payload = req.get_request().get_payload();
17225b04948SNeale Ranns  payload.is_add = 1;
17325b04948SNeale Ranns  payload.vrf_id = m_id;
17425b04948SNeale Ranns  to_bytes(m_inside, payload.local_ip_address);
17525b04948SNeale Ranns  to_bytes(m_outside, payload.external_ip_address);
17625b04948SNeale Ranns
17725b04948SNeale Ranns  VAPI_CALL(req.execute());
17825b04948SNeale Ranns
179208c29aaSNeale Ranns  return (wait());
18025b04948SNeale Ranns}
18125b04948SNeale Ranns
18225b04948SNeale Rannsstd::string
18325b04948SNeale Rannscreate_66_cmd::to_string() const
18425b04948SNeale Ranns{
18525b04948SNeale Ranns  std::ostringstream s;
18625b04948SNeale Ranns  s << "nat-66-static-create: " << m_hw_item.to_string() << " table:" << m_id
18725b04948SNeale Ranns    << " inside:" << m_inside.to_string()
18825b04948SNeale Ranns    << " outside:" << m_outside.to_string();
18925b04948SNeale Ranns
19025b04948SNeale Ranns  return (s.str());
19125b04948SNeale Ranns}
19225b04948SNeale Ranns
19325b04948SNeale Rannsdelete_66_cmd::delete_66_cmd(HW::item<bool>& item,
19425b04948SNeale Ranns                             route::table_id_t id,
19525b04948SNeale Ranns                             const boost::asio::ip::address_v6& inside,
19625b04948SNeale Ranns                             const boost::asio::ip::address_v6& outside)
19725b04948SNeale Ranns  : rpc_cmd(item)
19825b04948SNeale Ranns  , m_id(id)
19925b04948SNeale Ranns  , m_inside(inside)
20025b04948SNeale Ranns  , m_outside(outside)
20125b04948SNeale Ranns{
20225b04948SNeale Ranns}
20325b04948SNeale Ranns
20425b04948SNeale Rannsbool
20525b04948SNeale Rannsdelete_66_cmd::operator==(const delete_66_cmd& other) const
20625b04948SNeale Ranns{
20725b04948SNeale Ranns  return ((m_id == other.m_id) && (m_inside == other.m_inside) &&
20825b04948SNeale Ranns          (m_outside == other.m_outside));
20925b04948SNeale Ranns}
21025b04948SNeale Ranns
21125b04948SNeale Rannsrc_t
21225b04948SNeale Rannsdelete_66_cmd::issue(connection& con)
21325b04948SNeale Ranns{
21425b04948SNeale Ranns  msg_t req(con.ctx(), std::ref(*this));
21525b04948SNeale Ranns
21625b04948SNeale Ranns  auto& payload = req.get_request().get_payload();
21725b04948SNeale Ranns  payload.is_add = 0;
21825b04948SNeale Ranns  payload.vrf_id = m_id;
21925b04948SNeale Ranns  to_bytes(m_inside, payload.local_ip_address);
22025b04948SNeale Ranns  to_bytes(m_outside, payload.external_ip_address);
22125b04948SNeale Ranns
22225b04948SNeale Ranns  VAPI_CALL(req.execute());
22325b04948SNeale Ranns
22425b04948SNeale Ranns  wait();
22525b04948SNeale Ranns  m_hw_item.set(rc_t::NOOP);
22625b04948SNeale Ranns
22725b04948SNeale Ranns  return rc_t::OK;
22825b04948SNeale Ranns}
22925b04948SNeale Ranns
23025b04948SNeale Rannsstd::string
23125b04948SNeale Rannsdelete_66_cmd::to_string() const
23225b04948SNeale Ranns{
23325b04948SNeale Ranns  std::ostringstream s;
23425b04948SNeale Ranns  s << "nat-66-static-delete: " << m_hw_item.to_string() << " table:" << m_id
23525b04948SNeale Ranns    << " inside:" << m_inside.to_string()
23625b04948SNeale Ranns    << " outside:" << m_outside.to_string();
23725b04948SNeale Ranns
23825b04948SNeale Ranns  return (s.str());
23925b04948SNeale Ranns}
24025b04948SNeale Ranns
24125b04948SNeale Rannsbool
24225b04948SNeale Rannsdump_66_cmd::operator==(const dump_66_cmd& other) const
24325b04948SNeale Ranns{
24425b04948SNeale Ranns  return (true);
24525b04948SNeale Ranns}
24625b04948SNeale Ranns
24725b04948SNeale Rannsrc_t
24825b04948SNeale Rannsdump_66_cmd::issue(connection& con)
24925b04948SNeale Ranns{
25025b04948SNeale Ranns  m_dump.reset(new msg_t(con.ctx(), std::ref(*this)));
25125b04948SNeale Ranns
25225b04948SNeale Ranns  VAPI_CALL(m_dump->execute());
25325b04948SNeale Ranns
25425b04948SNeale Ranns  wait();
25525b04948SNeale Ranns
25625b04948SNeale Ranns  return rc_t::OK;
25725b04948SNeale Ranns}
25825b04948SNeale Ranns
25925b04948SNeale Rannsstd::string
26025b04948SNeale Rannsdump_66_cmd::to_string() const
261812ed39fSNeale Ranns{
262812ed39fSNeale Ranns  return ("nat-static-dump");
263812ed39fSNeale Ranns}
264041fa507SNeale Ranns
265041fa507SNeale Ranns}; // namespace nat_static_cmds
266041fa507SNeale Ranns}; // namespace VOM
267812ed39fSNeale Ranns
268812ed39fSNeale Ranns/*
269812ed39fSNeale Ranns * fd.io coding-style-patch-verification: ON
270812ed39fSNeale Ranns *
271812ed39fSNeale Ranns * Local Variables:
272812ed39fSNeale Ranns * eval: (c-set-style "mozilla")
273812ed39fSNeale Ranns * End:
274812ed39fSNeale Ranns */
275