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. 50
      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; struct auto_sock_iface* ifa = *pp;
*pp = ifa->next; *pp = ifa->next;
char ifname[IFNAMSIZ] = ""; 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) { if (ifa->v4_udp) {
DEBUG_INFO(DEBUG_CATEGORY_AS, "[as] removing v4 UDP socket %s ifidx=%u", ifa->v4_udp->name, ifindex); DEBUG_INFO(DEBUG_CATEGORY_AS, "[as] removing v4 UDP socket %s ifidx=%u", ifa->v4_udp->name, ifindex);

50
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); socket_monitor_update_if_addr(es);
if (memcmp(&old_if_addr, &es->interface_addr, sizeof(old_if_addr)) != 0) { if (memcmp(&old_if_addr, &es->interface_addr, sizeof(old_if_addr)) != 0) {
sm->socket_updates++; 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", DEBUG_INFO(DEBUG_CATEGORY_SOCKET, "socket %s (%s idx=%u) addr changed: %s → %s",
es->name, ifname, es->netif_index, es->name, ifname, es->netif_index,
sockaddr_storage_to_str(&old_if_addr).str, sockaddr_storage_to_str(&es->interface_addr).str); 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) { static void socket_monitor_handle_addr(struct SOCKET_MONITOR* sm, struct ifaddrmsg* ifa, int msg_type) {
sm->addr_changes++; 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", 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); msg_type == RTM_NEWADDR ? "NEW" : "DEL", ifname, ifa->ifa_index, ifa->ifa_family);
struct ETCP_SOCKET* es = sm->instance->etcp_sockets; 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) { static void socket_monitor_handle_link(struct SOCKET_MONITOR* sm, struct ifinfomsg* ifi, int msg_type) {
sm->link_changes++; sm->link_changes++;
int is_up = (ifi->ifi_flags & IFF_UP) != 0; 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", DEBUG_INFO(DEBUG_CATEGORY_SOCKET, "link %s: %s (idx=%u) flags=0x%x",
is_up ? "UP" : "DOWN", ifname, ifi->ifi_index, ifi->ifi_flags); is_up ? "UP" : "DOWN", ifname, ifi->ifi_index, ifi->ifi_flags);
struct ETCP_SOCKET* es = sm->instance->etcp_sockets; 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); socket_monitor_update_if_addr(es);
if (memcmp(&old_if_addr, &es->interface_addr, sizeof(old_if_addr)) != 0) { if (memcmp(&old_if_addr, &es->interface_addr, sizeof(old_if_addr)) != 0) {
sm->socket_updates++; 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", DEBUG_INFO(DEBUG_CATEGORY_SOCKET, "socket %s (%s idx=%u) addr changed via default route: %s → %s",
es->name, ifname, es->netif_index, es->name, ifname, es->netif_index,
sockaddr_storage_to_str(&old_if_addr).str, sockaddr_storage_to_str(&es->interface_addr).str); 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) { switch (rtm->rtm_type) {
case RTM_IFINFO: case RTM_IFINFO:
case RTM_IFANNOUNCE: case RTM_IFANNOUNCE: {
sm->link_changes++; sm->link_changes++;
{ struct if_msghdr* ifm = (struct if_msghdr*)rtm;
const char* nm = rtm->rtm_type == RTM_IFINFO ? "IFINFO" : "IFANNOUNCE"; char ifname[IFNAMSIZ];
DEBUG_INFO(DEBUG_CATEGORY_SOCKET, "link event %s:", nm); if (!if_indextoname(ifm->ifm_index, ifname)) snprintf(ifname, sizeof(ifname), "?");
struct ETCP_SOCKET* es = sm->instance->etcp_sockets; const char* nm = rtm->rtm_type == RTM_IFINFO ? "IFINFO" : "IFANNOUNCE";
while (es) { int is_up = (ifm->ifm_flags & IFF_UP) != 0;
char ifname[IFNAMSIZ]; if (!if_indextoname(es->netif_index, ifname)) snprintf(ifname, sizeof(ifname), "idx%u", es->netif_index); DEBUG_INFO(DEBUG_CATEGORY_SOCKET, "link event %s: %s (idx=%u) %s",
DEBUG_INFO(DEBUG_CATEGORY_SOCKET, " → socket %s (%s idx=%u) firing STATUS_CHANGED", es->name, ifname, es->netif_index); 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); etcp_socket_cbk_fire(es, ETCP_SOCKET_EVENT_STATUS_CHANGED);
socket_monitor_fire_one(sm, es); if (is_up) socket_monitor_fire_one(sm, es);
es = es->next;
} }
es = es->next;
} }
break; } break;
case RTM_NEWADDR: case RTM_NEWADDR:
case RTM_DELADDR: case RTM_DELADDR: {
sm->addr_changes++; 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];
struct ETCP_SOCKET* es = sm->instance->etcp_sockets; if (!if_indextoname(ifam->ifam_index, ifname)) snprintf(ifname, sizeof(ifname), "?");
while (es) { socket_monitor_fire_one(sm, es); es = es->next; } DEBUG_INFO(DEBUG_CATEGORY_SOCKET, "addr %s: %s (idx=%u)",
} rtm->rtm_type == RTM_NEWADDR ? "NEW" : "DEL", ifname, ifam->ifam_index);
break; 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_ADD:
case RTM_DELETE: case RTM_DELETE:
sm->route_changes++; sm->route_changes++;

Loading…
Cancel
Save