diff options
Diffstat (limited to 'agent/snmpvars.hpp')
-rw-r--r-- | agent/snmpvars.hpp | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/agent/snmpvars.hpp b/agent/snmpvars.hpp new file mode 100644 index 0000000..67cfa17 --- /dev/null +++ b/agent/snmpvars.hpp @@ -0,0 +1,121 @@ +/** + * @brief netsnmp_variable_list C++ wrapper. + * + * This file is part of sila-snmp project. + * + * Copyright (c) 2022 SILA + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#pragma once + +namespace phosphor +{ +namespace snmp +{ +namespace agent +{ + +/** + * @brief SNMP representation of boolean type. + */ +enum class TruthValue : int +{ + True = 1, + False = 2, +}; + +#define SNMPBOOL(value) \ + static_cast<int>(value ? TruthValue::True : TruthValue::False) + +struct VariableList +{ + /** + * @brief Fill snmp field with string value. + */ + static void set(netsnmp_variable_list* var, const std::string& value) + { + snmp_set_var_typed_value(var, ASN_OCTET_STR, value.c_str(), + value.length()); + } + + /** + * @brief Fill snmp field with boolean value. + */ + static void set(netsnmp_variable_list* var, bool value) + { + snmp_set_var_typed_integer(var, ASN_INTEGER, SNMPBOOL(value)); + } + + /** + * @brief Fill snmp field with integral value. + */ + template <typename T> static void set(netsnmp_variable_list* var, T&& value) + { + snmp_set_var_typed_integer(var, ASN_INTEGER, value); + } + + /** + * @brief Add string as field into snmp variables list. + * + * @param vars - Pointer to snmp variables list + * @param field_oid - field OID + * @param field_oid_len - length of field OID + * @param field_value - field value + */ + static void add(netsnmp_variable_list* vars, const oid* field_oid, + size_t field_oid_len, const std::string& field_value) + { + snmp_varlist_add_variable( + &vars, field_oid, field_oid_len, ASN_OCTET_STR, + reinterpret_cast<const u_char*>(field_value.data()), + field_value.length()); + } + + /** + * @brief Add boolean as field into snmp variables list. + * + * @param vars - Pointer to snmp variables list + * @param field_oid - field OID + * @param field_oid_len - length of field OID + * @param field_value - field value + */ + static void add(netsnmp_variable_list* vars, const oid* field_oid, + size_t field_oid_len, bool field_value) + { + auto v = SNMPBOOL(field_value); + snmp_varlist_add_variable(&vars, field_oid, field_oid_len, ASN_INTEGER, + &v, sizeof(v)); + } + /** + * @brief Add value of integral type as field into snmp variables list. + * + * @param vars - Pointer to snmp variables list + * @param field_oid - field OID + * @param field_oid_len - length of field OID + * @param field_value - field value + */ + template <typename T> + static void add(netsnmp_variable_list* vars, const oid* field_oid, + size_t field_oid_len, T&& field_value) + { + snmp_varlist_add_variable(&vars, field_oid, field_oid_len, ASN_INTEGER, + reinterpret_cast<const u_char*>(&field_value), + sizeof(field_value)); + } +}; + +} // namespace agent +} // namespace snmp +} // namespace phosphor |