]> granicus.if.org Git - libnl/commitdiff
u32: add support for hashing
authorAdrian Ban <adrian.ban@mantech.ro>
Tue, 8 May 2012 21:14:13 +0000 (23:14 +0200)
committerThomas Graf <tgraf@redhat.com>
Tue, 8 May 2012 21:14:13 +0000 (23:14 +0200)
include/netlink/route/cls/u32.h
lib/route/cls/u32.c

index cf35e266636b6665406a4c3f9a54dccc4d3d7229..62c538670215f980c3e799262bd1ea457e24720d 100644 (file)
@@ -21,6 +21,10 @@ extern "C" {
 
 extern void    rtnl_u32_set_handle(struct rtnl_cls *, int, int, int);
 extern int     rtnl_u32_set_classid(struct rtnl_cls *, uint32_t);
+extern int     rtnl_u32_set_divisor(struct rtnl_cls *, uint32_t);
+extern int     rtnl_u32_set_link(struct rtnl_cls *, uint32_t);
+extern int     rtnl_u32_set_hashmask(struct rtnl_cls *, uint32_t, uint32_t);
+extern int     rtnl_u32_set_cls_terminal(struct rtnl_cls *);
 
 extern int     rtnl_u32_set_flags(struct rtnl_cls *, int);
 extern int     rtnl_u32_add_key(struct rtnl_cls *, uint32_t, uint32_t,
index 201646077fce9aa17b8d4ceae485428e8fe4c7d9..331e714eef114bf36a310859aa6b44628db8c412 100644 (file)
@@ -374,6 +374,91 @@ int rtnl_u32_set_classid(struct rtnl_cls *cls, uint32_t classid)
        return 0;
 }
 
+int rtnl_u32_set_divisor(struct rtnl_cls *cls, uint32_t divisor)
+{
+       struct rtnl_u32 *u;
+
+       if (!(u = (struct rtnl_u32 *) rtnl_tc_data(TC_CAST(cls))))
+               return -NLE_NOMEM;
+
+       u->cu_divisor = divisor;
+       u->cu_mask |= U32_ATTR_DIVISOR;
+       return 0;
+}
+
+int rtnl_u32_set_link(struct rtnl_cls *cls, uint32_t link)
+{
+       struct rtnl_u32 *u;
+
+       if (!(u = (struct rtnl_u32 *) rtnl_tc_data(TC_CAST(cls))))
+               return -NLE_NOMEM;
+
+       u->cu_link = link;
+       u->cu_mask |= U32_ATTR_LINK;
+       return 0;
+}
+
+int rtnl_u32_set_hashtable(struct rtnl_cls *cls, uint32_t ht)
+{
+       struct rtnl_u32 *u;
+
+       if (!(u = (struct rtnl_u32 *) rtnl_tc_data(TC_CAST(cls))))
+               return -NLE_NOMEM;
+
+       u->cu_hash = ht;
+       u->cu_mask |= U32_ATTR_HASH;
+       return 0;
+}
+
+int rtnl_u32_set_hashmask(struct rtnl_cls *cls, uint32_t hashmask, uint32_t offset)
+{
+       struct rtnl_u32 *u;
+       struct tc_u32_sel *sel;
+       int err;
+
+       hashmask = htonl(hashmask);
+
+       if (!(u = (struct rtnl_u32 *) rtnl_tc_data(TC_CAST(cls))))
+               return -NLE_NOMEM;
+
+       sel = u32_selector_alloc(u);
+       if (!sel)
+               return -NLE_NOMEM;
+
+       err = nl_data_append(u->cu_selector, NULL, sizeof(struct tc_u32_key));
+       if(err < 0)
+               return err;
+
+       sel = u32_selector(u);
+
+       sel->hmask = hashmask;
+       sel->hoff = offset;
+       return 0;
+}
+
+int rtnl_u32_set_cls_terminal(struct rtnl_cls *cls)
+{
+       struct rtnl_u32 *u;
+       struct tc_u32_sel *sel;
+       int err;
+
+       if (!(u = (struct rtnl_u32 *) rtnl_tc_data(TC_CAST(cls))))
+               return -NLE_NOMEM;
+
+       sel = u32_selector_alloc(u);
+       if (!sel)
+               return -NLE_NOMEM;
+
+       err = nl_data_append(u->cu_selector, NULL, sizeof(struct tc_u32_key));
+       if(err < 0)
+               return err;
+
+       sel = u32_selector(u);
+
+       sel->flags |= TC_U32_TERMINAL;
+       return 0;
+}
+
 /** @} */
 
 /**