00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <netlink-local.h>
00020 #include <netlink/netlink.h>
00021 #include <netlink/utils.h>
00022 #include <netlink/route/rtnl.h>
00023 #include <netlink/route/route.h>
00024
00025
00026 #define NEXTHOP_HAS_FLAGS 0x000001
00027 #define NEXTHOP_HAS_WEIGHT 0x000002
00028 #define NEXTHOP_HAS_IFINDEX 0x000004
00029 #define NEXTHOP_HAS_GATEWAY 0x000008
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 struct rtnl_nexthop *rtnl_route_nh_alloc(void)
00042 {
00043 struct rtnl_nexthop *nh;
00044
00045 nh = calloc(1, sizeof(*nh));
00046 if (!nh) {
00047 nl_errno(ENOMEM);
00048 return NULL;
00049 }
00050
00051 nl_init_list_head(&nh->rtnh_list);
00052
00053 return nh;
00054 }
00055
00056
00057
00058
00059
00060 void rtnl_route_nh_free(struct rtnl_nexthop *nh)
00061 {
00062 nl_addr_put(nh->rtnh_gateway);
00063 free(nh);
00064 }
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076 void rtnl_route_nh_set_weight(struct rtnl_nexthop *nh, int weight)
00077 {
00078 nh->rtnh_weight = weight;
00079 nh->rtnh_mask |= NEXTHOP_HAS_WEIGHT;
00080 }
00081
00082
00083
00084
00085
00086
00087 int rtnl_route_nh_get_weight(struct rtnl_nexthop *nh)
00088 {
00089 if (nh->rtnh_mask & NEXTHOP_HAS_WEIGHT)
00090 return nh->rtnh_weight;
00091 else
00092 return 0;
00093 }
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106 void rtnl_route_nh_set_ifindex(struct rtnl_nexthop *nh, int ifindex)
00107 {
00108 nh->rtnh_ifindex = ifindex;
00109 nh->rtnh_mask |= NEXTHOP_HAS_IFINDEX;
00110 }
00111
00112
00113
00114
00115
00116
00117 int rtnl_route_nh_get_ifindex(struct rtnl_nexthop *nh)
00118 {
00119 if (nh->rtnh_mask & NEXTHOP_HAS_IFINDEX)
00120 return nh->rtnh_ifindex;
00121 else
00122 return -1;
00123 }
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139 void rtnl_route_nh_set_gateway(struct rtnl_nexthop *nh, struct nl_addr *addr)
00140 {
00141 struct nl_addr *old = nh->rtnh_gateway;
00142
00143 nh->rtnh_gateway = nl_addr_get(addr);
00144 if (old)
00145 nl_addr_put(old);
00146
00147 nh->rtnh_mask |= NEXTHOP_HAS_GATEWAY;
00148 }
00149
00150
00151
00152
00153
00154
00155 struct nl_addr *rtnl_route_nh_get_gateway(struct rtnl_nexthop *nh)
00156 {
00157 if (nh->rtnh_mask & NEXTHOP_HAS_GATEWAY)
00158 return nh->rtnh_gateway;
00159 else
00160 return NULL;
00161 }
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174 void rtnl_route_nh_set_flags(struct rtnl_nexthop *nh, unsigned int flags)
00175 {
00176 nh->rtnh_flag_mask |= flags;
00177 nh->rtnh_flags |= flags;
00178 nh->rtnh_mask |= NEXTHOP_HAS_FLAGS;
00179 }
00180
00181
00182
00183
00184
00185
00186 void rtnl_route_nh_unset_flags(struct rtnl_nexthop *nh, unsigned int flags)
00187 {
00188 nh->rtnh_flag_mask |= flags;
00189 nh->rtnh_flags &= ~flags;
00190 nh->rtnh_mask |= NEXTHOP_HAS_FLAGS;
00191 }
00192
00193
00194
00195
00196
00197
00198 unsigned int rtnl_route_nh_get_flags(struct rtnl_nexthop *nh)
00199 {
00200 if (nh->rtnh_mask & NEXTHOP_HAS_FLAGS)
00201 return nh->rtnh_flags;
00202 else
00203 return 0;
00204 }
00205
00206
00207