mirror of
https://codeberg.org/dnkl/yambar.git
synced 2025-06-23 02:25:39 +02:00
Merge branch 'master' into module_mpris
This commit is contained in:
commit
0d8ef94921
9 changed files with 211 additions and 75 deletions
|
@ -437,7 +437,7 @@ run(struct module *mod)
|
|||
*/
|
||||
while (!aborted) {
|
||||
struct pollfd fds[] = {{.fd = mod->abort_fd, .events = POLLIN}};
|
||||
int res = poll(fds, sizeof(fds) / sizeof(fds[0]), 10 * 1000);
|
||||
int res = poll(fds, sizeof(fds) / sizeof(fds[0]), 2 * 1000);
|
||||
|
||||
if (res < 0) {
|
||||
if (errno == EINTR)
|
||||
|
@ -448,10 +448,16 @@ run(struct module *mod)
|
|||
break;
|
||||
}
|
||||
|
||||
if (res == 1) {
|
||||
if (res == 0) {
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
else if (res == 1) {
|
||||
assert(fds[0].revents & POLLIN);
|
||||
aborted = true;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#include <arpa/inet.h>
|
||||
#include <linux/genetlink.h>
|
||||
#include <linux/if.h>
|
||||
#include <linux/if_arp.h>
|
||||
#include <linux/netlink.h>
|
||||
#include <linux/nl80211.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
|
@ -24,7 +25,7 @@
|
|||
#include <tllist.h>
|
||||
|
||||
#define LOG_MODULE "network"
|
||||
#define LOG_ENABLE_DBG 0
|
||||
#define LOG_ENABLE_DBG 1
|
||||
#include "../bar/bar.h"
|
||||
#include "../config-verify.h"
|
||||
#include "../config.h"
|
||||
|
@ -52,6 +53,8 @@ struct af_addr {
|
|||
|
||||
struct iface {
|
||||
char *name;
|
||||
char *type; /* ARPHRD_NNN */
|
||||
char *kind; /* IFLA_LINKINFO::IFLA_INFO_KIND */
|
||||
|
||||
uint32_t get_stats_seq_nr;
|
||||
|
||||
|
@ -104,6 +107,8 @@ free_iface(struct iface iface)
|
|||
{
|
||||
tll_free(iface.addrs);
|
||||
free(iface.ssid);
|
||||
free(iface.kind);
|
||||
free(iface.type);
|
||||
free(iface.name);
|
||||
}
|
||||
|
||||
|
@ -207,6 +212,8 @@ content(struct module *mod)
|
|||
struct tag_set tags = {
|
||||
.tags = (struct tag *[]){
|
||||
tag_new_string(mod, "name", iface->name),
|
||||
tag_new_string(mod, "type", iface->type),
|
||||
tag_new_string(mod, "kind", iface->kind),
|
||||
tag_new_int(mod, "index", iface->index),
|
||||
tag_new_bool(mod, "carrier", iface->carrier),
|
||||
tag_new_string(mod, "state", state),
|
||||
|
@ -221,7 +228,7 @@ content(struct module *mod)
|
|||
tag_new_float(mod, "dl-speed", iface->dl_speed),
|
||||
tag_new_float(mod, "ul-speed", iface->ul_speed),
|
||||
},
|
||||
.count = 14,
|
||||
.count = 16,
|
||||
};
|
||||
exposables[idx++] = m->label->instantiate(m->label, &tags);
|
||||
tag_set_destroy(&tags);
|
||||
|
@ -549,6 +556,79 @@ send_nl80211_get_scan(struct private *m)
|
|||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
foreach_nlattr(struct module *mod, struct iface *iface, const struct genlmsghdr *genl, size_t len,
|
||||
bool (*cb)(struct module *mod, struct iface *iface, uint16_t type, bool nested, const void *payload,
|
||||
size_t len, void *ctx),
|
||||
void *ctx)
|
||||
{
|
||||
const uint8_t *raw = (const uint8_t *)genl + GENL_HDRLEN;
|
||||
const uint8_t *end = (const uint8_t *)genl + len;
|
||||
|
||||
for (const struct nlattr *attr = (const struct nlattr *)raw; raw < end;
|
||||
raw += NLA_ALIGN(attr->nla_len), attr = (const struct nlattr *)raw) {
|
||||
uint16_t type = attr->nla_type & NLA_TYPE_MASK;
|
||||
bool nested = (attr->nla_type & NLA_F_NESTED) != 0;
|
||||
;
|
||||
const void *payload = raw + NLA_HDRLEN;
|
||||
|
||||
if (!cb(mod, iface, type, nested, payload, attr->nla_len - NLA_HDRLEN, ctx))
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
foreach_nlattr_nested(struct module *mod, struct iface *iface, const void *parent_payload, size_t len,
|
||||
bool (*cb)(struct module *mod, struct iface *iface, uint16_t type, bool nested,
|
||||
const void *payload, size_t len, void *ctx),
|
||||
void *ctx)
|
||||
{
|
||||
const uint8_t *raw = parent_payload;
|
||||
const uint8_t *end = parent_payload + len;
|
||||
|
||||
for (const struct nlattr *attr = (const struct nlattr *)raw; raw < end;
|
||||
raw += NLA_ALIGN(attr->nla_len), attr = (const struct nlattr *)raw) {
|
||||
uint16_t type = attr->nla_type & NLA_TYPE_MASK;
|
||||
bool nested = (attr->nla_type & NLA_F_NESTED) != 0;
|
||||
const void *payload = raw + NLA_HDRLEN;
|
||||
|
||||
if (!cb(mod, iface, type, nested, payload, attr->nla_len - NLA_HDRLEN, ctx))
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
parse_linkinfo(struct module *mod, struct iface *iface, uint16_t type,
|
||||
bool nested, const void *payload, size_t len, void *_void)
|
||||
{
|
||||
switch (type) {
|
||||
case IFLA_INFO_KIND: {
|
||||
const char *kind = payload;
|
||||
free(iface->kind);
|
||||
iface->kind = strndup(kind, len);
|
||||
|
||||
LOG_DBG("%s: IFLA_INFO_KIND: %s", iface->name, iface->kind);
|
||||
break;
|
||||
}
|
||||
|
||||
case IFLA_INFO_DATA:
|
||||
//LOG_DBG("%s: IFLA_INFO_DATA", iface->name);
|
||||
break;
|
||||
|
||||
default:
|
||||
LOG_WARN("unrecognized IFLA_LINKINFO attribute: "
|
||||
"type=%hu, nested=%d, len=%zu",
|
||||
type, nested, len);
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void
|
||||
handle_link(struct module *mod, uint16_t type, const struct ifinfomsg *msg, size_t len)
|
||||
{
|
||||
|
@ -581,9 +661,31 @@ handle_link(struct module *mod, uint16_t type, const struct ifinfomsg *msg, size
|
|||
}
|
||||
|
||||
if (iface == NULL) {
|
||||
char *type = NULL;
|
||||
|
||||
switch (msg->ifi_type) {
|
||||
case ARPHRD_ETHER:
|
||||
type = strdup("ether");
|
||||
break;
|
||||
|
||||
case ARPHRD_LOOPBACK:
|
||||
type = strdup("loopback");
|
||||
break;
|
||||
|
||||
case ARPHRD_IEEE80211:
|
||||
type = strdup("wlan");
|
||||
break;
|
||||
|
||||
default:
|
||||
if (asprintf(&type, "ARPHRD_%hu", msg->ifi_type) < 0)
|
||||
type = strdup("unknown");
|
||||
break;
|
||||
}
|
||||
|
||||
mtx_lock(&mod->lock);
|
||||
tll_push_back(m->ifaces, ((struct iface){
|
||||
.index = msg->ifi_index,
|
||||
.type = type,
|
||||
.state = IF_OPER_DOWN,
|
||||
.addrs = tll_init(),
|
||||
}));
|
||||
|
@ -596,9 +698,10 @@ handle_link(struct module *mod, uint16_t type, const struct ifinfomsg *msg, size
|
|||
case IFLA_IFNAME:
|
||||
mtx_lock(&mod->lock);
|
||||
iface->name = strdup((const char *)RTA_DATA(attr));
|
||||
LOG_DBG("%s: index=%d", iface->name, iface->index);
|
||||
LOG_DBG("%s: index=%d, type=%s", iface->name, iface->index, iface->type);
|
||||
mtx_unlock(&mod->lock);
|
||||
break;
|
||||
|
||||
case IFLA_OPERSTATE: {
|
||||
uint8_t operstate = *(const uint8_t *)RTA_DATA(attr);
|
||||
if (iface->state == operstate)
|
||||
|
@ -633,7 +736,8 @@ handle_link(struct module *mod, uint16_t type, const struct ifinfomsg *msg, size
|
|||
if (memcmp(iface->mac, mac, sizeof(iface->mac)) == 0)
|
||||
break;
|
||||
|
||||
LOG_DBG("%s: IFLA_ADDRESS: %02x:%02x:%02x:%02x:%02x:%02x", iface->name, mac[0], mac[1], mac[2], mac[3],
|
||||
LOG_DBG("%s: IFLA_ADDRESS: %02x:%02x:%02x:%02x:%02x:%02x",
|
||||
iface->name, mac[0], mac[1], mac[2], mac[3],
|
||||
mac[4], mac[5]);
|
||||
|
||||
mtx_lock(&mod->lock);
|
||||
|
@ -641,6 +745,13 @@ handle_link(struct module *mod, uint16_t type, const struct ifinfomsg *msg, size
|
|||
mtx_unlock(&mod->lock);
|
||||
break;
|
||||
}
|
||||
|
||||
case IFLA_LINKINFO: {
|
||||
foreach_nlattr_nested(
|
||||
mod, iface, RTA_DATA(attr), RTA_PAYLOAD(attr),
|
||||
&parse_linkinfo, NULL);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -723,51 +834,6 @@ handle_address(struct module *mod, uint16_t type, const struct ifaddrmsg *msg, s
|
|||
mod->bar->refresh(mod->bar);
|
||||
}
|
||||
|
||||
static bool
|
||||
foreach_nlattr(struct module *mod, struct iface *iface, const struct genlmsghdr *genl, size_t len,
|
||||
bool (*cb)(struct module *mod, struct iface *iface, uint16_t type, bool nested, const void *payload,
|
||||
size_t len, void *ctx),
|
||||
void *ctx)
|
||||
{
|
||||
const uint8_t *raw = (const uint8_t *)genl + GENL_HDRLEN;
|
||||
const uint8_t *end = (const uint8_t *)genl + len;
|
||||
|
||||
for (const struct nlattr *attr = (const struct nlattr *)raw; raw < end;
|
||||
raw += NLA_ALIGN(attr->nla_len), attr = (const struct nlattr *)raw) {
|
||||
uint16_t type = attr->nla_type & NLA_TYPE_MASK;
|
||||
bool nested = (attr->nla_type & NLA_F_NESTED) != 0;
|
||||
;
|
||||
const void *payload = raw + NLA_HDRLEN;
|
||||
|
||||
if (!cb(mod, iface, type, nested, payload, attr->nla_len - NLA_HDRLEN, ctx))
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
foreach_nlattr_nested(struct module *mod, struct iface *iface, const void *parent_payload, size_t len,
|
||||
bool (*cb)(struct module *mod, struct iface *iface, uint16_t type, bool nested,
|
||||
const void *payload, size_t len, void *ctx),
|
||||
void *ctx)
|
||||
{
|
||||
const uint8_t *raw = parent_payload;
|
||||
const uint8_t *end = parent_payload + len;
|
||||
|
||||
for (const struct nlattr *attr = (const struct nlattr *)raw; raw < end;
|
||||
raw += NLA_ALIGN(attr->nla_len), attr = (const struct nlattr *)raw) {
|
||||
uint16_t type = attr->nla_type & NLA_TYPE_MASK;
|
||||
bool nested = (attr->nla_type & NLA_F_NESTED) != 0;
|
||||
const void *payload = raw + NLA_HDRLEN;
|
||||
|
||||
if (!cb(mod, iface, type, nested, payload, attr->nla_len - NLA_HDRLEN, ctx))
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
struct mcast_group {
|
||||
uint32_t id;
|
||||
const char *name;
|
||||
|
@ -1304,6 +1370,8 @@ parse_genl_reply(struct module *mod, const struct nlmsghdr *hdr, size_t len)
|
|||
continue;
|
||||
|
||||
LOG_DBG("%s: got interface information", iface->name);
|
||||
free(iface->type);
|
||||
iface->type = strdup("wlan");
|
||||
foreach_nlattr(mod, iface, genl, msg_size, &handle_nl80211_new_interface, NULL);
|
||||
break;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue