From 7a26c7934b64816ebf66ad4b129271633fb38a9a Mon Sep 17 00:00:00 2001 From: Santhosh Kumar Date: Sun, 19 Mar 2017 23:47:34 -0700 Subject: [PATCH 1/3] Provide accessors for actions (rtnl_act). Add accessor functions to retrieve actions on a tc object and provide additional function to navigate the collection of actions. --- include/netlink/route/action.h | 1 + include/netlink/route/cls/basic.h | 1 + include/netlink/route/cls/u32.h | 1 + lib/route/act.c | 9 +++++++++ lib/route/cls/basic.c | 15 +++++++++++++++ lib/route/cls/u32.c | 15 +++++++++++++++ libnl-route-3.sym | 3 +++ 7 files changed, 45 insertions(+) diff --git a/include/netlink/route/action.h b/include/netlink/route/action.h index 5db92ab03..7d4c1857a 100644 --- a/include/netlink/route/action.h +++ b/include/netlink/route/action.h @@ -22,6 +22,7 @@ extern "C" { #endif extern struct rtnl_act *rtnl_act_alloc(void); +extern struct rtnl_act *rtnl_act_next(struct rtnl_act *); extern void rtnl_act_get(struct rtnl_act *); extern void rtnl_act_put(struct rtnl_act *); extern int rtnl_act_build_add_request(struct rtnl_act *, int, diff --git a/include/netlink/route/cls/basic.h b/include/netlink/route/cls/basic.h index f00793ca6..51232ae0a 100644 --- a/include/netlink/route/cls/basic.h +++ b/include/netlink/route/cls/basic.h @@ -28,6 +28,7 @@ extern void rtnl_basic_set_ematch(struct rtnl_cls *, extern struct rtnl_ematch_tree *rtnl_basic_get_ematch(struct rtnl_cls *); extern int rtnl_basic_add_action(struct rtnl_cls *, struct rtnl_act *); extern int rtnl_basic_del_action(struct rtnl_cls *, struct rtnl_act *); +extern struct rtnl_act* rtnl_basic_get_action(struct rtnl_cls *); #ifdef __cplusplus } diff --git a/include/netlink/route/cls/u32.h b/include/netlink/route/cls/u32.h index 7475443e3..2443f513a 100644 --- a/include/netlink/route/cls/u32.h +++ b/include/netlink/route/cls/u32.h @@ -50,6 +50,7 @@ extern int rtnl_u32_add_key_in6_addr(struct rtnl_cls *, const struct in6_addr *, uint8_t, int, int); extern int rtnl_u32_add_action(struct rtnl_cls *, struct rtnl_act *); extern int rtnl_u32_del_action(struct rtnl_cls *, struct rtnl_act *); +extern struct rtnl_act* rtnl_u32_get_action(struct rtnl_cls *); #ifdef __cplusplus } diff --git a/lib/route/act.c b/lib/route/act.c index e429e00a3..836219d64 100644 --- a/lib/route/act.c +++ b/lib/route/act.c @@ -27,6 +27,15 @@ static struct nl_object_ops act_obj_ops; static struct nl_cache_ops rtnl_act_ops; +struct rtnl_act * rtnl_act_next(struct rtnl_act *act) +{ + if (act == NULL) { + return NULL; + } + + return act->a_next; +} + int rtnl_act_append(struct rtnl_act **head, struct rtnl_act *new) { struct rtnl_act *p_act; diff --git a/lib/route/cls/basic.c b/lib/route/cls/basic.c index 6af3844b7..d330a19d1 100644 --- a/lib/route/cls/basic.c +++ b/lib/route/cls/basic.c @@ -233,6 +233,21 @@ int rtnl_basic_add_action(struct rtnl_cls *cls, struct rtnl_act *act) return rtnl_act_append(&b->b_act, act); } +struct rtnl_act* rtnl_basic_get_action(struct rtnl_cls *cls) +{ + struct rtnl_basic *b; + + if (!(b = rtnl_tc_data_peek(TC_CAST(cls)))) + return NULL; + + if (!(b->b_mask & BASIC_ATTR_ACTION)) + return NULL; + + struct rtnl_act* act = b->b_act; + rtnl_act_get(act); + return act; +} + int rtnl_basic_del_action(struct rtnl_cls *cls, struct rtnl_act *act) { struct rtnl_basic *b; diff --git a/lib/route/cls/u32.c b/lib/route/cls/u32.c index e8561c19a..a6047b4cf 100644 --- a/lib/route/cls/u32.c +++ b/lib/route/cls/u32.c @@ -560,6 +560,21 @@ int rtnl_u32_add_action(struct rtnl_cls *cls, struct rtnl_act *act) return rtnl_act_append(&u->cu_act, act); } +struct rtnl_act* rtnl_u32_get_action(struct rtnl_cls *cls) +{ + struct rtnl_u32 *u; + + if (!(u = rtnl_tc_data_peek(TC_CAST(cls)))) + return NULL; + + if (!(u->cu_mask & U32_ATTR_ACTION)) + return NULL; + + struct rtnl_act* act = u->cu_act; + rtnl_act_get(act); + return act; +} + int rtnl_u32_del_action(struct rtnl_cls *cls, struct rtnl_act *act) { struct rtnl_u32 *u; diff --git a/libnl-route-3.sym b/libnl-route-3.sym index 21441857f..9edfec798 100644 --- a/libnl-route-3.sym +++ b/libnl-route-3.sym @@ -82,6 +82,7 @@ global: rtnl_act_parse; rtnl_act_put; rtnl_act_put_all; + rtnl_act_next; rtnl_act_remove; rtnl_addr_add; rtnl_addr_alloc; @@ -126,6 +127,7 @@ global: rtnl_addr_unset_flags; rtnl_basic_add_action; rtnl_basic_del_action; + rtnl_basic_get_action; rtnl_basic_get_ematch; rtnl_basic_get_target; rtnl_basic_set_ematch; @@ -822,6 +824,7 @@ global: rtnl_u32_add_key_uint16; rtnl_u32_add_key_uint32; rtnl_u32_add_key_uint8; + rtnl_u32_get_action; rtnl_u32_del_action; rtnl_u32_get_key; rtnl_u32_set_classid; From a20a49fa5411aa98318a1a1313f3d993b1bceb54 Mon Sep 17 00:00:00 2001 From: Santhosh Kumar Date: Tue, 21 Mar 2017 10:38:36 -0700 Subject: [PATCH 2/3] Do not increment refcount in rtnl_*_get_action APIs. --- lib/route/cls/basic.c | 4 +--- lib/route/cls/u32.c | 4 +--- libnl-route-3.sym | 2 +- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/lib/route/cls/basic.c b/lib/route/cls/basic.c index d330a19d1..912ded6ea 100644 --- a/lib/route/cls/basic.c +++ b/lib/route/cls/basic.c @@ -243,9 +243,7 @@ struct rtnl_act* rtnl_basic_get_action(struct rtnl_cls *cls) if (!(b->b_mask & BASIC_ATTR_ACTION)) return NULL; - struct rtnl_act* act = b->b_act; - rtnl_act_get(act); - return act; + return b->b_act; } int rtnl_basic_del_action(struct rtnl_cls *cls, struct rtnl_act *act) diff --git a/lib/route/cls/u32.c b/lib/route/cls/u32.c index a6047b4cf..087797e88 100644 --- a/lib/route/cls/u32.c +++ b/lib/route/cls/u32.c @@ -570,9 +570,7 @@ struct rtnl_act* rtnl_u32_get_action(struct rtnl_cls *cls) if (!(u->cu_mask & U32_ATTR_ACTION)) return NULL; - struct rtnl_act* act = u->cu_act; - rtnl_act_get(act); - return act; + return u->cu_act; } int rtnl_u32_del_action(struct rtnl_cls *cls, struct rtnl_act *act) diff --git a/libnl-route-3.sym b/libnl-route-3.sym index 9edfec798..4d937ca2f 100644 --- a/libnl-route-3.sym +++ b/libnl-route-3.sym @@ -824,8 +824,8 @@ global: rtnl_u32_add_key_uint16; rtnl_u32_add_key_uint32; rtnl_u32_add_key_uint8; - rtnl_u32_get_action; rtnl_u32_del_action; + rtnl_u32_get_action; rtnl_u32_get_key; rtnl_u32_set_classid; rtnl_u32_set_cls_terminal; From eb481fb22c7a71b12ef627fe17d39390d406d364 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 3 May 2017 13:00:49 +0200 Subject: [PATCH 3/3] route: fix symbol versioning Once released, an existing symbol version must not be modified. Move the new symbols to the right section. --- libnl-route-3.sym | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libnl-route-3.sym b/libnl-route-3.sym index 4d937ca2f..1fb4371cb 100644 --- a/libnl-route-3.sym +++ b/libnl-route-3.sym @@ -82,7 +82,6 @@ global: rtnl_act_parse; rtnl_act_put; rtnl_act_put_all; - rtnl_act_next; rtnl_act_remove; rtnl_addr_add; rtnl_addr_alloc; @@ -127,7 +126,6 @@ global: rtnl_addr_unset_flags; rtnl_basic_add_action; rtnl_basic_del_action; - rtnl_basic_get_action; rtnl_basic_get_ematch; rtnl_basic_get_target; rtnl_basic_set_ematch; @@ -825,7 +823,6 @@ global: rtnl_u32_add_key_uint32; rtnl_u32_add_key_uint8; rtnl_u32_del_action; - rtnl_u32_get_action; rtnl_u32_get_key; rtnl_u32_set_classid; rtnl_u32_set_cls_terminal; @@ -1037,8 +1034,11 @@ global: libnl_3_4 { global: + rtnl_act_next; + rtnl_basic_get_action; rtnl_link_inet6_flags2str; rtnl_link_inet6_str2flags; rtnl_link_inet6_get_flags; rtnl_link_inet6_set_flags; + rtnl_u32_get_action; } libnl_3_2_29;