]> granicus.if.org Git - libnl/commitdiff
link: Support link grouping
authorThomas Graf <tgraf@redhat.com>
Tue, 9 Oct 2012 19:55:31 +0000 (21:55 +0200)
committerThomas Graf <tgraf@redhat.com>
Tue, 9 Oct 2012 19:55:31 +0000 (21:55 +0200)
New functions:
  rtnl_link_set_group(link, group)
  rtnl_link_get_group(link)

The group identifier is printed in the brief section as "group N"

Signed-off-by: Thomas Graf <tgraf@redhat.com>
doc/route.txt
include/netlink-types.h
include/netlink/route/link.h
lib/route/link.c

index a01f6d9de5359446e7b668fc2cbfe296508e09ac..e47c6d324855e2c0796228f397f30b71945d9e16 100644 (file)
@@ -365,6 +365,20 @@ void rtnl_link_set_ifindex(struct rtnl_link *link, int ifindex);
 int rtnl_link_get_ifindex(struct rtnl_link *link);
 -----
 
+[[link_attr_group]]
+==== Group
+Each link can be assigned a numeric group identifier to group a bunch of links
+together and apply a set of changes to a group instead of just a single link.
+
+
+[source,c]
+-----
+#include <netlink/route/link.h>
+
+void rtnl_link_set_group(struct rtnl_link *link, uint32_t group);
+uint32_t rtnl_link_get_group(struct rtnl_link *link);
+-----
+
 [[link_attr_address]]
 ==== Link Layer Address
 The link layer address (e.g. MAC address).
index 345486f35b990c404b4f0455a83b5270d02bd2b9..10ef2182cb58b3be8a8434ade55a49521243c006 100644 (file)
@@ -176,6 +176,7 @@ struct rtnl_link
        uint32_t                        l_promiscuity;
        uint32_t                        l_num_tx_queues;
        uint32_t                        l_num_rx_queues;
+       uint32_t                        l_group;
 };
 
 struct rtnl_ncacheinfo
index 518bab5509a49a5908b5978eeaf4ead02d0a5a93..8268b13560b6ba33b98bd704815d9f9b2beeae25 100644 (file)
@@ -148,6 +148,9 @@ extern char *       rtnl_link_get_qdisc(struct rtnl_link *);
 extern void    rtnl_link_set_name(struct rtnl_link *, const char *);
 extern char *  rtnl_link_get_name(struct rtnl_link *);
 
+extern void    rtnl_link_set_group(struct rtnl_link *, uint32_t);
+extern uint32_t        rtnl_link_get_group(struct rtnl_link *);
+
 extern void    rtnl_link_set_flags(struct rtnl_link *, unsigned int);
 extern void    rtnl_link_unset_flags(struct rtnl_link *, unsigned int);
 extern unsigned int rtnl_link_get_flags(struct rtnl_link *);
index ff2b000f2dc501d153e2cee94e13571238f2d117..3f9d9dc54d6364a13fbe876f1c7982050a2d7c85 100644 (file)
@@ -52,6 +52,7 @@
 #define LINK_ATTR_PROMISCUITY  (1 << 21)
 #define LINK_ATTR_NUM_TX_QUEUES        (1 << 22)
 #define LINK_ATTR_NUM_RX_QUEUES        (1 << 23)
+#define LINK_ATTR_GROUP                (1 << 24)
 
 static struct nl_cache_ops rtnl_link_ops;
 static struct nl_object_ops link_obj_ops;
