19 #include <netlink-local.h>
20 #include <netlink/netlink.h>
21 #include <netlink/cache.h>
22 #include <netlink/utils.h>
23 #include <netlink/data.h>
24 #include <netlink/route/rtnl.h>
25 #include <netlink/route/route.h>
26 #include <netlink/route/link.h>
30 static int route_msg_parser(
struct nl_cache_ops *ops,
struct sockaddr_nl *who,
33 struct rtnl_route *route;
36 if ((err = rtnl_route_parse(nlh, &route)) < 0)
41 rtnl_route_put(route);
45 static int route_request_update(
struct nl_cache *c,
struct nl_sock *h)
48 .rtm_family = c->c_iarg1,
51 if (c->c_iarg2 & ROUTE_CACHE_CONTENT)
52 rhdr.rtm_flags |= RTM_F_CLONED;
54 return nl_send_simple(h, RTM_GETROUTE, NLM_F_DUMP, &rhdr,
sizeof(rhdr));
77 struct nl_cache **result)
79 struct nl_cache *cache;
85 cache->c_iarg1 = family;
86 cache->c_iarg2 = flags;
104 static int build_route_msg(
struct rtnl_route *tmpl,
int cmd,
int flags,
105 struct nl_msg **result)
113 if ((err = rtnl_route_build_msg(msg, tmpl)) < 0) {
122 int rtnl_route_build_add_request(
struct rtnl_route *tmpl,
int flags,
123 struct nl_msg **result)
125 return build_route_msg(tmpl, RTM_NEWROUTE, NLM_F_CREATE | flags,
129 int rtnl_route_add(
struct nl_sock *sk,
struct rtnl_route *route,
int flags)
134 if ((err = rtnl_route_build_add_request(route, flags, &msg)) < 0)
137 err = nl_send_auto_complete(sk, msg);
142 return wait_for_ack(sk);
145 int rtnl_route_build_del_request(
struct rtnl_route *tmpl,
int flags,
146 struct nl_msg **result)
148 return build_route_msg(tmpl, RTM_DELROUTE, flags, result);
151 int rtnl_route_delete(
struct nl_sock *sk,
struct rtnl_route *route,
int flags)
156 if ((err = rtnl_route_build_del_request(route, flags, &msg)) < 0)
159 err = nl_send_auto_complete(sk, msg);
164 return wait_for_ack(sk);
170 { AF_INET, RTNLGRP_IPV4_ROUTE },
171 { AF_INET6, RTNLGRP_IPV6_ROUTE },
172 { AF_DECnet, RTNLGRP_DECnet_ROUTE },
173 { END_OF_GROUP_LIST },
178 .co_hdrsize =
sizeof(
struct rtmsg),
180 { RTM_NEWROUTE, NL_ACT_NEW,
"new" },
181 { RTM_DELROUTE, NL_ACT_DEL,
"del" },
182 { RTM_GETROUTE, NL_ACT_GET,
"get" },
183 END_OF_MSGTYPES_LIST,
185 .co_protocol = NETLINK_ROUTE,
186 .co_groups = route_groups,
187 .co_request_update = route_request_update,
188 .co_msg_parser = route_msg_parser,
189 .co_obj_ops = &route_obj_ops,
192 static void __init route_init(
void)
197 static void __exit route_exit(
void)