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

Reply via email to