diff --git a/src/urma/lib/uvs/core/include/uvs_api.h b/src/urma/lib/uvs/core/include/uvs_api.h index 202180794df36247034992849e64b8674dcbb093..057a496ac83ad13a6734bf3369d05d2108bc5b7a 100644 --- a/src/urma/lib/uvs/core/include/uvs_api.h +++ b/src/urma/lib/uvs/core/include/uvs_api.h @@ -12,6 +12,7 @@ #define UVS_API_H #include +#include #include "uvs_types.h" #ifdef __cplusplus @@ -42,6 +43,29 @@ typedef struct uvs_route_list { uvs_route_t buf[UVS_MAX_ROUTES]; } uvs_route_list_t; +/** + * Create an aggregation device in UVS. + * @param[in] agg_eid EID of the aggregation device to be created. + * @return 0 on success, other value on error. + */ +int uvs_create_agg_dev(uvs_eid_t agg_eid); + +/** + * Delete an aggregation device from UVS. + * @param[in] agg_eid EID of the aggregation device to be deleted. + * @return 0 on success, other value on error. + */ +int uvs_delete_agg_dev(uvs_eid_t agg_eid); + +/** + * Get device name by EID. + * @param[in] eid EID of the device. + * @param[in] buf Buffer to hold the device name. + * @param[in] len Length of the buffer. + * @return 0 on success, other value on error. + */ +int uvs_get_device_name_by_eid(uvs_eid_t eid, char *buf, size_t len); + /** * UVS set topo info which gets from MXE module. * @param[in] topo: topo info of one bonding device diff --git a/src/urma/lib/uvs/core/tpsa_api.c b/src/urma/lib/uvs/core/tpsa_api.c index 51fef123bc33fbe4e43f43685e5f83dd7581c0ca..cdfd133ab0e7761cd42cbb6c2a6b5c71e843f8be 100644 --- a/src/urma/lib/uvs/core/tpsa_api.c +++ b/src/urma/lib/uvs/core/tpsa_api.c @@ -18,6 +18,50 @@ #define UVS_MAX_TOPO_NUM 16 +int uvs_create_agg_dev(uvs_eid_t agg_eid) +{ + int ret = 0; + + ret = uvs_ubagg_ioctl_create_agg_dev(agg_eid); + if (ret != 0) { + TPSA_LOG_ERR("failed to create agg dev in ubagg.\n"); + return ret; + } + + return ret; +} + +int uvs_delete_agg_dev(uvs_eid_t agg_eid) +{ + int ret = 0; + + ret = uvs_ubagg_ioctl_delete_agg_dev(agg_eid); + if (ret != 0) { + TPSA_LOG_ERR("failed to delete agg dev in ubagg.\n"); + return ret; + } + + return ret; +} + +int uvs_get_device_name_by_eid(uvs_eid_t eid, char *buf, size_t len) +{ + int ret = 0; + + if (buf == NULL || len == 0) { + TPSA_LOG_ERR("Invalid parameter.\n"); + return -EINVAL; + } + + ret = uvs_ubagg_ioctl_get_dev_name_by_eid(eid, buf, len); + if (ret != 0) { + TPSA_LOG_ERR("failed to get dev name by eid in ubagg.\n"); + return ret; + } + + return 0; +} + int uvs_set_topo_info_inner(void *topo, uint32_t topo_num) { int ret; diff --git a/src/urma/lib/uvs/core/uvs_ubagg_ioctl.c b/src/urma/lib/uvs/core/uvs_ubagg_ioctl.c index cceb391314aca7ef8cbc2416976b405b35b73367..cc0f854561ed4d29e2e00a6bb97ed585a3a0302d 100644 --- a/src/urma/lib/uvs/core/uvs_ubagg_ioctl.c +++ b/src/urma/lib/uvs/core/uvs_ubagg_ioctl.c @@ -20,6 +20,95 @@ #define UVS_UBAGG_DEVICE_PATH "/dev/ubagg" #define UVS_UBCORE_DEVICE_PATH "/dev/ubcore/ubcore" +int uvs_ubagg_ioctl_create_agg_dev(uvs_eid_t agg_eid) +{ + struct uvs_ubagg_create_dev_arg args = {0}; + struct uvs_ubagg_cmd_hdr hdr = {0}; + int ret; + + args.in.agg_eid = agg_eid; + + hdr.command = UVS_UBAGG_CMD_CREATE_DEV; + hdr.args_addr = (uint64_t)(uintptr_t)&args; + hdr.args_len = sizeof(args); + + int dev_fd = open(UVS_UBAGG_DEVICE_PATH, O_RDWR); + if (dev_fd < 0) { + TPSA_LOG_ERR("Failed to open dev_fd err: %s.\n", ub_strerror(errno)); + return -1; + } + + ret = ioctl(dev_fd, UVS_UBAGG_CMD, &hdr); + if (ret != 0) { + TPSA_LOG_ERR("Failed to create aggr dev, ret: %d, errno: %d.\n", ret, errno); + close(dev_fd); + return -1; + } + + close(dev_fd); + return 0; +} + +int uvs_ubagg_ioctl_delete_agg_dev(uvs_eid_t agg_eid) +{ + struct uvs_ubagg_delete_dev_arg args = {0}; + struct uvs_ubagg_cmd_hdr hdr = {0}; + int ret; + + args.in.agg_eid = agg_eid; + + hdr.command = UVS_UBAGG_CMD_DELETE_DEV; + hdr.args_addr = (uint64_t)(uintptr_t)&args; + hdr.args_len = sizeof(args); + + int dev_fd = open(UVS_UBAGG_DEVICE_PATH, O_RDWR); + if (dev_fd < 0) { + TPSA_LOG_ERR("Failed to open dev_fd err: %s.\n", ub_strerror(errno)); + return -1; + } + + ret = ioctl(dev_fd, UVS_UBAGG_CMD, &hdr); + if (ret != 0) { + TPSA_LOG_ERR("Failed to remove aggr dev, ret: %d, errno: %d.\n", ret, errno); + close(dev_fd); + return -1; + } + + close(dev_fd); + return 0; +} + +int uvs_ubagg_ioctl_get_dev_name_by_eid(uvs_eid_t eid, char *buf, size_t len) +{ + struct uvs_ubagg_get_dev_name_arg args = {0}; + struct uvs_ubagg_cmd_hdr hdr = {0}; + int ret; + + args.in.eid = eid; + + hdr.command = UVS_UBAGG_CMD_GET_DEV_NAME; + hdr.args_addr = (uint64_t)(uintptr_t)&args; + hdr.args_len = sizeof(args); + + int dev_fd = open(UVS_UBAGG_DEVICE_PATH, O_RDWR); + if (dev_fd < 0) { + TPSA_LOG_ERR("Failed to open dev_fd err: %s.\n", ub_strerror(errno)); + return -1; + } + + ret = ioctl(dev_fd, UVS_UBAGG_CMD, &hdr); + if (ret != 0) { + TPSA_LOG_ERR("Failed to get dev name by eid, ret: %d, errno: %d.\n", ret, errno); + close(dev_fd); + return -1; + } + + strncpy(buf, args.out.dev_name, len); + + close(dev_fd); + return 0; +} + int uvs_ubagg_ioctl_set_topo(void *topo_info, int topo_num) { struct uvs_ubagg_set_topo_info args = {0}; @@ -29,7 +118,7 @@ int uvs_ubagg_ioctl_set_topo(void *topo_info, int topo_num) args.in.topo = topo_info; args.in.topo_num = (uint32_t)topo_num; - hdr.command = UVS_UBAGG_CMD_SET_TOPO; + hdr.command = UVS_UBAGG_CMD_SET_TOPO_INFO; hdr.args_addr = (uint64_t)(uintptr_t)&args; hdr.args_len = sizeof(args); @@ -41,7 +130,7 @@ int uvs_ubagg_ioctl_set_topo(void *topo_info, int topo_num) ret = ioctl(dev_fd, UVS_UBAGG_CMD, &hdr); if (ret != 0) { - TPSA_LOG_ERR("ioctl to set topo info fail\n"); + TPSA_LOG_ERR("Failed to set topo info, ret: %d, errno: %d.\n", ret, errno); close(dev_fd); return -1; } diff --git a/src/urma/lib/uvs/core/uvs_ubagg_ioctl.h b/src/urma/lib/uvs/core/uvs_ubagg_ioctl.h index d36df303132e55f6deee202b28a03932f2de803d..f1bde7788c4321433616837baa44ae49be8a679a 100644 --- a/src/urma/lib/uvs/core/uvs_ubagg_ioctl.h +++ b/src/urma/lib/uvs/core/uvs_ubagg_ioctl.h @@ -10,11 +10,17 @@ #ifndef UVS_UBAGG_IOCTL_H #define UVS_UBAGG_IOCTL_H #include +#include "uvs_types.h" + +#define UVS_MAX_DEV_NAME_LEN 64 typedef enum uvs_ubagg_cmd { UVS_UBAGG_CMD_ADD_DEV = 1, UVS_UBAGG_CMD_RMV_DEV, - UVS_UBAGG_CMD_SET_TOPO, + UVS_UBAGG_CMD_SET_TOPO_INFO, + UVS_UBAGG_CMD_CREATE_DEV, + UVS_UBAGG_CMD_DELETE_DEV, + UVS_UBAGG_CMD_GET_DEV_NAME, } uvs_ubagg_cmd_t; struct uvs_ubagg_cmd_hdr { @@ -26,6 +32,27 @@ struct uvs_ubagg_cmd_hdr { #define UVS_UBAGG_CMD_MAGIC 'B' #define UVS_UBAGG_CMD _IOWR(UVS_UBAGG_CMD_MAGIC, 1, struct uvs_ubagg_cmd_hdr) +struct uvs_ubagg_create_dev_arg { + struct { + uvs_eid_t agg_eid; + } in; +}; + +struct uvs_ubagg_delete_dev_arg { + struct { + uvs_eid_t agg_eid; + } in; +}; + +struct uvs_ubagg_get_dev_name_arg { + struct { + uvs_eid_t eid; + } in; + struct { + char dev_name[UVS_MAX_DEV_NAME_LEN]; + } out; +}; + struct uvs_ubagg_set_topo_info { struct { void *topo; @@ -33,6 +60,9 @@ struct uvs_ubagg_set_topo_info { } in; }; +int uvs_ubagg_ioctl_create_agg_dev(uvs_eid_t agg_eid); +int uvs_ubagg_ioctl_delete_agg_dev(uvs_eid_t agg_eid); +int uvs_ubagg_ioctl_get_dev_name_by_eid(uvs_eid_t eid, char *buf, size_t len); int uvs_ubagg_ioctl_set_topo(void *topo_info, int topo_num); int uvs_ubcore_ioctl_set_topo(void *topo_info, int topo_num); int uvs_ubcore_ioctl_get_route_list(const uvs_route_t *route, uvs_route_list_t *route_list); diff --git a/src/urma/tools/urma_admin/admin_cmd.h b/src/urma/tools/urma_admin/admin_cmd.h index 496a6da06416a53a19d2e95191045d669f4b3078..7fd43fb41941699d925b51b7b4e8dfe4757c6bbc 100644 --- a/src/urma/tools/urma_admin/admin_cmd.h +++ b/src/urma/tools/urma_admin/admin_cmd.h @@ -137,6 +137,32 @@ enum { UBCORE_ATTR_RES_LAST }; +typedef enum admin_agg_cmd { + CMD_AGG_ADD = 4, + CMD_AGG_DEL, +} admin_agg_cmd_t; + +struct admin_cmd_hdr { + uint32_t command; + uint32_t args_len; + uint64_t args_addr; +}; + +#define ADMIN_AGG_CMD_MAGIC 'B' +#define ADMIN_AGG_CMD _IOWR(ADMIN_AGG_CMD_MAGIC, 1, struct admin_cmd_hdr) + +struct cmd_agg_add_arg { + struct { + urma_eid_t agg_eid; + } in; +}; + +struct cmd_agg_del_arg { + struct { + urma_eid_t agg_eid; + } in; +}; + // Legacy command int admin_show_utp(const tool_config_t *cfg); int admin_show_stats(tool_config_t *cfg); diff --git a/src/urma/tools/urma_admin/admin_cmd_agg.c b/src/urma/tools/urma_admin/admin_cmd_agg.c index f607413c3c0cd09b0fcd05c510295cb8d4b7298c..af3508c71500c61852c7d07b4267b13fb26041bb 100644 --- a/src/urma/tools/urma_admin/admin_cmd_agg.c +++ b/src/urma/tools/urma_admin/admin_cmd_agg.c @@ -9,8 +9,12 @@ */ #include +#include #include "admin_cmd.h" +#include "ub_util.h" + +#define ADMIN_AGG_DEVICE_PATH "/dev/ubagg" static int cmd_agg_usage(admin_config_t *cfg) { @@ -19,6 +23,35 @@ static int cmd_agg_usage(admin_config_t *cfg) return 0; } +static int admin_cmd_agg_add(urma_eid_t eid) +{ + struct cmd_agg_add_arg args = {0}; + struct admin_cmd_hdr hdr = {0}; + int ret; + + args.in.agg_eid = eid; + + hdr.command = CMD_AGG_ADD; + hdr.args_addr = (uint64_t)(uintptr_t)&args; + hdr.args_len = sizeof(args); + + int dev_fd = open(ADMIN_AGG_DEVICE_PATH, O_RDWR); + if (dev_fd < 0) { + printf("Failed to open dev_fd err: %s.\n", ub_strerror(errno)); + return -1; + } + + ret = ioctl(dev_fd, ADMIN_AGG_CMD, &hdr); + if (ret != 0) { + printf("Failed to create aggr dev, ret: %d, errno: %d.\n", ret, errno); + close(dev_fd); + return -1; + } + + close(dev_fd); + return 0; +} + static int cmd_agg_add(admin_config_t *cfg) { int ret; @@ -26,7 +59,41 @@ static int cmd_agg_add(admin_config_t *cfg) return ret; } - printf("TODO add agg dev\n"); + ret = admin_cmd_agg_add(cfg->eid); + if (ret != 0) { + printf("Failed to add agg dev\n"); + return ret; + } + + return 0; +} + +static int admin_cmd_agg_del(urma_eid_t eid) +{ + struct cmd_agg_del_arg args = {0}; + struct admin_cmd_hdr hdr = {0}; + int ret; + + args.in.agg_eid = eid; + + hdr.command = CMD_AGG_DEL; + hdr.args_addr = (uint64_t)(uintptr_t)&args; + hdr.args_len = sizeof(args); + + int dev_fd = open(ADMIN_AGG_DEVICE_PATH, O_RDWR); + if (dev_fd < 0) { + printf("Failed to open dev_fd err: %s.\n", ub_strerror(errno)); + return -1; + } + + ret = ioctl(dev_fd, ADMIN_AGG_CMD, &hdr); + if (ret != 0) { + printf("Failed to del aggr dev, ret: %d, errno: %d.\n", ret, errno); + close(dev_fd); + return -1; + } + + close(dev_fd); return 0; } @@ -37,7 +104,11 @@ static int cmd_agg_del(admin_config_t *cfg) return ret; } - printf("TODO del agg dev\n"); + ret = admin_cmd_agg_del(cfg->eid); + if (ret != 0) { + printf("Failed to del agg dev\n"); + return ret; + } return 0; }