]> git.proxmox.com Git - mirror_iproute2.git/commitdiff
introduce support for slave info data
authorJiri Pirko <jiri@resnulli.us>
Thu, 23 Jan 2014 16:52:53 +0000 (17:52 +0100)
committerStephen Hemminger <stephen@networkplumber.org>
Mon, 17 Feb 2014 18:53:33 +0000 (10:53 -0800)
Signed-off-by: Jiri Pirko <jiri@resnulli.us>
ip/ip_common.h
ip/ipaddress.c
ip/iplink.c

index f9b47343494194eb0d2ed2b33d7b87b58f571852..698dc7aa611497ae5141f5f1d49e2fd0f1caec70 100644 (file)
@@ -61,6 +61,8 @@ static inline int rtm_get_table(struct rtmsg *r, struct rtattr **tb)
 
 extern struct rtnl_handle rth;
 
+#include <stdbool.h>
+
 struct link_util
 {
        struct link_util        *next;
@@ -72,9 +74,11 @@ struct link_util
                                             struct rtattr *[]);
        void                    (*print_xstats)(struct link_util *, FILE *,
                                             struct rtattr *);
+       bool                    slave;
 };
 
 struct link_util *get_link_kind(const char *kind);
+struct link_util *get_link_slave_kind(const char *slave_kind);
 int get_netns_fd(const char *name);
 
 #ifndef        INFINITY_LIFE_TIME
index f794fa13d96274938994ed1fede7785166e0b006..33698ae74c0401f90a4721d62ae7edf0804f3baa 100644 (file)
@@ -192,34 +192,52 @@ static void print_linktype(FILE *fp, struct rtattr *tb)
 {
        struct rtattr *linkinfo[IFLA_INFO_MAX+1];
        struct link_util *lu;
+       struct link_util *slave_lu;
        char *kind;
+       char *slave_kind;
 
        parse_rtattr_nested(linkinfo, IFLA_INFO_MAX, tb);
 
-       if (!linkinfo[IFLA_INFO_KIND])
-               return;
-       kind = RTA_DATA(linkinfo[IFLA_INFO_KIND]);
+       if (linkinfo[IFLA_INFO_KIND]) {
+               kind = RTA_DATA(linkinfo[IFLA_INFO_KIND]);
 
-       fprintf(fp, "%s", _SL_);
-       fprintf(fp, "    %s ", kind);
+               fprintf(fp, "%s", _SL_);
+               fprintf(fp, "    %s ", kind);
 
-       lu = get_link_kind(kind);
-       if (!lu || !lu->print_opt)
-               return;
+               lu = get_link_kind(kind);
+               if (lu && lu->print_opt) {
+                       struct rtattr *attr[lu->maxattr+1], **data = NULL;
 
-       if (1) {
-               struct rtattr *attr[lu->maxattr+1], **data = NULL;
+                       if (linkinfo[IFLA_INFO_DATA]) {
+                               parse_rtattr_nested(attr, lu->maxattr,
+                                                   linkinfo[IFLA_INFO_DATA]);
+                               data = attr;
+                       }
+                       lu->print_opt(lu, fp, data);
 
-               if (linkinfo[IFLA_INFO_DATA]) {
-                       parse_rtattr_nested(attr, lu->maxattr,
-                                           linkinfo[IFLA_INFO_DATA]);
-                       data = attr;
+                       if (linkinfo[IFLA_INFO_XSTATS] && show_stats &&
+                           lu->print_xstats)
+                               lu->print_xstats(lu, fp, linkinfo[IFLA_INFO_XSTATS]);
                }
-               lu->print_opt(lu, fp, data);
+       }
 
-               if (linkinfo[IFLA_INFO_XSTATS] && show_stats &&
-                   lu->print_xstats)
-                       lu->print_xstats(lu, fp, linkinfo[IFLA_INFO_XSTATS]);
+       if (linkinfo[IFLA_INFO_SLAVE_KIND]) {
+               slave_kind = RTA_DATA(linkinfo[IFLA_INFO_SLAVE_KIND]);
+
+               fprintf(fp, "%s", _SL_);
+               fprintf(fp, "    %s_slave ", slave_kind);
+
+               slave_lu = get_link_slave_kind(slave_kind);
+               if (slave_lu && slave_lu->print_opt) {
+                       struct rtattr *attr[slave_lu->maxattr+1], **data = NULL;
+
+                       if (linkinfo[IFLA_INFO_SLAVE_DATA]) {
+                               parse_rtattr_nested(attr, slave_lu->maxattr,
+                                                   linkinfo[IFLA_INFO_SLAVE_DATA]);
+                               data = attr;
+                       }
+                       slave_lu->print_opt(slave_lu, fp, data);
+               }
        }
 }
 
index 343b29f92bf6cc15856afc9e35151dc25c72e9db..6a62cc0477b489580011fb75e6244d359907b3c0 100644 (file)
@@ -27,6 +27,7 @@
 #include <string.h>
 #include <sys/ioctl.h>
 #include <linux/sockios.h>
+#include <stdbool.h>
 
 #include "rt_names.h"
 #include "utils.h"
@@ -105,14 +106,15 @@ static int on_off(const char *msg, const char *realval)
 static void *BODY;             /* cached dlopen(NULL) handle */
 static struct link_util *linkutil_list;
 
-struct link_util *get_link_kind(const char *id)
+static struct link_util *__get_link_kind(const char *id, bool slave)
 {
        void *dlh;
        char buf[256];
        struct link_util *l;
 
        for (l = linkutil_list; l; l = l->next)
-               if (strcmp(l->id, id) == 0)
+               if (strcmp(l->id, id) == 0 &&
+                   l->slave == slave)
                        return l;
 
        snprintf(buf, sizeof(buf), LIBDIR "/ip/link_%s.so", id);
@@ -127,7 +129,10 @@ struct link_util *get_link_kind(const char *id)
                }
        }
 
-       snprintf(buf, sizeof(buf), "%s_link_util", id);
+       if (slave)
+               snprintf(buf, sizeof(buf), "%s_slave_link_util", id);
+       else
+               snprintf(buf, sizeof(buf), "%s_link_util", id);
        l = dlsym(dlh, buf);
        if (l == NULL)
                return NULL;
@@ -137,6 +142,16 @@ struct link_util *get_link_kind(const char *id)
        return l;
 }
 
+struct link_util *get_link_kind(const char *id)
+{
+       return __get_link_kind(id, false);
+}
+
+struct link_util *get_link_slave_kind(const char *id)
+{
+       return __get_link_kind(id, true);
+}
+
 static int get_link_mode(const char *mode)
 {
        if (strcasecmp(mode, "default") == 0)