From e04a0c71667a751ad3236a3c722608c0824e2192 Mon Sep 17 00:00:00 2001 From: Przemyslaw Czarnota Date: Mon, 7 Oct 2019 15:06:26 +0200 Subject: act: add cookie parameter --- include/netlink-private/types.h | 4 +++ include/netlink/route/action.h | 2 ++ lib/route/act.c | 43 +++++++++++++++++++++++++++++++++ libnl-route-3.sym | 2 ++ 4 files changed, 51 insertions(+) --- a/include/netlink-private/types.h +++ b/include/netlink-private/types.h @@ -570,9 +570,13 @@ struct rtnl_cls uint16_t c_protocol; }; +#define TC_COOKIE_MAX_SIZE 16 + struct rtnl_act { NL_TC_GENERIC(c); + unsigned char cookie[TC_COOKIE_MAX_SIZE]; + uint8_t is_cookie_set; struct rtnl_act * a_next; }; --- a/include/netlink/route/action.h +++ b/include/netlink/route/action.h @@ -41,6 +41,8 @@ extern int rtnl_act_remove(struct rtnl_ extern int rtnl_act_fill(struct nl_msg *, int, struct rtnl_act *); extern void rtnl_act_put_all(struct rtnl_act **); extern int rtnl_act_parse(struct rtnl_act **, struct nlattr *); +extern int rtnl_act_set_cookie(struct rtnl_act *, const unsigned char *, unsigned int); +extern int rtnl_act_get_cookie(struct rtnl_act *, unsigned char *, unsigned int); #ifdef __cplusplus } #endif --- a/lib/route/act.c +++ b/lib/route/act.c @@ -90,6 +90,9 @@ static int rtnl_act_fill_one(struct nl_m if (tc->ce_mask & TCA_ATTR_KIND) NLA_PUT_STRING(msg, TCA_ACT_KIND, tc->tc_kind); + if (act->is_cookie_set) + NLA_PUT(msg, TCA_ACT_COOKIE, sizeof(act->cookie), act->cookie); + ops = rtnl_tc_get_ops(tc); if (ops && (ops->to_msg_fill || ops->to_msg_fill_raw)) { struct nlattr *opts; @@ -393,6 +396,33 @@ void rtnl_act_put_all(struct rtnl_act ** *head = NULL; } +int rtnl_act_set_cookie(struct rtnl_act *act, const unsigned char *cookie, + unsigned int size) +{ + if (size > TC_COOKIE_MAX_SIZE) + return -NLE_ATTRSIZE; + + act->is_cookie_set = 1; + + memcpy(act->cookie, cookie, size); + + return 0; +} + +int rtnl_act_get_cookie(struct rtnl_act *act, unsigned char *cookie, + unsigned int size) +{ + if (size > TC_COOKIE_MAX_SIZE) + return -NLE_ATTRSIZE; + + if (!act->is_cookie_set) + return -NLE_MISSING_ATTR; + + memcpy(cookie, act->cookie, size); + + return 0; +} + int rtnl_act_parse(struct rtnl_act **head, struct nlattr *tb) { struct rtnl_act *act; @@ -400,6 +430,8 @@ int rtnl_act_parse(struct rtnl_act **hea struct nlattr *tb2[TCA_ACT_MAX + 1]; struct nlattr *nla[TCA_ACT_MAX_PRIO + 1]; char kind[TCKINDSIZ]; + unsigned char cookie[TC_COOKIE_MAX_SIZE]; + unsigned int cklen; int err, i; err = nla_parse(nla, TCA_ACT_MAX_PRIO, nla_data(tb), @@ -441,6 +473,17 @@ int rtnl_act_parse(struct rtnl_act **hea tc->ce_mask |= TCA_ATTR_OPTS; } + if (tb2[TCA_ACT_COOKIE]) { + cklen = nla_len(tb2[TCA_ACT_COOKIE]); + nla_memcpy(cookie, tb2[TCA_ACT_COOKIE], sizeof(cookie)); + + err = rtnl_act_set_cookie(act, cookie, cklen); + if (err) + goto err_free; + + act->is_cookie_set = 1; + } + ops = rtnl_tc_get_ops(tc); if (ops && ops->to_msg_parser) { void *data = rtnl_tc_data(tc); --- a/libnl-route-3.sym +++ b/libnl-route-3.sym @@ -83,6 +83,8 @@ global: rtnl_act_put; rtnl_act_put_all; rtnl_act_remove; + rtnl_act_set_cookie; + rtnl_act_get_cookie; rtnl_addr_add; rtnl_addr_alloc; rtnl_addr_alloc_cache;