In this commit, we add a new function that appends the media
and the bearer identifier in a generic way. We align the rest
of the code to use this new function. There is no functional change.

Signed-off-by: Parthasarathy Bhuvaragan <parthasarathy.bhuvara...@ericsson.com>
---
 tipc/bearer.c | 150 ++++++++++++++++++++++++++++++----------------------------
 1 file changed, 77 insertions(+), 73 deletions(-)

diff --git a/tipc/bearer.c b/tipc/bearer.c
index 30b54d9fe24e..d6f1edf5b4c5 100644
--- a/tipc/bearer.c
+++ b/tipc/bearer.c
@@ -26,6 +26,9 @@
 #include "msg.h"
 #include "bearer.h"
 
+static int cmd_get_unique_bearer_name(const struct cmd *cmd, struct cmdl *cmdl,
+                                     struct opt *opts, char *bname);
+
 static void _print_bearer_opts(void)
 {
        fprintf(stderr,
@@ -67,22 +70,6 @@ static void cmd_bearer_enable_udp_help(struct cmdl *cmdl)
                cmdl->argv[0]);
 }
 
-static int enable_l2_bearer(struct nlmsghdr *nlh, struct opt *opts,
-                           struct cmdl *cmdl)
-{
-       struct opt *opt;
-       char id[TIPC_MAX_BEARER_NAME];
-
-       if (!(opt = get_opt(opts, "device"))) {
-               fprintf(stderr, "error: missing bearer device\n");
-               return -EINVAL;
-       }
-       snprintf(id, sizeof(id), "eth:%s", opt->val);
-       mnl_attr_put_strz(nlh, TIPC_NLA_BEARER_NAME, id);
-
-       return 0;
-}
-
 static int get_netid_cb(const struct nlmsghdr *nlh, void *data)
 {
        struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh);
