Lines Matching full:route
7 * @ingroup route
8 * @defgroup route_obj Route Object
36 #include <netlink/route/rtnl.h>
37 #include <netlink/route/route.h>
38 #include <netlink/route/link.h>
39 #include <netlink/route/nexthop.h>
41 #include "nl-route.h"
42 #include "nl-aux-route/nl-route.h"
253 link_cache = nl_cache_mngt_require_safe("route/link"); in route_dump_details()
326 struct rtnl_route *route = (struct rtnl_route *) obj; in route_dump_stats() local
330 if (route->ce_mask & ROUTE_ATTR_CACHEINFO) { in route_dump_stats()
331 struct rtnl_rtcacheinfo *ci = &route->rt_cacheinfo; in route_dump_stats()
344 struct rtnl_route *route = (struct rtnl_route *) obj; in route_keygen() local
356 if (route->rt_dst) in route_keygen()
357 addr = route->rt_dst; in route_keygen()
368 rkey->rt_family = route->rt_family; in route_keygen()
369 rkey->rt_tos = route->rt_tos; in route_keygen()
370 rkey->rt_table = route->rt_table; in route_keygen()
371 rkey->rt_prio = route->rt_prio; in route_keygen()
379 "route %p key (fam %d tos %d table %d prio %d addr %s) keysz %d hash 0x%x\n", in route_keygen()
380 route, rkey->rt_family, rkey->rt_tos, rkey->rt_table, in route_keygen()
389 struct rtnl_route *route = (struct rtnl_route *)obj; in route_id_attrs_get() local
394 if (route->rt_family == AF_MPLS) in route_id_attrs_get()
514 * ipv6 ECMP route notifications from the kernel come as in route_update()
516 * function collapses such route msgs into a single in route_update()
517 * route with multiple nexthops. The resulting object looks in route_update()
518 * similar to a ipv4 ECMP route in route_update()
532 * Get the only nexthop entry from the new route. For in route_update()
533 * IPv6 we always get a route with a 0th NH in route_update()
546 * Do not add the nexthop to old route if it was already added before in route_update()
555 * Add the nexthop to old route in route_update()
562 NL_DBG(2, "Route obj %p updated. Added " in route_update()
573 * route deletes. So, if there is only one nexthop in route_update()
581 * Find the next hop in old route and delete it in route_update()
589 NL_DBG(2, "Route obj %p updated. Removed " in route_update()
603 "to object %p during route update\n", new_obj); in route_update()
649 void rtnl_route_get(struct rtnl_route *route) in rtnl_route_get() argument
651 nl_object_get((struct nl_object *) route); in rtnl_route_get()
654 void rtnl_route_put(struct rtnl_route *route) in rtnl_route_put() argument
656 nl_object_put((struct nl_object *) route); in rtnl_route_put()
666 void rtnl_route_set_table(struct rtnl_route *route, uint32_t table) in rtnl_route_set_table() argument
668 route->rt_table = table; in rtnl_route_set_table()
669 route->ce_mask |= ROUTE_ATTR_TABLE; in rtnl_route_set_table()
672 uint32_t rtnl_route_get_table(struct rtnl_route *route) in rtnl_route_get_table() argument
674 return route->rt_table; in rtnl_route_get_table()
677 void rtnl_route_set_scope(struct rtnl_route *route, uint8_t scope) in rtnl_route_set_scope() argument
679 route->rt_scope = scope; in rtnl_route_set_scope()
680 route->ce_mask |= ROUTE_ATTR_SCOPE; in rtnl_route_set_scope()
683 uint8_t rtnl_route_get_scope(struct rtnl_route *route) in rtnl_route_get_scope() argument
685 return route->rt_scope; in rtnl_route_get_scope()
688 void rtnl_route_set_tos(struct rtnl_route *route, uint8_t tos) in rtnl_route_set_tos() argument
690 route->rt_tos = tos; in rtnl_route_set_tos()
691 route->ce_mask |= ROUTE_ATTR_TOS; in rtnl_route_set_tos()
694 uint8_t rtnl_route_get_tos(struct rtnl_route *route) in rtnl_route_get_tos() argument
696 return route->rt_tos; in rtnl_route_get_tos()
699 void rtnl_route_set_protocol(struct rtnl_route *route, uint8_t protocol) in rtnl_route_set_protocol() argument
701 route->rt_protocol = protocol; in rtnl_route_set_protocol()
702 route->ce_mask |= ROUTE_ATTR_PROTOCOL; in rtnl_route_set_protocol()
705 uint8_t rtnl_route_get_protocol(struct rtnl_route *route) in rtnl_route_get_protocol() argument
707 return route->rt_protocol; in rtnl_route_get_protocol()
710 void rtnl_route_set_priority(struct rtnl_route *route, uint32_t prio) in rtnl_route_set_priority() argument
712 route->rt_prio = prio; in rtnl_route_set_priority()
713 route->ce_mask |= ROUTE_ATTR_PRIO; in rtnl_route_set_priority()
716 uint32_t rtnl_route_get_priority(struct rtnl_route *route) in rtnl_route_get_priority() argument
718 return route->rt_prio; in rtnl_route_get_priority()
721 int rtnl_route_set_family(struct rtnl_route *route, uint8_t family) in rtnl_route_set_family() argument
728 route->rt_family = family; in rtnl_route_set_family()
729 route->ce_mask |= ROUTE_ATTR_FAMILY; in rtnl_route_set_family()
736 uint8_t rtnl_route_get_family(struct rtnl_route *route) in rtnl_route_get_family() argument
738 return route->rt_family; in rtnl_route_get_family()
741 int rtnl_route_set_dst(struct rtnl_route *route, struct nl_addr *addr) in rtnl_route_set_dst() argument
743 if (route->ce_mask & ROUTE_ATTR_FAMILY) { in rtnl_route_set_dst()
744 if (addr->a_family != route->rt_family) in rtnl_route_set_dst()
747 route->rt_family = addr->a_family; in rtnl_route_set_dst()
749 if (route->rt_dst) in rtnl_route_set_dst()
750 nl_addr_put(route->rt_dst); in rtnl_route_set_dst()
753 route->rt_dst = addr; in rtnl_route_set_dst()
755 route->ce_mask |= (ROUTE_ATTR_DST | ROUTE_ATTR_FAMILY); in rtnl_route_set_dst()
760 struct nl_addr *rtnl_route_get_dst(struct rtnl_route *route) in rtnl_route_get_dst() argument
762 return route->rt_dst; in rtnl_route_get_dst()
765 int rtnl_route_set_src(struct rtnl_route *route, struct nl_addr *addr) in rtnl_route_set_src() argument
770 if (route->ce_mask & ROUTE_ATTR_FAMILY) { in rtnl_route_set_src()
771 if (addr->a_family != route->rt_family) in rtnl_route_set_src()
774 route->rt_family = addr->a_family; in rtnl_route_set_src()
776 if (route->rt_src) in rtnl_route_set_src()
777 nl_addr_put(route->rt_src); in rtnl_route_set_src()
780 route->rt_src = addr; in rtnl_route_set_src()
781 route->ce_mask |= (ROUTE_ATTR_SRC | ROUTE_ATTR_FAMILY); in rtnl_route_set_src()
786 struct nl_addr *rtnl_route_get_src(struct rtnl_route *route) in rtnl_route_get_src() argument
788 return route->rt_src; in rtnl_route_get_src()
791 int rtnl_route_set_type(struct rtnl_route *route, uint8_t type) in rtnl_route_set_type() argument
796 route->rt_type = type; in rtnl_route_set_type()
797 route->ce_mask |= ROUTE_ATTR_TYPE; in rtnl_route_set_type()
802 uint8_t rtnl_route_get_type(struct rtnl_route *route) in rtnl_route_get_type() argument
804 return route->rt_type; in rtnl_route_get_type()
807 void rtnl_route_set_flags(struct rtnl_route *route, uint32_t flags) in rtnl_route_set_flags() argument
809 route->rt_flag_mask |= flags; in rtnl_route_set_flags()
810 route->rt_flags |= flags; in rtnl_route_set_flags()
811 route->ce_mask |= ROUTE_ATTR_FLAGS; in rtnl_route_set_flags()
814 void rtnl_route_unset_flags(struct rtnl_route *route, uint32_t flags) in rtnl_route_unset_flags() argument
816 route->rt_flag_mask |= flags; in rtnl_route_unset_flags()
817 route->rt_flags &= ~flags; in rtnl_route_unset_flags()
818 route->ce_mask |= ROUTE_ATTR_FLAGS; in rtnl_route_unset_flags()
821 uint32_t rtnl_route_get_flags(struct rtnl_route *route) in rtnl_route_get_flags() argument
823 return route->rt_flags; in rtnl_route_get_flags()
826 int rtnl_route_set_metric(struct rtnl_route *route, int metric, uint32_t value) in rtnl_route_set_metric() argument
831 route->rt_metrics[metric - 1] = value; in rtnl_route_set_metric()
833 if (!(route->rt_metrics_mask & (1 << (metric - 1)))) { in rtnl_route_set_metric()
834 route->rt_nmetrics++; in rtnl_route_set_metric()
835 route->rt_metrics_mask |= (1 << (metric - 1)); in rtnl_route_set_metric()
838 route->ce_mask |= ROUTE_ATTR_METRICS; in rtnl_route_set_metric()
843 int rtnl_route_unset_metric(struct rtnl_route *route, int metric) in rtnl_route_unset_metric() argument
848 if (route->rt_metrics_mask & (1 << (metric - 1))) { in rtnl_route_unset_metric()
849 route->rt_nmetrics--; in rtnl_route_unset_metric()
850 route->rt_metrics_mask &= ~(1 << (metric - 1)); in rtnl_route_unset_metric()
856 int rtnl_route_get_metric(struct rtnl_route *route, int metric, uint32_t *value) in rtnl_route_get_metric() argument
861 if (!(route->rt_metrics_mask & (1 << (metric - 1)))) in rtnl_route_get_metric()
865 *value = route->rt_metrics[metric - 1]; in rtnl_route_get_metric()
870 int rtnl_route_set_pref_src(struct rtnl_route *route, struct nl_addr *addr) in rtnl_route_set_pref_src() argument
872 if (route->ce_mask & ROUTE_ATTR_FAMILY) { in rtnl_route_set_pref_src()
873 if (addr->a_family != route->rt_family) in rtnl_route_set_pref_src()
876 route->rt_family = addr->a_family; in rtnl_route_set_pref_src()
878 if (route->rt_pref_src) in rtnl_route_set_pref_src()
879 nl_addr_put(route->rt_pref_src); in rtnl_route_set_pref_src()
882 route->rt_pref_src = addr; in rtnl_route_set_pref_src()
883 route->ce_mask |= (ROUTE_ATTR_PREF_SRC | ROUTE_ATTR_FAMILY); in rtnl_route_set_pref_src()
888 struct nl_addr *rtnl_route_get_pref_src(struct rtnl_route *route) in rtnl_route_get_pref_src() argument
890 return route->rt_pref_src; in rtnl_route_get_pref_src()
893 void rtnl_route_set_iif(struct rtnl_route *route, int ifindex) in rtnl_route_set_iif() argument
895 route->rt_iif = ifindex; in rtnl_route_set_iif()
896 route->ce_mask |= ROUTE_ATTR_IIF; in rtnl_route_set_iif()
899 int rtnl_route_get_iif(struct rtnl_route *route) in rtnl_route_get_iif() argument
901 return route->rt_iif; in rtnl_route_get_iif()
904 void rtnl_route_add_nexthop(struct rtnl_route *route, struct rtnl_nexthop *nh) in rtnl_route_add_nexthop() argument
906 nl_list_add_tail(&nh->rtnh_list, &route->rt_nexthops); in rtnl_route_add_nexthop()
907 route->rt_nr_nh++; in rtnl_route_add_nexthop()
908 route->ce_mask |= ROUTE_ATTR_MULTIPATH; in rtnl_route_add_nexthop()
911 void rtnl_route_remove_nexthop(struct rtnl_route *route, struct rtnl_nexthop *nh) in rtnl_route_remove_nexthop() argument
913 if (route->ce_mask & ROUTE_ATTR_MULTIPATH) { in rtnl_route_remove_nexthop()
914 route->rt_nr_nh--; in rtnl_route_remove_nexthop()
919 struct nl_list_head *rtnl_route_get_nexthops(struct rtnl_route *route) in rtnl_route_get_nexthops() argument
921 if (route->ce_mask & ROUTE_ATTR_MULTIPATH) in rtnl_route_get_nexthops()
922 return &route->rt_nexthops; in rtnl_route_get_nexthops()
927 int rtnl_route_get_nnexthops(struct rtnl_route *route) in rtnl_route_get_nnexthops() argument
929 if (route->ce_mask & ROUTE_ATTR_MULTIPATH) in rtnl_route_get_nnexthops()
930 return route->rt_nr_nh; in rtnl_route_get_nnexthops()
965 void rtnl_route_set_ttl_propagate(struct rtnl_route *route, uint8_t ttl_prop) in rtnl_route_set_ttl_propagate() argument
967 route->rt_ttl_propagate = ttl_prop; in rtnl_route_set_ttl_propagate()
968 route->ce_mask |= ROUTE_ATTR_TTL_PROPAGATE; in rtnl_route_set_ttl_propagate()
971 int rtnl_route_get_ttl_propagate(struct rtnl_route *route) in rtnl_route_get_ttl_propagate() argument
973 if (!route) in rtnl_route_get_ttl_propagate()
975 if (!(route->ce_mask & ROUTE_ATTR_TTL_PROPAGATE)) in rtnl_route_get_ttl_propagate()
977 return route->rt_ttl_propagate; in rtnl_route_get_ttl_propagate()
980 void rtnl_route_set_nhid(struct rtnl_route *route, uint32_t nhid) in rtnl_route_set_nhid() argument
982 route->rt_nhid = nhid; in rtnl_route_set_nhid()
985 route->ce_mask |= ROUTE_ATTR_NHID; in rtnl_route_set_nhid()
987 route->ce_mask &= ~ROUTE_ATTR_NHID; in rtnl_route_set_nhid()
990 uint32_t rtnl_route_get_nhid(struct rtnl_route *route) in rtnl_route_get_nhid() argument
992 return route->rt_nhid; in rtnl_route_get_nhid()
1003 * Guess scope of a route object.
1004 * @arg route Route object.
1006 * Guesses the scope of a route object, based on the following rules:
1008 * 1) Local route -> local scope
1015 int rtnl_route_guess_scope(struct rtnl_route *route) in rtnl_route_guess_scope() argument
1017 if (route->rt_type == RTN_LOCAL) in rtnl_route_guess_scope()
1020 if (route->rt_family == AF_MPLS) in rtnl_route_guess_scope()
1023 if (!nl_list_empty(&route->rt_nexthops)) { in rtnl_route_guess_scope()
1030 nl_list_for_each_entry(nh, &route->rt_nexthops, rtnh_list) { in rtnl_route_guess_scope()
1080 static int parse_multipath(struct rtnl_route *route, struct nlattr *attr) in parse_multipath() argument
1111 route->rt_family); in parse_multipath()
1129 route->rt_family); in parse_multipath()
1159 rtnl_route_add_nexthop(route, _nl_steal_pointer(&nh)); in parse_multipath()
1169 _nl_auto_rtnl_route struct rtnl_route *route = NULL; in rtnl_route_parse() local
1178 route = rtnl_route_alloc(); in rtnl_route_parse()
1179 if (!route) in rtnl_route_parse()
1182 route->ce_msgtype = nlh->nlmsg_type; in rtnl_route_parse()
1189 route->rt_family = family = rtm->rtm_family; in rtnl_route_parse()
1190 route->rt_tos = rtm->rtm_tos; in rtnl_route_parse()
1191 route->rt_table = rtm->rtm_table; in rtnl_route_parse()
1192 route->rt_type = rtm->rtm_type; in rtnl_route_parse()
1193 route->rt_scope = rtm->rtm_scope; in rtnl_route_parse()
1194 route->rt_protocol = rtm->rtm_protocol; in rtnl_route_parse()
1195 route->rt_flags = rtm->rtm_flags; in rtnl_route_parse()
1196 route->rt_prio = 0; in rtnl_route_parse()
1198 route->ce_mask |= ROUTE_ATTR_FAMILY | ROUTE_ATTR_TOS | in rtnl_route_parse()
1207 route->ce_mask |= ROUTE_ATTR_PRIO; in rtnl_route_parse()
1233 err = rtnl_route_set_dst(route, dst); in rtnl_route_parse()
1246 rtnl_route_set_src(route, src); in rtnl_route_parse()
1250 rtnl_route_set_table(route, nla_get_u32(tb[RTA_TABLE])); in rtnl_route_parse()
1253 rtnl_route_set_iif(route, nla_get_u32(tb[RTA_IIF])); in rtnl_route_parse()
1256 rtnl_route_set_priority(route, nla_get_u32(tb[RTA_PRIORITY])); in rtnl_route_parse()
1263 rtnl_route_set_pref_src(route, addr); in rtnl_route_parse()
1278 err = rtnl_route_set_metric(route, i, m); in rtnl_route_parse()
1286 if ((err = parse_multipath(route, tb[RTA_MULTIPATH])) < 0) in rtnl_route_parse()
1291 nla_memcpy(&route->rt_cacheinfo, tb[RTA_CACHEINFO], in rtnl_route_parse()
1292 sizeof(route->rt_cacheinfo)); in rtnl_route_parse()
1293 route->ce_mask |= ROUTE_ATTR_CACHEINFO; in rtnl_route_parse()
1328 addr = nl_addr_alloc_attr(tb[RTA_NEWDST], route->rt_family); in rtnl_route_parse()
1355 rtnl_route_set_ttl_propagate(route, in rtnl_route_parse()
1370 rtnl_route_set_nhid(route, nla_get_u32(tb[RTA_NH_ID])); in rtnl_route_parse()
1375 if (route->rt_nr_nh == 0) { in rtnl_route_parse()
1379 rtnl_route_add_nexthop(route, _nl_steal_pointer(&old_nh)); in rtnl_route_parse()
1385 first = nl_list_first_entry(&route->rt_nexthops, in rtnl_route_parse()
1398 *result = _nl_steal_pointer(&route); in rtnl_route_parse()
1402 int rtnl_route_build_msg(struct nl_msg *msg, struct rtnl_route *route) in rtnl_route_build_msg() argument
1407 .rtm_family = route->rt_family, in rtnl_route_build_msg()
1408 .rtm_tos = route->rt_tos, in rtnl_route_build_msg()
1409 .rtm_table = route->rt_table, in rtnl_route_build_msg()
1410 .rtm_protocol = route->rt_protocol, in rtnl_route_build_msg()
1411 .rtm_scope = route->rt_scope, in rtnl_route_build_msg()
1412 .rtm_type = route->rt_type, in rtnl_route_build_msg()
1413 .rtm_flags = route->rt_flags, in rtnl_route_build_msg()
1416 if (route->rt_dst == NULL) in rtnl_route_build_msg()
1419 rtmsg.rtm_dst_len = nl_addr_get_prefixlen(route->rt_dst); in rtnl_route_build_msg()
1420 if (route->rt_src) in rtnl_route_build_msg()
1421 rtmsg.rtm_src_len = nl_addr_get_prefixlen(route->rt_src); in rtnl_route_build_msg()
1423 if (!(route->ce_mask & ROUTE_ATTR_SCOPE)) in rtnl_route_build_msg()
1424 rtmsg.rtm_scope = rtnl_route_guess_scope(route); in rtnl_route_build_msg()
1426 if (rtnl_route_get_nnexthops(route) == 1) { in rtnl_route_build_msg()
1428 nh = rtnl_route_nexthop_n(route, 0); in rtnl_route_build_msg()
1439 if (route->rt_family != AF_MPLS) in rtnl_route_build_msg()
1440 NLA_PUT_U32(msg, RTA_TABLE, route->rt_table); in rtnl_route_build_msg()
1442 if (nl_addr_get_len(route->rt_dst)) in rtnl_route_build_msg()
1443 NLA_PUT_ADDR(msg, RTA_DST, route->rt_dst); in rtnl_route_build_msg()
1445 if (route->ce_mask & ROUTE_ATTR_PRIO) in rtnl_route_build_msg()
1446 NLA_PUT_U32(msg, RTA_PRIORITY, route->rt_prio); in rtnl_route_build_msg()
1448 if (route->ce_mask & ROUTE_ATTR_SRC) in rtnl_route_build_msg()
1449 NLA_PUT_ADDR(msg, RTA_SRC, route->rt_src); in rtnl_route_build_msg()
1451 if (route->ce_mask & ROUTE_ATTR_PREF_SRC) in rtnl_route_build_msg()
1452 NLA_PUT_ADDR(msg, RTA_PREFSRC, route->rt_pref_src); in rtnl_route_build_msg()
1454 if (route->ce_mask & ROUTE_ATTR_IIF) in rtnl_route_build_msg()
1455 NLA_PUT_U32(msg, RTA_IIF, route->rt_iif); in rtnl_route_build_msg()
1457 if (route->ce_mask & ROUTE_ATTR_TTL_PROPAGATE) in rtnl_route_build_msg()
1458 NLA_PUT_U8(msg, RTA_TTL_PROPAGATE, route->rt_ttl_propagate); in rtnl_route_build_msg()
1460 if (route->rt_nmetrics > 0) { in rtnl_route_build_msg()
1468 if (!rtnl_route_get_metric(route, i, &val)) in rtnl_route_build_msg()
1476 if (route->ce_mask & ROUTE_ATTR_NHID) { in rtnl_route_build_msg()
1477 NLA_PUT_U32(msg, RTA_NH_ID, route->rt_nhid); in rtnl_route_build_msg()
1478 } else if (rtnl_route_get_nnexthops(route) == 1) { in rtnl_route_build_msg()
1481 nh = rtnl_route_nexthop_n(route, 0); in rtnl_route_build_msg()
1495 } else if (rtnl_route_get_nnexthops(route) > 1) { in rtnl_route_build_msg()
1502 nl_list_for_each_entry(nh, &route->rt_nexthops, rtnh_list) { in rtnl_route_build_msg()
1546 .oo_name = "route/route",