49 #ifndef BM_BM_SIM_CONTEXT_H_
50 #define BM_BM_SIM_CONTEXT_H_
59 #include <unordered_map>
63 #include "P4Objects.h"
64 #include "action_profile.h"
65 #include "match_tables.h"
66 #include "runtime_interface.h"
68 #include "device_id.h"
77 : lock(std::move(lock)), instance(instance) { }
80 ExternType *
get()
const {
return instance; }
83 boost::shared_lock<boost::shared_mutex> lock;
94 using mbr_hdl_t = RuntimeInterface::mbr_hdl_t;
95 using grp_hdl_t = RuntimeInterface::grp_hdl_t;
97 using MeterErrorCode = RuntimeInterface::MeterErrorCode;
98 using RegisterErrorCode = RuntimeInterface::RegisterErrorCode;
100 using ErrorCode = RuntimeInterface::ErrorCode;
112 std::shared_ptr<void> ptr_ = std::static_pointer_cast<void>(ptr);
113 const auto &r = components.insert({std::type_index(
typeid(T)), ptr_});
121 const auto &search = components.find(std::type_index(
typeid(T)));
122 if (search == components.end())
return nullptr;
123 return std::static_pointer_cast<T>(search->second);
132 return p4objects->get_pipeline_rt(name);
138 return p4objects->get_parser_rt(name);
144 return p4objects->get_deparser_rt(name);
150 return p4objects->get_field_list(field_list_id);
159 p4object_id_t get_table_id(
const std::string &name) {
160 return p4objects->get_match_action_table(name)->get_id();
163 p4object_id_t get_action_id(
const std::string &table_name,
164 const std::string &action_name) {
165 return p4objects->get_action(table_name, action_name)->get_id();
172 mt_get_num_entries(
const std::string &table_name,
size_t *num_entries)
const;
175 mt_clear_entries(
const std::string &table_name,
bool reset_default_entry);
178 mt_add_entry(
const std::string &table_name,
179 const std::vector<MatchKeyParam> &match_key,
180 const std::string &action_name,
181 ActionData action_data,
182 entry_handle_t *handle,
186 mt_set_default_action(
const std::string &table_name,
187 const std::string &action_name,
188 ActionData action_data);
191 mt_reset_default_entry(
const std::string &table_name);
194 mt_delete_entry(
const std::string &table_name,
195 entry_handle_t handle);
198 mt_modify_entry(
const std::string &table_name,
199 entry_handle_t handle,
200 const std::string &action_name,
201 ActionData action_data);
204 mt_set_entry_ttl(
const std::string &table_name,
205 entry_handle_t handle,
206 unsigned int ttl_ms);
211 mt_act_prof_add_member(
const std::string &act_prof_name,
212 const std::string &action_name,
213 ActionData action_data, mbr_hdl_t *mbr);
216 mt_act_prof_delete_member(
const std::string &act_prof_name, mbr_hdl_t mbr);
219 mt_act_prof_modify_member(
const std::string &act_prof_name, mbr_hdl_t mbr,
220 const std::string &action_name,
221 ActionData action_data);
224 mt_act_prof_create_group(
const std::string &act_prof_name, grp_hdl_t *grp);
227 mt_act_prof_delete_group(
const std::string &act_prof_name, grp_hdl_t grp);
230 mt_act_prof_add_member_to_group(
const std::string &act_prof_name,
231 mbr_hdl_t mbr, grp_hdl_t grp);
234 mt_act_prof_remove_member_from_group(
const std::string &act_prof_name,
235 mbr_hdl_t mbr, grp_hdl_t grp);
237 std::vector<ActionProfile::Member>
238 mt_act_prof_get_members(
const std::string &act_prof_name)
const;
241 mt_act_prof_get_member(
const std::string &act_prof_name, grp_hdl_t grp,
242 ActionProfile::Member *member)
const;
244 std::vector<ActionProfile::Group>
245 mt_act_prof_get_groups(
const std::string &act_prof_name)
const;
248 mt_act_prof_get_group(
const std::string &act_prof_name, grp_hdl_t grp,
249 ActionProfile::Group *group)
const;
254 mt_indirect_add_entry(
const std::string &table_name,
255 const std::vector<MatchKeyParam> &match_key,
257 entry_handle_t *handle,
261 mt_indirect_modify_entry(
const std::string &table_name,
262 entry_handle_t handle,
266 mt_indirect_delete_entry(
const std::string &table_name,
267 entry_handle_t handle);
270 mt_indirect_set_entry_ttl(
const std::string &table_name,
271 entry_handle_t handle,
272 unsigned int ttl_ms);
275 mt_indirect_set_default_member(
const std::string &table_name,
279 mt_indirect_reset_default_entry(
const std::string &table_name);
282 mt_indirect_ws_add_entry(
const std::string &table_name,
283 const std::vector<MatchKeyParam> &match_key,
285 entry_handle_t *handle,
289 mt_indirect_ws_modify_entry(
const std::string &table_name,
290 entry_handle_t handle,
294 mt_indirect_ws_set_default_group(
const std::string &table_name,
298 mt_get_type(
const std::string &table_name)
const;
300 template <
typename T>
301 std::vector<typename T::Entry>
302 mt_get_entries(
const std::string &table_name)
const;
304 template <
typename T>
306 mt_get_entry(
const std::string &table_name, entry_handle_t handle,
307 typename T::Entry *entry)
const;
309 template <
typename T>
311 mt_get_default_entry(
const std::string &table_name,
312 typename T::Entry *default_entry)
const;
314 template <
typename T>
316 mt_get_entry_from_key(
const std::string &table_name,
317 const std::vector<MatchKeyParam> &match_key,
318 typename T::Entry *entry,
319 int priority = 1)
const;
322 mt_read_counters(
const std::string &table_name,
323 entry_handle_t handle,
324 MatchTableAbstract::counter_value_t *bytes,
325 MatchTableAbstract::counter_value_t *packets);
328 mt_reset_counters(
const std::string &table_name);
331 mt_write_counters(
const std::string &table_name,
332 entry_handle_t handle,
333 MatchTableAbstract::counter_value_t bytes,
334 MatchTableAbstract::counter_value_t packets);
337 mt_set_meter_rates(
const std::string &table_name, entry_handle_t handle,
338 const std::vector<Meter::rate_config_t> &configs);
341 mt_get_meter_rates(
const std::string &table_name, entry_handle_t handle,
342 std::vector<Meter::rate_config_t> *configs);
345 mt_reset_meter_rates(
const std::string &table_name, entry_handle_t handle);
347 Counter::CounterErrorCode
348 read_counters(
const std::string &counter_name,
350 MatchTableAbstract::counter_value_t *bytes,
351 MatchTableAbstract::counter_value_t *packets);
353 Counter::CounterErrorCode
354 reset_counters(
const std::string &counter_name);
356 Counter::CounterErrorCode
357 write_counters(
const std::string &counter_name,
359 MatchTableAbstract::counter_value_t bytes,
360 MatchTableAbstract::counter_value_t packets);
363 meter_array_set_rates(
364 const std::string &meter_name,
365 const std::vector<Meter::rate_config_t> &configs);
368 meter_set_rates(
const std::string &meter_name,
size_t idx,
369 const std::vector<Meter::rate_config_t> &configs);
372 meter_get_rates(
const std::string &meter_name,
size_t idx,
373 std::vector<Meter::rate_config_t> *configs);
376 meter_reset_rates(
const std::string &meter_name,
size_t idx);
379 register_read(
const std::string ®ister_name,
380 const size_t idx, Data *value);
383 register_read_all(
const std::string ®ister_name);
386 register_write(
const std::string ®ister_name,
387 const size_t idx, Data value);
390 register_write_range(
const std::string ®ister_name,
391 const size_t start,
const size_t end, Data value);
394 register_reset(
const std::string ®ister_name);
397 parse_vset_add(
const std::string &parse_vset_name,
398 const ByteContainer &value);
401 parse_vset_remove(
const std::string &parse_vset_name,
402 const ByteContainer &value);
405 parse_vset_get(
const std::string &parse_vset_name,
406 std::vector<ByteContainer> *values);
409 parse_vset_clear(
const std::string &parse_vset_name);
411 P4Objects::IdLookupErrorCode p4objects_id_from_name(
412 P4Objects::ResourceType type,
const std::string &name,
413 p4object_id_t *
id)
const;
415 template <
typename T>
417 set_crc_custom_parameters(
418 const std::string &calc_name,
419 const typename CustomCrcMgr<T>::crc_config_t &crc_config);
423 const std::string &calc_name,
424 const ToeplitzMgr::key_t &key);
426 bool set_group_selector(
427 const std::string &act_prof_name,
428 std::shared_ptr<ActionProfile::GroupSelectionIface> selector);
432 using ReadLock = std::unique_lock<std::mutex>;
433 using WriteLock = std::unique_lock<std::mutex>;
435 Context(
const Context &other) =
delete;
436 Context &operator=(
const Context &other) =
delete;
440 NEW_CONFIG_LOADED = 0,
446 MatchErrorCode get_mt_indirect(
const std::string &table_name,
447 MatchTableIndirect **table)
const;
448 MatchErrorCode get_mt_indirect_ws(
const std::string &table_name,
449 MatchTableIndirectWS **table)
const;
451 bool field_exists(
const std::string &header_name,
452 const std::string &field_name)
const {
453 return p4objects->field_exists(header_name, field_name);
456 PHVFactory &get_phv_factory();
458 LearnEngineIface *get_learn_engine();
460 AgeingMonitorIface *get_ageing_monitor();
462 void set_notifications_transport(std::shared_ptr<TransportIface> transport);
464 void set_device_id(device_id_t device_id);
466 void set_cxt_id(cxt_id_t cxt_id);
468 void set_force_arith(
bool force_arith);
470 using header_field_pair = P4Objects::header_field_pair;
471 using ForceArith = P4Objects::ForceArith;
472 int init_objects(std::istream *is,
473 LookupStructureFactory * lookup_factory,
474 const std::set<header_field_pair> &required_fields =
475 std::set<header_field_pair>(),
476 const ForceArith &arith_objects = ForceArith());
478 ErrorCode load_new_config(
480 LookupStructureFactory * lookup_factory,
481 const std::set<header_field_pair> &required_fields =
482 std::set<header_field_pair>(),
483 const ForceArith &arith_objects = ForceArith());
485 ErrorCode swap_configs();
487 ErrorCode reset_state();
489 ErrorCode serialize(std::ostream *out);
490 ErrorCode deserialize(std::istream *in);
494 int swap_requested() {
return swap_ordered; }
504 void send_swap_status_notification(SwapStatus status);
509 device_id_t device_id{0};
511 std::shared_ptr<P4Objects> p4objects{
nullptr};
512 std::shared_ptr<P4Objects> p4objects_rt{
nullptr};
514 std::unordered_map<std::type_index, std::shared_ptr<void> > components{};
516 std::shared_ptr<TransportIface> notifications_transport{
nullptr};
518 mutable boost::shared_mutex request_mutex{};
520 std::atomic<bool> swap_ordered{
false};
522 bool force_arith{
false};
527 #endif // BM_BM_SIM_CONTEXT_H_