From d8bae76ac768f6bf49a2ac0c865ec44a8f9ab61b Mon Sep 17 00:00:00 2001 From: Evgeny Date: Sun, 9 Aug 2026 17:39:31 +0300 Subject: [PATCH] =?UTF-8?q?socket=20monitor:=20BSD=20ifindex=20+=20UP/DOWN?= =?UTF-8?q?=20+=20=D1=84=D0=B8=D0=BB=D1=8C=D1=82=D1=80=20=D1=81=D0=BF?= =?UTF-8?q?=D0=B0=D0=BC=D0=B0;=20fallback=20idx%u=20=E2=86=92=20=3F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/transport_layer/auto_socket.c | 2 +- src/transport_layer/socket_monitor.c | 50 ++++++++++++++++------------ 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/src/transport_layer/auto_socket.c b/src/transport_layer/auto_socket.c index b92d94e1..3c2ba8eb 100644 --- a/src/transport_layer/auto_socket.c +++ b/src/transport_layer/auto_socket.c @@ -396,7 +396,7 @@ static void remove_iface_sockets(struct AUTO_SOCKET* as, uint32_t ifindex) { struct auto_sock_iface* ifa = *pp; *pp = ifa->next; char ifname[IFNAMSIZ] = ""; - if (!if_indextoname(ifindex, ifname)) snprintf(ifname, sizeof(ifname), "idx%u", ifindex); + if (!if_indextoname(ifindex, ifname)) snprintf(ifname, sizeof(ifname), "?"); if (ifa->v4_udp) { DEBUG_INFO(DEBUG_CATEGORY_AS, "[as] removing v4 UDP socket %s ifidx=%u", ifa->v4_udp->name, ifindex); diff --git a/src/transport_layer/socket_monitor.c b/src/transport_layer/socket_monitor.c index b1447ac9..c3b44b5b 100644 --- a/src/transport_layer/socket_monitor.c +++ b/src/transport_layer/socket_monitor.c @@ -121,7 +121,7 @@ static void socket_monitor_fire_one(struct SOCKET_MONITOR* sm, struct ETCP_SOCKE socket_monitor_update_if_addr(es); if (memcmp(&old_if_addr, &es->interface_addr, sizeof(old_if_addr)) != 0) { sm->socket_updates++; - char ifname[IFNAMSIZ]; if (!if_indextoname(es->netif_index, ifname)) snprintf(ifname, sizeof(ifname), "idx%u", es->netif_index); + char ifname[IFNAMSIZ]; if (!if_indextoname(es->netif_index, ifname)) snprintf(ifname, sizeof(ifname), "?"); DEBUG_INFO(DEBUG_CATEGORY_SOCKET, "socket %s (%s idx=%u) addr changed: %s → %s", es->name, ifname, es->netif_index, sockaddr_storage_to_str(&old_if_addr).str, sockaddr_storage_to_str(&es->interface_addr).str); @@ -139,7 +139,7 @@ static void socket_monitor_check_and_fire(struct SOCKET_MONITOR* sm, struct ETCP static void socket_monitor_handle_addr(struct SOCKET_MONITOR* sm, struct ifaddrmsg* ifa, int msg_type) { sm->addr_changes++; - char ifname[IFNAMSIZ]; if (!if_indextoname(ifa->ifa_index, ifname)) snprintf(ifname, sizeof(ifname), "idx%u", ifa->ifa_index); + char ifname[IFNAMSIZ]; if (!if_indextoname(ifa->ifa_index, ifname)) snprintf(ifname, sizeof(ifname), "?"); DEBUG_INFO(DEBUG_CATEGORY_SOCKET, "addr %s: %s (idx=%u) family=%d", msg_type == RTM_NEWADDR ? "NEW" : "DEL", ifname, ifa->ifa_index, ifa->ifa_family); struct ETCP_SOCKET* es = sm->instance->etcp_sockets; @@ -149,7 +149,7 @@ static void socket_monitor_handle_addr(struct SOCKET_MONITOR* sm, struct ifaddrm static void socket_monitor_handle_link(struct SOCKET_MONITOR* sm, struct ifinfomsg* ifi, int msg_type) { sm->link_changes++; int is_up = (ifi->ifi_flags & IFF_UP) != 0; - char ifname[IFNAMSIZ]; if (!if_indextoname(ifi->ifi_index, ifname)) snprintf(ifname, sizeof(ifname), "idx%u", ifi->ifi_index); + char ifname[IFNAMSIZ]; if (!if_indextoname(ifi->ifi_index, ifname)) snprintf(ifname, sizeof(ifname), "?"); DEBUG_INFO(DEBUG_CATEGORY_SOCKET, "link %s: %s (idx=%u) flags=0x%x", is_up ? "UP" : "DOWN", ifname, ifi->ifi_index, ifi->ifi_flags); struct ETCP_SOCKET* es = sm->instance->etcp_sockets; @@ -184,7 +184,7 @@ static void socket_monitor_handle_route(struct SOCKET_MONITOR* sm, struct rtmsg* socket_monitor_update_if_addr(es); if (memcmp(&old_if_addr, &es->interface_addr, sizeof(old_if_addr)) != 0) { sm->socket_updates++; - char ifname[IFNAMSIZ]; if (!if_indextoname(es->netif_index, ifname)) snprintf(ifname, sizeof(ifname), "idx%u", es->netif_index); + char ifname[IFNAMSIZ]; if (!if_indextoname(es->netif_index, ifname)) snprintf(ifname, sizeof(ifname), "?"); DEBUG_INFO(DEBUG_CATEGORY_SOCKET, "socket %s (%s idx=%u) addr changed via default route: %s → %s", es->name, ifname, es->netif_index, sockaddr_storage_to_str(&old_if_addr).str, sockaddr_storage_to_str(&es->interface_addr).str); @@ -244,30 +244,36 @@ static void socket_monitor_bsd_read_cb(int fd, void* arg) { switch (rtm->rtm_type) { case RTM_IFINFO: - case RTM_IFANNOUNCE: + case RTM_IFANNOUNCE: { sm->link_changes++; - { - const char* nm = rtm->rtm_type == RTM_IFINFO ? "IFINFO" : "IFANNOUNCE"; - DEBUG_INFO(DEBUG_CATEGORY_SOCKET, "link event %s:", nm); - struct ETCP_SOCKET* es = sm->instance->etcp_sockets; - while (es) { - char ifname[IFNAMSIZ]; if (!if_indextoname(es->netif_index, ifname)) snprintf(ifname, sizeof(ifname), "idx%u", es->netif_index); - DEBUG_INFO(DEBUG_CATEGORY_SOCKET, " → socket %s (%s idx=%u) firing STATUS_CHANGED", es->name, ifname, es->netif_index); + struct if_msghdr* ifm = (struct if_msghdr*)rtm; + char ifname[IFNAMSIZ]; + if (!if_indextoname(ifm->ifm_index, ifname)) snprintf(ifname, sizeof(ifname), "?"); + const char* nm = rtm->rtm_type == RTM_IFINFO ? "IFINFO" : "IFANNOUNCE"; + int is_up = (ifm->ifm_flags & IFF_UP) != 0; + DEBUG_INFO(DEBUG_CATEGORY_SOCKET, "link event %s: %s (idx=%u) %s", + nm, ifname, ifm->ifm_index, is_up ? "UP" : "DOWN"); + struct ETCP_SOCKET* es = sm->instance->etcp_sockets; + while (es) { + if (es->netif_index == ifm->ifm_index) { + DEBUG_DEBUG(DEBUG_CATEGORY_SOCKET, " → socket %s firing STATUS_CHANGED", es->name); etcp_socket_cbk_fire(es, ETCP_SOCKET_EVENT_STATUS_CHANGED); - socket_monitor_fire_one(sm, es); - es = es->next; + if (is_up) socket_monitor_fire_one(sm, es); } + es = es->next; } - break; + } break; case RTM_NEWADDR: - case RTM_DELADDR: + case RTM_DELADDR: { sm->addr_changes++; - DEBUG_INFO(DEBUG_CATEGORY_SOCKET, "addr %s:", rtm->rtm_type == RTM_NEWADDR ? "NEW" : "DEL"); - { - struct ETCP_SOCKET* es = sm->instance->etcp_sockets; - while (es) { socket_monitor_fire_one(sm, es); es = es->next; } - } - break; + struct ifa_msghdr* ifam = (struct ifa_msghdr*)rtm; + char ifname[IFNAMSIZ]; + if (!if_indextoname(ifam->ifam_index, ifname)) snprintf(ifname, sizeof(ifname), "?"); + DEBUG_INFO(DEBUG_CATEGORY_SOCKET, "addr %s: %s (idx=%u)", + rtm->rtm_type == RTM_NEWADDR ? "NEW" : "DEL", ifname, ifam->ifam_index); + struct ETCP_SOCKET* es = sm->instance->etcp_sockets; + while (es) { socket_monitor_fire_one(sm, es); es = es->next; } + } break; case RTM_ADD: case RTM_DELETE: sm->route_changes++;