X-Git-Url: http://git.onelab.eu/?p=libnl.git;a=blobdiff_plain;f=lib%2Froute%2Fnexthop.c;fp=lib%2Froute%2Fnexthop.c;h=720ceb56d4ee1139ece504bb99ea3483dfaa58c9;hp=0000000000000000000000000000000000000000;hb=4cee2ecb3b8afa0637e6f5fe4c57985a4bc740ff;hpb=2df2fbe518d5a221ce6e3ee88a3fb23fb1b94b27 diff --git a/lib/route/nexthop.c b/lib/route/nexthop.c new file mode 100644 index 0000000..720ceb5 --- /dev/null +++ b/lib/route/nexthop.c @@ -0,0 +1,207 @@ +/* + * 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; +} + +/** @} */ +/** @} */