/* * lib/route/nexthop.c Routing Nexthop * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation version 2.1 * of the License. * * Copyright (c) 2003-2006 Thomas Graf */ /** * @ingroup route * @defgroup nexthop Nexthop * @brief * @{ */ #include #include #include #include #include /** @cond SKIP */ #define NEXTHOP_HAS_FLAGS 0x000001 #define NEXTHOP_HAS_WEIGHT 0x000002 #define NEXTHOP_HAS_IFINDEX 0x000004 #define NEXTHOP_HAS_GATEWAY 0x000008 /** @endcond */ /** * @name Nexthop Allocation/Freeage * @{ */ /** * Allocate a routing nexthop. * @return Newly allocated routing nexthop object. */ struct rtnl_nexthop *rtnl_route_nh_alloc(void) { struct rtnl_nexthop *nh; nh = calloc(1, sizeof(*nh)); if (!nh) { nl_errno(ENOMEM); return NULL; } nl_init_list_head(&nh->rtnh_list); return nh; } /** * Free a routing nexthop. * @arg nh Routing nexthop to be freed. */ void rtnl_route_nh_free(struct rtnl_nexthop *nh) { nl_addr_put(nh->rtnh_gateway); free(nh); } /** @} */ /** * @name Attribute: Weight */ /** * Set weight of routing nexthop. * @arg nh Routing nexthop. * @arg weight New weight value. */ void rtnl_route_nh_set_weight(struct rtnl_nexthop *nh, int weight) { nh->rtnh_weight = weight; nh->rtnh_mask |= NEXTHOP_HAS_WEIGHT; } /** * Get weight of routing nexthop. * @arg nh Routing nexthop. * @return Weight value or 0 if not available. */ int rtnl_route_nh_get_weight(struct rtnl_nexthop *nh) { if (nh->rtnh_mask & NEXTHOP_HAS_WEIGHT) return nh->rtnh_weight; else return 0; } /** @} */ /** * @name Attribute: Interface Index * @{ */ /** * Set interface index for outgoing interface of routing nexthop. * @arg nh Routing nexthop. * @arg ifindex New interface index. */ void rtnl_route_nh_set_ifindex(struct rtnl_nexthop *nh, int ifindex) { nh->rtnh_ifindex = ifindex; nh->rtnh_mask |= NEXTHOP_HAS_IFINDEX; } /** * Get interface index of outgoing index of routing nexthop. * @arg nh Routing nexthop. * @return Interface index or -1 if not available. */ int rtnl_route_nh_get_ifindex(struct rtnl_nexthop *nh) { if (nh->rtnh_mask & NEXTHOP_HAS_IFINDEX) return nh->rtnh_ifindex; else return -1; } /** @} */ /** * @name Attribute: Gateway Address * @{ */ /** * Set gateway address of routing nexthop. * @arg nh Routing nexthop. * @arg addr New gateway address. * * An eventual existing gateway address will be freed and a * reference is acquried of the new address. */ void rtnl_route_nh_set_gateway(struct rtnl_nexthop *nh, struct nl_addr *addr) { struct nl_addr *old = nh->rtnh_gateway; nh->rtnh_gateway = nl_addr_get(addr); if (old) nl_addr_put(old); nh->rtnh_mask |= NEXTHOP_HAS_GATEWAY; } /** * Get gateway address of routing nexthop. * @arg nh Routing nexthop. * @return Gateway address or NULL if not available. */ struct nl_addr *rtnl_route_nh_get_gateway(struct rtnl_nexthop *nh) { if (nh->rtnh_mask & NEXTHOP_HAS_GATEWAY) return nh->rtnh_gateway; else return NULL; } /** @} */ /** * @name Attribute: Flags * @{ */ /** * Set flags of routing nexthop. * @arg nh Routing nexthop. * @arg flags Flags to be set. */ void rtnl_route_nh_set_flags(struct rtnl_nexthop *nh, unsigned int flags) { nh->rtnh_flag_mask |= flags; nh->rtnh_flags |= flags; nh->rtnh_mask |= NEXTHOP_HAS_FLAGS; } /** * Unset flags of routing nexthop. * @arg nh Routing nexthop. * @arg flags Flags to be unset. */ void rtnl_route_nh_unset_flags(struct rtnl_nexthop *nh, unsigned int flags) { nh->rtnh_flag_mask |= flags; nh->rtnh_flags &= ~flags; nh->rtnh_mask |= NEXTHOP_HAS_FLAGS; } /** * Get flags of routing nexthop. * @arg nh Routing nexthop. * @return Flags or 0 if not available. */ unsigned int rtnl_route_nh_get_flags(struct rtnl_nexthop *nh) { if (nh->rtnh_mask & NEXTHOP_HAS_FLAGS) return nh->rtnh_flags; else return 0; } /** @} */ /** @} */