1 /* SPDX-License-Identifier: LGPL-2.1-only */
2
3 #ifndef __NETLINK_NL_AUX_ROUTE_NL_ROUTE_H__
4 #define __NETLINK_NL_AUX_ROUTE_NL_ROUTE_H__
5
6 #include "base/nl-base-utils.h"
7
8 #include <netlink/route/action.h>
9
10 struct rtnl_link;
11 void rtnl_link_put(struct rtnl_link *);
12 #define _nl_auto_rtnl_link _nl_auto(_nl_auto_rtnl_link_fcn)
13 _NL_AUTO_DEFINE_FCN_TYPED0(struct rtnl_link *, _nl_auto_rtnl_link_fcn,
14 rtnl_link_put);
15
16 struct rtnl_route;
17 void rtnl_route_put(struct rtnl_route *);
18 #define _nl_auto_rtnl_route _nl_auto(_nl_auto_rtnl_route_fcn)
19 _NL_AUTO_DEFINE_FCN_TYPED0(struct rtnl_route *, _nl_auto_rtnl_route_fcn,
20 rtnl_route_put);
21
22 struct rtnl_mdb;
23 void rtnl_mdb_put(struct rtnl_mdb *);
24 #define _nl_auto_rtnl_mdb _nl_auto(_nl_auto_rtnl_mdb_fcn)
25 _NL_AUTO_DEFINE_FCN_TYPED0(struct rtnl_mdb *, _nl_auto_rtnl_mdb_fcn,
26 rtnl_mdb_put);
27
28 struct rtnl_nexthop;
29 void rtnl_route_nh_free(struct rtnl_nexthop *);
30 #define _nl_auto_rtnl_nexthop _nl_auto(_nl_auto_rtnl_nexthop_fcn)
31 _NL_AUTO_DEFINE_FCN_TYPED0(struct rtnl_nexthop *, _nl_auto_rtnl_nexthop_fcn,
32 rtnl_route_nh_free);
33
34 struct rtnl_nh;
35 void rtnl_nh_put(struct rtnl_nh *);
36 #define _nl_auto_rtnl_nh _nl_auto(_nl_auto_rtnl_nh_fcn)
37 _NL_AUTO_DEFINE_FCN_TYPED0(struct rtnl_nh *, _nl_auto_rtnl_nh_fcn, rtnl_nh_put);
38
39 struct rtnl_link_af_ops;
40 void rtnl_link_af_ops_put(struct rtnl_link_af_ops *);
41 #define _nl_auto_rtnl_link_af_ops _nl_auto(_nl_auto_rtnl_link_af_ops_fcn)
42 _NL_AUTO_DEFINE_FCN_TYPED0(struct rtnl_link_af_ops *,
43 _nl_auto_rtnl_link_af_ops_fcn, rtnl_link_af_ops_put);
44
45 #define _nl_auto_rtnl_act _nl_auto(_nl_auto_rtnl_act_fcn)
46 _NL_AUTO_DEFINE_FCN_TYPED0(struct rtnl_act *, _nl_auto_rtnl_act_fcn,
47 rtnl_act_put);
48
49 #define _nl_auto_rtnl_act_all _nl_auto(_nl_auto_rtnl_act_fcn_all)
50 _NL_AUTO_DEFINE_FCN_INDIRECT0(struct rtnl_act *, _nl_auto_rtnl_act_fcn_all,
51 rtnl_act_put_all);
52
53 struct rtnl_ematch_tree;
54 void rtnl_ematch_tree_free(struct rtnl_ematch_tree *);
55 #define _nl_auto_rtnl_ematch_tree _nl_auto(_nl_auto_rtnl_ematch_tree_fcn)
56 _NL_AUTO_DEFINE_FCN_TYPED0(struct rtnl_ematch_tree *,
57 _nl_auto_rtnl_ematch_tree_fcn,
58 rtnl_ematch_tree_free);
59
60 struct rtnl_cls;
61 void rtnl_cls_put(struct rtnl_cls *);
62 #define _nl_auto_rtnl_cls _nl_auto(_nl_auto_rtnl_cls_fcn)
63 _NL_AUTO_DEFINE_FCN_TYPED0(struct rtnl_cls *, _nl_auto_rtnl_cls_fcn,
64 rtnl_cls_put);
65
66 /*****************************************************************************/
67
_rtnl_act_append_get(struct rtnl_act ** head,struct rtnl_act * new)68 static inline int _rtnl_act_append_get(struct rtnl_act **head,
69 struct rtnl_act *new)
70 {
71 int r;
72
73 r = rtnl_act_append(head, new);
74 if (r >= 0)
75 rtnl_act_get(new);
76 return r;
77 }
78
_rtnl_act_append_take(struct rtnl_act ** head,struct rtnl_act * new)79 static inline int _rtnl_act_append_take(struct rtnl_act **head,
80 struct rtnl_act *new)
81 {
82 int r;
83
84 r = rtnl_act_append(head, new);
85 if (r < 0)
86 rtnl_act_put(new);
87 return r;
88 }
89
90 #endif /* __NETLINK_NL_AUX_ROUTE_NL_ROUTE_H__ */
91