Browse Source

socket monitor: BSD ifindex + UP/DOWN + фильтр спама; fallback idx%u → ?

topo_upd
Evgeny 2 months ago
parent
commit
d8bae76ac7
  1. 2
      src/transport_layer/auto_socket.c
  2. 40
      src/transport_layer/socket_monitor.c

2
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);

40
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++;
{
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";
DEBUG_INFO(DEBUG_CATEGORY_SOCKET, "link event %s:", nm);
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) {
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);
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 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;
} break;
case RTM_ADD:
case RTM_DELETE:
sm->route_changes++;

Loading…
Cancel
Save