forked from external/yambar
module/network: use separate functions to connect to RT/GENL netlink
This commit is contained in:
parent
d39e6b8b94
commit
5249d9ef79
1 changed files with 38 additions and 15 deletions
|
@ -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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue