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; }
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(); } }
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; }