Máscara de networking devuelta en rt_msghdr2 en formatting no válido

Quiero analizar las routes devueltas por el kernel al invocar la function sysctl con los arguments: { CTL_NET, PF_ROUTE, 0, AF_INET, NET_RT_DUMP2, 0 } .

Después de hacer eso recibo varios posts de routing, en todos he encontrado el problema: el struct sockaddr* en el índice RTAX_NETMASK no contiene un struct sockaddr RTAX_NETMASK válido.

El código para extraer las direcciones del struct rt_msghdr2 devuelto por sysctl es el siguiente:

 // ROUNDUP Taken from route.c #define ROUNDUP(a) \ ((a) > 0 ? (1 + (((a) - 1) | (sizeof(uint32_t) - 1))) : sizeof(uint32_t)) struct rt_msghdr2* routeMsg = (struct rt_msgdr2*)buffer; struct sockaddr* sockAddrArray[RTAX_MAX]; memset(sockAddrArray, 0, sizeof(sockAddrArray)); struct sockaddr* currentSockAddr; currentSockAddr = (struct sockaddr*)(routeMsg + 1); for (int i = 0; i < RTAX_MAX; i++) { if (routeMsg->rtm_addrs & (1 << i)) { sockAddrArray[i] = currentSockAddr; currentSockAddr = (struct sockaddr *)(ROUNDUP(currentSockAddr->sa_len) + (char *)currentSockAddr); } else { sockAddrArray[i] = NULL; } } 

Aunque el routeMsg dice que tiene una máscara de networking, cuando routeMsg los contenidos, me parece que tiene algo como esto:

 sockAddrArray[RTAX_NETMASK]->sa_len = 0 sockAddrArray[RTAX_NETMASK]->sa_type = \xff sockAddrArray[RTAX_NETMASK]->sa_data = { \xff, \xff, \0, ...} 

Lo extraño es que la ruta coincidente en el host (basada en la networking y las direcciones de puerta de enlace) tiene la máscara de networking 255.255.255.0 que coincide demasiado bien con el contenido directo de la máscara de networking sockaddr .

Por supuesto, no puedo confiar en nada más que venga después del RTAX_NETMASK en la matriz, ya que será analizado incorrectamente.

¿Alguien sabe por qué sucede esto?