From 946a8eef184c32ad69b734056050f331ef579e29 Mon Sep 17 00:00:00 2001 From: Jeffrey Townsend Date: Sat, 12 Jan 2019 21:53:46 +0000 Subject: [PATCH] Various API fixups and enhancements. --- .../any/onlp/src/onlp/module/inc/onlp/fan.h | 17 +- .../any/onlp/src/onlp/module/inc/onlp/led.h | 7 + .../src/onlp/module/inc/onlp/platformi/fani.h | 11 +- .../src/onlp/module/inc/onlp/platformi/ledi.h | 7 + .../any/onlp/src/onlp/module/src/attribute.c | 14 +- .../base/any/onlp/src/onlp/module/src/fan.c | 107 ++++-- .../base/any/onlp/src/onlp/module/src/led.c | 78 ++--- .../onlp/src/onlp/module/src/onlp_module.c | 23 ++ .../any/onlp/src/onlp/module/src/onlp_ucli.c | 331 ++++++++++++++---- .../base/any/onlp/src/onlp/module/src/psu.c | 23 +- .../base/any/onlp/src/onlp/module/src/sfp.c | 8 +- .../onlp_platform_defaults/module/src/fani.c | 28 +- .../onlp_platform_defaults/module/src/ledi.c | 28 +- .../onlp_platform_defaults/module/src/psui.c | 15 +- .../module/src/thermali.c | 14 +- .../src/onlplib/module/inc/onlplib/file.h | 9 + .../any/onlp/src/onlplib/module/src/file.c | 31 ++ 17 files changed, 593 insertions(+), 158 deletions(-) diff --git a/packages/base/any/onlp/src/onlp/module/inc/onlp/fan.h b/packages/base/any/onlp/src/onlp/module/inc/onlp/fan.h index 2fa8f5cc..5788c395 100644 --- a/packages/base/any/onlp/src/onlp/module/inc/onlp/fan.h +++ b/packages/base/any/onlp/src/onlp/module/inc/onlp/fan.h @@ -112,14 +112,21 @@ int onlp_fan_sw_denit(void); * @param id The fan OID. * @param[out] hdr Receives the OID header. */ -int onlp_fan_hdr_get(onlp_oid_t id, onlp_oid_hdr_t* hdr); +int onlp_fan_hdr_get(onlp_oid_t oid, onlp_oid_hdr_t* hdr); /** * @brief Retrieve fan information. * @param id The fan OID. * @param[out] rv Receives the fan information. */ -int onlp_fan_info_get(onlp_oid_t id, onlp_fan_info_t* rv); +int onlp_fan_info_get(onlp_oid_t oid, onlp_fan_info_t* rv); + +/** + * @brief Retrieve the fan capabilities. + * @param id The fan OID. + * @param[out] rv Receives the fan capabilities. + */ +int onlp_fan_caps_get(onlp_oid_t oid, uint32_t* caps); /** * @brief Set the fan speed in RPMs. @@ -127,7 +134,7 @@ int onlp_fan_info_get(onlp_oid_t id, onlp_fan_info_t* rv); * @param rpm The new RPM. * @note Only valid if the fan has the SET_RPM capability. */ -int onlp_fan_rpm_set(onlp_oid_t id, int rpm); +int onlp_fan_rpm_set(onlp_oid_t oid, int rpm); /** * @brief Set the fan speed in percentage. @@ -135,7 +142,7 @@ int onlp_fan_rpm_set(onlp_oid_t id, int rpm); * @param p The percentage. * @note Only valid if the fan has the SET_PERCENTAGE capability. */ -int onlp_fan_percentage_set(onlp_oid_t id, int p); +int onlp_fan_percentage_set(onlp_oid_t oid, int p); /** * @brief Set the fan direction. @@ -143,7 +150,7 @@ int onlp_fan_percentage_set(onlp_oid_t id, int p); * @param dir The fan direction (B2F or F2B) * @note Only called if both capabilities are set. */ -int onlp_fan_dir_set(onlp_oid_t id, onlp_fan_dir_t dir); +int onlp_fan_dir_set(onlp_oid_t oid, onlp_fan_dir_t dir); /** * @brief Convert a fan info structure to user JSON. diff --git a/packages/base/any/onlp/src/onlp/module/inc/onlp/led.h b/packages/base/any/onlp/src/onlp/module/inc/onlp/led.h index 54c00206..58e172ad 100644 --- a/packages/base/any/onlp/src/onlp/module/inc/onlp/led.h +++ b/packages/base/any/onlp/src/onlp/module/inc/onlp/led.h @@ -128,6 +128,13 @@ int onlp_led_hdr_get(onlp_oid_t id, onlp_oid_hdr_t* rv); */ int onlp_led_info_get(onlp_oid_t id, onlp_led_info_t* rv); +/** + * @brief Get the LED caps. + * @param id The LED OID. + * @param[out] rv Receives the caps. + */ +int onlp_led_caps_get(onlp_oid_t oid, uint32_t* caps); + /** * @brief Set the LED mode. * @param id The LED OID. diff --git a/packages/base/any/onlp/src/onlp/module/inc/onlp/platformi/fani.h b/packages/base/any/onlp/src/onlp/module/inc/onlp/platformi/fani.h index 6bb1fffa..dd8f7031 100644 --- a/packages/base/any/onlp/src/onlp/module/inc/onlp/platformi/fani.h +++ b/packages/base/any/onlp/src/onlp/module/inc/onlp/platformi/fani.h @@ -51,18 +51,25 @@ int onlp_fani_sw_denit(void); /** * @brief Retrieve the fan's OID hdr. - * @param id The fan OID. + * @param id The fan id. * @param[out] hdr Receives the OID header. */ int onlp_fani_hdr_get(onlp_oid_id_t id, onlp_oid_hdr_t* hdr); /** * @brief Get the information structure for the given fan OID. - * @param id The fan OID + * @param id The fan id * @param[out] rv Receives the fan information. */ int onlp_fani_info_get(onlp_oid_id_t id, onlp_fan_info_t* rv); +/** + * @brief Get the fan capabilities. + * @param id The fan id. + * @param[out] rv The fan capabilities + */ +int onlp_fani_caps_get(onlp_oid_id_t id, uint32_t* rv); + /** * @brief Set the fan speed in RPM. * @param id The fan OID diff --git a/packages/base/any/onlp/src/onlp/module/inc/onlp/platformi/ledi.h b/packages/base/any/onlp/src/onlp/module/inc/onlp/platformi/ledi.h index 53132c41..f1f86592 100644 --- a/packages/base/any/onlp/src/onlp/module/inc/onlp/platformi/ledi.h +++ b/packages/base/any/onlp/src/onlp/module/inc/onlp/platformi/ledi.h @@ -60,6 +60,13 @@ int onlp_ledi_hdr_get(onlp_oid_id_t id, onlp_oid_hdr_t* rv); */ int onlp_ledi_info_get(onlp_oid_id_t id, onlp_led_info_t* rv); +/** + * @brief Get the caps for the given LED + * @param id The LED ID + * @param[out] rv Receives the caps. + */ +int onlp_ledi_caps_get(onlp_oid_id_t id, uint32_t* rv); + /** * @brief Set the LED mode. * @param id The LED OID diff --git a/packages/base/any/onlp/src/onlp/module/src/attribute.c b/packages/base/any/onlp/src/onlp/module/src/attribute.c index a992c04c..8525ea4a 100644 --- a/packages/base/any/onlp/src/onlp/module/src/attribute.c +++ b/packages/base/any/onlp/src/onlp/module/src/attribute.c @@ -108,11 +108,8 @@ onlp_attribute_onie_info_get(onlp_oid_t oid, onlp_onie_info_t** rvp) int rv; onlp_onie_info_t* rp; - rv = onlp_attributei_onie_info_get(oid, NULL); - - if(ONLP_FAILURE(rv) || rvp == NULL) { - return rv; - } + ONLP_PTR_VALIDATE_ZERO(rvp); + ONLP_TRY(onlp_attributei_onie_info_get(oid, NULL)); rp = aim_zmalloc(sizeof(*rp)); rv = onlp_attributei_onie_info_get(oid, rp); @@ -188,11 +185,8 @@ onlp_attribute_asset_info_get(onlp_oid_t oid, onlp_asset_info_t** rvp) int rv; onlp_asset_info_t* rp; - rv = onlp_attributei_asset_info_get(oid, NULL); - - if(ONLP_FAILURE(rv) || rvp == NULL) { - return rv; - } + ONLP_PTR_VALIDATE_ZERO(rvp); + ONLP_TRY(onlp_attributei_asset_info_get(oid, NULL)); rp = aim_zmalloc(sizeof(*rp)); rv = onlp_attributei_asset_info_get(oid, rp); diff --git a/packages/base/any/onlp/src/onlp/module/src/fan.c b/packages/base/any/onlp/src/onlp/module/src/fan.c index 263bf5a1..d0f0e95a 100644 --- a/packages/base/any/onlp/src/onlp/module/src/fan.c +++ b/packages/base/any/onlp/src/onlp/module/src/fan.c @@ -64,11 +64,17 @@ ONLP_LOCKED_API0(onlp_fan_sw_denit); static int onlp_fan_hdr_get_locked__(onlp_oid_t oid, onlp_oid_hdr_t* hdr) { - ONLP_OID_FAN_VALIDATE(oid); + int rv; + onlp_oid_id_t id; + + ONLP_OID_FAN_VALIDATE_GET_ID(oid, id); ONLP_PTR_VALIDATE_ZERO(hdr); - return onlp_log_error(0, - onlp_fani_hdr_get(oid, hdr), - "fani hdr get %{onlp_oid}", oid); + + rv = onlp_log_error(0, + onlp_fani_hdr_get(id, hdr), + "fani hdr get %{onlp_oid}", oid); + hdr->id = oid; + return rv; } ONLP_LOCKED_API2(onlp_fan_hdr_get, onlp_oid_t, oid, onlp_oid_hdr_t*, hdr); @@ -76,26 +82,59 @@ ONLP_LOCKED_API2(onlp_fan_hdr_get, onlp_oid_t, oid, onlp_oid_hdr_t*, hdr); * Fan Info Get */ static int -onlp_fan_info_get_locked__(onlp_oid_t oid, onlp_fan_info_t* fip) +onlp_fan_info_get_locked__(onlp_oid_t oid, onlp_fan_info_t* info) { - ONLP_OID_FAN_VALIDATE(oid); - ONLP_PTR_VALIDATE_ZERO(fip); - return onlp_log_error(0, - onlp_fani_info_get(oid, fip), - "fani info get %{onlp_oid}", oid); + int rv; + onlp_oid_id_t id; + + ONLP_OID_FAN_VALIDATE_GET_ID(oid, id); + ONLP_PTR_VALIDATE_ZERO(info); + + rv = onlp_log_error(0, + onlp_fani_info_get(id, info), + "fani info get %{onlp_oid}", oid); + + info->hdr.id = oid; + return rv; } -ONLP_LOCKED_API2(onlp_fan_info_get, onlp_oid_t, oid, onlp_fan_info_t*, fip); +ONLP_LOCKED_API2(onlp_fan_info_get, onlp_oid_t, oid, onlp_fan_info_t*, info); + +/** + * Fan Caps Get + */ +static int +onlp_fan_caps_get_locked__(onlp_oid_t oid, uint32_t* rv) +{ + onlp_oid_id_t id; + + ONLP_OID_FAN_VALIDATE_GET_ID(oid, id); + ONLP_PTR_VALIDATE_ZERO(rv); + + return onlp_log_error(0, + onlp_fani_caps_get(id, rv), + "fani caps get %{onlp_oid}", oid); +} +ONLP_LOCKED_API2(onlp_fan_caps_get, onlp_oid_t, oid, uint32_t*, rv); + static int -onlp_fan_rpm_set_locked__(onlp_oid_t id, int rpm) +onlp_fan_rpm_set_locked__(onlp_oid_t oid, int rpm) { - onlp_fan_info_t info; + uint32_t caps = 0; + onlp_oid_id_t id; - ONLP_OID_FAN_VALIDATE(id); - ONLP_TRY(onlp_fani_info_get(id, &info)); - if(info.caps & ONLP_FAN_CAPS_SET_RPM) { - return onlp_fani_rpm_set(id, rpm); + ONLP_OID_FAN_VALIDATE_GET_ID(oid, id); + + ONLP_TRY(onlp_log_error(0, + onlp_fan_caps_get_locked__(oid, &caps), + "fan rpm set %{onlp_oid} %d: could not get fan caps", + oid, rpm)); + + if(caps & ONLP_FAN_CAPS_SET_RPM) { + return onlp_log_error(0, + onlp_fani_rpm_set(id, rpm), + "fani rpm set %{onlp_oid} %d", oid, rpm); } else { return ONLP_STATUS_E_UNSUPPORTED; @@ -104,12 +143,19 @@ onlp_fan_rpm_set_locked__(onlp_oid_t id, int rpm) ONLP_LOCKED_API2(onlp_fan_rpm_set, onlp_oid_t, id, int, rpm); static int -onlp_fan_percentage_set_locked__(onlp_oid_t id, int p) +onlp_fan_percentage_set_locked__(onlp_oid_t oid, int p) { - onlp_fan_info_t info; - ONLP_OID_FAN_VALIDATE(id); - ONLP_TRY(onlp_fani_info_get(id, &info)); - if(info.caps & ONLP_FAN_CAPS_SET_PERCENTAGE) { + uint32_t caps = 0; + onlp_oid_id_t id; + + ONLP_OID_FAN_VALIDATE_GET_ID(oid, id); + + ONLP_TRY(onlp_log_error(0, + onlp_fan_caps_get_locked__(oid, &caps), + "fan percentage set %{onlp_oid} %d: could not get fan caps", + oid, p)); + + if(caps & ONLP_FAN_CAPS_SET_PERCENTAGE) { return onlp_fani_percentage_set(id, p); } else { @@ -119,12 +165,19 @@ onlp_fan_percentage_set_locked__(onlp_oid_t id, int p) ONLP_LOCKED_API2(onlp_fan_percentage_set, onlp_oid_t, id, int, p); static int -onlp_fan_dir_set_locked__(onlp_oid_t id, onlp_fan_dir_t dir) +onlp_fan_dir_set_locked__(onlp_oid_t oid, onlp_fan_dir_t dir) { - onlp_fan_info_t info; - ONLP_OID_FAN_VALIDATE(id); - ONLP_TRY(onlp_fani_info_get(id, &info)); - if(info.caps & ONLP_FAN_CAPS_SET_DIR) { + onlp_oid_id_t id; + uint32_t caps = 0; + + ONLP_OID_FAN_VALIDATE_GET_ID(oid, id); + + ONLP_TRY(onlp_log_error(0, + onlp_fani_caps_get(id, &caps), + "fan dir set %{onlp_oid} %{onlp_fan_dir}: could not get fan caps", + oid, dir)); + + if(caps & ONLP_FAN_CAPS_SET_DIR) { return onlp_fani_dir_set(id, dir); } else { diff --git a/packages/base/any/onlp/src/onlp/module/src/led.c b/packages/base/any/onlp/src/onlp/module/src/led.c index cfa3ac24..29f2a9e3 100644 --- a/packages/base/any/onlp/src/onlp/module/src/led.c +++ b/packages/base/any/onlp/src/onlp/module/src/led.c @@ -29,31 +29,6 @@ #include "onlp_int.h" #include "onlp_locks.h" -static int -onlp_led_present__(onlp_oid_t id, onlp_led_info_t* info) -{ - int rv; - - /* Info retrieval required. */ - rv = onlp_ledi_info_get(id, info); - if(rv < 0) { - return rv; - } - /* The led must be present. */ - if((info->hdr.status & 0x1) == 0) { - return ONLP_STATUS_E_MISSING; - } - return ONLP_STATUS_OK; -} -#define ONLP_LED_PRESENT_OR_RETURN(_id, _info) \ - do { \ - int _rv = onlp_led_present__(_id, _info); \ - if(_rv < 0) { \ - return _rv; \ - } \ - } while(0) - - static int onlp_led_sw_init_locked__(void) { @@ -102,16 +77,34 @@ ONLP_LOCKED_API2(onlp_led_info_get, onlp_oid_t, id, onlp_led_info_t*, info); static int -onlp_led_mode_set_locked__(onlp_oid_t id, onlp_led_mode_t mode) +onlp_led_caps_get_locked__(onlp_oid_t oid, uint32_t* rv) { - onlp_led_info_t info; - ONLP_LED_PRESENT_OR_RETURN(id, &info); + onlp_oid_id_t id; - /* - * The mode enumeration values always match - * the capability bit positions. - */ - if(info.caps & (1 << mode)) { + ONLP_OID_LED_VALIDATE_GET_ID(oid, id); + ONLP_PTR_VALIDATE_ZERO(rv); + + return onlp_log_error(0, + onlp_ledi_caps_get(id, rv), + "ledi caps get %{onlp_oid}", oid); +} +ONLP_LOCKED_API2(onlp_led_caps_get, onlp_oid_t, oid, uint32_t*, rv); + + +static int +onlp_led_mode_set_locked__(onlp_oid_t oid, onlp_led_mode_t mode) +{ + uint32_t caps = 0; + onlp_oid_id_t id; + + ONLP_OID_LED_VALIDATE_GET_ID(oid, id); + + ONLP_TRY(onlp_log_error(0, + onlp_led_caps_get_locked__(oid, &caps), + "led mode set %{onlp_oid} %{onlp_led_mode}: could not get led caps.", + oid, mode)); + + if(caps & (1 << mode)) { return onlp_ledi_mode_set(id, mode); } else { @@ -121,16 +114,19 @@ onlp_led_mode_set_locked__(onlp_oid_t id, onlp_led_mode_t mode) ONLP_LOCKED_API2(onlp_led_mode_set, onlp_oid_t, id, onlp_led_mode_t, mode); static int -onlp_led_char_set_locked__(onlp_oid_t id, char c) +onlp_led_char_set_locked__(onlp_oid_t oid, char c) { - onlp_led_info_t info; - ONLP_LED_PRESENT_OR_RETURN(id, &info); + uint32_t caps = 0; + onlp_oid_id_t id; - /* - * The mode enumeration values always match - * the capability bit positions. - */ - if(info.caps & ONLP_LED_CAPS_CHAR) { + ONLP_OID_LED_VALIDATE_GET_ID(oid, id); + + ONLP_TRY(onlp_log_error(0, + onlp_led_caps_get_locked__(oid, &caps), + "led char set %{onlp_oid} %c: could not get led caps.", + oid, c)); + + if(caps & ONLP_LED_CAPS_CHAR) { return onlp_ledi_char_set(id, c); } else { diff --git a/packages/base/any/onlp/src/onlp/module/src/onlp_module.c b/packages/base/any/onlp/src/onlp/module/src/onlp_module.c index 8cdb38ce..986cbc4e 100644 --- a/packages/base/any/onlp/src/onlp/module/src/onlp_module.c +++ b/packages/base/any/onlp/src/onlp/module/src/onlp_module.c @@ -57,6 +57,25 @@ onlp_aim_fs__onlp_oid(aim_datatype_context_t* dtc, return AIM_DATATYPE_ERROR; } +static int +onlp_aim_fs__onlp_oid_type(aim_datatype_context_t* dtc, + const char* arg, aim_va_list_t* vargs) +{ + onlp_oid_t* oidp = va_arg(vargs->val, onlp_oid_t*); + onlp_oid_type_t oid_type = va_arg(vargs->val, onlp_oid_type_t); + + AIM_REFERENCE(dtc); + + if(ONLP_SUCCESS(onlp_oid_from_str((char*)arg, oidp))) { + /** Full formed OID */ + return AIM_DATATYPE_OK; + } + + /** Use the given default */ + *oidp = ONLP_OID_TYPE_CREATE(oid_type, atoi(arg)); + return AIM_DATATYPE_OK; +} + static int onlp_aim_ts__onlp_oid_hdr(aim_datatype_context_t* dtc, aim_va_list_t* vargs, const char** rv) @@ -88,6 +107,10 @@ datatypes_init__(void) "ONLP OID Header", NULL, onlp_aim_ts__onlp_oid_hdr, NULL); + aim_datatype_register(0, "onlp_oid_type", + "ONLP OID", + onlp_aim_fs__onlp_oid_type, + NULL, NULL); /* diff --git a/packages/base/any/onlp/src/onlp/module/src/onlp_ucli.c b/packages/base/any/onlp/src/onlp/module/src/onlp_ucli.c index 2e4ad307..d79ca4a7 100644 --- a/packages/base/any/onlp/src/onlp/module/src/onlp_ucli.c +++ b/packages/base/any/onlp/src/onlp/module/src/onlp_ucli.c @@ -115,7 +115,7 @@ static ucli_status_t onlp_ucli__chassis__debug__show__(ucli_context_t* uc) { UCLI_COMMAND_INFO(uc, - "debug", 0, + "show", 0, "Dump all chassis OIDs."); onlp_chassis_debug_show(&uc->pvs); return 0; @@ -280,6 +280,149 @@ onlp_ucli__sfp__inventory__(ucli_context_t* uc) return 0; } +static ucli_status_t +onlp_ucli__sfp__dev__read__(ucli_context_t* uc) +{ + UCLI_COMMAND_INFO(uc, + "read", 4, + "$summary#Read bytes from the given addresses."); + int rv; + onlp_oid_t port; + int devaddr; + int addr; int size; + uint8_t* data; + + UCLI_ARGPARSE_OR_RETURN(uc, "{onlp_oid_type}iii", + &port, ONLP_OID_TYPE_SFP, &devaddr, &addr, &size); + if(ONLP_SUCCESS(rv = onlp_sfp_dev_alloc_read(port, devaddr, addr, size, &data))) { + ucli_printf(uc, "%{data}\n", data, size); + aim_free(data); + } + else { + ucli_printf(uc, "%{onlp_status}\n", rv); + } + return 0; +} + +static ucli_status_t +onlp_ucli__sfp__bitmaps__(ucli_context_t* uc) +{ + UCLI_COMMAND_INFO(uc, + "bitmaps", 0, + "$summary#Show SFP Presence and RX_LOS bitmaps."); + + int rv; + onlp_sfp_bitmap_t bmap; + + ucli_printf(uc, "Presence: "); + if(ONLP_SUCCESS(rv = onlp_sfp_presence_bitmap_get(&bmap))) { + ucli_printf(uc, "%{aim_bitmap}\n", &bmap); + } + else { + ucli_printf(uc, "%{onlp_status}\n", rv); + } + + ucli_printf(uc, "RX_LOS: "); + if(ONLP_SUCCESS(rv = onlp_sfp_rx_los_bitmap_get(&bmap))) { + ucli_printf(uc, "%{aim_bitmap}\n", &bmap); + } + else { + ucli_printf(uc, "%{onlp_status}\n", rv); + } + return 0; +} + + +static ucli_status_t +onlp_ucli__fan__rpm__get(ucli_context_t* uc) +{ + + UCLI_COMMAND_INFO(uc, + "get", 1, + "$summary#Show the RPM for the given fan."); + + int rv; + onlp_oid_t oid; + onlp_fan_info_t info; + + UCLI_ARGPARSE_OR_RETURN(uc, "{onlp_oid_type}", &oid, ONLP_OID_TYPE_FAN); + + if(ONLP_SUCCESS(rv = onlp_fan_info_get(oid, &info))) { + if(info.caps & ONLP_FAN_CAPS_GET_RPM) { + ucli_printf(uc, "%{onlp_oid} rpm = %d\n", oid, info.rpm); + } + else { + ucli_printf(uc, "%{onlp_oid} does not support rpm.\n", oid); + } + } + else { + ucli_printf(uc, "%{onlp_status}\n", rv); + } + + return 0; +} + +static ucli_status_t +onlp_ucli__fan__rpm__set(ucli_context_t* uc) +{ + UCLI_COMMAND_INFO(uc, + "set", 2, + "$summary#Set the RPM for the given fan."); + + int rpm; + onlp_oid_t oid; + + UCLI_ARGPARSE_OR_RETURN(uc, "{onlp_oid_type}i", &oid, ONLP_OID_TYPE_FAN, &rpm); + ucli_printf(uc, "%{onlp_status}\n", + onlp_fan_rpm_set(oid, rpm)); + return 0; +} + +static ucli_status_t +onlp_ucli__fan__percentage__get(ucli_context_t* uc) +{ + + UCLI_COMMAND_INFO(uc, + "get", 1, + "$summary#Show the speed percentage for the given fan."); + + int rv; + onlp_oid_t oid; + onlp_fan_info_t info; + + UCLI_ARGPARSE_OR_RETURN(uc, "{onlp_oid_type}", &oid, ONLP_OID_TYPE_FAN); + + if(ONLP_SUCCESS(rv = onlp_fan_info_get(oid, &info))) { + if(info.caps & ONLP_FAN_CAPS_GET_PERCENTAGE) { + ucli_printf(uc, "%{onlp_oid} percentage = %d\n", oid, info.percentage); + } + else { + ucli_printf(uc, "%{onlp_oid} does not support percentage.\n", oid); + } + } + else { + ucli_printf(uc, "%{onlp_status}\n", rv); + } + + return 0; +} + +static ucli_status_t +onlp_ucli__fan__percentage__set(ucli_context_t* uc) +{ + UCLI_COMMAND_INFO(uc, + "set", 2, + "$summary#Set the speed percentage for the given fan."); + + int p; + onlp_oid_t oid; + + UCLI_ARGPARSE_OR_RETURN(uc, "{onlp_oid_type}i", &oid, ONLP_OID_TYPE_FAN, &p); + ucli_printf(uc, "%{onlp_status}\n", + onlp_fan_percentage_set(oid, p)); + return 0; +} + static ucli_status_t onlp_ucli__platform__manager__run__(ucli_context_t* uc) { @@ -334,47 +477,49 @@ onlp_ucli__platform__manager__daemon__(ucli_context_t* uc) * *****************************************************************************/ ucli_node_t* onlp_ucli__node__ = NULL; -ucli_node_t* onlp_ucli__debug__node__ = NULL; -ucli_node_t* onlp_ucli__debug__oid__node__ = NULL; -ucli_node_t* onlp_ucli__debug__oid__verify__node__ = NULL; -static ucli_command_handler_f onlp_ucli__debug__oid__verify__verify__handlers__[] = +ucli_node_t* onlp_ucli__oid__node__ = NULL; +ucli_node_t* onlp_ucli__oid__hdr__node__ = NULL; +ucli_node_t* onlp_ucli__oid__hdr__json__node__ = NULL; +static ucli_command_handler_f onlp_ucli__oid__hdr__json__json__handlers__[] = { - onlp_ucli__debug__oid__verify__json__, + onlp_ucli__oid__hdr__json__id__, + onlp_ucli__oid__hdr__json__file__, NULL }; -static ucli_module_t onlp_ucli__debug__oid__verify__verify__module__ = +static ucli_module_t onlp_ucli__oid__hdr__json__json__module__ = { - "verify", + "json", NULL, - onlp_ucli__debug__oid__verify__verify__handlers__, + onlp_ucli__oid__hdr__json__json__handlers__, NULL, NULL }; -ucli_node_t* onlp_ucli__debug__oid__from__node__ = NULL; -static ucli_command_handler_f onlp_ucli__debug__oid__from__from__handlers__[] = +ucli_node_t* onlp_ucli__sfp__node__ = NULL; +ucli_node_t* onlp_ucli__sfp__dev__node__ = NULL; +static ucli_command_handler_f onlp_ucli__sfp__dev__dev__handlers__[] = { - onlp_ucli__debug__oid__from__json__, + onlp_ucli__sfp__dev__read__, NULL }; -static ucli_module_t onlp_ucli__debug__oid__from__from__module__ = +static ucli_module_t onlp_ucli__sfp__dev__dev__module__ = { - "from", + "dev", NULL, - onlp_ucli__debug__oid__from__from__handlers__, + onlp_ucli__sfp__dev__dev__handlers__, NULL, NULL }; -ucli_node_t* onlp_ucli__debug__oid__to__node__ = NULL; -static ucli_command_handler_f onlp_ucli__debug__oid__to__to__handlers__[] = +static ucli_command_handler_f onlp_ucli__sfp__sfp__handlers__[] = { - onlp_ucli__debug__oid__to__json__, + onlp_ucli__sfp__inventory__, + onlp_ucli__sfp__bitmaps__, NULL }; -static ucli_module_t onlp_ucli__debug__oid__to__to__module__ = +static ucli_module_t onlp_ucli__sfp__sfp__module__ = { - "to", + "sfp", NULL, - onlp_ucli__debug__oid__to__to__handlers__, + onlp_ucli__sfp__sfp__handlers__, NULL, NULL }; @@ -453,48 +598,92 @@ static ucli_module_t onlp_ucli__chassis__env__env__module__ = NULL, NULL }; -ucli_node_t* onlp_ucli__sfp__node__ = NULL; -static ucli_command_handler_f onlp_ucli__sfp__sfp__handlers__[] = +ucli_node_t* onlp_ucli__fan__node__ = NULL; +ucli_node_t* onlp_ucli__fan__percentage__node__ = NULL; +static ucli_command_handler_f onlp_ucli__fan__percentage__percentage__handlers__[] = { - onlp_ucli__sfp__inventory__, + onlp_ucli__fan__percentage__get, + onlp_ucli__fan__percentage__set, NULL }; -static ucli_module_t onlp_ucli__sfp__sfp__module__ = +static ucli_module_t onlp_ucli__fan__percentage__percentage__module__ = { - "sfp", + "percentage", NULL, - onlp_ucli__sfp__sfp__handlers__, + onlp_ucli__fan__percentage__percentage__handlers__, NULL, NULL }; -ucli_node_t* onlp_ucli__oid__node__ = NULL; -ucli_node_t* onlp_ucli__oid__hdr__node__ = NULL; -ucli_node_t* onlp_ucli__oid__hdr__json__node__ = NULL; -static ucli_command_handler_f onlp_ucli__oid__hdr__json__json__handlers__[] = +ucli_node_t* onlp_ucli__fan__rpm__node__ = NULL; +static ucli_command_handler_f onlp_ucli__fan__rpm__rpm__handlers__[] = { - onlp_ucli__oid__hdr__json__id__, - onlp_ucli__oid__hdr__json__file__, + onlp_ucli__fan__rpm__get, + onlp_ucli__fan__rpm__set, NULL }; -static ucli_module_t onlp_ucli__oid__hdr__json__json__module__ = +static ucli_module_t onlp_ucli__fan__rpm__rpm__module__ = { - "json", + "rpm", NULL, - onlp_ucli__oid__hdr__json__json__handlers__, + onlp_ucli__fan__rpm__rpm__handlers__, + NULL, + NULL +}; +ucli_node_t* onlp_ucli__debug__node__ = NULL; +ucli_node_t* onlp_ucli__debug__oid__node__ = NULL; +ucli_node_t* onlp_ucli__debug__oid__verify__node__ = NULL; +static ucli_command_handler_f onlp_ucli__debug__oid__verify__verify__handlers__[] = +{ + onlp_ucli__debug__oid__verify__json__, + NULL +}; +static ucli_module_t onlp_ucli__debug__oid__verify__verify__module__ = +{ + "verify", + NULL, + onlp_ucli__debug__oid__verify__verify__handlers__, + NULL, + NULL +}; +ucli_node_t* onlp_ucli__debug__oid__from__node__ = NULL; +static ucli_command_handler_f onlp_ucli__debug__oid__from__from__handlers__[] = +{ + onlp_ucli__debug__oid__from__json__, + NULL +}; +static ucli_module_t onlp_ucli__debug__oid__from__from__module__ = +{ + "from", + NULL, + onlp_ucli__debug__oid__from__from__handlers__, + NULL, + NULL +}; +ucli_node_t* onlp_ucli__debug__oid__to__node__ = NULL; +static ucli_command_handler_f onlp_ucli__debug__oid__to__to__handlers__[] = +{ + onlp_ucli__debug__oid__to__json__, + NULL +}; +static ucli_module_t onlp_ucli__debug__oid__to__to__module__ = +{ + "to", + NULL, + onlp_ucli__debug__oid__to__to__handlers__, NULL, NULL }; static ucli_node_t* __ucli_auto_init__(void) { if(onlp_ucli__node__ == NULL) onlp_ucli__node__ = ucli_node_create("onlp", NULL, NULL); - if(onlp_ucli__debug__node__ == NULL) onlp_ucli__debug__node__ = ucli_node_create("debug", NULL, NULL); - if(onlp_ucli__debug__oid__node__ == NULL) onlp_ucli__debug__oid__node__ = ucli_node_create("oid", NULL, NULL); - if(onlp_ucli__debug__oid__verify__node__ == NULL) onlp_ucli__debug__oid__verify__node__ = ucli_node_create("verify", NULL, NULL); - ucli_module_init(&onlp_ucli__debug__oid__verify__verify__module__); - if(onlp_ucli__debug__oid__from__node__ == NULL) onlp_ucli__debug__oid__from__node__ = ucli_node_create("from", NULL, NULL); - ucli_module_init(&onlp_ucli__debug__oid__from__from__module__); - if(onlp_ucli__debug__oid__to__node__ == NULL) onlp_ucli__debug__oid__to__node__ = ucli_node_create("to", NULL, NULL); - ucli_module_init(&onlp_ucli__debug__oid__to__to__module__); + if(onlp_ucli__oid__node__ == NULL) onlp_ucli__oid__node__ = ucli_node_create("oid", NULL, NULL); + if(onlp_ucli__oid__hdr__node__ == NULL) onlp_ucli__oid__hdr__node__ = ucli_node_create("hdr", NULL, NULL); + if(onlp_ucli__oid__hdr__json__node__ == NULL) onlp_ucli__oid__hdr__json__node__ = ucli_node_create("json", NULL, NULL); + ucli_module_init(&onlp_ucli__oid__hdr__json__json__module__); + if(onlp_ucli__sfp__node__ == NULL) onlp_ucli__sfp__node__ = ucli_node_create("sfp", NULL, NULL); + if(onlp_ucli__sfp__dev__node__ == NULL) onlp_ucli__sfp__dev__node__ = ucli_node_create("dev", NULL, NULL); + ucli_module_init(&onlp_ucli__sfp__dev__dev__module__); + ucli_module_init(&onlp_ucli__sfp__sfp__module__); if(onlp_ucli__platform__node__ == NULL) onlp_ucli__platform__node__ = ucli_node_create("platform", NULL, NULL); if(onlp_ucli__platform__manager__node__ == NULL) onlp_ucli__platform__manager__node__ = ucli_node_create("manager", NULL, NULL); ucli_module_init(&onlp_ucli__platform__manager__manager__module__); @@ -507,20 +696,27 @@ static ucli_node_t* __ucli_auto_init__(void) ucli_module_init(&onlp_ucli__chassis__asset__asset__module__); if(onlp_ucli__chassis__env__node__ == NULL) onlp_ucli__chassis__env__node__ = ucli_node_create("env", NULL, NULL); ucli_module_init(&onlp_ucli__chassis__env__env__module__); - if(onlp_ucli__sfp__node__ == NULL) onlp_ucli__sfp__node__ = ucli_node_create("sfp", NULL, NULL); - ucli_module_init(&onlp_ucli__sfp__sfp__module__); - if(onlp_ucli__oid__node__ == NULL) onlp_ucli__oid__node__ = ucli_node_create("oid", NULL, NULL); - if(onlp_ucli__oid__hdr__node__ == NULL) onlp_ucli__oid__hdr__node__ = ucli_node_create("hdr", NULL, NULL); - if(onlp_ucli__oid__hdr__json__node__ == NULL) onlp_ucli__oid__hdr__json__node__ = ucli_node_create("json", NULL, NULL); - ucli_module_init(&onlp_ucli__oid__hdr__json__json__module__); - ucli_node_subnode_add(onlp_ucli__node__, onlp_ucli__debug__node__); - ucli_node_subnode_add(onlp_ucli__debug__node__, onlp_ucli__debug__oid__node__); - ucli_node_subnode_add(onlp_ucli__debug__oid__node__, onlp_ucli__debug__oid__verify__node__); - ucli_node_module_add(onlp_ucli__debug__oid__verify__node__, &onlp_ucli__debug__oid__verify__verify__module__); - ucli_node_subnode_add(onlp_ucli__debug__oid__node__, onlp_ucli__debug__oid__from__node__); - ucli_node_module_add(onlp_ucli__debug__oid__from__node__, &onlp_ucli__debug__oid__from__from__module__); - ucli_node_subnode_add(onlp_ucli__debug__oid__node__, onlp_ucli__debug__oid__to__node__); - ucli_node_module_add(onlp_ucli__debug__oid__to__node__, &onlp_ucli__debug__oid__to__to__module__); + if(onlp_ucli__fan__node__ == NULL) onlp_ucli__fan__node__ = ucli_node_create("fan", NULL, NULL); + if(onlp_ucli__fan__percentage__node__ == NULL) onlp_ucli__fan__percentage__node__ = ucli_node_create("percentage", NULL, NULL); + ucli_module_init(&onlp_ucli__fan__percentage__percentage__module__); + if(onlp_ucli__fan__rpm__node__ == NULL) onlp_ucli__fan__rpm__node__ = ucli_node_create("rpm", NULL, NULL); + ucli_module_init(&onlp_ucli__fan__rpm__rpm__module__); + if(onlp_ucli__debug__node__ == NULL) onlp_ucli__debug__node__ = ucli_node_create("debug", NULL, NULL); + if(onlp_ucli__debug__oid__node__ == NULL) onlp_ucli__debug__oid__node__ = ucli_node_create("oid", NULL, NULL); + if(onlp_ucli__debug__oid__verify__node__ == NULL) onlp_ucli__debug__oid__verify__node__ = ucli_node_create("verify", NULL, NULL); + ucli_module_init(&onlp_ucli__debug__oid__verify__verify__module__); + if(onlp_ucli__debug__oid__from__node__ == NULL) onlp_ucli__debug__oid__from__node__ = ucli_node_create("from", NULL, NULL); + ucli_module_init(&onlp_ucli__debug__oid__from__from__module__); + if(onlp_ucli__debug__oid__to__node__ == NULL) onlp_ucli__debug__oid__to__node__ = ucli_node_create("to", NULL, NULL); + ucli_module_init(&onlp_ucli__debug__oid__to__to__module__); + ucli_node_subnode_add(onlp_ucli__node__, onlp_ucli__oid__node__); + ucli_node_subnode_add(onlp_ucli__oid__node__, onlp_ucli__oid__hdr__node__); + ucli_node_subnode_add(onlp_ucli__oid__hdr__node__, onlp_ucli__oid__hdr__json__node__); + ucli_node_module_add(onlp_ucli__oid__hdr__json__node__, &onlp_ucli__oid__hdr__json__json__module__); + ucli_node_subnode_add(onlp_ucli__node__, onlp_ucli__sfp__node__); + ucli_node_subnode_add(onlp_ucli__sfp__node__, onlp_ucli__sfp__dev__node__); + ucli_node_module_add(onlp_ucli__sfp__dev__node__, &onlp_ucli__sfp__dev__dev__module__); + ucli_node_module_add(onlp_ucli__sfp__node__, &onlp_ucli__sfp__sfp__module__); ucli_node_subnode_add(onlp_ucli__node__, onlp_ucli__platform__node__); ucli_node_subnode_add(onlp_ucli__platform__node__, onlp_ucli__platform__manager__node__); ucli_node_module_add(onlp_ucli__platform__manager__node__, &onlp_ucli__platform__manager__manager__module__); @@ -533,12 +729,19 @@ static ucli_node_t* __ucli_auto_init__(void) ucli_node_module_add(onlp_ucli__chassis__asset__node__, &onlp_ucli__chassis__asset__asset__module__); ucli_node_subnode_add(onlp_ucli__chassis__node__, onlp_ucli__chassis__env__node__); ucli_node_module_add(onlp_ucli__chassis__env__node__, &onlp_ucli__chassis__env__env__module__); - ucli_node_subnode_add(onlp_ucli__node__, onlp_ucli__sfp__node__); - ucli_node_module_add(onlp_ucli__sfp__node__, &onlp_ucli__sfp__sfp__module__); - ucli_node_subnode_add(onlp_ucli__node__, onlp_ucli__oid__node__); - ucli_node_subnode_add(onlp_ucli__oid__node__, onlp_ucli__oid__hdr__node__); - ucli_node_subnode_add(onlp_ucli__oid__hdr__node__, onlp_ucli__oid__hdr__json__node__); - ucli_node_module_add(onlp_ucli__oid__hdr__json__node__, &onlp_ucli__oid__hdr__json__json__module__); + ucli_node_subnode_add(onlp_ucli__node__, onlp_ucli__fan__node__); + ucli_node_subnode_add(onlp_ucli__fan__node__, onlp_ucli__fan__percentage__node__); + ucli_node_module_add(onlp_ucli__fan__percentage__node__, &onlp_ucli__fan__percentage__percentage__module__); + ucli_node_subnode_add(onlp_ucli__fan__node__, onlp_ucli__fan__rpm__node__); + ucli_node_module_add(onlp_ucli__fan__rpm__node__, &onlp_ucli__fan__rpm__rpm__module__); + ucli_node_subnode_add(onlp_ucli__node__, onlp_ucli__debug__node__); + ucli_node_subnode_add(onlp_ucli__debug__node__, onlp_ucli__debug__oid__node__); + ucli_node_subnode_add(onlp_ucli__debug__oid__node__, onlp_ucli__debug__oid__verify__node__); + ucli_node_module_add(onlp_ucli__debug__oid__verify__node__, &onlp_ucli__debug__oid__verify__verify__module__); + ucli_node_subnode_add(onlp_ucli__debug__oid__node__, onlp_ucli__debug__oid__from__node__); + ucli_node_module_add(onlp_ucli__debug__oid__from__node__, &onlp_ucli__debug__oid__from__from__module__); + ucli_node_subnode_add(onlp_ucli__debug__oid__node__, onlp_ucli__debug__oid__to__node__); + ucli_node_module_add(onlp_ucli__debug__oid__to__node__, &onlp_ucli__debug__oid__to__to__module__); return onlp_ucli__node__; } /******************************************************************************/ diff --git a/packages/base/any/onlp/src/onlp/module/src/psu.c b/packages/base/any/onlp/src/onlp/module/src/psu.c index c7fe3102..8d2dbce7 100644 --- a/packages/base/any/onlp/src/onlp/module/src/psu.c +++ b/packages/base/any/onlp/src/onlp/module/src/psu.c @@ -54,18 +54,33 @@ ONLP_LOCKED_API0(onlp_psu_sw_denit); static int onlp_psu_hdr_get_locked__(onlp_oid_t oid, onlp_oid_hdr_t* hdr) { - ONLP_OID_PSU_VALIDATE(oid); + int rv; + onlp_oid_id_t id; + + ONLP_OID_PSU_VALIDATE_GET_ID(oid, id); ONLP_PTR_VALIDATE_ZERO(hdr); - return onlp_psui_hdr_get(oid, hdr); + + rv = onlp_log_error(0, + onlp_psui_hdr_get(id, hdr), + "psui hdr get %{onlp_oid}", oid); + hdr->id = oid; + return rv; } ONLP_LOCKED_API2(onlp_psu_hdr_get, onlp_oid_t, oid, onlp_oid_hdr_t*, hdr); static int onlp_psu_info_get_locked__(onlp_oid_t oid, onlp_psu_info_t* info) { - ONLP_OID_PSU_VALIDATE(oid); + int rv; + onlp_oid_id_t id; + + ONLP_OID_PSU_VALIDATE_GET_ID(oid, id); ONLP_PTR_VALIDATE_ZERO(info); - return onlp_psui_info_get(oid, info); + rv = onlp_log_error(0, + onlp_psui_info_get(id, info), + "psui info get %{onlp_oid}", oid); + info->hdr.id = oid; + return rv; } ONLP_LOCKED_API2(onlp_psu_info_get, onlp_oid_t, oid, onlp_psu_info_t*, info); diff --git a/packages/base/any/onlp/src/onlp/module/src/sfp.c b/packages/base/any/onlp/src/onlp/module/src/sfp.c index 65f656f7..87c9e3ac 100644 --- a/packages/base/any/onlp/src/onlp/module/src/sfp.c +++ b/packages/base/any/onlp/src/onlp/module/src/sfp.c @@ -161,6 +161,9 @@ ONLP_LOCKED_API2(onlp_sfp_type_get, onlp_oid_t, oid, onlp_sfp_type_t*, rtype); static int onlp_sfp_presence_bitmap_get_locked__(onlp_sfp_bitmap_t* dst) { + ONLP_PTR_VALIDATE_ZERO(dst); + onlp_sfp_bitmap_t_init(dst); + int rv = onlp_sfpi_presence_bitmap_get(dst); if(rv == ONLP_STATUS_E_UNSUPPORTED) { @@ -270,6 +273,9 @@ ONLP_LOCKED_API3(onlp_sfp_control_get, onlp_oid_t, port, onlp_sfp_control_t, con static int onlp_sfp_rx_los_bitmap_get_locked__(onlp_sfp_bitmap_t* dst) { + ONLP_PTR_VALIDATE_ZERO(dst); + onlp_sfp_bitmap_t_init(dst); + int rv = onlp_sfpi_rx_los_bitmap_get(dst); if(rv == ONLP_STATUS_E_UNSUPPORTED) { @@ -336,7 +342,7 @@ onlp_sfp_control_flags_get(onlp_oid_t oid, uint32_t* flags) } int -onlp_sfp_dev_read_alloc(onlp_oid_t port, +onlp_sfp_dev_alloc_read(onlp_oid_t port, int devaddr, int addr, int count, uint8_t** rvp) { diff --git a/packages/base/any/onlp/src/onlp_platform_defaults/module/src/fani.c b/packages/base/any/onlp/src/onlp_platform_defaults/module/src/fani.c index 3f9dc688..7d2dfa16 100644 --- a/packages/base/any/onlp/src/onlp_platform_defaults/module/src/fani.c +++ b/packages/base/any/onlp/src/onlp_platform_defaults/module/src/fani.c @@ -33,8 +33,34 @@ __ONLP_DEFAULTI_IMPLEMENTATION_OPTIONAL(onlp_fani_sw_init(void)); __ONLP_DEFAULTI_IMPLEMENTATION_OPTIONAL(onlp_fani_hw_init(uint32_t flags)); __ONLP_DEFAULTI_IMPLEMENTATION_OPTIONAL(onlp_fani_sw_denit(void)); -__ONLP_DEFAULTI_IMPLEMENTATION(onlp_fani_hdr_get(onlp_oid_id_t id, onlp_oid_hdr_t* hdr)); __ONLP_DEFAULTI_IMPLEMENTATION(onlp_fani_info_get(onlp_oid_id_t id, onlp_fan_info_t* info)); + +/** + * Simulate hdr_get for older platforms which don't support it. + * This is inefficient. + */ +int __ONLP_DEFAULTI +onlp_fani_hdr_get(onlp_oid_id_t id, onlp_oid_hdr_t* hdr) +{ + onlp_fan_info_t info; + ONLP_TRY(onlp_fani_info_get(id, &info)); + *hdr = info.hdr; + return ONLP_STATUS_OK; +} + +/** + * Simulate caps_get for older platforms which don't support it. + * This is inefficient. + */ +int __ONLP_DEFAULTI +onlp_fani_caps_get(onlp_oid_id_t id, uint32_t* rv) +{ + onlp_fan_info_t info; + ONLP_TRY(onlp_fani_info_get(id, &info)); + *rv = info.caps; + return ONLP_STATUS_OK; +} + __ONLP_DEFAULTI_IMPLEMENTATION(onlp_fani_rpm_set(onlp_oid_id_t id, int rpm)); __ONLP_DEFAULTI_IMPLEMENTATION(onlp_fani_percentage_set(onlp_oid_id_t id, int p)); __ONLP_DEFAULTI_IMPLEMENTATION(onlp_fani_dir_set(onlp_oid_id_t id, onlp_fan_dir_t dir)); diff --git a/packages/base/any/onlp/src/onlp_platform_defaults/module/src/ledi.c b/packages/base/any/onlp/src/onlp_platform_defaults/module/src/ledi.c index 9025a71d..b42cc040 100644 --- a/packages/base/any/onlp/src/onlp_platform_defaults/module/src/ledi.c +++ b/packages/base/any/onlp/src/onlp_platform_defaults/module/src/ledi.c @@ -28,7 +28,33 @@ __ONLP_DEFAULTI_IMPLEMENTATION_OPTIONAL(onlp_ledi_sw_init(void)); __ONLP_DEFAULTI_IMPLEMENTATION_OPTIONAL(onlp_ledi_hw_init(uint32_t flags)); __ONLP_DEFAULTI_IMPLEMENTATION_OPTIONAL(onlp_ledi_sw_denit(void)); -__ONLP_DEFAULTI_IMPLEMENTATION(onlp_ledi_hdr_get(onlp_oid_id_t id, onlp_oid_hdr_t* rv)); __ONLP_DEFAULTI_IMPLEMENTATION(onlp_ledi_info_get(onlp_oid_id_t id, onlp_led_info_t* rv)); + +/** + * simulate hdr_get for older platforms which don't support it. + * This is inefficient. + */ +int __ONLP_DEFAULTI +onlp_ledi_hdr_get(onlp_oid_id_t id, onlp_oid_hdr_t* rv) +{ + onlp_led_info_t info; + ONLP_TRY(onlp_ledi_info_get(id, &info)); + *rv = info.hdr; + return ONLP_STATUS_OK; +} + +/** + * Simulate caps_get for older platforms which don't support it. + * This is inefficient. + */ +int __ONLP_DEFAULTI +onlp_ledi_caps_get(onlp_oid_id_t id, uint32_t* rv) +{ + onlp_led_info_t info; + ONLP_TRY(onlp_ledi_info_get(id, &info)); + *rv = info.caps; + return ONLP_STATUS_OK; +} + __ONLP_DEFAULTI_IMPLEMENTATION(onlp_ledi_mode_set(onlp_oid_id_t id, onlp_led_mode_t mode)); __ONLP_DEFAULTI_IMPLEMENTATION(onlp_ledi_char_set(onlp_oid_id_t id, char c)); diff --git a/packages/base/any/onlp/src/onlp_platform_defaults/module/src/psui.c b/packages/base/any/onlp/src/onlp_platform_defaults/module/src/psui.c index d86bd5d8..ae5193e4 100644 --- a/packages/base/any/onlp/src/onlp_platform_defaults/module/src/psui.c +++ b/packages/base/any/onlp/src/onlp_platform_defaults/module/src/psui.c @@ -29,5 +29,18 @@ __ONLP_DEFAULTI_IMPLEMENTATION_OPTIONAL(onlp_psui_sw_init(void)); __ONLP_DEFAULTI_IMPLEMENTATION_OPTIONAL(onlp_psui_hw_init(uint32_t flags)); __ONLP_DEFAULTI_IMPLEMENTATION_OPTIONAL(onlp_psui_sw_denit(void)); -__ONLP_DEFAULTI_IMPLEMENTATION(onlp_psui_hdr_get(onlp_oid_id_t id, onlp_oid_hdr_t* rv)); + +/** + * simulate hdr_get for older platforms which don't support it. + * This is inefficient. + */ +int __ONLP_DEFAULTI +onlp_psui_hdr_get(onlp_oid_id_t id, onlp_oid_hdr_t* rv) +{ + onlp_psu_info_t info; + ONLP_TRY(onlp_psui_info_get(id, &info)); + *rv = info.hdr; + return ONLP_STATUS_OK; +} + __ONLP_DEFAULTI_IMPLEMENTATION(onlp_psui_info_get(onlp_oid_id_t id, onlp_psu_info_t* rv)); diff --git a/packages/base/any/onlp/src/onlp_platform_defaults/module/src/thermali.c b/packages/base/any/onlp/src/onlp_platform_defaults/module/src/thermali.c index c45a8250..c8d273dc 100644 --- a/packages/base/any/onlp/src/onlp_platform_defaults/module/src/thermali.c +++ b/packages/base/any/onlp/src/onlp_platform_defaults/module/src/thermali.c @@ -30,4 +30,16 @@ __ONLP_DEFAULTI_IMPLEMENTATION_OPTIONAL(onlp_thermali_sw_init(void)); __ONLP_DEFAULTI_IMPLEMENTATION_OPTIONAL(onlp_thermali_hw_init(uint32_t flags)); __ONLP_DEFAULTI_IMPLEMENTATION_OPTIONAL(onlp_thermali_sw_denit(void)); __ONLP_DEFAULTI_IMPLEMENTATION(onlp_thermali_info_get(onlp_oid_id_t id, onlp_thermal_info_t* rv)); -__ONLP_DEFAULTI_IMPLEMENTATION(onlp_thermali_hdr_get(onlp_oid_id_t id, onlp_oid_hdr_t* rv)); + +/** + * simulate hdr_get for older platforms which don't support it. + * This is inefficient. + */ +int __ONLP_DEFAULTI +onlp_thermali_hdr_get(onlp_oid_id_t id, onlp_oid_hdr_t* rv) +{ + onlp_thermal_info_t info; + ONLP_TRY(onlp_thermali_info_get(id, &info)); + *rv = info.hdr; + return ONLP_STATUS_OK; +} diff --git a/packages/base/any/onlp/src/onlplib/module/inc/onlplib/file.h b/packages/base/any/onlp/src/onlplib/module/inc/onlplib/file.h index 33096eaf..0394c5aa 100644 --- a/packages/base/any/onlp/src/onlplib/module/inc/onlplib/file.h +++ b/packages/base/any/onlp/src/onlplib/module/inc/onlplib/file.h @@ -121,6 +121,15 @@ int onlp_file_read_int(int* value, const char* fmt, ...); */ int onlp_file_read_int_max(int* value, char** files); + +/** + * @brief Join the contents of the given files. + * @param[out] Receives the joined string. + * @param string The join string. + * @param files The source files. + */ +int onlp_file_join_files(char** rv, const char* string, char** files); + /** * @brief Write data to the given file. * @param data The data to write. diff --git a/packages/base/any/onlp/src/onlplib/module/src/file.c b/packages/base/any/onlp/src/onlplib/module/src/file.c index 7fa723f6..43e8618c 100644 --- a/packages/base/any/onlp/src/onlplib/module/src/file.c +++ b/packages/base/any/onlp/src/onlplib/module/src/file.c @@ -311,6 +311,37 @@ onlp_file_read_int_max(int* value, char** files) return 0; } +int +onlp_file_join_files(char** rv, const char* string, char** files) +{ + int i; + + if(rv == NULL || files == NULL || string == NULL) { + return ONLP_STATUS_E_PARAM; + } + + for(i = 0; files[i]; i++); + + if(i == 0) { + *rv = aim_strdup(""); + return 0; + } + + const char** strings = aim_zmalloc(sizeof(*strings)*i); + for(i = 0; files[i]; i++) { + onlp_file_read_str((char**)strings+i, files[i]); + } + + *rv = aim_strjoin(string, strings, i); + + for(i = 0; files[i]; i++) { + aim_free((char*)strings[i]); + } + aim_free(strings); + + return 0; +} + int onlp_file_vwrite(uint8_t* data, int len, const char* fmt, va_list vargs) {