In this commit we introduce the ability to set and get
MTU for UDP media and bearer.

For set and get properties such as tolerance, window and priority,
we already do:

    $ tipc media set PPROPERTY media MEDIA
    $ tipc media get PPROPERTY media MEDIA

    $ tipc bearer set OPTION media MEDIA ARGS
    $ tipc bearer get [OPTION] media MEDIA ARGS

The same has been extended for MTU, with an exception to support
only media type UDP.

Acked-by: Jon Maloy <jon.ma...@ericsson.com>
Signed-off-by: GhantaKrishnamurthy MohanKrishna 
<mohan.krishna.ghanta.krishnamur...@ericsson.com>
---
 tipc/bearer.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++---------
 tipc/media.c  | 24 ++++++++++++++++++++++--
 2 files changed, 68 insertions(+), 11 deletions(-)

diff --git a/tipc/bearer.c b/tipc/bearer.c
index 0d8457015062..05dc84aa8ded 100644
--- a/tipc/bearer.c
+++ b/tipc/bearer.c
@@ -42,7 +42,8 @@ static void _print_bearer_opts(void)
                "OPTIONS\n"
                " priority              - Bearer link priority\n"
                " tolerance             - Bearer link tolerance\n"
-               " window                - Bearer link window\n");
+               " window                - Bearer link window\n"
+               " mtu                   - Bearer link mtu\n");
 }
 
 void print_bearer_media(void)
@@ -194,6 +195,21 @@ static int nl_add_udp_enable_opts(struct nlmsghdr *nlh, 
struct opt *opts,
        return 0;
 }
 
+static char *cmd_get_media_type(const struct cmd *cmd, struct cmdl *cmdl,
+                               struct opt *opts)
+{
+       struct opt *opt = get_opt(opts, "media");
+
+       if (!opt) {
+               if (help_flag)
+                       (cmd->help)(cmdl);
+               else
+                       fprintf(stderr, "error, missing bearer media\n");
+               return NULL;
+       }
+       return opt->val;
+}
+
 static int nl_add_bearer_name(struct nlmsghdr *nlh, const struct cmd *cmd,
                              struct cmdl *cmdl, struct opt *opts,
                              const struct tipc_sup_media *sup_media)