@@ -134,7 +121,6 @@ static int enable_udp_bearer(struct nlmsghdr *nlh, struct 
opt *opts,
        char *remport = "6118";
        char *locip = NULL;
        char *remip = NULL;
-       char name[TIPC_MAX_BEARER_NAME];
        struct addrinfo *loc = NULL;
        struct addrinfo *rem = NULL;
        struct addrinfo hints = {
@@ -148,13 +134,6 @@ static int enable_udp_bearer(struct nlmsghdr *nlh, struct 
opt *opts,
                return -EINVAL;
        }
 
-       if (!(opt = get_opt(opts, "name"))) {
-               fprintf(stderr, "error, udp bearer name missing\n");
-               cmd_bearer_enable_udp_help(cmdl);
-               return -EINVAL;
-       }
-       snprintf(name, sizeof(name), "udp:%s", opt->val);
-
        if (!(opt = get_opt(opts, "localip"))) {
                fprintf(stderr, "error, udp bearer localip missing\n");
                cmd_bearer_enable_udp_help(cmdl);
@@ -197,8 +176,6 @@ static int enable_udp_bearer(struct nlmsghdr *nlh, struct 
opt *opts,
                return -EINVAL;
        }
 
-       mnl_attr_put_strz(nlh, TIPC_NLA_BEARER_NAME, name);
-
        nest = mnl_attr_nest_start(nlh, TIPC_NLA_BEARER_UDP_OPTS);
        mnl_attr_put(nlh, TIPC_NLA_UDP_LOCAL, loc->ai_addrlen, loc->ai_addr);
        mnl_attr_put(nlh, TIPC_NLA_UDP_REMOTE, rem->ai_addrlen, rem->ai_addr);
@@ -228,6 +205,7 @@ static int cmd_bearer_enable(struct nlmsghdr *nlh, const 
struct cmd *cmd,
        struct opt *opt;
        struct nlattr *nest;
        char buf[MNL_SOCKET_BUFFER_SIZE];
+       char bname[TIPC_MAX_BEARER_NAME];
        char *media;
        struct opt opts[] = {
                { "device",             NULL },
@@ -257,6 +235,9 @@ static int cmd_bearer_enable(struct nlmsghdr *nlh, const 
struct cmd *cmd,
        }
        media = opt->val;
 
+       if ((err = cmd_get_unique_bearer_name(cmd, cmdl, opts, bname)))
+               return err;
+
        if (!(nlh = msg_init(buf, TIPC_NL_BEARER_ENABLE))) {
                fprintf(stderr, "error: message initialisation failed\n");
                return -1;
@@ -274,6 +255,8 @@ 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 (strcmp(media, "udp") == 0) {
                if (help_flag) {
                        cmd_bearer_enable_udp_help(cmdl);
@@ -286,50 +269,15 @@ static int cmd_bearer_enable(struct nlmsghdr *nlh, const 
struct cmd *cmd,
                        cmd_bearer_enable_l2_help(cmdl);
                        return -EINVAL;
                }
-               if ((err = enable_l2_bearer(nlh, opts, cmdl)))
-                       return err;
        } 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 int add_l2_bearer(struct nlmsghdr *nlh, struct opt *opts)
-{
-       struct opt *opt;
-       char id[TIPC_MAX_BEARER_NAME];
-
-       if (!(opt = get_opt(opts, "device"))) {
-               fprintf(stderr, "error: missing bearer device\n");
-               return -EINVAL;
-       }
-       snprintf(id, sizeof(id), "eth:%s", opt->val);
-
-       mnl_attr_put_strz(nlh, TIPC_NLA_BEARER_NAME, id);
-
-       return 0;
-}
-
-static int add_udp_bearer(struct nlmsghdr *nlh, struct opt *opts)
-{
-       struct opt *opt;
-       char id[TIPC_MAX_BEARER_NAME];
-
-       if (!(opt = get_opt(opts, "name"))) {
-               fprintf(stderr, "error: missing bearer name\n");
-               return -EINVAL;
-       }
-       snprintf(id, sizeof(id), "udp:%s", opt->val);
-
-       mnl_attr_put_strz(nlh, TIPC_NLA_BEARER_NAME, id);
-
-       return 0;
-}
-
 static void cmd_bearer_disable_l2_help(struct cmdl *cmdl)
 {
        fprintf(stderr, "Usage: %s bearer disable media udp device DEVICE\n",
@@ -355,6 +303,7 @@ static int cmd_bearer_disable(struct nlmsghdr *nlh, const 
struct cmd *cmd,
        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[] = {
@@ -379,27 +328,27 @@ static int cmd_bearer_disable(struct nlmsghdr *nlh, const 
struct cmd *cmd,
        }
        media = opt->val;
 
+       if ((err = cmd_get_unique_bearer_name(cmd, cmdl, opts, bname)))
+               return err;
+
        if (!(nlh = msg_init(buf, TIPC_NL_BEARER_DISABLE))) {
                fprintf(stderr, "error, message initialisation failed\n");
                return -1;
        }
 
        nest = mnl_attr_nest_start(nlh, TIPC_NLA_BEARER);
+       mnl_attr_put_strz(nlh, TIPC_NLA_BEARER_NAME, bname);
 
        if (strcmp(media, "udp") == 0) {
                if (help_flag) {
                        cmd_bearer_disable_udp_help(cmdl);
                        return -EINVAL;
                }
-               if ((err = add_udp_bearer(nlh, opts)))
-                       return err;
        } else if ((strcmp(media, "eth") == 0) || (strcmp(media, "udp") == 0)) {
                if (help_flag) {
                        cmd_bearer_disable_l2_help(cmdl);
                        return -EINVAL;
                }
-               if ((err = add_l2_bearer(nlh, opts)))
-                       return err;
        } else {
                fprintf(stderr, "error, invalid media type \"%s\"\n", media);
                return -EINVAL;
@@ -441,6 +390,7 @@ static int cmd_bearer_set_prop(struct nlmsghdr *nlh, const 
struct cmd *cmd,
        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;
@@ -490,20 +440,21 @@ static int cmd_bearer_set_prop(struct nlmsghdr *nlh, 
const struct cmd *cmd,
        }
        media = opt->val;
 
+       if ((err = cmd_get_unique_bearer_name(cmd, cmdl, opts, bname)))
+               return err;
+
+       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;
                }
-               if ((err = add_udp_bearer(nlh, opts)))
-                       return err;
        } else if ((strcmp(media, "eth") == 0) || (strcmp(media, "udp") == 0)) {
                if (help_flag) {
                        cmd_bearer_set_l2_help(cmdl, media);
                        return -EINVAL;
                }
-               if ((err = add_l2_bearer(nlh, opts)))
-                       return err;
        } else {
                fprintf(stderr, "error, invalid media type \"%s\"\n", media);
                return -EINVAL;
@@ -581,6 +532,7 @@ static int cmd_bearer_get_prop(struct nlmsghdr *nlh, const 
struct cmd *cmd,
        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[] = {
@@ -618,21 +570,22 @@ static int cmd_bearer_get_prop(struct nlmsghdr *nlh, 
const struct cmd *cmd,
        }
        media = opt->val;
 
+       if ((err = cmd_get_unique_bearer_name(cmd, cmdl, opts, bname)))
+               return err;
+
        attrs = mnl_attr_nest_start(nlh, TIPC_NLA_BEARER);
+       mnl_attr_put_strz(nlh, TIPC_NLA_BEARER_NAME, bname);
+
        if (strcmp(media, "udp") == 0) {
                if (help_flag) {
                        cmd_bearer_get_udp_help(cmdl);
                        return -EINVAL;
                }
-               if ((err = add_udp_bearer(nlh, opts)))
-                       return err;
        } else if ((strcmp(media, "eth") == 0) || (strcmp(media, "udp") == 0)) {
                if (help_flag) {
                        cmd_bearer_get_l2_help(cmdl, media);
                        return -EINVAL;
                }
-               if ((err = add_l2_bearer(nlh, opts)))
-                       return err;
        } else {
                fprintf(stderr, "error, invalid media type \"%s\"\n", media);
                return -EINVAL;
@@ -696,6 +649,57 @@ static int cmd_bearer_list(struct nlmsghdr *nlh, const 
struct cmd *cmd,
        return msg_dumpit(nlh, bearer_list_cb, NULL);
 }
 
+static int cmd_get_unique_bearer_name(const struct cmd *cmd, struct cmdl *cmdl,
+                                     struct opt *opts, char *bname)
+{
+       char *media;
+       char *identifier;
+       struct opt *opt;
+       struct tipc_bearer_identifier {
+               char *media;
+               char *identifier;
+       };
+       struct tipc_bearer_identifier *entry;
+       struct tipc_bearer_identifier bname_list[] = {
+               { "udp",        "name" },
+               { "eth",        "device" },
+               { "ib",         "device" },
+               { NULL, },
+       };
+
+       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;
+
+       for (entry = bname_list; entry->media; entry++) {
+               if (strcmp(entry->media, media))
+                       continue;
+
+               if (!(opt = get_opt(opts, entry->identifier))) {
+                       if (help_flag)
+                               (cmd->help)(cmdl);
+                       else
+                               fprintf(stderr, "error, missing bearer %s\n",
+                                       entry->identifier);
+                       return -EINVAL;
+               }
+
+               identifier = opt->val;
+               snprintf(bname, TIPC_MAX_BEARER_NAME, "%s:%s", media, 
identifier);
+
+               return 0;
+       }
+
+       fprintf(stderr, "error, invalid media type %s\n", media);
+
+       return -EINVAL;
+}
+
 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