refactor wifi on linux

This commit is contained in:
drkhsh
2025-04-30 03:59:49 +02:00
parent a0f960c16f
commit 3db023f13b

View File

@ -26,24 +26,16 @@
static char resp[4096]; static char resp[4096];
static char * static char *
findattr(int attr, char *p, char *e, size_t *len) findattr(int attr, const char *p, const char *e, size_t *len)
{ {
while (p < e) {
struct nlattr nla; struct nlattr nla;
size_t alen;
while ((size_t)(e-p) >= sizeof(nla)) {
memcpy(&nla, p, sizeof(nla)); memcpy(&nla, p, sizeof(nla));
if (nla.nla_len < NLA_HDRLEN)
return NULL;
if (nla.nla_type == attr) { if (nla.nla_type == attr) {
p += NLA_HDRLEN;
*len = nla.nla_len - NLA_HDRLEN; *len = nla.nla_len - NLA_HDRLEN;
return (size_t)(e-p)>=*len?p:NULL; return (char *)(p + NLA_HDRLEN);
} }
alen = NLA_ALIGN(nla.nla_len); p += NLA_ALIGN(nla.nla_len);
if ((size_t)(e-p) < alen)
return NULL;
p += alen;
} }
return NULL; return NULL;
} }
@ -100,6 +92,7 @@
p = findattr(CTRL_ATTR_FAMILY_ID, resp + sizeof(ctrl), resp + r, &len); p = findattr(CTRL_ATTR_FAMILY_ID, resp + sizeof(ctrl), resp + r, &len);
if (p && len == 2) if (p && len == 2)
memcpy(&id, p, 2); memcpy(&id, p, 2);
return id; return id;
} }
@ -177,6 +170,7 @@
p = findattr(NL80211_ATTR_SSID, resp + NLMSG_HDRLEN + GENL_HDRLEN, resp + r, &len); p = findattr(NL80211_ATTR_SSID, resp + NLMSG_HDRLEN + GENL_HDRLEN, resp + r, &len);
if (p) if (p)
p[len] = 0; p[len] = 0;
return p; return p;
} }
@ -190,6 +184,7 @@
size_t len; size_t len;
char req[NLMSG_HDRLEN + GENL_HDRLEN + NLA_HDRLEN + NLA_ALIGN(4)] = {0}, *p = req, *e; char req[NLMSG_HDRLEN + GENL_HDRLEN + NLA_HDRLEN + NLA_ALIGN(4)] = {0}, *p = req, *e;
int idx = ifindex(interface); int idx = ifindex(interface);
if (idx < 0) { if (idx < 0) {
fprintf(stderr, "interface %s not found\n", interface); fprintf(stderr, "interface %s not found\n", interface);
return NULL; return NULL;
@ -213,12 +208,13 @@
.nla_type = NL80211_ATTR_IFINDEX, .nla_type = NL80211_ATTR_IFINDEX,
}, sizeof(struct nlattr)); }, sizeof(struct nlattr));
p += NLA_HDRLEN; p += NLA_HDRLEN;
memcpy(p, &(uint32_t){idx}, 4); memcpy(p, &idx, 4);
if (send(nlsock, req, sizeof(req), 0) != sizeof(req)) { if (send(nlsock, req, sizeof(req), 0) != sizeof(req)) {
warn("send 'AF_NETLINK':"); warn("send 'AF_NETLINK':");
return NULL; return NULL;
} }
*strength = 0; *strength = 0;
while (1) { while (1) {
r = recv(nlsock, resp, sizeof(resp), 0); r = recv(nlsock, resp, sizeof(resp), 0);
@ -228,9 +224,11 @@
} }
if ((size_t)r < sizeof(hdr)) if ((size_t)r < sizeof(hdr))
return NULL; return NULL;
for (p = resp; p != resp + r && (size_t)(resp + r-p) >= sizeof(hdr); p = e) { for (p = resp; p != resp + r && (size_t)(resp + r-p) >= sizeof(hdr); p = e) {
memcpy(&hdr, p, sizeof(hdr)); memcpy(&hdr, p, sizeof(hdr));
e = resp + r - p < hdr.nlmsg_len ? resp + r : p + hdr.nlmsg_len; e = resp + r - p < hdr.nlmsg_len ? resp + r : p + hdr.nlmsg_len;
if (!*strength && hdr.nlmsg_len > NLMSG_HDRLEN+GENL_HDRLEN) { if (!*strength && hdr.nlmsg_len > NLMSG_HDRLEN+GENL_HDRLEN) {
p += NLMSG_HDRLEN+GENL_HDRLEN; p += NLMSG_HDRLEN+GENL_HDRLEN;
p = findattr(NL80211_ATTR_STA_INFO, p, e, &len); p = findattr(NL80211_ATTR_STA_INFO, p, e, &len);