lib: Extract from devlink/mnlg a helper, mnlu_socket_open()
This little dance of mnl_socket_open(), option setting, and bind, is the same regardless of tool. Extract into a new module that should hold helpers for working with libmnl, mnl_util.c. Signed-off-by: Petr Machata <me@pmachata.org> Signed-off-by: David Ahern <dsahern@gmail.com>
This commit is contained in:
parent
9091ff0251
commit
72858c7b77
|
|
@ -12,7 +12,7 @@ endif
|
||||||
|
|
||||||
all: $(TARGETS) $(LIBS)
|
all: $(TARGETS) $(LIBS)
|
||||||
|
|
||||||
devlink: $(DEVLINKOBJ)
|
devlink: $(DEVLINKOBJ) $(LIBNETLINK)
|
||||||
$(QUIET_LINK)$(CC) $^ $(LDFLAGS) $(LDLIBS) -o $@
|
$(QUIET_LINK)$(CC) $^ $(LDFLAGS) $(LDLIBS) -o $@
|
||||||
|
|
||||||
install: all
|
install: all
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@
|
||||||
#include <linux/genetlink.h>
|
#include <linux/genetlink.h>
|
||||||
|
|
||||||
#include "libnetlink.h"
|
#include "libnetlink.h"
|
||||||
|
#include "mnl_utils.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "mnlg.h"
|
#include "mnlg.h"
|
||||||
|
|
||||||
|
|
@ -263,7 +264,6 @@ struct mnlg_socket *mnlg_socket_open(const char *family_name, uint8_t version)
|
||||||
{
|
{
|
||||||
struct mnlg_socket *nlg;
|
struct mnlg_socket *nlg;
|
||||||
struct nlmsghdr *nlh;
|
struct nlmsghdr *nlh;
|
||||||
int one = 1;
|
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
nlg = malloc(sizeof(*nlg));
|
nlg = malloc(sizeof(*nlg));
|
||||||
|
|
@ -274,19 +274,9 @@ struct mnlg_socket *mnlg_socket_open(const char *family_name, uint8_t version)
|
||||||
if (!nlg->buf)
|
if (!nlg->buf)
|
||||||
goto err_buf_alloc;
|
goto err_buf_alloc;
|
||||||
|
|
||||||
nlg->nl = mnl_socket_open(NETLINK_GENERIC);
|
nlg->nl = mnlu_socket_open(NETLINK_GENERIC);
|
||||||
if (!nlg->nl)
|
if (!nlg->nl)
|
||||||
goto err_mnl_socket_open;
|
goto err_socket_open;
|
||||||
|
|
||||||
/* Older kernels may no support capped/extended ACK reporting */
|
|
||||||
mnl_socket_setsockopt(nlg->nl, NETLINK_CAP_ACK, &one, sizeof(one));
|
|
||||||
mnl_socket_setsockopt(nlg->nl, NETLINK_EXT_ACK, &one, sizeof(one));
|
|
||||||
|
|
||||||
err = mnl_socket_bind(nlg->nl, 0, MNL_SOCKET_AUTOPID);
|
|
||||||
if (err < 0)
|
|
||||||
goto err_mnl_socket_bind;
|
|
||||||
|
|
||||||
nlg->portid = mnl_socket_get_portid(nlg->nl);
|
|
||||||
|
|
||||||
nlh = __mnlg_msg_prepare(nlg, CTRL_CMD_GETFAMILY,
|
nlh = __mnlg_msg_prepare(nlg, CTRL_CMD_GETFAMILY,
|
||||||
NLM_F_REQUEST | NLM_F_ACK, GENL_ID_CTRL, 1);
|
NLM_F_REQUEST | NLM_F_ACK, GENL_ID_CTRL, 1);
|
||||||
|
|
@ -305,9 +295,8 @@ struct mnlg_socket *mnlg_socket_open(const char *family_name, uint8_t version)
|
||||||
|
|
||||||
err_mnlg_socket_recv_run:
|
err_mnlg_socket_recv_run:
|
||||||
err_mnlg_socket_send:
|
err_mnlg_socket_send:
|
||||||
err_mnl_socket_bind:
|
|
||||||
mnl_socket_close(nlg->nl);
|
mnl_socket_close(nlg->nl);
|
||||||
err_mnl_socket_open:
|
err_socket_open:
|
||||||
free(nlg->buf);
|
free(nlg->buf);
|
||||||
err_buf_alloc:
|
err_buf_alloc:
|
||||||
free(nlg);
|
free(nlg);
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
#ifndef __MNL_UTILS_H__
|
||||||
|
#define __MNL_UTILS_H__ 1
|
||||||
|
|
||||||
|
struct mnl_socket *mnlu_socket_open(int bus);
|
||||||
|
|
||||||
|
#endif /* __MNL_UTILS_H__ */
|
||||||
|
|
@ -7,7 +7,7 @@ UTILOBJ = utils.o rt_names.o ll_map.o ll_types.o ll_proto.o ll_addr.o \
|
||||||
inet_proto.o namespace.o json_writer.o json_print.o \
|
inet_proto.o namespace.o json_writer.o json_print.o \
|
||||||
names.o color.o bpf.o exec.o fs.o cg_map.o
|
names.o color.o bpf.o exec.o fs.o cg_map.o
|
||||||
|
|
||||||
NLOBJ=libgenl.o libnetlink.o
|
NLOBJ=libgenl.o libnetlink.o mnl_utils.o
|
||||||
|
|
||||||
all: libnetlink.a libutil.a
|
all: libnetlink.a libutil.a
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,30 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0+
|
||||||
|
/*
|
||||||
|
* mnl_utils.c Helpers for working with libmnl.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <libmnl/libmnl.h>
|
||||||
|
|
||||||
|
#include "mnl_utils.h"
|
||||||
|
|
||||||
|
struct mnl_socket *mnlu_socket_open(int bus)
|
||||||
|
{
|
||||||
|
struct mnl_socket *nl;
|
||||||
|
int one = 1;
|
||||||
|
|
||||||
|
nl = mnl_socket_open(bus);
|
||||||
|
if (nl == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
mnl_socket_setsockopt(nl, NETLINK_CAP_ACK, &one, sizeof(one));
|
||||||
|
mnl_socket_setsockopt(nl, NETLINK_EXT_ACK, &one, sizeof(one));
|
||||||
|
|
||||||
|
if (mnl_socket_bind(nl, 0, MNL_SOCKET_AUTOPID) < 0)
|
||||||
|
goto err_bind;
|
||||||
|
|
||||||
|
return nl;
|
||||||
|
|
||||||
|
err_bind:
|
||||||
|
mnl_socket_close(nl);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue