4

我想在sysctl使用参数调用函数时解析内核返回的路由:{ CTL_NET, PF_ROUTE, 0, AF_INET, NET_RT_DUMP2, 0 }.

这样做之后,我收到了几条路由消息,在所有这些消息中我都发现了问题:struct sockaddr*at 索引RTAX_NETMASK不包含有效的struct sockaddr.

struct rt_msghdr2从返回的地址中提取地址的代码sysctl如下:

// 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;
    }
}

即使routeMsg它有一个网络掩码的状态,当我检查内容时,我发现它有这样的东西:

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

奇怪的是,主机上的匹配路由(基于网络和网关地址)的网络掩码与网络掩码255.255.255.0的直接内容匹配得太好了sockaddr

当然,我不能相信RTAX_NETMASK数组中的任何其他内容,因为它会被错误地解析。

有人知道为什么会这样吗?

4

0 回答 0