module/network: use separate functions to connect to RT/GENL netlink

This commit is contained in:
Daniel Eklöf 2021-08-26 18:58:21 +02:00
parent d39e6b8b94
commit 5249d9ef79
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F

View file

@ -156,31 +156,54 @@ nl_pid_value(void)
/* Connect and bind to netlink socket. Returns socket fd, or -1 on error */ /* Connect and bind to netlink socket. Returns socket fd, or -1 on error */
static int static int
netlink_connect(int protocol, bool bind_socket) netlink_connect_rt(void)
{ {
int sock = socket(AF_NETLINK, SOCK_RAW, protocol); int sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
if (sock == -1) { if (sock == -1) {
LOG_ERRNO("failed to create netlink socket"); LOG_ERRNO("failed to create netlink socket");
return -1; return -1;
} }
if (bind_socket) { const struct sockaddr_nl addr = {
const struct sockaddr_nl addr = { .nl_family = AF_NETLINK,
.nl_family = AF_NETLINK, .nl_pid = nl_pid_value(),
.nl_pid = nl_pid_value(), .nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR,
.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR, };
};
if (bind(sock, (const struct sockaddr *)&addr, sizeof(addr)) == -1) { if (bind(sock, (const struct sockaddr *)&addr, sizeof(addr)) == -1) {
LOG_ERRNO("failed to bind netlink socket"); LOG_ERRNO("failed to bind netlink socket");
close(sock); close(sock);
return -1; return -1;
}
} }
return sock; return sock;
} }
static int
netlink_connect_genl(void)
{
int sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_GENERIC);
if (sock == -1) {
LOG_ERRNO("failed to create netlink socket");
return -1;
}
#if 0
const struct sockaddr_nl addr = {
.nl_family = AF_NETLINK,
.nl_pid = nl_pid_value(),
.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR,
};
if (bind(sock, (const struct sockaddr *)&addr, sizeof(addr)) == -1) {
LOG_ERRNO("failed to bind netlink socket");
close(sock);
return -1;
}
#endif
return sock;
}
static bool static bool
send_nlmsg(int sock, const void *nlmsg, size_t len) send_nlmsg(int sock, const void *nlmsg, size_t len)
{ {
@ -734,8 +757,8 @@ run(struct module *mod)
int ret = 1; int ret = 1;
struct private *m = mod->private; struct private *m = mod->private;
m->rt_sock = netlink_connect(NETLINK_ROUTE, true); m->rt_sock = netlink_connect_rt();
m->genl_sock = netlink_connect(NETLINK_GENERIC, false); m->genl_sock = netlink_connect_genl();
if (m->rt_sock < 0 || m->genl_sock < 0) if (m->rt_sock < 0 || m->genl_sock < 0)
goto out; goto out;