]> granicus.if.org Git - libnl/commitdiff
lib/route: set IFLA_PROTINFO attribute in request message
authorJef Oliver <jef.oliver@intel.com>
Sat, 27 Aug 2016 02:19:50 +0000 (19:19 -0700)
committerThomas Haller <thaller@redhat.com>
Mon, 29 Aug 2016 11:09:37 +0000 (13:09 +0200)
This patch adds the functionality to set IFLA_PROTINFO in a
request. This allows for appending protocol specific information
to a request message.

This patch adds ao_fill_pi to the rtnl_link_af_ops structure. This
registers a function to fill the IFLA_PROTINFO attribute. This
function follows the makeup of ao_fill_af.

This patch adds ao_fill_pi_flags to the rtnl_link_af_ops
structure. This registers an extra flag that can be bitmasked
onto the IFLA_PROTINFO definition. This is useful for address
families that require NLA_F_NESTED.

This patch adds a function named af_fill_pi, which is called by
build_link_msg. This function calls the registered function
pointers for an address family to fill IFLA_PROTINFO and to
bitmask any extra flags.

Signed-off-by: Jef Oliver <jef.oliver@intel.com>
Signed-off-by: Thomas Haller <thaller@redhat.com>
include/netlink-private/route/link/api.h
lib/route/link.c

index 1cda72e614f5a8d490f570d73b08b84a29cef4bf..2767f6393476fc2bc1ecf418bba33562c6e0cb67 100644 (file)
@@ -154,6 +154,19 @@ struct rtnl_link_af_ops
         * RTM_SETLINK when rtnl_link_build_change_request() is called.
         */
        const int ao_override_rtm;
+
+       /** Called if a link message is sent to the kernel. Must append the
+        * link protocol specific attributes to the message. (IFLA_PROTINFO) */
+       int                   (*ao_fill_pi)(struct rtnl_link *,
+                                                               struct nl_msg *msg, void *);
+
+       /** PROTINFO type
+        *
+        * Called if a link message is sent to the kernel. If this is set,
+        * the default IFLA_PROTINFO is bitmasked with what is specified
+        * here. (eg. NLA_F_NESTED)
+        */
+       const int ao_fill_pi_flags;
 };
 
 extern struct rtnl_link_af_ops *rtnl_link_af_ops_lookup(unsigned int);
index 7b687e96d28d7e499ce8dd9ff5855e5cd292f5de..c24760385e903e616b7b8d6434ba0ea009c2f6bb 100644 (file)
@@ -152,6 +152,30 @@ static int af_fill(struct rtnl_link *link, struct rtnl_link_af_ops *ops,
        return 0;
 }
 
+static int af_fill_pi(struct rtnl_link *link, struct rtnl_link_af_ops *ops,
+                  void *data, void *arg)
+{
+       struct nl_msg *msg = arg;
+       struct nlattr *pi_attr;
+       int err, pi_type = IFLA_PROTINFO;
+
+       if (!ops->ao_fill_pi)
+               return 0;
+
+       if (ops->ao_fill_pi_flags > 0)
+               pi_type |= ops->ao_fill_pi_flags;
+
+       if (!(pi_attr = nla_nest_start(msg, pi_type)))
+               return -NLE_MSGSIZE;
+
+       if ((err = ops->ao_fill_pi(link, arg, data)) < 0)
+               return err;
+
+       nla_nest_end(msg, pi_attr);
+
+       return 0;
+}
+
 static int af_dump_line(struct rtnl_link *link, struct rtnl_link_af_ops *ops,
                         void *data, void *arg)
 {
@@ -1481,6 +1505,9 @@ static int build_link_msg(int cmd, struct ifinfomsg *hdr,
                nla_nest_end(msg, info);
        }
 
+       if (do_foreach_af(link, af_fill_pi, msg) < 0)
+               goto nla_put_failure;
+
        if (!(af_spec = nla_nest_start(msg, IFLA_AF_SPEC)))
                goto nla_put_failure;