@@ -217,15 +233,8 @@ int cmd_get_unique_bearer_name(const struct cmd *cmd, 
struct cmdl *cmdl,
        struct opt *opt;
        const struct tipc_sup_media *entry;
 
-
-       if (!(opt = get_opt(opts, "media"))) {
-               if (help_flag)
-                       (cmd->help)(cmdl);
-               else
-                       fprintf(stderr, "error, missing bearer media\n");
+       if (!(media = cmd_get_media_type(cmd, cmdl, opts)))
                return -EINVAL;
-       }
-       media = opt->val;
 
        for (entry = sup_media; entry->media; entry++) {
                if (strcmp(entry->media, media))
@@ -559,6 +568,8 @@ static int cmd_bearer_set_prop(struct nlmsghdr *nlh, const 
struct cmd *cmd,
                prop = TIPC_NLA_PROP_TOL;
        else if ((strcmp(cmd->cmd, "window") == 0))
                prop = TIPC_NLA_PROP_WIN;
+       else if ((strcmp(cmd->cmd, "mtu") == 0))
+               prop = TIPC_NLA_PROP_MTU;
        else
                return -EINVAL;
 
@@ -571,6 +582,17 @@ static int cmd_bearer_set_prop(struct nlmsghdr *nlh, const 
struct cmd *cmd,
        if (parse_opts(opts, cmdl) < 0)
                return -EINVAL;
 
+       if (prop == TIPC_NLA_PROP_MTU) {
+               char *media = cmd_get_media_type(cmd, cmdl, opts);
+
+               if (!media)
+                       return -EINVAL;
+               else if (strcmp(media, "udp")) {
+                       fprintf(stderr, "error, not supported for media\n");
+                       return -EINVAL;
+               }
+       }
+
        if (!(nlh = msg_init(buf, TIPC_NL_BEARER_SET))) {
                fprintf(stderr, "error, message initialisation failed\n");
                return -1;
@@ -597,6 +619,7 @@ static int cmd_bearer_set(struct nlmsghdr *nlh, const 
struct cmd *cmd,
                { "priority",   cmd_bearer_set_prop,    cmd_bearer_set_help },
                { "tolerance",  cmd_bearer_set_prop,    cmd_bearer_set_help },
                { "window",     cmd_bearer_set_prop,    cmd_bearer_set_help },
+               { "mtu",        cmd_bearer_set_prop,    cmd_bearer_set_help },
                { NULL }
        };
 
@@ -877,12 +900,25 @@ static int cmd_bearer_get_prop(struct nlmsghdr *nlh, 
const struct cmd *cmd,
                prop = TIPC_NLA_PROP_TOL;
        else if ((strcmp(cmd->cmd, "window") == 0))
                prop = TIPC_NLA_PROP_WIN;
+       else if ((strcmp(cmd->cmd, "mtu") == 0))
+               prop = TIPC_NLA_PROP_MTU;
        else
                return -EINVAL;
 
        if (parse_opts(opts, cmdl) < 0)
                return -EINVAL;
 
+       if (prop == TIPC_NLA_PROP_MTU) {
+               char *media = cmd_get_media_type(cmd, cmdl, opts);
+
+               if (!media)
+                       return -EINVAL;
+               else if (strcmp(media, "udp")) {
+                       fprintf(stderr, "error, not supported for media\n");
+                       return -EINVAL;
+               }
+       }
+
        if (!(nlh = msg_init(buf, TIPC_NL_BEARER_GET))) {
                fprintf(stderr, "error, message initialisation failed\n");
                return -1;
@@ -904,6 +940,7 @@ static int cmd_bearer_get(struct nlmsghdr *nlh, const 
struct cmd *cmd,
                { "priority",   cmd_bearer_get_prop,    cmd_bearer_get_help },
                { "tolerance",  cmd_bearer_get_prop,    cmd_bearer_get_help },
                { "window",     cmd_bearer_get_prop,    cmd_bearer_get_help },
+               { "mtu",        cmd_bearer_get_prop,    cmd_bearer_get_help },
                { "media",      cmd_bearer_get_media,   cmd_bearer_get_help },
                { NULL }
        };
diff --git a/tipc/media.c b/tipc/media.c
index 6e10c7e5d8e6..969ef6578b3b 100644
--- a/tipc/media.c
+++ b/tipc/media.c
@@ -103,6 +103,8 @@ static int cmd_media_get_prop(struct nlmsghdr *nlh, const 
struct cmd *cmd,
                prop = TIPC_NLA_PROP_TOL;
        else if ((strcmp(cmd->cmd, "window") == 0))
                prop = TIPC_NLA_PROP_WIN;
+       else if ((strcmp(cmd->cmd, "mtu") == 0))
+               prop = TIPC_NLA_PROP_MTU;
        else
                return -EINVAL;
 
@@ -123,6 +125,12 @@ static int cmd_media_get_prop(struct nlmsghdr *nlh, const 
struct cmd *cmd,
                fprintf(stderr, "error, missing media\n");
                return -EINVAL;
        }
+
+       if ((prop == TIPC_NLA_PROP_MTU) &&
+           (strcmp(opt->val, "udp"))) {
+               fprintf(stderr, "error, not supported for media\n");
+               return -EINVAL;
+       }
        nest = mnl_attr_nest_start(nlh, TIPC_NLA_MEDIA);
        mnl_attr_put_strz(nlh, TIPC_NLA_MEDIA_NAME, opt->val);
        mnl_attr_nest_end(nlh, nest);
@@ -136,7 +144,8 @@ static void cmd_media_get_help(struct cmdl *cmdl)
                "PROPERTIES\n"
                " tolerance             - Get media tolerance\n"
                " priority              - Get media priority\n"
-               " window                - Get media window\n",
+               " window                - Get media window\n"
+               " mtu                   - Get media mtu\n",
                cmdl->argv[0]);
 }
 
@@ -147,6 +156,7 @@ static int cmd_media_get(struct nlmsghdr *nlh, const struct 
cmd *cmd,
                { "priority",   cmd_media_get_prop,     cmd_media_get_help },
                { "tolerance",  cmd_media_get_prop,     cmd_media_get_help },
                { "window",     cmd_media_get_prop,     cmd_media_get_help },
+               { "mtu",        cmd_media_get_prop,     cmd_media_get_help },
                { NULL }
        };
 
@@ -159,7 +169,8 @@ static void cmd_media_set_help(struct cmdl *cmdl)
                "PROPERTIES\n"
                " tolerance TOLERANCE   - Set media tolerance\n"
                " priority PRIORITY     - Set media priority\n"
-               " window WINDOW         - Set media window\n",
+               " window WINDOW         - Set media window\n"
+               " mtu MTU               - Set media mtu\n",
                cmdl->argv[0]);
 }
 
@@ -183,6 +194,8 @@ static int cmd_media_set_prop(struct nlmsghdr *nlh, const 
struct cmd *cmd,
                prop = TIPC_NLA_PROP_TOL;
        else if ((strcmp(cmd->cmd, "window") == 0))
                prop = TIPC_NLA_PROP_WIN;
+       else if ((strcmp(cmd->cmd, "mtu") == 0))
+               prop = TIPC_NLA_PROP_MTU;
        else
                return -EINVAL;
 
@@ -210,6 +223,12 @@ static int cmd_media_set_prop(struct nlmsghdr *nlh, const 
struct cmd *cmd,
                fprintf(stderr, "error, missing media\n");
                return -EINVAL;
        }
+
+       if ((prop == TIPC_NLA_PROP_MTU) &&
+           (strcmp(opt->val, "udp"))) {
+               fprintf(stderr, "error, not supported for media\n");
+               return -EINVAL;
+       }
        mnl_attr_put_strz(nlh, TIPC_NLA_MEDIA_NAME, opt->val);
 
        props = mnl_attr_nest_start(nlh, TIPC_NLA_MEDIA_PROP);
@@ -228,6 +247,7 @@ static int cmd_media_set(struct nlmsghdr *nlh, const struct 
cmd *cmd,
                { "priority",   cmd_media_set_prop,     cmd_media_set_help },
                { "tolerance",  cmd_media_set_prop,     cmd_media_set_help },
                { "window",     cmd_media_set_prop,     cmd_media_set_help },
+               { "mtu",        cmd_media_set_prop,     cmd_media_set_help },
                { NULL }
        };
 
-- 
2.1.4

Reply via email to