From b2e7cc8c704d38ce032e7b9f576bfdc94757ae53 Mon Sep 17 00:00:00 2001 From: MeowOS Date: Mon, 31 Aug 2026 05:16:18 +0800 Subject: [PATCH] =?UTF-8?q?fix(mdns):=20=E5=90=AF=E5=8A=A8=E7=AB=9E?= =?UTF-8?q?=E6=80=81+=E8=BF=90=E8=A1=8C=E6=9C=9F=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E9=87=8D=E6=A3=80=20(agent-194)=20=E2=80=94=20=E6=97=A0?= =?UTF-8?q?=E5=8F=AF=E7=94=A8IPv4=E4=B8=8D=E5=86=8Dexit(2)=E6=94=B9?= =?UTF-8?q?=E5=86=85=E9=83=A82s=E7=AD=89=E5=BE=85=E9=87=8D=E8=AF=95(SIGTER?= =?UTF-8?q?M=E5=8F=AF=E6=89=93=E6=96=AD);=205s=E5=91=A8=E6=9C=9F=E6=A3=80?= =?UTF-8?q?=E6=B5=8B=E6=8E=89=E7=BA=BF/=E6=8D=A2IP=E2=86=92=E9=87=8D?= =?UTF-8?q?=E6=96=B0join=E7=BB=84=E6=92=AD+A=E8=AE=B0=E5=BD=95=E5=AE=9E?= =?UTF-8?q?=E6=97=B6=E5=88=B7=E6=96=B0(=E4=BF=AEIP=E5=8F=98=E6=9B=B4?= =?UTF-8?q?=E8=BF=98=E5=B8=A6=E6=97=A7=E5=9C=B0=E5=9D=80);=20=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3down=E6=97=B6=E9=9B=B6=E5=BA=94=E7=AD=94=E5=AE=88?= =?UTF-8?q?=E5=8D=AB;=20MEOW=5FMDNS=5FIF=20=E8=90=BD=E5=9C=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit meow_mdns b23de7ce→d6b0151b (+3.5KB); mipsel -Wall -Wextra 0 warning; 宿主netns实测等待/换IP/掉线守卫全过 注: 真机源码在 mips-repo/bins/meow_mdns/(非patch_v2); fw_content.conf 的 md5 行打包时更新 --- mips-repo/bins/meow_mdns/bin/meow_mdns | Bin 79468 -> 82972 bytes mips-repo/bins/meow_mdns/manifest.md | 7 +- mips-repo/bins/meow_mdns/meow_mdns.c | 114 +++++++++++++++++++------ 3 files changed, 92 insertions(+), 29 deletions(-) diff --git a/mips-repo/bins/meow_mdns/bin/meow_mdns b/mips-repo/bins/meow_mdns/bin/meow_mdns index 02bbf368d344f44c53d7e4846e14eca95472c988..d55d896d7219aeca33151c03604ae1199d2ec735 100755 GIT binary patch delta 19508 zcma)k4}4U`wg24NO|mR8EFmsoiOcTh?q&^X8bSy$#;}QLjEIPcks=KNq9R4)VMHF~ zv5O*&G-d-6NchvR`2z$9*+38w6a%D~A|Q}dsgGJ{eO7&xQh!t}BK!NEd+#RE*Z2GU z!sl}4o;fpf=FFKhXU@#tt5@|~Dk7@mjXo=98H};6ytR&eZ@HB*di20BCgC4rKD-kZ zJxe>7@6Uu}CdH3hAt`6UlC& zf?I1p-^|k<6RV{n{p=UZpBHDOC*o$!T2l7H^RwnIcz*8BXFc;&dHJ)?JtY#kkRBAf zc(QHMgOeYhJ}W&nll?2g%nZ@PCpw;c>iL&uJy*8yg>2ii3(KEc{PgU(PuUhfHM{KJ zZL`bD7T@Q5L5$Qr>0bD}?Zp>n&sp%4?ZGKaG6s;koiE&-nwn~RY4)?_&n|pMJgeK% zk*Uv=M*qu-7d-z$d5T(bn$4}1xx3@%5myY!UH5Y~serQ^fHI&hpR;N_^YC09@bu<) zEQ#4Cc@2mFCb(Xy*m>op511;RcqwfjU=#whNE# z-?_IhGhS=FcR-`WKr0ASsyK_rW5dJn+HSz$b12zNRz>|Te zXdUVRE)FmUa4DWn;1d8psWx!-87f$`wj*`u1u6ZTgPfJWiAwO4;wd=9*=6l12c&1Y zhM$7;ltUfq!){C7Z=hVc(7vKU5;K91=?N0c0W1TY0=WM!i7f{VjFMOj;Fd~>odbLe z@Dspq02vhB^SZa z1B`0}hk#l8Bo+XiegKRCRsvoEYyrFhSauLSHNac}CIIFfl2{sG3t$0Y%A1fJU=iRV z%0D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 delta 16338 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 Jaf&qZ{{sIpEkghR diff --git a/mips-repo/bins/meow_mdns/manifest.md b/mips-repo/bins/meow_mdns/manifest.md index 4bc8051..e598510 100644 --- a/mips-repo/bins/meow_mdns/manifest.md +++ b/mips-repo/bins/meow_mdns/manifest.md @@ -28,6 +28,9 @@ - RFC 1035 名压缩(owner 名若已在响应中出现则回写 `0xC0` 指针)。 - IP_PKTINFO 判断查询到组播还是单播:**组播查询→组播应答 + 单播冗余回源**;单播查询→单播回源。 - 线程/信号安全;SIGINT/SIGTERM 优雅退出(留组并关 socket)。 +- **启动容错**:接口未就绪(无 IPv4/wlan0 未 up)时**内部等待重试**(每 2s,无限等,stderr 打 `waiting`),不再 exit;修复开机时 mdns 先于网络就绪的 5×exit=2 崩溃竞态。 +- **运行期容错**:每 5s 周期检查设备 IP,**掉线(无 IPv4)或换 IP(WiFi 重连)时自动重新 drop/join 组播并刷新应答 IP**,避免应答携带旧地址。 +- `MEOW_MDNS_IF`(已实现):限定要绑定/公布的接口名——既作为 IP 筛选,也决定 join 绑定接口;可用于宿主模拟"无接口"(设为不存在的接口名即进入等待循环)。 ## 环境覆写 | 变量 | 默认 | 说明 | @@ -51,8 +54,8 @@ ELF 32-bit LSB executable, MIPS, MIPS32 rel2 version 1 (SYSV), statically linked, stripped ## 体积 -- 部署版:**79,468 B ≈ 77.6 KB**(strip 后) -- MD5 :**b23de7ce54873e926e7601a3b21b66a9** +- 部署版:**82,972 B ≈ 81.0 KB**(strip 后;较旧版 +3.5KB,启动容错 + 运行期重检) +- MD5 :**d6b0151bda26768f19952dae1342610d**(旧 `b23de7ce54873e926e7601a3b21b66a9`) ## 构建命令 见同目录 build.sh(宿主 gcc `-O2` 可编译并在本机组播/单播自测;交叉 `zig-mipsel-cc -Os -static`)。 diff --git a/mips-repo/bins/meow_mdns/meow_mdns.c b/mips-repo/bins/meow_mdns/meow_mdns.c index 1f2320c..f095378 100644 --- a/mips-repo/bins/meow_mdns/meow_mdns.c +++ b/mips-repo/bins/meow_mdns/meow_mdns.c @@ -13,6 +13,8 @@ * MEOW_MDNS_ADDR 缺省 = 第一块非回环 UP 接口的 IPv4 (可为 wlan0 10.109.49.50) * MEOW_MDNS_IF 缺省 = 自动; 设定接口名, join 组播绑定到该接口 * MEOW_MDNS_PORT 缺省 = 5353; 可覆写(通常仅宿主单测用) + * 容错: 接口未就绪(无 IPv4)时内部等待重试(每 2s, 无限等, 打 waiting)而非退出; + * 运行期掉线/换 IP(WiFi 重连)每 5s 检测, 自动重新 join 并刷新应答 IP。 * * 构建: 宿主机 cc -O2 -o meow_mdns meow_mdns.c * 交叉 zig-mipsel-cc -Os -static -o meow_mdns meow_mdns.c @@ -39,6 +41,7 @@ #include #include #include +#include #define MDNS_PORT 5353 #define MDNS_GROUP "224.0.0.251" @@ -55,8 +58,35 @@ static volatile sig_atomic_t g_running = 1; static int g_cacheflush = 0; /* 唯一记录(A/SRV/TXT)是否置 cache-flush 位 (MEOW_MDNS_CF) */ +static char g_ifname[IFNAMSIZ]; /* MEOW_MDNS_IF 指定的接口名, 空=自动 */ static void on_signal(int sig) { (void)sig; g_running = 0; } +/* 确定当前应公布的设备 IPv4 (网络序, 存 *out)。 + * 优先 MEOW_MDNS_ADDR(有效且非 0); 其次 MEOW_MDNS_IF 指定接口; 否则第一块非回环 UP 的 IPv4。 + * 返回 1=找到; 0=暂无可用地址(接口未就绪). */ +static int find_device_ip(struct in_addr *out) +{ + const char *ea = getenv("MEOW_MDNS_ADDR"); + if (ea && *ea) { + if (inet_pton(AF_INET, ea, out) == 1 && out->s_addr) return 1; + /* 无效或 0.0.0.0: 落到接口扫描 */ + } + struct ifaddrs *ifa, *i; + int found = 0; + if (getifaddrs(&ifa) == 0) { + for (i = ifa; i; i = i->ifa_next) { + if (!i->ifa_addr || i->ifa_addr->sa_family != AF_INET) continue; + if (!(i->ifa_flags & IFF_UP) || (i->ifa_flags & IFF_LOOPBACK)) continue; + if (g_ifname[0] && strcmp(i->ifa_name, g_ifname) != 0) continue; + *out = ((struct sockaddr_in *)i->ifa_addr)->sin_addr; + found = 1; + break; + } + freeifaddrs(ifa); + } + return found; +} + static void to_lower(char *s) { for (; *s; s++) *s = (char)tolower((unsigned char)*s); } /* 把 "a.b.c" 编码为 DNS 名字(无压缩) ==> abc<0>。返回长度, -1 失败 */ @@ -206,28 +236,25 @@ int main(int argc, char **argv) char svc[MAX_NAME] = "_ssh._tcp.local"; /* 地址全程保持网络字节序 (struct in_addr) */ + const char *eif = getenv("MEOW_MDNS_IF"); + if (eif && *eif) snprintf(g_ifname, sizeof(g_ifname), "%s", eif); + + /* 信号先注册, 使等待循环可被 SIGTERM/SIGINT 打断 */ + signal(SIGINT, on_signal); + signal(SIGTERM, on_signal); + signal(SIGPIPE, SIG_IGN); + + /* ---- 等待网络接口就绪,内部重试(每 2s, 无限等): 接口未就绪不算崩 ---- */ struct in_addr ipin = {0}; - const char *ea = getenv("MEOW_MDNS_ADDR"); - if (ea && *ea) { - if (inet_pton(AF_INET, ea, &ipin) != 1) ipin.s_addr = 0; - } - if (!ipin.s_addr) { - /* 遍历接口取第一块非回环 UP 的 IPv4(sin_addr 已是网络序) */ - struct ifaddrs *ifa, *i; - if (getifaddrs(&ifa) == 0) { - for (i = ifa; i; i = i->ifa_next) { - if (!i->ifa_addr || i->ifa_addr->sa_family != AF_INET) continue; - if (!(i->ifa_flags & IFF_UP) || (i->ifa_flags & IFF_LOOPBACK)) continue; - ipin = ((struct sockaddr_in *)i->ifa_addr)->sin_addr; - break; - } - freeifaddrs(ifa); - } - } - if (!ipin.s_addr) { - fprintf(stderr, "meow_mdns: no IPv4 address (set MEOW_MDNS_ADDR)\n"); - return 2; + for (;;) { + if (find_device_ip(&ipin)) break; + fprintf(stderr, "meow_mdns: no usable IPv4 interface (%s)... waiting\n", + g_ifname[0] ? g_ifname : "auto"); + fflush(stderr); + if (!g_running) { printf("meow_mdns: exiting\n"); return 0; } + sleep(2); } + if (!g_running) { printf("meow_mdns: exiting\n"); return 0; } char ips[32]; inet_ntop(AF_INET, &ipin, ips, sizeof(ips)); printf("meow_mdns: host=%s.local addr=%s swc=%s\n", host, ips, svc); @@ -271,10 +298,6 @@ int main(int argc, char **argv) struct timeval tv = { 1, 0 }; setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); - signal(SIGINT, on_signal); - signal(SIGTERM, on_signal); - signal(SIGPIPE, SIG_IGN); - struct in_addr mcast_addr; inet_pton(AF_INET, MDNS_GROUP, &mcast_addr); @@ -302,7 +325,36 @@ int main(int argc, char **argv) char pkt[2048]; struct sockaddr_in src; + time_t last_chk = time(NULL); while (g_running) { + /* 周期接口检查(5s): 检测掉线(无 IPv4)/换 IP(WiFi 重连), 重新 join 组播并刷新应答 IP */ + time_t now = time(NULL); + if (now - last_chk >= 5) { + last_chk = now; + struct in_addr cur = {0}; + int have = find_device_ip(&cur); + if (have != (ipin.s_addr != 0) || (have && cur.s_addr != ipin.s_addr)) { + if (ipin.s_addr) + setsockopt(s, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq)); + ipin = cur; + if (have) { + inet_ntop(AF_INET, &ipin, ips, sizeof(ips)); + memset(&mreq, 0, sizeof(mreq)); + inet_pton(AF_INET, MDNS_GROUP, &mreq.imr_multiaddr); + mreq.imr_interface.s_addr = ipin.s_addr; + if (setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) + perror("IP_ADD_MEMBERSHIP"); + if (set_mcastif && ipin.s_addr) + setsockopt(s, IPPROTO_IP, IP_MULTICAST_IF, &ipin.s_addr, sizeof(ipin.s_addr)); + printf("meow_mdns: interface ready addr=%s\n", ips); + } else { + ips[0] = 0; + printf("meow_mdns: interface lost, addr=0 (waiting)\n"); + } + fflush(stdout); + } + } + /* recvmsg + IP_PKTINFO: 拿到查询的目的地址与到达接口, 判断组播/单播 */ memset(&src, 0, sizeof(src)); unsigned char ctrl[256]; @@ -327,11 +379,16 @@ int main(int argc, char **argv) if (n < 12) continue; uint32_t destip = mcast_addr.s_addr; /* 取不到就按组播处理 */ - for (struct cmsghdr *cm = CMSG_FIRSTHDR(&msg); cm; cm = CMSG_NXTHDR(&msg, cm)) { + /* 手工迭代 control 消息, 规避 musl CMSG_NXTHDR 的 -Wsign-compare 警告 */ + unsigned char *ctrl_end = (unsigned char *)msg.msg_control + msg.msg_controllen; + for (struct cmsghdr *cm = CMSG_FIRSTHDR(&msg); cm != NULL; ) { if (cm->cmsg_level == IPPROTO_IP && cm->cmsg_type == IP_PKTINFO) { struct in_pktinfo *pi = (struct in_pktinfo *)CMSG_DATA(cm); if (pi->ipi_addr.s_addr) destip = pi->ipi_addr.s_addr; } + unsigned char *next = (unsigned char *)cm + CMSG_ALIGN(cm->cmsg_len); + if (next + sizeof(struct cmsghdr) > ctrl_end) break; + cm = (struct cmsghdr *)next; } uint8_t *m = (uint8_t *)pkt; @@ -369,6 +426,8 @@ int main(int argc, char **argv) fflush(stdout); } + if (!ipin.s_addr) continue; /* 接口未就绪: 无有效公布地址, 暂不应答 */ + /* ---- 构建应答 ---- * RFC 6762: 应答 QDCOUNT 通常为 0, 但部分实现(avahi)接受、部分要求回显问题。 * MEOW_MDNS_QD 控制是否回显; MEOW_MDNS_CF 控制唯一记录 cache-flush 位。 */ @@ -467,10 +526,11 @@ int main(int argc, char **argv) ssize_t su = sendto(s, resp, ro, 0, (struct sockaddr *)&dst, sizeof(dst)); (void)su; if (verbose) { + char srcip[64]; + inet_ntop(AF_INET, &src.sin_addr, srcip, sizeof(srcip)); printf(" -> replied %zu bytes to %s%s:%d (AN %zu)\n", ro, to_mcast ? "mcast(224.0.0.251)" : "", - inet_ntop(AF_INET, &src.sin_addr, ips, sizeof(ips)), - ntohs(src.sin_port), ancount); + srcip, ntohs(src.sin_port), ancount); fflush(stdout); } }