diff --git a/include/tdi/common/c_frontend/tdi_table.h b/include/tdi/common/c_frontend/tdi_table.h index 872f2ed..44241fa 100644 --- a/include/tdi/common/c_frontend/tdi_table.h +++ b/include/tdi/common/c_frontend/tdi_table.h @@ -104,6 +104,23 @@ tdi_status_t tdi_table_entry_del(const tdi_table_hdl *table_hdl, const tdi_flags_hdl *flags, const tdi_table_key_hdl *key); +/** + * @brief Reset an entry of the table + * + * @param[in] table_hdl Table object + * @param[in] session Session Object + * @param[in] dev_tgt Device target + * @param[in] flags Call flags + * @param[in] key Entry Key + * + * @return Status of the API call + */ +tdi_status_t tdi_table_entry_reset(const tdi_table_hdl *table_hdl, + const tdi_session_hdl *session, + const tdi_target_hdl *dev_tgt, + const tdi_flags_hdl *flags, + const tdi_table_key_hdl *key); + /** * @brief Clear a table. Delete all entries. This API also resets default * entry if present and is not const default. If table has always present diff --git a/include/tdi/common/tdi_defs.h b/include/tdi/common/tdi_defs.h index b9a8f4f..5f9c35e 100644 --- a/include/tdi/common/tdi_defs.h +++ b/include/tdi/common/tdi_defs.h @@ -89,8 +89,10 @@ enum tdi_table_api_type_e { TDI_TABLE_API_TYPE_KEY_GET = 15, /** Get entry handle from key. */ TDI_TABLE_API_TYPE_HANDLE_GET = 16, + /** Reset. Reset an entry to its default state*/ + TDI_TABLE_API_TYPE_RESET = 17, /** Invalid not supported API. */ - TDI_TABLE_API_TYPE_INVALID_API = 17 + TDI_TABLE_API_TYPE_INVALID_API = 18 }; // The same name can be used with or without enum keyword. Advantage of being // compatible with C++ diff --git a/include/tdi/common/tdi_table.hpp b/include/tdi/common/tdi_table.hpp index 72ac5c1..d3ab654 100644 --- a/include/tdi/common/tdi_table.hpp +++ b/include/tdi/common/tdi_table.hpp @@ -115,6 +115,21 @@ class Table { const tdi::Flags &flags, const tdi::TableKey &key) const; + /** + * @brief Delete an entry of the table + * + * @param[in] session Session Object + * @param[in] dev_tgt Device target + * @param[in] flags Call flags + * @param[in] key Entry Key + * + * @return Status of the API call + */ + virtual tdi_status_t entryReset(const tdi::Session &session, + const tdi::Target &dev_tgt, + const tdi::Flags &flags, + const tdi::TableKey &key) const; + /** * @brief Clear a table. Delete all entries. This API also resets default * entry if present and is not const default. If table has always present diff --git a/src/c_frontend/tdi_table_c.cpp b/src/c_frontend/tdi_table_c.cpp index 28429dc..0013afb 100644 --- a/src/c_frontend/tdi_table_c.cpp +++ b/src/c_frontend/tdi_table_c.cpp @@ -86,6 +86,18 @@ tdi_status_t tdi_table_entry_del(const tdi_table_hdl *table_hdl, *reinterpret_cast(key)); } +tdi_status_t tdi_table_entry_reset(const tdi_table_hdl *table_hdl, + const tdi_session_hdl *session, + const tdi_target_hdl *target, + const tdi_flags_hdl *flags, + const tdi_table_key_hdl *key) { + auto table = reinterpret_cast(table_hdl); + return table->entryReset(*reinterpret_cast(session), + *reinterpret_cast(target), + *reinterpret_cast(flags), + *reinterpret_cast(key)); +} + tdi_status_t tdi_table_clear(const tdi_table_hdl *table_hdl, const tdi_session_hdl *session, const tdi_target_hdl *target, diff --git a/src/tdi_table.cpp b/src/tdi_table.cpp index 94778ce..be2e539 100644 --- a/src/tdi_table.cpp +++ b/src/tdi_table.cpp @@ -57,6 +57,17 @@ tdi_status_t Table::entryDel(const Session & /*session*/, return TDI_NOT_SUPPORTED; } +tdi_status_t Table::entryReset(const Session & /*session*/, + const Target & /*dev_tgt*/, + const Flags & /*flags*/, + const TableKey & /*key*/) const { + LOG_ERROR("%s:%d %s ERROR : Table entry Reset not supported", + __func__, + __LINE__, + tableInfoGet()->nameGet().c_str()); + return TDI_NOT_SUPPORTED; +} + tdi_status_t Table::clear(const Session & /*session*/, const Target & /*dev_tgt*/, const Flags & /*flags*/) const { diff --git a/tdi_python/tdiTable.py b/tdi_python/tdiTable.py index 6cdbe09..5cb0bdb 100644 --- a/tdi_python/tdiTable.py +++ b/tdi_python/tdiTable.py @@ -1506,7 +1506,40 @@ def del_entry(self, key_content, entry_handle=None): if sts != 0: raise TdiTableError("Error: table_entry_delete failed on table {}. [{}]".format(self.name, self._cintf.err_str(sts)), self, sts) - def get_entry(self, key_content, from_hw=False, print_entry=True, key_handle=None, entry_handle=None, dev_tgt=None): + def reset_entry(self, key_content, entry_handle=None): + if entry_handle != None and "get_by_handle" not in self.supported_commands: + raise TdiTableError("{} Error: reseting entry by handle not supported.".format(self.name), self, -1) + + key_handle = None + #entry_tgt = byref(self._cintf.BfDevTgt(0, 0, 0, 0)) + entry_tgt = self._cintf.get_dev_tgt() + if entry_handle != None: + key_handle = self._cintf.handle_type() + sts = self._cintf.get_driver().tdi_table_key_allocate(self._handle, byref(key_handle)) + if sts != 0: + raise TdiTableError("CLI Error: table key allocate failed. [{}].".format(self._cintf.err_str(sts)), self, sts) + sts = self._cintf.tdi_table_entry_key_get(self._handle, + self._cintf.get_session(), + self._cintf.get_dev_tgt(), + entry_handle, + entry_tgt, + key_handle) + if sts != 0: + raise TdiTableError("Error: table_entry_reset failed on table {}. [{}]".format(self.name, self._cintf.err_str(sts)), self, sts) + else: + key_handle = self._make_call_keys(key_content) + if key_handle == -1: + return -1 + entry_tgt = self._cintf.get_dev_tgt() + sts = self._cintf.tdi_table_entry_reset(self._handle, + self._cintf.get_session(), + entry_tgt, + key_handle) + self._cintf.get_driver().tdi_table_key_deallocate(key_handle) + if sts != 0: + raise TdiTableError("Error: table_entry_reset failed on table {}. [{}]".format(self.name, self._cintf.err_str(sts)), self, sts) + + def get_entry(self, key_content, from_hw=False, print_entry=True, key_handle=None, entry_handle=None): is_key_set = False if key_handle==None else True if dev_tgt == None: dev_tgt = self._cintf.get_dev_tgt() diff --git a/tdi_python/tdicli.py b/tdi_python/tdicli.py index 329d7fe..fe75b7b 100644 --- a/tdi_python/tdicli.py +++ b/tdi_python/tdicli.py @@ -141,6 +141,11 @@ def tdi_table_entry_del(tbl_hdl, session, dev_tgt, key): return self._driver.tdi_table_entry_del(tbl_hdl, session, dev_tgt, flags, key) setattr(self, 'tdi_table_entry_del', tdi_table_entry_del) + def tdi_table_entry_reset(tbl_hdl, session, dev_tgt, key): + flags = self.get_flags() + return self._driver.tdi_table_entry_reset(tbl_hdl, session, dev_tgt, flags, key) + setattr(self, 'tdi_table_entry_reset', tdi_table_entry_reset) + def tdi_table_entry_add(tbl_hdl, session, dev_tgt, flags, key, data): return self._driver.tdi_table_entry_add(tbl_hdl, session, dev_tgt, flags, key, data) setattr(self, 'tdi_table_entry_add', tdi_table_entry_add)