Ejemplo n.º 1
0
bool route_table_mgr::parse_enrty(nlmsghdr *nl_header, route_val *p_val)
{
	int len;
	struct rtmsg *rt_msg;
	struct rtattr *rt_attribute;

	// get route entry header
	rt_msg = (struct rtmsg *) NLMSG_DATA(nl_header);

	// we are not concerned about the local and default route table
	if (rt_msg->rtm_family != AF_INET || rt_msg->rtm_table == RT_TABLE_LOCAL || rt_msg->rtm_table == RT_TABLE_DEFAULT)
		return false;

	p_val->set_protocol(rt_msg->rtm_protocol);
	p_val->set_scope(rt_msg->rtm_scope);
	p_val->set_type(rt_msg->rtm_type);
	p_val->set_table_id(rt_msg->rtm_table);

	in_addr_t dst_mask = htonl(VMA_NETMASK(rt_msg->rtm_dst_len));
	p_val->set_dst_mask(dst_mask);
	p_val->set_dst_pref_len(rt_msg->rtm_dst_len);

	len = RTM_PAYLOAD(nl_header);
	rt_attribute = (struct rtattr *) RTM_RTA(rt_msg);

	for (;RTA_OK(rt_attribute, len);rt_attribute=RTA_NEXT(rt_attribute,len)) {
		parse_attr(rt_attribute, p_val);
	}
	p_val->set_state(true);
	p_val->set_str();
	return true;
}
Ejemplo n.º 2
0
void route_table_mgr::create_route_val_from_info(const netlink_route_info *netlink_route_info, route_val &netlink_route_val)
{
	char dst_addr_chr[ADDR_LEN];
	inet_ntop(AF_INET, netlink_route_info->dst_addr, dst_addr_chr, ADDR_LEN);
	netlink_route_val.set_dst_addr(inet_addr((const char*)dst_addr_chr));

	in_addr_t dst_mask = htonl(VMA_NETMASK(netlink_route_info->dst_prefixlen));
	netlink_route_val.set_dst_mask(dst_mask);
	netlink_route_val.set_dst_pref_len(netlink_route_info->dst_prefixlen);

	netlink_route_val.set_protocol(netlink_route_info->protocol);
	netlink_route_val.set_scope(netlink_route_info->scope);
	netlink_route_val.set_type(netlink_route_info->type);

	int if_index = netlink_route_info->oif;
	netlink_route_val.set_if_index(if_index);

	char if_name[IFNAMSIZ];
	if_indextoname(if_index,if_name);
	netlink_route_val.set_if_name(if_name);

	struct sockaddr_in src_addr;
	if (!get_ipv4_from_ifname(if_name, &src_addr)) {
		netlink_route_val.set_src_addr(src_addr.sin_addr.s_addr);
	}

	netlink_route_val.set_str();
	if (g_vlogger_level >= VLOG_FUNC) {
		netlink_route_val.print_route_val();
	}
}
Ejemplo n.º 3
0
bool route_table_mgr::rt_mgr_parse_enrty(nlmsghdr *nl_header, route_val *p_rtv)
{
	int len;
	struct rtmsg *rt_msg;
	struct rtattr *rt_attribute;

	// get route entry header
	rt_msg = (struct rtmsg *) NLMSG_DATA(nl_header);

	// we are only concerned about the main route table
	if (rt_msg->rtm_family != AF_INET || rt_msg->rtm_table != RT_TABLE_MAIN)
		return false;

	p_rtv->set_protocol(rt_msg->rtm_protocol);
	p_rtv->set_scope(rt_msg->rtm_scope);
	p_rtv->set_type(rt_msg->rtm_type);

	in_addr_t dst_mask = htonl(VMA_NETMASK(rt_msg->rtm_dst_len));
	p_rtv->set_dst_mask(dst_mask);
	p_rtv->set_dst_pref_len(rt_msg->rtm_dst_len);

	len = RTM_PAYLOAD(nl_header);
	rt_attribute = (struct rtattr *) RTM_RTA(rt_msg);

	for (;RTA_OK(rt_attribute, len);rt_attribute=RTA_NEXT(rt_attribute,len)) {
		rt_mgr_parse_attr(rt_attribute, p_rtv);
	}
	p_rtv->set_state(true);

	if (!p_rtv->get_src_addr()) {
		struct sockaddr_in src_addr;
		char *if_name = (char *)p_rtv->get_if_name();
		if (!get_ipv4_from_ifname(if_name, &src_addr)) {
			p_rtv->set_src_addr(src_addr.sin_addr.s_addr);
		}
		else {
			// Failed mapping if_name to IPv4 address
			// Should we log or return error also from here?
		}
	}

	p_rtv->set_str();
	return true;
}