In this commit, we fix several bearer operations for infiniband media in a generic way.
Signed-off-by: Parthasarathy Bhuvaragan <parthasarathy.bhuvara...@ericsson.com> --- tipc/bearer.c | 257 ++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 152 insertions(+), 105 deletions(-) diff --git a/tipc/bearer.c b/tipc/bearer.c index c3494e96d3e3..89477c09a68f 100644 --- a/tipc/bearer.c +++ b/tipc/bearer.c @@ -26,6 +26,18 @@ #include "msg.h" #include "bearer.h" +struct tipc_bearer_ops { + char *name; + int (*add) (struct nlmsghdr *nlh, struct opt *opts, + struct cmdl *cmdl, char *bname); + void (*enable_help) (struct cmdl *cmdl); + void (*disable_help) (struct cmdl *cmdl); + void (*set_help) (struct cmdl *cmdl); + void (*get_help) (struct cmdl *cmdl); +}; + +static int cmd_find_bearer_ops(const struct cmd *cmd, struct cmdl *cmdl, + struct opt *opts, struct tipc_bearer_ops **bops); static int cmd_get_unique_bearer_name(const struct cmd *cmd, struct cmdl *cmdl, struct opt *opts, char *bname); @@ -47,10 +59,20 @@ static void _print_bearer_media(void) " eth - Ethernet\n"); } -static void cmd_bearer_enable_l2_help(struct cmdl *cmdl) +static void cmd_bearer_enable_eth_help(struct cmdl *cmdl) { fprintf(stderr, - "Usage: %s bearer enable media MEDIA device DEVICE [OPTIONS]\n" + "Usage: %s bearer enable media eth device DEVICE [OPTIONS]\n" + "\nOPTIONS\n" + " domain DOMAIN - Discovery domain\n" + " priority PRIORITY - Bearer priority\n", + cmdl->argv[0]); +} + +static void cmd_bearer_enable_ib_help(struct cmdl *cmdl) +{ + fprintf(stderr, + "Usage: %s bearer enable media ib device DEVICE [OPTIONS]\n" "\nOPTIONS\n" " domain DOMAIN - Discovery domain\n" " priority PRIORITY - Bearer priority\n", @@ -128,12 +150,6 @@ static int enable_udp_bearer(struct nlmsghdr *nlh, struct opt *opts, .ai_socktype = SOCK_DGRAM }; - if (help_flag) { - cmd_bearer_enable_udp_help(cmdl); - /* TODO find a better error code? */ - return -EINVAL; - } - if (!(opt = get_opt(opts, "localip"))) { fprintf(stderr, "error, udp bearer localip missing\n"); cmd_bearer_enable_udp_help(cmdl); @@ -187,6 +203,24 @@ static int enable_udp_bearer(struct nlmsghdr *nlh, struct opt *opts, return 0; } +static int add_bearer_name(struct nlmsghdr *nlh, struct opt *opts, + struct cmdl *cmdl, char *bname) +{ + mnl_attr_put_strz(nlh, TIPC_NLA_BEARER_NAME, bname); + return 0; +} + +static int add_udp_bearer(struct nlmsghdr *nlh, struct opt *opts, + struct cmdl *cmdl, char *bname) +{ + int err; + + if ((err = add_bearer_name(nlh, opts, cmdl, bname))) + return err; + + return enable_udp_bearer(nlh, opts, cmdl); +} + static void cmd_bearer_enable_help(struct cmdl *cmdl) { fprintf(stderr, @@ -206,7 +240,7 @@ static int cmd_bearer_enable(struct nlmsghdr *nlh, const struct cmd *cmd, struct nlattr *nest; char buf[MNL_SOCKET_BUFFER_SIZE]; char bname[TIPC_MAX_BEARER_NAME]; - char *media; + struct tipc_bearer_ops *bearer_oper; struct opt opts[] = { { "device", NULL }, { "domain", NULL }, @@ -226,14 +260,13 @@ static int cmd_bearer_enable(struct nlmsghdr *nlh, const struct cmd *cmd, return -EINVAL; } - if (!(opt = get_opt(opts, "media"))) { - if (help_flag) - (cmd->help)(cmdl); - else - fprintf(stderr, "error, missing bearer media\n"); + if ((err = cmd_find_bearer_ops(cmd, cmdl, opts, &bearer_oper))) + return err; + + if (help_flag) { + bearer_oper->enable_help(cmdl); return -EINVAL; } - media = opt->val; if ((err = cmd_get_unique_bearer_name(cmd, cmdl, opts, bname))) return err; @@ -255,32 +288,23 @@ static int cmd_bearer_enable(struct nlmsghdr *nlh, const struct cmd *cmd, mnl_attr_nest_end(nlh, props); } - mnl_attr_put_strz(nlh, TIPC_NLA_BEARER_NAME, bname); + if ((err = bearer_oper->add(nlh, opts, cmdl, bname))) + return err; - if (strcmp(media, "udp") == 0) { - if (help_flag) { - cmd_bearer_enable_udp_help(cmdl); - return -EINVAL; - } - if ((err = enable_udp_bearer(nlh, opts, cmdl))) - return err; - } else if ((strcmp(media, "eth") == 0) || (strcmp(media, "udp") == 0)) { - if (help_flag) { - cmd_bearer_enable_l2_help(cmdl); - return -EINVAL; - } - } else { - fprintf(stderr, "error, invalid media type \"%s\"\n", media); - return -EINVAL; - } mnl_attr_nest_end(nlh, nest); return msg_doit(nlh, NULL, NULL); } -static void cmd_bearer_disable_l2_help(struct cmdl *cmdl) +static void cmd_bearer_disable_eth_help(struct cmdl *cmdl) +{ + fprintf(stderr, "Usage: %s bearer disable media eth device DEVICE\n", + cmdl->argv[0]); +} + +static void cmd_bearer_disable_ib_help(struct cmdl *cmdl) { - fprintf(stderr, "Usage: %s bearer disable media udp device DEVICE\n", + fprintf(stderr, "Usage: %s bearer disable media ib device DEVICE\n", cmdl->argv[0]); } @@ -301,11 +325,9 @@ static int cmd_bearer_disable(struct nlmsghdr *nlh, const struct cmd *cmd, struct cmdl *cmdl, void *data) { int err; - char *media; char buf[MNL_SOCKET_BUFFER_SIZE]; char bname[TIPC_MAX_BEARER_NAME]; struct nlattr *nest; - struct opt *opt; struct opt opts[] = { { "device", NULL }, { "name", NULL }, @@ -319,33 +341,19 @@ static int cmd_bearer_disable(struct nlmsghdr *nlh, const struct cmd *cmd, return -EINVAL; } - if (!(opt = get_opt(opts, "media"))) { - if (help_flag) - (cmd->help)(cmdl); - else - fprintf(stderr, "error, missing bearer media\n"); + if (help_flag) { + struct tipc_bearer_ops *bearer_oper; + + if ((err = cmd_find_bearer_ops(cmd, cmdl, opts, &bearer_oper))) + return err; + + bearer_oper->disable_help(cmdl); return -EINVAL; } - media = opt->val; if ((err = cmd_get_unique_bearer_name(cmd, cmdl, opts, bname))) return err; - if (strcmp(media, "udp") == 0) { - if (help_flag) { - cmd_bearer_disable_udp_help(cmdl); - return -EINVAL; - } - } else if ((strcmp(media, "eth") == 0) || (strcmp(media, "udp") == 0)) { - if (help_flag) { - cmd_bearer_disable_l2_help(cmdl); - return -EINVAL; - } - } else { - fprintf(stderr, "error, invalid media type \"%s\"\n", media); - return -EINVAL; - } - if (!(nlh = msg_init(buf, TIPC_NL_BEARER_DISABLE))) { fprintf(stderr, "error, message initialisation failed\n"); return -1; @@ -353,11 +361,9 @@ static int cmd_bearer_disable(struct nlmsghdr *nlh, const struct cmd *cmd, nest = mnl_attr_nest_start(nlh, TIPC_NLA_BEARER); mnl_attr_put_strz(nlh, TIPC_NLA_BEARER_NAME, bname); - mnl_attr_nest_end(nlh, nest); return msg_doit(nlh, NULL, NULL); - } static void cmd_bearer_set_help(struct cmdl *cmdl) @@ -375,11 +381,19 @@ static void cmd_bearer_set_udp_help(struct cmdl *cmdl) _print_bearer_opts(); } -static void cmd_bearer_set_l2_help(struct cmdl *cmdl, char *media) +static void cmd_bearer_set_eth_help(struct cmdl *cmdl) { fprintf(stderr, - "Usage: %s bearer set [OPTION]... media %s device DEVICE\n", - cmdl->argv[0], media); + "Usage: %s bearer set [OPTION]... media eth device DEVICE\n", + cmdl->argv[0]); + _print_bearer_opts(); +} + +static void cmd_bearer_set_ib_help(struct cmdl *cmdl) +{ + fprintf(stderr, + "Usage: %s bearer set [OPTION]... media ib device DEVICE\n", + cmdl->argv[0]); _print_bearer_opts(); } @@ -389,12 +403,10 @@ static int cmd_bearer_set_prop(struct nlmsghdr *nlh, const struct cmd *cmd, int err; int val; int prop; - char *media; char buf[MNL_SOCKET_BUFFER_SIZE]; char bname[TIPC_MAX_BEARER_NAME]; struct nlattr *props; struct nlattr *attrs; - struct opt *opt; struct opt opts[] = { { "device", NULL }, { "media", NULL }, @@ -425,11 +437,15 @@ static int cmd_bearer_set_prop(struct nlmsghdr *nlh, const struct cmd *cmd, if (parse_opts(opts, cmdl) < 0) return -EINVAL; - if (!(opt = get_opt(opts, "media"))) { - fprintf(stderr, "error, missing media\n"); + if (help_flag) { + struct tipc_bearer_ops *bearer_oper; + + if ((err = cmd_find_bearer_ops(cmd, cmdl, opts, &bearer_oper))) + return err; + + bearer_oper->set_help(cmdl); return -EINVAL; } - media = opt->val; if ((err = cmd_get_unique_bearer_name(cmd, cmdl, opts, bname))) return err; @@ -445,21 +461,6 @@ static int cmd_bearer_set_prop(struct nlmsghdr *nlh, const struct cmd *cmd, mnl_attr_nest_end(nlh, props); mnl_attr_put_strz(nlh, TIPC_NLA_BEARER_NAME, bname); - - if (strcmp(media, "udp") == 0) { - if (help_flag) { - cmd_bearer_set_udp_help(cmdl); - return -EINVAL; - } - } else if ((strcmp(media, "eth") == 0) || (strcmp(media, "udp") == 0)) { - if (help_flag) { - cmd_bearer_set_l2_help(cmdl, media); - return -EINVAL; - } - } else { - fprintf(stderr, "error, invalid media type \"%s\"\n", media); - return -EINVAL; - } mnl_attr_nest_end(nlh, attrs); return msg_doit(nlh, NULL, NULL); @@ -493,11 +494,19 @@ static void cmd_bearer_get_udp_help(struct cmdl *cmdl) _print_bearer_opts(); } -static void cmd_bearer_get_l2_help(struct cmdl *cmdl, char *media) +static void cmd_bearer_get_eth_help(struct cmdl *cmdl) { fprintf(stderr, - "Usage: %s bearer get [OPTION]... media %s device DEVICE\n", - cmdl->argv[0], media); + "Usage: %s bearer get [OPTION]... media eth device DEVICE\n", + cmdl->argv[0]); + _print_bearer_opts(); +} + +static void cmd_bearer_get_ib_help(struct cmdl *cmdl) +{ + fprintf(stderr, + "Usage: %s bearer get [OPTION]... media ib device DEVICE\n", + cmdl->argv[0]); _print_bearer_opts(); } @@ -531,11 +540,9 @@ static int cmd_bearer_get_prop(struct nlmsghdr *nlh, const struct cmd *cmd, { int err; int prop; - char *media; char buf[MNL_SOCKET_BUFFER_SIZE]; char bname[TIPC_MAX_BEARER_NAME]; struct nlattr *attrs; - struct opt *opt; struct opt opts[] = { { "device", NULL }, { "media", NULL }, @@ -560,30 +567,19 @@ static int cmd_bearer_get_prop(struct nlmsghdr *nlh, const struct cmd *cmd, if (parse_opts(opts, cmdl) < 0) return -EINVAL; - if (!(opt = get_opt(opts, "media"))) { - fprintf(stderr, "error, missing media\n"); + if (help_flag) { + struct tipc_bearer_ops *bearer_oper; + + if ((err = cmd_find_bearer_ops(cmd, cmdl, opts, &bearer_oper))) + return err; + + bearer_oper->get_help(cmdl); return -EINVAL; } - media = opt->val; if ((err = cmd_get_unique_bearer_name(cmd, cmdl, opts, bname))) return err; - if (strcmp(media, "udp") == 0) { - if (help_flag) { - cmd_bearer_get_udp_help(cmdl); - return -EINVAL; - } - } else if ((strcmp(media, "eth") == 0) || (strcmp(media, "udp") == 0)) { - if (help_flag) { - cmd_bearer_get_l2_help(cmdl, media); - return -EINVAL; - } - } else { - fprintf(stderr, "error, invalid media type \"%s\"\n", media); - return -EINVAL; - } - if (!(nlh = msg_init(buf, TIPC_NL_BEARER_GET))) { fprintf(stderr, "error, message initialisation failed\n"); return -1; @@ -701,6 +697,57 @@ static int cmd_get_unique_bearer_name(const struct cmd *cmd, struct cmdl *cmdl, return -EINVAL; } +static struct tipc_bearer_ops *find_bearer_ops(const char *media) +{ + static struct tipc_bearer_ops media_list[] = { + { "udp", add_udp_bearer, cmd_bearer_enable_udp_help, + cmd_bearer_disable_udp_help, cmd_bearer_set_udp_help, + cmd_bearer_get_udp_help }, + { "eth", add_bearer_name, cmd_bearer_enable_eth_help, + cmd_bearer_disable_eth_help, cmd_bearer_set_eth_help, + cmd_bearer_get_eth_help }, + { "ib", add_bearer_name, cmd_bearer_enable_ib_help, + cmd_bearer_disable_ib_help, cmd_bearer_set_ib_help, + cmd_bearer_get_ib_help }, + { NULL, }, + }; + struct tipc_bearer_ops *entry; + + for (entry = media_list; entry->name; entry++) { + if (strcmp(entry->name, media) == 0) + return entry; + } + + return NULL; +} + +static int cmd_find_bearer_ops(const struct cmd *cmd, struct cmdl *cmdl, + struct opt *opts, struct tipc_bearer_ops **bops) +{ + struct opt *opt; + char *media; + struct tipc_bearer_ops *entry; + + if (!(opt = get_opt(opts, "media"))) { + if (help_flag) + (cmd->help)(cmdl); + else + fprintf(stderr, "error, missing bearer media\n"); + return -EINVAL; + } + media = opt->val; + + entry = find_bearer_ops(media); + + if (!entry) { + fprintf(stderr, "error, invalid media type %s\n", media); + return -EINVAL; + } + + *bops = entry; + return 0; +} + void cmd_bearer_help(struct cmdl *cmdl) { fprintf(stderr, -- 2.1.4 ------------------------------------------------------------------------------ What NetFlow Analyzer can do for you? Monitors network bandwidth and traffic patterns at an interface-level. Reveals which users, apps, and protocols are consuming the most bandwidth. Provides multi-vendor support for NetFlow, J-Flow, sFlow and other flows. Make informed decisions using capacity planning reports. https://ad.doubleclick.net/ddm/clk/305295220;132659582;e _______________________________________________ tipc-discussion mailing list tipc-discussion@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tipc-discussion