Считываю ответ на запрос таблицы маршрутизации с netlink-сокета. Однако выхлоп какой-то странный (см. ниже). ЧЯДНТ?
Функция распарсивания ответа
void rip_netlink_read_reply( int nsd, rip_msg_t * rip )
{
struct nlmsghdr * nlp;
struct rtmsg * rtp;
struct rtattr * rtap;
int rtl;
uint32_t metrics;
uint32_t dst;
uint32_t mask;
char buf[4096];
int rc;
rte_t rte;
uint32_t mask_ip;
int i, m;
assert( nsd >= 0 && rip );
rc = recv( nsd, buf, sizeof( buf ), 0 );
// hexdump( stdout, "Binary reply", buf, rc );
printf( "Read %d bytes\n", rc );
nlp = (struct nlmsghdr *) buf;
for( ; NLMSG_OK( nlp, rc ); nlp=NLMSG_NEXT(nlp, rc) )
{
if( nlp->nlmsg_type == NLMSG_NOOP ) continue;
if( nlp->nlmsg_type == NLMSG_ERROR ) printf( "Error\n" );
if( nlp->nlmsg_type == NLMSG_DONE ) printf( "Done\n" );
rtp = (struct rtmsg *) NLMSG_DATA(nlp);
if(rtp->rtm_table != RT_TABLE_MAIN)
continue;
rtap = (struct rtattr *) RTM_RTA(rtp);
rtl = RTM_PAYLOAD(nlp);
for(;RTA_OK(rtap, rtl);rtap=RTA_NEXT(rtap,rtl))
{
switch(rtap->rta_type)
{
case RTA_DST:
dst = *((uint32_t*)RTA_DATA(rtap));
printf( "DST: %8x %s\n", dst, inet_ntoa(*((struct in_addr *)&dst )));
break;
case RTA_METRICS:
metrics = *((int*)RTA_DATA( rtap ) );
printf( "Metrics: %x %d\n", metrics, metrics );
break;
default:
break;
}
}
mask = rtp->rtm_dst_len;
printf( "Mask: %d\n", mask );
mask_ip = mask > 0 ? 0x00 - (1<<(32 - mask)) : 0xFFFFFFFF;
}
}
Выхлоп
Read 1020 bytes
DST: b1a8c0 192.168.177.0 <------ нормалды, только почему он мне метрику не прислал?
Mask: 24
DST: 2c10ac 172.16.44.0
Mask: 24
DST: bedac3 195.218.190.0
Mask: 23
Mask: 0
Read 1640 bytes
DST: 80fe 254.128.0.0 <-------- отсюда и далее WTF???
Metrics: 20008 131080 <-------- X_X
Mask: 64
DST: 80fe 254.128.0.0
Metrics: 20008 131080
Mask: 64
DST: 80fe 254.128.0.0
Metrics: 20008 131080
Mask: 64
Read 20 bytes
Done
Mask: 0