Lines Matching refs:route
282 struct rtnl_route *route = (struct rtnl_route *) obj; in route_dump_stats() local
286 if (route->ce_mask & ROUTE_ATTR_CACHEINFO) { in route_dump_stats()
287 struct rtnl_rtcacheinfo *ci = &route->rt_cacheinfo; in route_dump_stats()
300 struct rtnl_route *route = (struct rtnl_route *) obj; in route_keygen() local
314 if (route->rt_dst) in route_keygen()
315 addr = route->rt_dst; in route_keygen()
326 rkey->rt_family = route->rt_family; in route_keygen()
327 rkey->rt_tos = route->rt_tos; in route_keygen()
328 rkey->rt_table = route->rt_table; in route_keygen()
329 rkey->rt_prio = route->rt_prio; in route_keygen()
337 "hash 0x%x\n", route, rkey->rt_family, rkey->rt_tos, in route_keygen()
583 void rtnl_route_get(struct rtnl_route *route) in rtnl_route_get() argument
585 nl_object_get((struct nl_object *) route); in rtnl_route_get()
588 void rtnl_route_put(struct rtnl_route *route) in rtnl_route_put() argument
590 nl_object_put((struct nl_object *) route); in rtnl_route_put()
600 void rtnl_route_set_table(struct rtnl_route *route, uint32_t table) in rtnl_route_set_table() argument
602 route->rt_table = table; in rtnl_route_set_table()
603 route->ce_mask |= ROUTE_ATTR_TABLE; in rtnl_route_set_table()
606 uint32_t rtnl_route_get_table(struct rtnl_route *route) in rtnl_route_get_table() argument
608 return route->rt_table; in rtnl_route_get_table()
611 void rtnl_route_set_scope(struct rtnl_route *route, uint8_t scope) in rtnl_route_set_scope() argument
613 route->rt_scope = scope; in rtnl_route_set_scope()
614 route->ce_mask |= ROUTE_ATTR_SCOPE; in rtnl_route_set_scope()
617 uint8_t rtnl_route_get_scope(struct rtnl_route *route) in rtnl_route_get_scope() argument
619 return route->rt_scope; in rtnl_route_get_scope()
622 void rtnl_route_set_tos(struct rtnl_route *route, uint8_t tos) in rtnl_route_set_tos() argument
624 route->rt_tos = tos; in rtnl_route_set_tos()
625 route->ce_mask |= ROUTE_ATTR_TOS; in rtnl_route_set_tos()
628 uint8_t rtnl_route_get_tos(struct rtnl_route *route) in rtnl_route_get_tos() argument
630 return route->rt_tos; in rtnl_route_get_tos()
633 void rtnl_route_set_protocol(struct rtnl_route *route, uint8_t protocol) in rtnl_route_set_protocol() argument
635 route->rt_protocol = protocol; in rtnl_route_set_protocol()
636 route->ce_mask |= ROUTE_ATTR_PROTOCOL; in rtnl_route_set_protocol()
639 uint8_t rtnl_route_get_protocol(struct rtnl_route *route) in rtnl_route_get_protocol() argument
641 return route->rt_protocol; in rtnl_route_get_protocol()
644 void rtnl_route_set_priority(struct rtnl_route *route, uint32_t prio) in rtnl_route_set_priority() argument
646 route->rt_prio = prio; in rtnl_route_set_priority()
647 route->ce_mask |= ROUTE_ATTR_PRIO; in rtnl_route_set_priority()
650 uint32_t rtnl_route_get_priority(struct rtnl_route *route) in rtnl_route_get_priority() argument
652 return route->rt_prio; in rtnl_route_get_priority()
655 int rtnl_route_set_family(struct rtnl_route *route, uint8_t family) in rtnl_route_set_family() argument
660 route->rt_family = family; in rtnl_route_set_family()
661 route->ce_mask |= ROUTE_ATTR_FAMILY; in rtnl_route_set_family()
666 uint8_t rtnl_route_get_family(struct rtnl_route *route) in rtnl_route_get_family() argument
668 return route->rt_family; in rtnl_route_get_family()
671 int rtnl_route_set_dst(struct rtnl_route *route, struct nl_addr *addr) in rtnl_route_set_dst() argument
673 if (route->ce_mask & ROUTE_ATTR_FAMILY) { in rtnl_route_set_dst()
674 if (addr->a_family != route->rt_family) in rtnl_route_set_dst()
677 route->rt_family = addr->a_family; in rtnl_route_set_dst()
679 if (route->rt_dst) in rtnl_route_set_dst()
680 nl_addr_put(route->rt_dst); in rtnl_route_set_dst()
683 route->rt_dst = addr; in rtnl_route_set_dst()
685 route->ce_mask |= (ROUTE_ATTR_DST | ROUTE_ATTR_FAMILY); in rtnl_route_set_dst()
690 struct nl_addr *rtnl_route_get_dst(struct rtnl_route *route) in rtnl_route_get_dst() argument
692 return route->rt_dst; in rtnl_route_get_dst()
695 int rtnl_route_set_src(struct rtnl_route *route, struct nl_addr *addr) in rtnl_route_set_src() argument
700 if (route->ce_mask & ROUTE_ATTR_FAMILY) { in rtnl_route_set_src()
701 if (addr->a_family != route->rt_family) in rtnl_route_set_src()
704 route->rt_family = addr->a_family; in rtnl_route_set_src()
706 if (route->rt_src) in rtnl_route_set_src()
707 nl_addr_put(route->rt_src); in rtnl_route_set_src()
710 route->rt_src = addr; in rtnl_route_set_src()
711 route->ce_mask |= (ROUTE_ATTR_SRC | ROUTE_ATTR_FAMILY); in rtnl_route_set_src()
716 struct nl_addr *rtnl_route_get_src(struct rtnl_route *route) in rtnl_route_get_src() argument
718 return route->rt_src; in rtnl_route_get_src()
721 int rtnl_route_set_type(struct rtnl_route *route, uint8_t type) in rtnl_route_set_type() argument
726 route->rt_type = type; in rtnl_route_set_type()
727 route->ce_mask |= ROUTE_ATTR_TYPE; in rtnl_route_set_type()
732 uint8_t rtnl_route_get_type(struct rtnl_route *route) in rtnl_route_get_type() argument
734 return route->rt_type; in rtnl_route_get_type()
737 void rtnl_route_set_flags(struct rtnl_route *route, uint32_t flags) in rtnl_route_set_flags() argument
739 route->rt_flag_mask |= flags; in rtnl_route_set_flags()
740 route->rt_flags |= flags; in rtnl_route_set_flags()
741 route->ce_mask |= ROUTE_ATTR_FLAGS; in rtnl_route_set_flags()
744 void rtnl_route_unset_flags(struct rtnl_route *route, uint32_t flags) in rtnl_route_unset_flags() argument
746 route->rt_flag_mask |= flags; in rtnl_route_unset_flags()
747 route->rt_flags &= ~flags; in rtnl_route_unset_flags()
748 route->ce_mask |= ROUTE_ATTR_FLAGS; in rtnl_route_unset_flags()
751 uint32_t rtnl_route_get_flags(struct rtnl_route *route) in rtnl_route_get_flags() argument
753 return route->rt_flags; in rtnl_route_get_flags()
756 int rtnl_route_set_metric(struct rtnl_route *route, int metric, uint32_t value) in rtnl_route_set_metric() argument
761 route->rt_metrics[metric - 1] = value; in rtnl_route_set_metric()
763 if (!(route->rt_metrics_mask & (1 << (metric - 1)))) { in rtnl_route_set_metric()
764 route->rt_nmetrics++; in rtnl_route_set_metric()
765 route->rt_metrics_mask |= (1 << (metric - 1)); in rtnl_route_set_metric()
768 route->ce_mask |= ROUTE_ATTR_METRICS; in rtnl_route_set_metric()
773 int rtnl_route_unset_metric(struct rtnl_route *route, int metric) in rtnl_route_unset_metric() argument
778 if (route->rt_metrics_mask & (1 << (metric - 1))) { in rtnl_route_unset_metric()
779 route->rt_nmetrics--; in rtnl_route_unset_metric()
780 route->rt_metrics_mask &= ~(1 << (metric - 1)); in rtnl_route_unset_metric()
786 int rtnl_route_get_metric(struct rtnl_route *route, int metric, uint32_t *value) in rtnl_route_get_metric() argument
791 if (!(route->rt_metrics_mask & (1 << (metric - 1)))) in rtnl_route_get_metric()
795 *value = route->rt_metrics[metric - 1]; in rtnl_route_get_metric()
800 int rtnl_route_set_pref_src(struct rtnl_route *route, struct nl_addr *addr) in rtnl_route_set_pref_src() argument
802 if (route->ce_mask & ROUTE_ATTR_FAMILY) { in rtnl_route_set_pref_src()
803 if (addr->a_family != route->rt_family) in rtnl_route_set_pref_src()
806 route->rt_family = addr->a_family; in rtnl_route_set_pref_src()
808 if (route->rt_pref_src) in rtnl_route_set_pref_src()
809 nl_addr_put(route->rt_pref_src); in rtnl_route_set_pref_src()
812 route->rt_pref_src = addr; in rtnl_route_set_pref_src()
813 route->ce_mask |= (ROUTE_ATTR_PREF_SRC | ROUTE_ATTR_FAMILY); in rtnl_route_set_pref_src()
818 struct nl_addr *rtnl_route_get_pref_src(struct rtnl_route *route) in rtnl_route_get_pref_src() argument
820 return route->rt_pref_src; in rtnl_route_get_pref_src()
823 void rtnl_route_set_iif(struct rtnl_route *route, int ifindex) in rtnl_route_set_iif() argument
825 route->rt_iif = ifindex; in rtnl_route_set_iif()
826 route->ce_mask |= ROUTE_ATTR_IIF; in rtnl_route_set_iif()
829 int rtnl_route_get_iif(struct rtnl_route *route) in rtnl_route_get_iif() argument
831 return route->rt_iif; in rtnl_route_get_iif()
834 void rtnl_route_add_nexthop(struct rtnl_route *route, struct rtnl_nexthop *nh) in rtnl_route_add_nexthop() argument
836 nl_list_add_tail(&nh->rtnh_list, &route->rt_nexthops); in rtnl_route_add_nexthop()
837 route->rt_nr_nh++; in rtnl_route_add_nexthop()
838 route->ce_mask |= ROUTE_ATTR_MULTIPATH; in rtnl_route_add_nexthop()
841 void rtnl_route_remove_nexthop(struct rtnl_route *route, struct rtnl_nexthop *nh) in rtnl_route_remove_nexthop() argument
843 if (route->ce_mask & ROUTE_ATTR_MULTIPATH) { in rtnl_route_remove_nexthop()
844 route->rt_nr_nh--; in rtnl_route_remove_nexthop()
849 struct nl_list_head *rtnl_route_get_nexthops(struct rtnl_route *route) in rtnl_route_get_nexthops() argument
851 if (route->ce_mask & ROUTE_ATTR_MULTIPATH) in rtnl_route_get_nexthops()
852 return &route->rt_nexthops; in rtnl_route_get_nexthops()
857 int rtnl_route_get_nnexthops(struct rtnl_route *route) in rtnl_route_get_nnexthops() argument
859 if (route->ce_mask & ROUTE_ATTR_MULTIPATH) in rtnl_route_get_nnexthops()
860 return route->rt_nr_nh; in rtnl_route_get_nnexthops()
913 int rtnl_route_guess_scope(struct rtnl_route *route) in rtnl_route_guess_scope() argument
915 if (route->rt_type == RTN_LOCAL) in rtnl_route_guess_scope()
918 if (!nl_list_empty(&route->rt_nexthops)) { in rtnl_route_guess_scope()
925 nl_list_for_each_entry(nh, &route->rt_nexthops, rtnh_list) { in rtnl_route_guess_scope()
946 static int parse_multipath(struct rtnl_route *route, struct nlattr *attr) in parse_multipath() argument
976 route->rt_family); in parse_multipath()
994 rtnl_route_add_nexthop(route, nh); in parse_multipath()
1010 struct rtnl_route *route; in rtnl_route_parse() local
1016 route = rtnl_route_alloc(); in rtnl_route_parse()
1017 if (!route) { in rtnl_route_parse()
1022 route->ce_msgtype = nlh->nlmsg_type; in rtnl_route_parse()
1029 route->rt_family = family = rtm->rtm_family; in rtnl_route_parse()
1030 route->rt_tos = rtm->rtm_tos; in rtnl_route_parse()
1031 route->rt_table = rtm->rtm_table; in rtnl_route_parse()
1032 route->rt_type = rtm->rtm_type; in rtnl_route_parse()
1033 route->rt_scope = rtm->rtm_scope; in rtnl_route_parse()
1034 route->rt_protocol = rtm->rtm_protocol; in rtnl_route_parse()
1035 route->rt_flags = rtm->rtm_flags; in rtnl_route_parse()
1036 route->rt_prio = 0; in rtnl_route_parse()
1038 route->ce_mask |= ROUTE_ATTR_FAMILY | ROUTE_ATTR_TOS | in rtnl_route_parse()
1053 err = rtnl_route_set_dst(route, dst); in rtnl_route_parse()
1068 rtnl_route_set_src(route, src); in rtnl_route_parse()
1073 rtnl_route_set_table(route, nla_get_u32(tb[RTA_TABLE])); in rtnl_route_parse()
1076 rtnl_route_set_iif(route, nla_get_u32(tb[RTA_IIF])); in rtnl_route_parse()
1079 rtnl_route_set_priority(route, nla_get_u32(tb[RTA_PRIORITY])); in rtnl_route_parse()
1084 rtnl_route_set_pref_src(route, addr); in rtnl_route_parse()
1099 if (rtnl_route_set_metric(route, i, m) < 0) in rtnl_route_parse()
1106 if ((err = parse_multipath(route, tb[RTA_MULTIPATH])) < 0) in rtnl_route_parse()
1110 nla_memcpy(&route->rt_cacheinfo, tb[RTA_CACHEINFO], in rtnl_route_parse()
1111 sizeof(route->rt_cacheinfo)); in rtnl_route_parse()
1112 route->ce_mask |= ROUTE_ATTR_CACHEINFO; in rtnl_route_parse()
1142 if (route->rt_nr_nh == 0) { in rtnl_route_parse()
1146 rtnl_route_add_nexthop(route, old_nh); in rtnl_route_parse()
1152 first = nl_list_first_entry(&route->rt_nexthops, in rtnl_route_parse()
1168 *result = route; in rtnl_route_parse()
1172 rtnl_route_put(route); in rtnl_route_parse()
1180 int rtnl_route_build_msg(struct nl_msg *msg, struct rtnl_route *route) in rtnl_route_build_msg() argument
1185 .rtm_family = route->rt_family, in rtnl_route_build_msg()
1186 .rtm_tos = route->rt_tos, in rtnl_route_build_msg()
1187 .rtm_table = route->rt_table, in rtnl_route_build_msg()
1188 .rtm_protocol = route->rt_protocol, in rtnl_route_build_msg()
1189 .rtm_scope = route->rt_scope, in rtnl_route_build_msg()
1190 .rtm_type = route->rt_type, in rtnl_route_build_msg()
1191 .rtm_flags = route->rt_flags, in rtnl_route_build_msg()
1194 if (route->rt_dst == NULL) in rtnl_route_build_msg()
1197 rtmsg.rtm_dst_len = nl_addr_get_prefixlen(route->rt_dst); in rtnl_route_build_msg()
1198 if (route->rt_src) in rtnl_route_build_msg()
1199 rtmsg.rtm_src_len = nl_addr_get_prefixlen(route->rt_src); in rtnl_route_build_msg()
1201 if (!(route->ce_mask & ROUTE_ATTR_SCOPE)) in rtnl_route_build_msg()
1202 rtmsg.rtm_scope = rtnl_route_guess_scope(route); in rtnl_route_build_msg()
1204 if (rtnl_route_get_nnexthops(route) == 1) { in rtnl_route_build_msg()
1206 nh = rtnl_route_nexthop_n(route, 0); in rtnl_route_build_msg()
1215 NLA_PUT_U32(msg, RTA_TABLE, route->rt_table); in rtnl_route_build_msg()
1217 if (nl_addr_get_len(route->rt_dst)) in rtnl_route_build_msg()
1218 NLA_PUT_ADDR(msg, RTA_DST, route->rt_dst); in rtnl_route_build_msg()
1219 NLA_PUT_U32(msg, RTA_PRIORITY, route->rt_prio); in rtnl_route_build_msg()
1221 if (route->ce_mask & ROUTE_ATTR_SRC) in rtnl_route_build_msg()
1222 NLA_PUT_ADDR(msg, RTA_SRC, route->rt_src); in rtnl_route_build_msg()
1224 if (route->ce_mask & ROUTE_ATTR_PREF_SRC) in rtnl_route_build_msg()
1225 NLA_PUT_ADDR(msg, RTA_PREFSRC, route->rt_pref_src); in rtnl_route_build_msg()
1227 if (route->ce_mask & ROUTE_ATTR_IIF) in rtnl_route_build_msg()
1228 NLA_PUT_U32(msg, RTA_IIF, route->rt_iif); in rtnl_route_build_msg()
1230 if (route->rt_nmetrics > 0) { in rtnl_route_build_msg()
1238 if (!rtnl_route_get_metric(route, i, &val)) in rtnl_route_build_msg()
1245 if (rtnl_route_get_nnexthops(route) == 1) { in rtnl_route_build_msg()
1248 nh = rtnl_route_nexthop_n(route, 0); in rtnl_route_build_msg()
1255 } else if (rtnl_route_get_nnexthops(route) > 1) { in rtnl_route_build_msg()
1262 nl_list_for_each_entry(nh, &route->rt_nexthops, rtnh_list) { in rtnl_route_build_msg()