/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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. */ #include #include #include "os/mynewt.h" #include #include #include #include #include #if MYNEWT_VAL(TIMEPERSIST) #include #endif #include "smp_os/smp_os.h" #include #include static int smp_def_console_echo(struct mgmt_ctxt *cb); static int smp_def_mpstat_read(struct mgmt_ctxt *cb); static int smp_datetime_get(struct mgmt_ctxt *cb); static int smp_datetime_set(struct mgmt_ctxt *cb); static const struct mgmt_handler smp_def_group_handlers[] = { [SMP_ID_CONS_ECHO_CTRL] = { smp_def_console_echo, smp_def_console_echo }, [SMP_ID_MPSTATS] = { smp_def_mpstat_read, NULL }, [SMP_ID_DATETIME_STR] = { smp_datetime_get, smp_datetime_set }, }; #define SMP_DEF_GROUP_SZ \ (sizeof(smp_def_group_handlers) / sizeof(smp_def_group_handlers[0])) static struct mgmt_group smp_def_group = { .mg_handlers = (struct mgmt_handler *)smp_def_group_handlers, .mg_handlers_count = SMP_DEF_GROUP_SZ, .mg_group_id = MGMT_GROUP_ID_OS }; static int smp_def_console_echo(struct mgmt_ctxt *cb) { long long int echo_on = 1; int rc; struct cbor_attr_t attrs[2] = { [0] = { .attribute = "echo", .type = CborAttrIntegerType, .addr.integer = &echo_on, .nodefault = 1 }, [1] = { 0 }, }; rc = cbor_read_object(&cb->it, attrs); if (rc) { return MGMT_ERR_EINVAL; } if (echo_on) { console_echo(1); } else { console_echo(0); } return (0); } static int smp_def_mpstat_read(struct mgmt_ctxt *cb) { struct os_mempool *prev_mp; struct os_mempool_info omi; CborError g_err = CborNoError; CborEncoder pools; CborEncoder pool; g_err |= cbor_encode_text_stringz(&cb->encoder, "rc"); g_err |= cbor_encode_int(&cb->encoder, MGMT_ERR_EOK); g_err |= cbor_encode_text_stringz(&cb->encoder, "mpools"); g_err |= cbor_encoder_create_map(&cb->encoder, &pools, CborIndefiniteLength); prev_mp = NULL; while (1) { prev_mp = os_mempool_info_get_next(prev_mp, &omi); if (prev_mp == NULL) { break; } g_err |= cbor_encode_text_stringz(&pools, omi.omi_name); g_err |= cbor_encoder_create_map(&pools, &pool, CborIndefiniteLength); g_err |= cbor_encode_text_stringz(&pool, "blksiz"); g_err |= cbor_encode_uint(&pool, omi.omi_block_size); g_err |= cbor_encode_text_stringz(&pool, "nblks"); g_err |= cbor_encode_uint(&pool, omi.omi_num_blocks); g_err |= cbor_encode_text_stringz(&pool, "nfree"); g_err |= cbor_encode_uint(&pool, omi.omi_num_free); g_err |= cbor_encode_text_stringz(&pool, "min"); g_err |= cbor_encode_uint(&pool, omi.omi_min_free); g_err |= cbor_encoder_close_container(&pools, &pool); } g_err |= cbor_encoder_close_container(&cb->encoder, &pools); if (g_err) { return MGMT_ERR_ENOMEM; } return (0); } static int smp_datetime_get(struct mgmt_ctxt *cb) { struct os_timeval tv; struct os_timezone tz; char buf[DATETIME_BUFSIZE]; int rc; CborError g_err = CborNoError; g_err |= cbor_encode_text_stringz(&cb->encoder, "rc"); g_err |= cbor_encode_int(&cb->encoder, MGMT_ERR_EOK); /* Display the current datetime */ rc = os_gettimeofday(&tv, &tz); assert(rc == 0); rc = datetime_format(&tv, &tz, buf, DATETIME_BUFSIZE); if (rc) { rc = MGMT_ERR_EINVAL; goto err; } g_err |= cbor_encode_text_stringz(&cb->encoder, "datetime"); g_err |= cbor_encode_text_stringz(&cb->encoder, buf); if (g_err) { return MGMT_ERR_ENOMEM; } return 0; err: return (rc); } static int smp_datetime_set(struct mgmt_ctxt *mc) { struct os_timeval tv; struct os_timezone tz; char buf[DATETIME_BUFSIZE]; int rc = 0; const struct cbor_attr_t datetime_write_attr[] = { [0] = { .attribute = "datetime", .type = CborAttrTextStringType, .addr.string = buf, .len = sizeof(buf), }, { 0 }, }; rc = cbor_read_object(&mc->it, datetime_write_attr); if (rc) { return MGMT_ERR_EINVAL; } /* Set the current datetime */ rc = datetime_parse(buf, &tv, &tz); if (!rc) { rc = os_settimeofday(&tv, &tz); if (rc) { return MGMT_ERR_EINVAL; } #if MYNEWT_VAL(TIMEPERSIST) timepersist(); #endif } else { return MGMT_ERR_EINVAL; } rc = mgmt_write_rsp_status(mc, 0); if (rc != 0) { return rc; } return 0; } void smp_os_groups_register(void) { mgmt_register_group(&smp_def_group); } void smp_os_pkg_init(void) { smp_os_groups_register(); }