@@ -260,6 +261,7 @@ static struct nla_policy link_policy[IFLA_MAX+1] = {
        [IFLA_PROMISCUITY]      = { .type = NLA_U32 },
        [IFLA_NUM_TX_QUEUES]    = { .type = NLA_U32 },
        [IFLA_NUM_RX_QUEUES]    = { .type = NLA_U32 },
+       [IFLA_GROUP]            = { .type = NLA_U32 },
 };
 
 static struct nla_policy link_info_policy[IFLA_INFO_MAX+1] = {
@@ -554,7 +556,12 @@ static int link_msg_parser(struct nl_cache_ops *ops, struct sockaddr_nl *who,
        if (tb[IFLA_NUM_RX_QUEUES]) {
                link->l_num_rx_queues = nla_get_u32(tb[IFLA_NUM_RX_QUEUES]);
                link->ce_mask |= LINK_ATTR_NUM_RX_QUEUES;
-       };
+       }
+
+       if (tb[IFLA_GROUP]) {
+               link->l_group = nla_get_u32(tb[IFLA_GROUP]);
+               link->ce_mask |= LINK_ATTR_GROUP;
+       }
 
        err = pp->pp_cb((struct nl_object *) link, pp);
 errout:
@@ -613,6 +620,9 @@ static void link_dump_line(struct nl_object *obj, struct nl_dump_params *p)
                        rtnl_link_put(ll);
        }
 
+       if (link->ce_mask & LINK_ATTR_GROUP)
+               nl_dump(p, "group %u ", link->l_group);
+
        if (link->l_info_ops && link->l_info_ops->io_dump[NL_DUMP_LINE])
                link->l_info_ops->io_dump[NL_DUMP_LINE](link, p);
 
@@ -816,6 +826,7 @@ static int link_compare(struct nl_object *_a, struct nl_object *_b,
        diff |= LINK_DIFF(PROMISCUITY,  a->l_promiscuity != b->l_promiscuity);
        diff |= LINK_DIFF(NUM_TX_QUEUES,a->l_num_tx_queues != b->l_num_tx_queues);
        diff |= LINK_DIFF(NUM_RX_QUEUES,a->l_num_rx_queues != b->l_num_rx_queues);
+       diff |= LINK_DIFF(GROUP,        a->l_group != b->l_group);
 
        if (flags & LOOSE_COMPARISON)
                diff |= LINK_DIFF(FLAGS,
@@ -852,6 +863,7 @@ static const struct trans_tbl link_attrs[] = {
        __ADD(LINK_ATTR_PROMISCUITY, promiscuity)
        __ADD(LINK_ATTR_NUM_TX_QUEUES, num_tx_queues)
        __ADD(LINK_ATTR_NUM_RX_QUEUES, num_rx_queues)
+       __ADD(LINK_ATTR_GROUP, group)
 };
 
 static char *link_attrs2str(int attrs, char *buf, size_t len)
@@ -1170,6 +1182,9 @@ static int build_link_msg(int cmd, struct ifinfomsg *hdr,
        if (link->ce_mask & LINK_ATTR_NUM_RX_QUEUES)
                NLA_PUT_U32(msg, IFLA_NUM_RX_QUEUES, link->l_num_rx_queues);
 
+       if (link->ce_mask & LINK_ATTR_GROUP)
+               NLA_PUT_U32(msg, IFLA_GROUP, link->l_group);
+
        if (link->ce_mask & LINK_ATTR_LINKINFO) {
                struct nlattr *info;
 
@@ -1523,6 +1538,28 @@ char *rtnl_link_get_name(struct rtnl_link *link)
        return link->ce_mask & LINK_ATTR_IFNAME ? link->l_name : NULL;
 }
 
+/**
+ * Set the group identifier of a link object
+ * @arg link           Link object
+ * @arg group          Group identifier
+ */
+void rtnl_link_set_group(struct rtnl_link *link, uint32_t group)
+{
+       link->l_group = group;
+       link->ce_mask |= LINK_ATTR_GROUP;
+}
+
+/**
+ * Return the group identifier of link object
+ * @arg link           Link object
+ *
+ * @return Group identifier or 0 if not set.
+ */
+uint32_t rtnl_link_get_group(struct rtnl_link *link)
+{
+       return link->l_group;
+}
+
 static inline void __assign_addr(struct rtnl_link *link, struct nl_addr **pos,
                                 struct nl_addr *new, int flag)
 {