]> git.proxmox.com Git - mirror_iproute2.git/blobdiff - tipc/link.c
tipc: add link broadcast set method and ratio
[mirror_iproute2.git] / tipc / link.c
index 43e26da3fa6b5a6dacf30106eedfe7d63bb27476..e3b10bb7b3d4aa866d5a8485edb4ffc67dd67236 100644 (file)
@@ -28,6 +28,9 @@
 #define PRIORITY_STR "priority"
 #define TOLERANCE_STR "tolerance"
 #define WINDOW_STR "window"
+#define BROADCAST_STR "broadcast"
+
+static const char tipc_bclink_name[] = "broadcast-link";
 
 static int link_list_cb(const struct nlmsghdr *nlh, void *data)
 {
@@ -521,7 +524,8 @@ static void cmd_link_set_help(struct cmdl *cmdl)
                "PROPERTIES\n"
                " tolerance TOLERANCE   - Set link tolerance\n"
                " priority PRIORITY     - Set link priority\n"
-               " window WINDOW         - Set link window\n",
+               " window WINDOW         - Set link window\n"
+               " broadcast BROADCAST   - Set link broadcast\n",
                cmdl->argv[0]);
 }
 
@@ -585,6 +589,95 @@ static int cmd_link_set_prop(struct nlmsghdr *nlh, const struct cmd *cmd,
        return msg_doit(nlh, link_get_cb, &prop);
 }
 
+static void cmd_link_set_bcast_help(struct cmdl *cmdl)
+{
+       fprintf(stderr, "Usage: %s link set broadcast PROPERTY\n\n"
+               "PROPERTIES\n"
+               " BROADCAST         - Forces all multicast traffic to be\n"
+               "                     transmitted via broadcast only,\n"
+               "                     irrespective of cluster size and number\n"
+               "                     of destinations\n\n"
+               " REPLICAST         - Forces all multicast traffic to be\n"
+               "                     transmitted via replicast only,\n"
+               "                     irrespective of cluster size and number\n"
+               "                     of destinations\n\n"
+               " AUTOSELECT        - Auto switching to broadcast or replicast\n"
+               "                     depending on cluster size and destination\n"
+               "                     node number\n\n"
+               " ratio SIZE        - Set the AUTOSELECT criteria, percentage of\n"
+               "                     destination nodes vs cluster size\n\n",
+               cmdl->argv[0]);
+}
+
+static int cmd_link_set_bcast(struct nlmsghdr *nlh, const struct cmd *cmd,
+                            struct cmdl *cmdl, void *data)
+{
+       char buf[MNL_SOCKET_BUFFER_SIZE];
+       struct nlattr *props;
+       struct nlattr *attrs;
+       struct opt *opt;
+       struct opt opts[] = {
+               { "BROADCAST",  OPT_KEY, NULL },
+               { "REPLICAST",  OPT_KEY, NULL },
+               { "AUTOSELECT", OPT_KEY, NULL },
+               { "ratio",      OPT_KEYVAL,     NULL },
+               { NULL }
+       };
+       int method = 0;
+
+       if (help_flag) {
+               (cmd->help)(cmdl);
+               return -EINVAL;
+       }
+
+       if (parse_opts(opts, cmdl) < 0)
+               return -EINVAL;
+
+       for (opt = opts; opt->key; opt++)
+               if (opt->val)
+                       break;
+
+       if (!opt || !opt->key) {
+               (cmd->help)(cmdl);
+               return -EINVAL;
+       }
+
+       nlh = msg_init(buf, TIPC_NL_LINK_SET);
+       if (!nlh) {
+               fprintf(stderr, "error, message initialisation failed\n");
+               return -1;
+       }
+
+       attrs = mnl_attr_nest_start(nlh, TIPC_NLA_LINK);
+       /* Direct to broadcast-link setting */
+       mnl_attr_put_strz(nlh, TIPC_NLA_LINK_NAME, tipc_bclink_name);
+       props = mnl_attr_nest_start(nlh, TIPC_NLA_LINK_PROP);
+
+       if (get_opt(opts, "BROADCAST"))
+               method = 0x1;
+       else if (get_opt(opts, "REPLICAST"))
+               method = 0x2;
+       else if (get_opt(opts, "AUTOSELECT"))
+               method = 0x4;
+
+       opt = get_opt(opts, "ratio");
+       if (!method && !opt) {
+               (cmd->help)(cmdl);
+               return -EINVAL;
+       }
+
+       if (method)
+               mnl_attr_put_u32(nlh, TIPC_NLA_PROP_BROADCAST, method);
+
+       if (opt)
+               mnl_attr_put_u32(nlh, TIPC_NLA_PROP_BROADCAST_RATIO,
+                                atoi(opt->val));
+
+       mnl_attr_nest_end(nlh, props);
+       mnl_attr_nest_end(nlh, attrs);
+       return msg_doit(nlh, NULL, NULL);
+}
+
 static int cmd_link_set(struct nlmsghdr *nlh, const struct cmd *cmd,
                        struct cmdl *cmdl, void *data)
 {
@@ -592,6 +685,7 @@ static int cmd_link_set(struct nlmsghdr *nlh, const struct cmd *cmd,
                { PRIORITY_STR, cmd_link_set_prop,      cmd_link_set_help },
                { TOLERANCE_STR,        cmd_link_set_prop,      cmd_link_set_help },
                { WINDOW_STR,   cmd_link_set_prop,      cmd_link_set_help },
+               { BROADCAST_STR, cmd_link_set_bcast, cmd_link_set_bcast_help },
                { NULL }
        };