tipc: add link broadcast set method and ratio

The command added here makes it possible to forcibly configure the
broadcast link to use either broadcast or replicast, in addition to
the already existing auto selection algorithm.

A sample usage is shown below:
$tipc link set broadcast BROADCAST
$tipc link set broadcast AUTOSELECT ratio 25

$tipc link set broadcast -h
Usage: tipc link set broadcast PROPERTY

PROPERTIES
 BROADCAST         - Forces all multicast traffic to be
                     transmitted via broadcast only,
                     irrespective of cluster size and number
                     of destinations

 REPLICAST         - Forces all multicast traffic to be
                     transmitted via replicast only,
                     irrespective of cluster size and number
                     of destinations

 AUTOSELECT        - Auto switching to broadcast or replicast
                     depending on cluster size and destination
                     node number

 ratio SIZE        - Set the AUTOSELECT criteria, percentage of
                     destination nodes vs cluster size

Acked-by: Jon Maloy <jon.maloy@ericsson.com>
Signed-off-by: Hoang Le <hoang.h.le@dektech.com.au>
Signed-off-by: David Ahern <dsahern@gmail.com>
This commit is contained in:
Hoang Le 2019-03-22 15:47:33 +07:00 committed by David Ahern
parent cdeb2674aa
commit 0ea46945bc
1 changed files with 95 additions and 1 deletions

View 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 }
};