Introduce routine to calculate size of the common tc netlink attributes,
and another helper routine to get the full message size including netlink
header and service header.

Signed-off-by: Roman Mashak <m...@mojatatu.com>
---
 net/sched/act_api.c | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/net/sched/act_api.c b/net/sched/act_api.c
index 1f65d6a..acac92a 100644
--- a/net/sched/act_api.c
+++ b/net/sched/act_api.c
@@ -109,6 +109,33 @@ int __tcf_idr_release(struct tc_action *p, bool bind, bool 
strict)
 }
 EXPORT_SYMBOL(__tcf_idr_release);
 
+static size_t tcf_action_shared_attrs_size(const struct tc_action *act)
+{
+       u32 cookie_len = 0;
+
+       if (act->act_cookie)
+               cookie_len = nla_total_size(act->act_cookie->len);
+
+       return  nla_total_size(0) /* action number nested */
+               + nla_total_size(IFNAMSIZ) /* TCA_ACT_KIND */
+               + cookie_len /* TCA_ACT_COOKIE */
+               + nla_total_size(0) /* TCA_ACT_STATS nested */
+               /* TCA_STATS_BASIC */
+               + nla_total_size_64bit(sizeof(struct gnet_stats_basic))
+               /* TCA_STATS_QUEUE */
+               + nla_total_size_64bit(sizeof(struct gnet_stats_queue))
+               + nla_total_size(0) /* TCA_OPTIONS nested */
+               + nla_total_size(sizeof(struct tcf_t)); /* TCA_GACT_TM */
+}
+
+static size_t tcf_action_full_attrs_size(size_t sz)
+{
+       return NLMSG_HDRLEN                     /* struct nlmsghdr */
+               + sizeof(struct tcamsg)
+               + nla_total_size(0)             /* TCA_ACT_TAB nested */
+               + sz;
+}
+
 static int tcf_dump_walker(struct tcf_idrinfo *idrinfo, struct sk_buff *skb,
                           struct netlink_callback *cb)
 {
-- 
2.7.4

Reply via email to