From: Jon M. <jm...@re...> - 2021-03-31 14:56:19
|
On 3/29/21 6:59 AM, Hoang Le wrote: > To avoid duplication, avoid code duplication > tipc should be converted to use the helper > functions for working with libmnl in lib/mnl_utils.c > > Signed-off-by: Hoang Le <hoa...@de...> > --- > tipc/bearer.c | 38 ++++++-------- > tipc/cmdl.c | 2 - > tipc/link.c | 37 +++++-------- > tipc/media.c | 15 +++--- > tipc/msg.c | 132 +++-------------------------------------------- > tipc/msg.h | 2 +- > tipc/nametable.c | 5 +- > tipc/node.c | 33 +++++------- > tipc/peer.c | 8 ++- > tipc/socket.c | 10 ++-- > tipc/tipc.c | 21 +++++++- > 11 files changed, 83 insertions(+), 220 deletions(-) > > diff --git a/tipc/bearer.c b/tipc/bearer.c > index 4470819e4a96..2afc48b9b108 100644 > --- a/tipc/bearer.c > +++ b/tipc/bearer.c > @@ -21,9 +21,6 @@ > #include <linux/genetlink.h> > #include <linux/if.h> > > -#include <libmnl/libmnl.h> > -#include <sys/socket.h> > - > #include "utils.h" > #include "cmdl.h" > #include "msg.h" > @@ -101,11 +98,11 @@ static int get_netid_cb(const struct nlmsghdr *nlh, void *data) > > static int generate_multicast(short af, char *buf, int bufsize) > { > - int netid; > - char mnl_msg[MNL_SOCKET_BUFFER_SIZE]; > struct nlmsghdr *nlh; > + int netid; > > - if (!(nlh = msg_init(mnl_msg, TIPC_NL_NET_GET))) { > + nlh = msg_init(TIPC_NL_NET_GET); > + if (!nlh) { > fprintf(stderr, "error, message initialization failed\n"); > return -1; > } > @@ -399,7 +396,6 @@ static int cmd_bearer_add_media(struct nlmsghdr *nlh, const struct cmd *cmd, > { > int err; > char *media; > - char buf[MNL_SOCKET_BUFFER_SIZE]; > struct opt *opt; > struct nlattr *attrs; > struct opt opts[] = { > @@ -435,7 +431,8 @@ static int cmd_bearer_add_media(struct nlmsghdr *nlh, const struct cmd *cmd, > return -EINVAL; > } > > - if (!(nlh = msg_init(buf, TIPC_NL_BEARER_ADD))) { > + nlh = msg_init(TIPC_NL_BEARER_ADD); > + if (!nlh) { > fprintf(stderr, "error, message initialisation failed\n"); > return -1; > } > @@ -482,7 +479,6 @@ static int cmd_bearer_enable(struct nlmsghdr *nlh, const struct cmd *cmd, > int err; > struct opt *opt; > struct nlattr *nest; > - char buf[MNL_SOCKET_BUFFER_SIZE]; > struct opt opts[] = { > { "device", OPT_KEYVAL, NULL }, > { "domain", OPT_KEYVAL, NULL }, > @@ -508,7 +504,8 @@ static int cmd_bearer_enable(struct nlmsghdr *nlh, const struct cmd *cmd, > return -EINVAL; > } > > - if (!(nlh = msg_init(buf, TIPC_NL_BEARER_ENABLE))) { > + nlh = msg_init(TIPC_NL_BEARER_ENABLE); > + if (!nlh) { > fprintf(stderr, "error: message initialisation failed\n"); > return -1; > } > @@ -563,7 +560,6 @@ static int cmd_bearer_disable(struct nlmsghdr *nlh, const struct cmd *cmd, > struct cmdl *cmdl, void *data) > { > int err; > - char buf[MNL_SOCKET_BUFFER_SIZE]; > struct nlattr *nest; > struct opt opts[] = { > { "device", OPT_KEYVAL, NULL }, > @@ -584,7 +580,8 @@ static int cmd_bearer_disable(struct nlmsghdr *nlh, const struct cmd *cmd, > return -EINVAL; > } > > - if (!(nlh = msg_init(buf, TIPC_NL_BEARER_DISABLE))) { > + nlh = msg_init(TIPC_NL_BEARER_DISABLE); > + if (!nlh) { > fprintf(stderr, "error, message initialisation failed\n"); > return -1; > } > @@ -628,7 +625,6 @@ static int cmd_bearer_set_prop(struct nlmsghdr *nlh, const struct cmd *cmd, > int err; > int val; > int prop; > - char buf[MNL_SOCKET_BUFFER_SIZE]; > struct nlattr *props; > struct nlattr *attrs; > struct opt opts[] = { > @@ -675,7 +671,8 @@ static int cmd_bearer_set_prop(struct nlmsghdr *nlh, const struct cmd *cmd, > } > } > > - if (!(nlh = msg_init(buf, TIPC_NL_BEARER_SET))) { > + nlh = msg_init(TIPC_NL_BEARER_SET); > + if (!nlh) { > fprintf(stderr, "error, message initialisation failed\n"); > return -1; > } > @@ -876,7 +873,6 @@ static int cmd_bearer_get_media(struct nlmsghdr *nlh, const struct cmd *cmd, > { > int err; > char *media; > - char buf[MNL_SOCKET_BUFFER_SIZE]; > struct opt *opt; > struct cb_data cb_data = {0}; > struct nlattr *attrs; > @@ -918,7 +914,8 @@ static int cmd_bearer_get_media(struct nlmsghdr *nlh, const struct cmd *cmd, > return -EINVAL; > } > > - if (!(nlh = msg_init(buf, TIPC_NL_BEARER_GET))) { > + nlh = msg_init(TIPC_NL_BEARER_GET); > + if (!nlh) { > fprintf(stderr, "error, message initialisation failed\n"); > return -1; > } > @@ -956,7 +953,6 @@ static int cmd_bearer_get_prop(struct nlmsghdr *nlh, const struct cmd *cmd, > { > int err; > int prop; > - char buf[MNL_SOCKET_BUFFER_SIZE]; > struct nlattr *attrs; > struct opt opts[] = { > { "device", OPT_KEYVAL, NULL }, > @@ -1001,7 +997,8 @@ static int cmd_bearer_get_prop(struct nlmsghdr *nlh, const struct cmd *cmd, > } > } > > - if (!(nlh = msg_init(buf, TIPC_NL_BEARER_GET))) { > + nlh = msg_init(TIPC_NL_BEARER_GET); > + if (!nlh) { > fprintf(stderr, "error, message initialisation failed\n"); > return -1; > } > @@ -1056,14 +1053,13 @@ static int bearer_list_cb(const struct nlmsghdr *nlh, void *data) > static int cmd_bearer_list(struct nlmsghdr *nlh, const struct cmd *cmd, > struct cmdl *cmdl, void *data) > { > - char buf[MNL_SOCKET_BUFFER_SIZE]; > - > if (help_flag) { > fprintf(stderr, "Usage: %s bearer list\n", cmdl->argv[0]); > return -EINVAL; > } > > - if (!(nlh = msg_init(buf, TIPC_NL_BEARER_GET))) { > + nlh = msg_init(TIPC_NL_BEARER_GET); > + if (!nlh) { > fprintf(stderr, "error, message initialisation failed\n"); > return -1; > } > diff --git a/tipc/cmdl.c b/tipc/cmdl.c > index 981e268ebf94..feaac2da175f 100644 > --- a/tipc/cmdl.c > +++ b/tipc/cmdl.c > @@ -13,8 +13,6 @@ > #include <string.h> > #include <errno.h> > > -#include <libmnl/libmnl.h> > - > #include "cmdl.h" > > static const struct cmd *find_cmd(const struct cmd *cmds, char *str) > diff --git a/tipc/link.c b/tipc/link.c > index 192736eaa154..2123f109c694 100644 > --- a/tipc/link.c > +++ b/tipc/link.c > @@ -17,7 +17,6 @@ > #include <linux/tipc_netlink.h> > #include <linux/tipc.h> > #include <linux/genetlink.h> > -#include <libmnl/libmnl.h> > > #include "cmdl.h" > #include "msg.h" > @@ -60,7 +59,6 @@ static int link_list_cb(const struct nlmsghdr *nlh, void *data) > static int cmd_link_list(struct nlmsghdr *nlh, const struct cmd *cmd, > struct cmdl *cmdl, void *data) > { > - char buf[MNL_SOCKET_BUFFER_SIZE]; > int err = 0; > > if (help_flag) { > @@ -68,7 +66,7 @@ static int cmd_link_list(struct nlmsghdr *nlh, const struct cmd *cmd, > return -EINVAL; > } > > - nlh = msg_init(buf, TIPC_NL_LINK_GET); > + nlh = msg_init(TIPC_NL_LINK_GET); > if (!nlh) { > fprintf(stderr, "error, message initialisation failed\n"); > return -1; > @@ -126,7 +124,6 @@ static int cmd_link_get_prop(struct nlmsghdr *nlh, const struct cmd *cmd, > struct cmdl *cmdl, void *data) > { > int prop; > - char buf[MNL_SOCKET_BUFFER_SIZE]; > struct nlattr *attrs; > struct opt *opt; > struct opt opts[] = { > @@ -151,7 +148,7 @@ static int cmd_link_get_prop(struct nlmsghdr *nlh, const struct cmd *cmd, > if (parse_opts(opts, cmdl) < 0) > return -EINVAL; > > - nlh = msg_init(buf, TIPC_NL_LINK_GET); > + nlh = msg_init(TIPC_NL_LINK_GET); > if (!nlh) { > fprintf(stderr, "error, message initialisation failed\n"); > return -1; > @@ -241,7 +238,6 @@ static int cmd_link_get_bcast(struct nlmsghdr *nlh, const struct cmd *cmd, > struct cmdl *cmdl, void *data) > { > int prop = TIPC_NLA_PROP_BROADCAST; > - char buf[MNL_SOCKET_BUFFER_SIZE]; > struct nlattr *attrs; > > if (help_flag) { > @@ -249,7 +245,7 @@ static int cmd_link_get_bcast(struct nlmsghdr *nlh, const struct cmd *cmd, > return -EINVAL; > } > > - nlh = msg_init(buf, TIPC_NL_LINK_GET); > + nlh = msg_init(TIPC_NL_LINK_GET); > if (!nlh) { > fprintf(stderr, "error, message initialisation failed\n"); > return -1; > @@ -284,7 +280,6 @@ static int cmd_link_stat_reset(struct nlmsghdr *nlh, const struct cmd *cmd, > struct cmdl *cmdl, void *data) > { > char *link; > - char buf[MNL_SOCKET_BUFFER_SIZE]; > struct opt *opt; > struct nlattr *nest; > struct opt opts[] = { > @@ -302,7 +297,7 @@ static int cmd_link_stat_reset(struct nlmsghdr *nlh, const struct cmd *cmd, > return -EINVAL; > } > > - nlh = msg_init(buf, TIPC_NL_LINK_RESET_STATS); > + nlh = msg_init(TIPC_NL_LINK_RESET_STATS); > if (!nlh) { > fprintf(stderr, "error, message initialisation failed\n"); > return -1; > @@ -550,7 +545,6 @@ static int cmd_link_stat_show(struct nlmsghdr *nlh, const struct cmd *cmd, > struct cmdl *cmdl, void *data) > { > char *link = NULL; > - char buf[MNL_SOCKET_BUFFER_SIZE]; > struct opt *opt; > struct opt opts[] = { > { "link", OPT_KEYVAL, NULL }, > @@ -564,7 +558,7 @@ static int cmd_link_stat_show(struct nlmsghdr *nlh, const struct cmd *cmd, > return -EINVAL; > } > > - nlh = msg_init(buf, TIPC_NL_LINK_GET); > + nlh = msg_init(TIPC_NL_LINK_GET); > if (!nlh) { > fprintf(stderr, "error, message initialisation failed\n"); > return -1; > @@ -626,7 +620,6 @@ static int cmd_link_set_prop(struct nlmsghdr *nlh, const struct cmd *cmd, > { > int val; > int prop; > - char buf[MNL_SOCKET_BUFFER_SIZE]; > struct nlattr *props; > struct nlattr *attrs; > struct opt *opt; > @@ -658,7 +651,7 @@ static int cmd_link_set_prop(struct nlmsghdr *nlh, const struct cmd *cmd, > if (parse_opts(opts, cmdl) < 0) > return -EINVAL; > > - nlh = msg_init(buf, TIPC_NL_LINK_SET); > + nlh = msg_init(TIPC_NL_LINK_SET); > if (!nlh) { > fprintf(stderr, "error, message initialisation failed\n"); > return -1; > @@ -704,7 +697,6 @@ static void cmd_link_set_bcast_help(struct cmdl *cmdl) > 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; > @@ -734,7 +726,7 @@ static int cmd_link_set_bcast(struct nlmsghdr *nlh, const struct cmd *cmd, > return -EINVAL; > } > > - nlh = msg_init(buf, TIPC_NL_LINK_SET); > + nlh = msg_init(TIPC_NL_LINK_SET); > if (!nlh) { > fprintf(stderr, "error, message initialisation failed\n"); > return -1; > @@ -788,7 +780,6 @@ static int cmd_link_mon_set_prop(struct nlmsghdr *nlh, const struct cmd *cmd, > struct cmdl *cmdl, void *data) > { > int size; > - char buf[MNL_SOCKET_BUFFER_SIZE]; > struct nlattr *attrs; > > if (cmdl->argc != cmdl->optind + 1) { > @@ -797,7 +788,7 @@ static int cmd_link_mon_set_prop(struct nlmsghdr *nlh, const struct cmd *cmd, > } > size = atoi(shift_cmdl(cmdl)); > > - nlh = msg_init(buf, TIPC_NL_MON_SET); > + nlh = msg_init(TIPC_NL_MON_SET); > if (!nlh) { > fprintf(stderr, "error, message initialisation failed\n"); > return -1; > @@ -841,7 +832,6 @@ static int link_mon_summary_cb(const struct nlmsghdr *nlh, void *data) > static int cmd_link_mon_summary(struct nlmsghdr *nlh, const struct cmd *cmd, > struct cmdl *cmdl, void *data) > { > - char buf[MNL_SOCKET_BUFFER_SIZE]; > int err = 0; > > if (help_flag) { > @@ -849,7 +839,7 @@ static int cmd_link_mon_summary(struct nlmsghdr *nlh, const struct cmd *cmd, > return -EINVAL; > } > > - nlh = msg_init(buf, TIPC_NL_MON_GET); > + nlh = msg_init(TIPC_NL_MON_GET); > if (!nlh) { > fprintf(stderr, "error, message initialisation failed\n"); > return -1; > @@ -1004,11 +994,10 @@ exit: > static int link_mon_peer_list(uint32_t mon_ref) > { > struct nlmsghdr *nlh; > - char buf[MNL_SOCKET_BUFFER_SIZE]; > struct nlattr *nest; > int err = 0; > > - nlh = msg_init(buf, TIPC_NL_MON_PEER_GET); > + nlh = msg_init(TIPC_NL_MON_PEER_GET); > if (!nlh) { > fprintf(stderr, "error, message initialisation failed\n"); > return -1; > @@ -1080,7 +1069,6 @@ static void cmd_link_mon_list_udp_help(struct cmdl *cmdl, char *media) > static int cmd_link_mon_list(struct nlmsghdr *nlh, const struct cmd *cmd, > struct cmdl *cmdl, void *data) > { > - char buf[MNL_SOCKET_BUFFER_SIZE]; > char bname[TIPC_MAX_BEARER_NAME] = {0}; > struct opt opts[] = { > { "media", OPT_KEYVAL, NULL }, > @@ -1112,7 +1100,7 @@ static int cmd_link_mon_list(struct nlmsghdr *nlh, const struct cmd *cmd, > return -EINVAL; > } > > - nlh = msg_init(buf, TIPC_NL_MON_GET); > + nlh = msg_init(TIPC_NL_MON_GET); > if (!nlh) { > fprintf(stderr, "error, message initialisation failed\n"); > return -1; > @@ -1176,9 +1164,8 @@ static int link_mon_get_cb(const struct nlmsghdr *nlh, void *data) > static int cmd_link_mon_get_prop(struct nlmsghdr *nlh, const struct cmd *cmd, > struct cmdl *cmdl, void *data) > { > - char buf[MNL_SOCKET_BUFFER_SIZE]; > > - nlh = msg_init(buf, TIPC_NL_MON_GET); > + nlh = msg_init(TIPC_NL_MON_GET); > if (!nlh) { > fprintf(stderr, "error, message initialisation failed\n"); > return -1; > diff --git a/tipc/media.c b/tipc/media.c > index 969ef6578b3b..a3fec681cbf4 100644 > --- a/tipc/media.c > +++ b/tipc/media.c > @@ -15,9 +15,7 @@ > #include <errno.h> > > #include <linux/tipc_netlink.h> > -#include <linux/tipc.h> > #include <linux/genetlink.h> > -#include <libmnl/libmnl.h> > > #include "cmdl.h" > #include "msg.h" > @@ -45,14 +43,13 @@ static int media_list_cb(const struct nlmsghdr *nlh, void *data) > static int cmd_media_list(struct nlmsghdr *nlh, const struct cmd *cmd, > struct cmdl *cmdl, void *data) > { > - char buf[MNL_SOCKET_BUFFER_SIZE]; > - > if (help_flag) { > fprintf(stderr, "Usage: %s media list\n", cmdl->argv[0]); > return -EINVAL; > } > > - if (!(nlh = msg_init(buf, TIPC_NL_MEDIA_GET))) { > + nlh = msg_init(TIPC_NL_MEDIA_GET); > + if (!nlh) { > fprintf(stderr, "error, message initialisation failed\n"); > return -1; > } > @@ -89,7 +86,6 @@ static int cmd_media_get_prop(struct nlmsghdr *nlh, const struct cmd *cmd, > struct cmdl *cmdl, void *data) > { > int prop; > - char buf[MNL_SOCKET_BUFFER_SIZE]; > struct nlattr *nest; > struct opt *opt; > struct opt opts[] = { > @@ -116,7 +112,8 @@ static int cmd_media_get_prop(struct nlmsghdr *nlh, const struct cmd *cmd, > if (parse_opts(opts, cmdl) < 0) > return -EINVAL; > > - if (!(nlh = msg_init(buf, TIPC_NL_MEDIA_GET))) { > + nlh = msg_init(TIPC_NL_MEDIA_GET); > + if (!nlh) { > fprintf(stderr, "error, message initialisation failed\n"); > return -1; > } > @@ -179,7 +176,6 @@ static int cmd_media_set_prop(struct nlmsghdr *nlh, const struct cmd *cmd, > { > int val; > int prop; > - char buf[MNL_SOCKET_BUFFER_SIZE]; > struct nlattr *props; > struct nlattr *attrs; > struct opt *opt; > @@ -213,7 +209,8 @@ static int cmd_media_set_prop(struct nlmsghdr *nlh, const struct cmd *cmd, > if (parse_opts(opts, cmdl) < 0) > return -EINVAL; > > - if (!(nlh = msg_init(buf, TIPC_NL_MEDIA_SET))) { > + nlh = msg_init(TIPC_NL_MEDIA_SET); > + if (!nlh) { > fprintf(stderr, "error, message initialisation failed\n"); > return -1; > } > diff --git a/tipc/msg.c b/tipc/msg.c > index dc09d05048f3..1225691c9a81 100644 > --- a/tipc/msg.c > +++ b/tipc/msg.c > @@ -13,13 +13,13 @@ > #include <time.h> > #include <errno.h> > > -#include <linux/tipc_netlink.h> > -#include <linux/tipc.h> > -#include <linux/genetlink.h> > #include <libmnl/libmnl.h> > > +#include "mnl_utils.h" > #include "msg.h" > > +extern struct mnlu_gen_socket tipc_nlg; > + > int parse_attrs(const struct nlattr *attr, void *data) > { > const struct nlattr **tb = data; > @@ -30,141 +30,23 @@ int parse_attrs(const struct nlattr *attr, void *data) > return MNL_CB_OK; > } > > -static int family_id_cb(const struct nlmsghdr *nlh, void *data) > -{ > - struct nlattr *tb[CTRL_ATTR_MAX + 1] = {}; > - struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh); > - int *id = data; > - > - mnl_attr_parse(nlh, sizeof(*genl), parse_attrs, tb); > - if (!tb[CTRL_ATTR_FAMILY_ID]) > - return MNL_CB_ERROR; > - > - *id = mnl_attr_get_u16(tb[CTRL_ATTR_FAMILY_ID]); > - > - return MNL_CB_OK; > -} > - > -static struct mnl_socket *msg_send(struct nlmsghdr *nlh) > -{ > - int ret; > - struct mnl_socket *nl; > - > - nl = mnl_socket_open(NETLINK_GENERIC); > - if (nl == NULL) { > - perror("mnl_socket_open"); > - return NULL; > - } > - > - ret = mnl_socket_bind(nl, 0, MNL_SOCKET_AUTOPID); > - if (ret < 0) { > - perror("mnl_socket_bind"); > - return NULL; > - } > - > - ret = mnl_socket_sendto(nl, nlh, nlh->nlmsg_len); > - if (ret < 0) { > - perror("mnl_socket_send"); > - return NULL; > - } > - > - return nl; > -} > - > -static int msg_recv(struct mnl_socket *nl, mnl_cb_t callback, void *data, int seq) > -{ > - int ret; > - unsigned int portid; > - char buf[MNL_SOCKET_BUFFER_SIZE]; > - > - portid = mnl_socket_get_portid(nl); > - > - ret = mnl_socket_recvfrom(nl, buf, sizeof(buf)); > - while (ret > 0) { > - ret = mnl_cb_run(buf, ret, seq, portid, callback, data); > - if (ret <= 0) > - break; > - ret = mnl_socket_recvfrom(nl, buf, sizeof(buf)); > - } > - if (ret == -1) > - perror("error"); > - > - mnl_socket_close(nl); > - > - return ret; > -} > - > -static int msg_query(struct nlmsghdr *nlh, mnl_cb_t callback, void *data) > -{ > - unsigned int seq; > - struct mnl_socket *nl; > - > - seq = time(NULL); > - nlh->nlmsg_seq = seq; > - > - nl = msg_send(nlh); > - if (!nl) > - return -ENOTSUP; > - > - return msg_recv(nl, callback, data, seq); > -} > - > -static int get_family(void) > -{ > - int err; > - int nl_family; > - struct nlmsghdr *nlh; > - struct genlmsghdr *genl; > - char buf[MNL_SOCKET_BUFFER_SIZE]; > - > - nlh = mnl_nlmsg_put_header(buf); > - nlh->nlmsg_type = GENL_ID_CTRL; > - nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; > - > - genl = mnl_nlmsg_put_extra_header(nlh, sizeof(struct genlmsghdr)); > - genl->cmd = CTRL_CMD_GETFAMILY; > - genl->version = 1; > - > - mnl_attr_put_u16(nlh, CTRL_ATTR_FAMILY_ID, GENL_ID_CTRL); > - mnl_attr_put_strz(nlh, CTRL_ATTR_FAMILY_NAME, TIPC_GENL_V2_NAME); > - > - if ((err = msg_query(nlh, family_id_cb, &nl_family))) > - return err; > - > - return nl_family; > -} > - > int msg_doit(struct nlmsghdr *nlh, mnl_cb_t callback, void *data) > { > nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; > - return msg_query(nlh, callback, data); > + return mnlu_gen_socket_sndrcv(&tipc_nlg, nlh, callback, data); > } > > int msg_dumpit(struct nlmsghdr *nlh, mnl_cb_t callback, void *data) > { > nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP; > - return msg_query(nlh, callback, data); > + return mnlu_gen_socket_sndrcv(&tipc_nlg, nlh, callback, data); > } > > -struct nlmsghdr *msg_init(char *buf, int cmd) > +struct nlmsghdr *msg_init(int cmd) > { > - int family; > struct nlmsghdr *nlh; > - struct genlmsghdr *genl; > - > - family = get_family(); > - if (family <= 0) { > - fprintf(stderr, > - "Unable to get TIPC nl family id (module loaded?)\n"); > - return NULL; > - } > - > - nlh = mnl_nlmsg_put_header(buf); > - nlh->nlmsg_type = family; > > - genl = mnl_nlmsg_put_extra_header(nlh, sizeof(struct genlmsghdr)); > - genl->cmd = cmd; > - genl->version = 1; > + nlh = mnlu_gen_socket_cmd_prepare(&tipc_nlg, cmd, 0); > > return nlh; > } > diff --git a/tipc/msg.h b/tipc/msg.h > index 41fd1ad1403a..56af5a705fb9 100644 > --- a/tipc/msg.h > +++ b/tipc/msg.h > @@ -12,7 +12,7 @@ > #ifndef _TIPC_MSG_H > #define _TIPC_MSG_H > > -struct nlmsghdr *msg_init(char *buf, int cmd); > +struct nlmsghdr *msg_init(int cmd); > int msg_doit(struct nlmsghdr *nlh, mnl_cb_t callback, void *data); > int msg_dumpit(struct nlmsghdr *nlh, mnl_cb_t callback, void *data); > int parse_attrs(const struct nlattr *attr, void *data); > diff --git a/tipc/nametable.c b/tipc/nametable.c > index d899eeb67c07..b09ed5fc7280 100644 > --- a/tipc/nametable.c > +++ b/tipc/nametable.c > @@ -15,7 +15,6 @@ > #include <linux/tipc_netlink.h> > #include <linux/tipc.h> > #include <linux/genetlink.h> > -#include <libmnl/libmnl.h> > > #include "cmdl.h" > #include "msg.h" > @@ -82,7 +81,6 @@ static int cmd_nametable_show(struct nlmsghdr *nlh, const struct cmd *cmd, > struct cmdl *cmdl, void *data) > { > int iteration = 0; > - char buf[MNL_SOCKET_BUFFER_SIZE]; > int rc = 0; > > if (help_flag) { > @@ -90,7 +88,8 @@ static int cmd_nametable_show(struct nlmsghdr *nlh, const struct cmd *cmd, > return -EINVAL; > } > > - if (!(nlh = msg_init(buf, TIPC_NL_NAME_TABLE_GET))) { > + nlh = msg_init(TIPC_NL_NAME_TABLE_GET); > + if (!nlh) { > fprintf(stderr, "error, message initialisation failed\n"); > return -1; > } > diff --git a/tipc/node.c b/tipc/node.c > index 05246013487f..ae75bfff7d2f 100644 > --- a/tipc/node.c > +++ b/tipc/node.c > @@ -17,7 +17,6 @@ > #include <linux/tipc_netlink.h> > #include <linux/tipc.h> > #include <linux/genetlink.h> > -#include <libmnl/libmnl.h> > > #include "cmdl.h" > #include "msg.h" > @@ -52,14 +51,13 @@ static int node_list_cb(const struct nlmsghdr *nlh, void *data) > static int cmd_node_list(struct nlmsghdr *nlh, const struct cmd *cmd, > struct cmdl *cmdl, void *data) > { > - char buf[MNL_SOCKET_BUFFER_SIZE]; > - > if (help_flag) { > fprintf(stderr, "Usage: %s node list\n", cmdl->argv[0]); > return -EINVAL; > } > > - if (!(nlh = msg_init(buf, TIPC_NL_NODE_GET))) { > + nlh = msg_init(TIPC_NL_NODE_GET); > + if (!nlh) { > fprintf(stderr, "error, message initialisation failed\n"); > return -1; > } > @@ -73,7 +71,6 @@ static int cmd_node_set_addr(struct nlmsghdr *nlh, const struct cmd *cmd, > char *str; > uint32_t addr; > struct nlattr *nest; > - char buf[MNL_SOCKET_BUFFER_SIZE]; > > if (cmdl->argc != cmdl->optind + 1) { > fprintf(stderr, "Usage: %s node set address ADDRESS\n", > @@ -86,7 +83,8 @@ static int cmd_node_set_addr(struct nlmsghdr *nlh, const struct cmd *cmd, > if (!addr) > return -1; > > - if (!(nlh = msg_init(buf, TIPC_NL_NET_SET))) { > + nlh = msg_init(TIPC_NL_NET_SET); > + if (!nlh) { > fprintf(stderr, "error, message initialisation failed\n"); > return -1; > } > @@ -126,7 +124,6 @@ static int cmd_node_get_addr(struct nlmsghdr *nlh, const struct cmd *cmd, > static int cmd_node_set_nodeid(struct nlmsghdr *nlh, const struct cmd *cmd, > struct cmdl *cmdl, void *data) > { > - char buf[MNL_SOCKET_BUFFER_SIZE]; > uint8_t id[16] = {0,}; > uint64_t *w0 = (uint64_t *) &id[0]; > uint64_t *w1 = (uint64_t *) &id[8]; > @@ -145,7 +142,7 @@ static int cmd_node_set_nodeid(struct nlmsghdr *nlh, const struct cmd *cmd, > return -EINVAL; > } > > - nlh = msg_init(buf, TIPC_NL_NET_SET); > + nlh = msg_init(TIPC_NL_NET_SET); > if (!nlh) { > fprintf(stderr, "error, message initialisation failed\n"); > return -1; > @@ -201,7 +198,6 @@ static int cmd_node_set_key(struct nlmsghdr *nlh, const struct cmd *cmd, > }; > struct nlattr *nest; > struct opt *opt_algname, *opt_nodeid, *opt_master, *opt_rekeying; > - char buf[MNL_SOCKET_BUFFER_SIZE]; > uint8_t id[TIPC_NODEID_LEN] = {0,}; > uint32_t rekeying = 0; > bool has_key = false; > @@ -262,7 +258,7 @@ get_ops: > } > > /* Init & do the command */ > - nlh = msg_init(buf, TIPC_NL_KEY_SET); > + nlh = msg_init(TIPC_NL_KEY_SET); > if (!nlh) { > fprintf(stderr, "error, message initialisation failed\n"); > return -1; > @@ -287,15 +283,13 @@ get_ops: > static int cmd_node_flush_key(struct nlmsghdr *nlh, const struct cmd *cmd, > struct cmdl *cmdl, void *data) > { > - char buf[MNL_SOCKET_BUFFER_SIZE]; > - > if (help_flag) { > (cmd->help)(cmdl); > return -EINVAL; > } > > /* Init & do the command */ > - nlh = msg_init(buf, TIPC_NL_KEY_FLUSH); > + nlh = msg_init(TIPC_NL_KEY_FLUSH); > if (!nlh) { > fprintf(stderr, "error, message initialisation failed\n"); > return -1; > @@ -332,14 +326,12 @@ static int nodeid_get_cb(const struct nlmsghdr *nlh, void *data) > static int cmd_node_get_nodeid(struct nlmsghdr *nlh, const struct cmd *cmd, > struct cmdl *cmdl, void *data) > { > - char buf[MNL_SOCKET_BUFFER_SIZE]; > - > if (help_flag) { > (cmd->help)(cmdl); > return -EINVAL; > } > > - nlh = msg_init(buf, TIPC_NL_NET_GET); > + nlh = msg_init(TIPC_NL_NET_GET); > if (!nlh) { > fprintf(stderr, "error, message initialisation failed\n"); > return -1; > @@ -370,14 +362,13 @@ static int netid_get_cb(const struct nlmsghdr *nlh, void *data) > static int cmd_node_get_netid(struct nlmsghdr *nlh, const struct cmd *cmd, > struct cmdl *cmdl, void *data) > { > - char buf[MNL_SOCKET_BUFFER_SIZE]; > - > if (help_flag) { > (cmd->help)(cmdl); > return -EINVAL; > } > > - if (!(nlh = msg_init(buf, TIPC_NL_NET_GET))) { > + nlh = msg_init(TIPC_NL_NET_GET); > + if (!nlh) { > fprintf(stderr, "error, message initialisation failed\n"); > return -1; > } > @@ -389,7 +380,6 @@ static int cmd_node_set_netid(struct nlmsghdr *nlh, const struct cmd *cmd, > struct cmdl *cmdl, void *data) > { > int netid; > - char buf[MNL_SOCKET_BUFFER_SIZE]; > struct nlattr *nest; > > if (help_flag) { > @@ -397,7 +387,8 @@ static int cmd_node_set_netid(struct nlmsghdr *nlh, const struct cmd *cmd, > return -EINVAL; > } > > - if (!(nlh = msg_init(buf, TIPC_NL_NET_SET))) { > + nlh = msg_init(TIPC_NL_NET_SET); > + if (!nlh) { > fprintf(stderr, "error, message initialisation failed\n"); > return -1; > } > diff --git a/tipc/peer.c b/tipc/peer.c > index f14ec35e6f71..ed18efc552fa 100644 > --- a/tipc/peer.c > +++ b/tipc/peer.c > @@ -17,7 +17,6 @@ > #include <linux/tipc_netlink.h> > #include <linux/tipc.h> > #include <linux/genetlink.h> > -#include <libmnl/libmnl.h> > > #include "cmdl.h" > #include "msg.h" > @@ -30,7 +29,6 @@ static int cmd_peer_rm_addr(struct nlmsghdr *nlh, const struct cmd *cmd, > char *str; > uint32_t addr; > struct nlattr *nest; > - char buf[MNL_SOCKET_BUFFER_SIZE]; > > if ((cmdl->argc != cmdl->optind + 1) || help_flag) { > fprintf(stderr, "Usage: %s peer remove address ADDRESS\n", > @@ -47,7 +45,8 @@ static int cmd_peer_rm_addr(struct nlmsghdr *nlh, const struct cmd *cmd, > if (!addr) > return -1; > > - if (!(nlh = msg_init(buf, TIPC_NL_PEER_REMOVE))) { > + nlh = msg_init(TIPC_NL_PEER_REMOVE); > + if (!nlh) { > fprintf(stderr, "error, message initialisation failed\n"); > return -1; > } > @@ -62,7 +61,6 @@ static int cmd_peer_rm_addr(struct nlmsghdr *nlh, const struct cmd *cmd, > static int cmd_peer_rm_nodeid(struct nlmsghdr *nlh, const struct cmd *cmd, > struct cmdl *cmdl, void *data) > { > - char buf[MNL_SOCKET_BUFFER_SIZE]; > __u8 id[16] = {0,}; > __u64 *w0 = (__u64 *)&id[0]; > __u64 *w1 = (__u64 *)&id[8]; > @@ -81,7 +79,7 @@ static int cmd_peer_rm_nodeid(struct nlmsghdr *nlh, const struct cmd *cmd, > return -EINVAL; > } > > - nlh = msg_init(buf, TIPC_NL_PEER_REMOVE); > + nlh = msg_init(TIPC_NL_PEER_REMOVE); > if (!nlh) { > fprintf(stderr, "error, message initialisation failed\n"); > return -1; > diff --git a/tipc/socket.c b/tipc/socket.c > index 852984ecd1e7..deae12af4409 100644 > --- a/tipc/socket.c > +++ b/tipc/socket.c > @@ -15,7 +15,6 @@ > #include <linux/tipc.h> > #include <linux/tipc_netlink.h> > #include <linux/genetlink.h> > -#include <libmnl/libmnl.h> > > #include "cmdl.h" > #include "msg.h" > @@ -46,10 +45,10 @@ static int publ_list_cb(const struct nlmsghdr *nlh, void *data) > static int publ_list(uint32_t sock) > { > struct nlmsghdr *nlh; > - char buf[MNL_SOCKET_BUFFER_SIZE]; > struct nlattr *nest; > > - if (!(nlh = msg_init(buf, TIPC_NL_PUBL_GET))) { > + nlh = msg_init(TIPC_NL_PUBL_GET); > + if (!nlh) { > fprintf(stderr, "error, message initialisation failed\n"); > return -1; > } > @@ -103,14 +102,13 @@ static int sock_list_cb(const struct nlmsghdr *nlh, void *data) > static int cmd_socket_list(struct nlmsghdr *nlh, const struct cmd *cmd, > struct cmdl *cmdl, void *data) > { > - char buf[MNL_SOCKET_BUFFER_SIZE]; > - > if (help_flag) { > fprintf(stderr, "Usage: %s socket list\n", cmdl->argv[0]); > return -EINVAL; > } > > - if (!(nlh = msg_init(buf, TIPC_NL_SOCK_GET))) { > + nlh = msg_init(TIPC_NL_SOCK_GET); > + if (!nlh) { > fprintf(stderr, "error, message initialisation failed\n"); > return -1; > } > diff --git a/tipc/tipc.c b/tipc/tipc.c > index 60176a044f8d..9f23a4bfd25d 100644 > --- a/tipc/tipc.c > +++ b/tipc/tipc.c > @@ -13,7 +13,11 @@ > #include <stdlib.h> > #include <getopt.h> > #include <unistd.h> > +#include <linux/tipc_netlink.h> > +#include <libmnl/libmnl.h> > +#include <errno.h> > > +#include "mnl_utils.h" > #include "bearer.h" > #include "link.h" > #include "nametable.h" > @@ -26,6 +30,7 @@ > > int help_flag; > int json; > +struct mnlu_gen_socket tipc_nlg; > > static void about(struct cmdl *cmdl) > { > @@ -110,8 +115,20 @@ int main(int argc, char *argv[]) > cmdl.argc = argc; > cmdl.argv = argv; > > - if ((res = run_cmd(NULL, &cmd, cmds, &cmdl, NULL)) != 0) > - return 1; > + res = mnlu_gen_socket_open(&tipc_nlg, TIPC_GENL_V2_NAME, > + TIPC_GENL_V2_VERSION); > + if (res) { > + fprintf(stderr, > + "Unable to get TIPC nl family id (module loaded?)\n"); > + return -1; > + } > > + res = run_cmd(NULL, &cmd, cmds, &cmdl, &tipc_nlg); > + if (res != 0) { > + mnlu_gen_socket_close(&tipc_nlg); > + return -1; > + } > + > + mnlu_gen_socket_close(&tipc_nlg); > return 0; > } Acked-by: Jon Maloy <jm...@re...> |