]> git.proxmox.com Git - mirror_iproute2.git/commitdiff
iproute2: Add new command to ip link to enable/disable VF spoof check
authorGreg Rose <gregory.v.rose@intel.com>
Thu, 13 Oct 2011 20:31:32 +0000 (20:31 +0000)
committerStephen Hemminger <shemminger@vyatta.com>
Wed, 23 Nov 2011 22:53:12 +0000 (14:53 -0800)
Add ip link command parsing for VF spoof checking enable/disable

V2 - Fixed problem with parsing of dump info on kernels that don't
     support the spoof checking option and also wrapped the ifla_vf_info
     structure in #ifdef __KERNEL__ to prevent user space from directly
     accessing the structure
V3 - Improved parsing of vfinfo
V4 - Put Makefile back to proper list of subdirs
V5 - Remove struct ifla_vf_info, it is only used by the kernel
V6 - Make sure spoof check is reported by the driver - rtnl will set
     it to -1 to indicate driver didn't report a value.

Signed-off-by: Greg Rose <gregory.v.rose@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
ip/ipaddress.c
ip/iplink.c
man/man8/ip.8

index 85f05a248ce503e7d83dad24032418c65d28ac07..2f2cabdffcf38b591aac5d235d37127706ec0b1e 100644 (file)
@@ -197,7 +197,9 @@ static void print_vfinfo(FILE *fp, struct rtattr *vfinfo)
        struct ifla_vf_mac *vf_mac;
        struct ifla_vf_vlan *vf_vlan;
        struct ifla_vf_tx_rate *vf_tx_rate;
+       struct ifla_vf_spoofchk *vf_spoofchk;
        struct rtattr *vf[IFLA_VF_MAX+1];
+       struct rtattr *tmp;
        SPRINT_BUF(b1);
 
        if (vfinfo->rta_type != IFLA_VF_INFO) {
@@ -211,6 +213,17 @@ static void print_vfinfo(FILE *fp, struct rtattr *vfinfo)
        vf_vlan = RTA_DATA(vf[IFLA_VF_VLAN]);
        vf_tx_rate = RTA_DATA(vf[IFLA_VF_TX_RATE]);
 
+       /* Check if the spoof checking vf info type is supported by
+        * this kernel.
+        */
+       tmp = (struct rtattr *)((char *)vf[IFLA_VF_TX_RATE] +
+                       vf[IFLA_VF_TX_RATE]->rta_len);
+
+       if (tmp->rta_type != IFLA_VF_SPOOFCHK)
+               vf_spoofchk = NULL;
+       else
+               vf_spoofchk = RTA_DATA(vf[IFLA_VF_SPOOFCHK]);
+
        fprintf(fp, "\n    vf %d MAC %s", vf_mac->vf,
                ll_addr_n2a((unsigned char *)&vf_mac->mac,
                ETH_ALEN, 0, b1, sizeof(b1)));
@@ -220,6 +233,12 @@ static void print_vfinfo(FILE *fp, struct rtattr *vfinfo)
                fprintf(fp, ", qos %d", vf_vlan->qos);
        if (vf_tx_rate->rate)
                fprintf(fp, ", tx rate %d (Mbps)", vf_tx_rate->rate);
+       if (vf_spoofchk && vf_spoofchk->setting != -1) {
+               if (vf_spoofchk->setting)
+                       fprintf(fp, ", spoof checking on");
+               else
+                       fprintf(fp, ", spoof checking off");
+       }
 }
 
 int print_linkinfo(const struct sockaddr_nl *who,
index 35e6dc6fb98ac0dbb7682ce31f7ee85a8a2b2934..ca1aaebeeb427e72560c13b5a58b4bfc402a88dc 100644 (file)
@@ -71,7 +71,10 @@ void iplink_usage(void)
        fprintf(stderr, "                         [ alias NAME ]\n");
        fprintf(stderr, "                         [ vf NUM [ mac LLADDR ]\n");
        fprintf(stderr, "                                  [ vlan VLANID [ qos VLAN-QOS ] ]\n");
+
        fprintf(stderr, "                                  [ rate TXRATE ] ] \n");
+
+       fprintf(stderr, "                                  [ spoofchk { on | off} ] ] \n");
        fprintf(stderr, "                         [ master DEVICE ]\n");
        fprintf(stderr, "                         [ nomaster ]\n");
        fprintf(stderr, "       ip link show [ DEVICE | group GROUP ]\n");
@@ -228,6 +231,18 @@ int iplink_parse_vf(int vf, int *argcp, char ***argvp,
                        ivt.vf = vf;
                        addattr_l(&req->n, sizeof(*req), IFLA_VF_TX_RATE, &ivt, sizeof(ivt));
                
+               } else if (matches(*argv, "spoofchk") == 0) {
+                       struct ifla_vf_spoofchk ivs;
+                       NEXT_ARG();
+                       if (matches(*argv, "on") == 0)
+                               ivs.setting = 1;
+                       else if (matches(*argv, "off") == 0)
+                               ivs.setting = 0;
+                       else
+                               invarg("Invalid \"spoofchk\" value\n", *argv);
+                       ivs.vf = vf;
+                       addattr_l(&req->n, sizeof(*req), IFLA_VF_SPOOFCHK, &ivs, sizeof(ivs));
+
                } else {
                        /* rewind arg */
                        PREV_ARG();
index 36431b6dc14b552e0a3a4aa23a9785e3715437c7..a20eca7b43a26f8d4de3915709b937088bd873da 100644 (file)
@@ -100,7 +100,9 @@ ip \- show / manipulate routing, devices, policy routing and tunnels
 .B qos
 .IR VLAN-QOS " ] ] ["
 .B rate
-.IR TXRATE " ] |"
+.IR TXRATE " ] ["
+.B spoofchk { on | off }
+] |
 .br
 .B master
 .IR DEVICE