]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
Add VF link state control
authorRony Efraim <ronye@mellanox.com>
Thu, 13 Jun 2013 10:19:12 +0000 (13:19 +0300)
committerStephen Hemminger <stephen@networkplumber.org>
Thu, 20 Jun 2013 01:14:39 +0000 (18:14 -0700)
Add link state per VF command

Signed-off-by: Rony Efraim <ronye@mellanox.com>
Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
ip/ipaddress.c
ip/iplink.c

index 5b9a438545147a09fd816adfeaeda82b107d932f..d2524e89dd32b0db087ebdfb4a69f63fdf537450 100644 (file)
@@ -229,6 +229,7 @@ static void print_vfinfo(FILE *fp, struct rtattr *vfinfo)
        struct ifla_vf_vlan *vf_vlan;
        struct ifla_vf_tx_rate *vf_tx_rate;
        struct ifla_vf_spoofchk *vf_spoofchk;
+       struct ifla_vf_link_state *vf_linkstate;
        struct rtattr *vf[IFLA_VF_MAX+1];
        struct rtattr *tmp;
        SPRINT_BUF(b1);
@@ -255,6 +256,20 @@ static void print_vfinfo(FILE *fp, struct rtattr *vfinfo)
        else
                vf_spoofchk = RTA_DATA(vf[IFLA_VF_SPOOFCHK]);
 
+       if (vf_spoofchk) {
+               /* Check if the link state vf info type is supported by
+                * this kernel.
+                */
+               tmp = (struct rtattr *)((char *)vf[IFLA_VF_SPOOFCHK] +
+                               vf[IFLA_VF_SPOOFCHK]->rta_len);
+
+               if (tmp->rta_type != IFLA_VF_LINK_STATE)
+                       vf_linkstate = NULL;
+               else
+                       vf_linkstate = RTA_DATA(vf[IFLA_VF_LINK_STATE]);
+       } else
+               vf_linkstate = NULL;
+
        fprintf(fp, "\n    vf %d MAC %s", vf_mac->vf,
                ll_addr_n2a((unsigned char *)&vf_mac->mac,
                ETH_ALEN, 0, b1, sizeof(b1)));
@@ -270,6 +285,14 @@ static void print_vfinfo(FILE *fp, struct rtattr *vfinfo)
                else
                        fprintf(fp, ", spoof checking off");
        }
+       if (vf_linkstate) {
+               if (vf_linkstate->link_state == IFLA_VF_LINK_STATE_AUTO)
+                       fprintf(fp, ", link-state auto");
+               else if (vf_linkstate->link_state == IFLA_VF_LINK_STATE_ENABLE)
+                       fprintf(fp, ", link-state enable");
+               else
+                       fprintf(fp, ", link-state disable");
+       }
 }
 
 static void print_link_stats64(FILE *fp, const struct rtnl_link_stats64 *s) {
index dc9801954ded1e64169a954ea0c8dde6795a622f..ada9d4255ba2c2544b694ee573750e0d6e5bdea3 100644 (file)
@@ -77,6 +77,7 @@ void iplink_usage(void)
        fprintf(stderr, "                                  [ rate TXRATE ] ] \n");
 
        fprintf(stderr, "                                  [ spoofchk { on | off} ] ] \n");
+       fprintf(stderr, "                                  [ state { auto | enable | disable} ] ]\n");
        fprintf(stderr, "                         [ master DEVICE ]\n");
        fprintf(stderr, "                         [ nomaster ]\n");
        fprintf(stderr, "       ip link show [ DEVICE | group GROUP ] [up]\n");
@@ -255,6 +256,19 @@ static int iplink_parse_vf(int vf, int *argcp, char ***argvp,
                        ivs.vf = vf;
                        addattr_l(&req->n, sizeof(*req), IFLA_VF_SPOOFCHK, &ivs, sizeof(ivs));
 
+               } else if (matches(*argv, "state") == 0) {
+                       struct ifla_vf_link_state ivl;
+                       NEXT_ARG();
+                       if (matches(*argv, "auto") == 0)
+                               ivl.link_state = IFLA_VF_LINK_STATE_AUTO;
+                       else if (matches(*argv, "enable") == 0)
+                               ivl.link_state = IFLA_VF_LINK_STATE_ENABLE;
+                       else if (matches(*argv, "disable") == 0)
+                               ivl.link_state = IFLA_VF_LINK_STATE_DISABLE;
+                       else
+                               invarg("Invalid \"state\" value\n", *argv);
+                       ivl.vf = vf;
+                       addattr_l(&req->n, sizeof(*req), IFLA_VF_LINK_STATE, &ivl, sizeof(ivl));
                } else {
                        /* rewind arg */
                        PREV_ARG();