blob: 4dad02b911e2904b1441a1a638a46ff531217a35 [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#ifndef __VOM_DUMP_CMD_H__
17#define __VOM_DUMP_CMD_H__
18
19#include <future>
20
21#include "vom/cmd.hpp"
22#include "vom/hw.hpp"
23
24#include <vapi/vapi.hpp>
25
26namespace VOM {
27/**
28 * A function type def for calculating a message's size
29 */
30typedef unsigned int (*get_msg_size_t)(void*);
31
32/**
33 * A base class for VPP dump commands.
34 * Dump commands are one of the sub-set of command types to VPP. Here the
35 * client
36 * makes a read request on the resource and VPP responds with all the
37 * records.
38 * This command is executed synchronously. Once complete the client can
39 * 'pop'
40 * the records from the command object
41 */
42template <typename MSG>
43class dump_cmd : public cmd
44{
45public:
46 typedef MSG msg_t;
47 typedef typename MSG::resp_type record_t;
48
49 typedef typename vapi::Result_set<typename MSG::resp_type>::const_iterator
50 const_iterator;
51
52 /**
53 * Default Constructor
54 */
55 dump_cmd()
56 : cmd()
57 {
58 }
59
60 /**
61 * Destructor
62 */
63 virtual ~dump_cmd() {}
64
Neale Ranns1d781552017-11-27 04:52:35 -080065 dump_cmd(const dump_cmd& d) = default;
66
Neale Ranns020df9a2017-11-25 02:52:06 -080067 /**
68 * Constant iterator to the start of the records retunred during the dump
69 */
70 const_iterator begin()
71 {
72 /*
73 * m_dump is NULL during client UT when the commands are not issued.
74 */
75 if (!m_dump)
76 return const_iterator();
77 return (m_dump->get_result_set().begin());
78 }
Neale Ranns812ed392017-10-16 04:20:13 -070079
Neale Ranns020df9a2017-11-25 02:52:06 -080080 /**
81 * Constant iterator to the end of the records retunred during the dump
82 */
83 const_iterator end()
84 {
85 if (!m_dump)
86 return const_iterator();
87 return (m_dump->get_result_set().end());
88 }
Neale Ranns812ed392017-10-16 04:20:13 -070089
90 /**
91 * Wait for the issue of the command to complete
92 */
93 rc_t wait()
94 {
95 std::future_status status;
96 std::future<rc_t> result;
97
98 result = m_promise.get_future();
99 status = result.wait_for(std::chrono::seconds(5));
100
101 if (status != std::future_status::ready) {
102 return (rc_t::TIMEOUT);
103 }
104
105 return (result.get());
106 }
107
108 /**
109 * Call operator called when the dump is complete
110 */
111 vapi_error_e operator()(MSG& d)
112 {
113 m_promise.set_value(rc_t::OK);
114
115 return (VAPI_OK);
116 }
117
118 /**
119 * Retire/cancel a long running command
120 */
121 virtual void retire(connection& con) {}
122
123protected:
124 /**
125 * The underlying promise that implements the synchornous nature
126 * of the command issue
127 */
128 std::promise<rc_t> m_promise;
129
130 /**
131 * Dump commands should not be issued whilst the HW is disabled
132 */
133 void succeeded() {}
134
135 /**
136 * The HW::cmd_q is a friend so it can call suceedded.
137 */
138 friend class HW::cmd_q;
139
140 /**
141 * The VAPI event registration
142 */
143 std::unique_ptr<MSG> m_dump;
144};
145};
146
147/*
148 * fd.io coding-style-patch-verification: ON
149 *
150 * Local Variables:
151 * eval: (c-set-style "mozilla")
152 * End:
153 */
154
155#endif