LINUX.ORG.RU

[C, netlink] metrics


0

1

Считываю ответ на запрос таблицы маршрутизации с 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


Ответ на: комментарий от anonymous

И правда, судя по всему, вторая часть данных (которая длиной 1640 байт) возвращает информацию об ipv6, т.к. RTA_PAYLOAD для RTA_DST возвращает в этом случае 16 вместо 4, т.е. айпишник у нас длиной 16 байт. Однако это не объясняет ситуацию с метрикой =(

harvos
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.