xref: /aosp_15_r20/external/libnl/include/nl-aux-route/nl-route.h (revision 4dc78e53d49367fa8e61b07018507c90983a077d)
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