i40e: Do not enable broadcast promiscuous by default
authorGreg Rose <gregory.v.rose@intel.com>
Thu, 28 Nov 2013 06:42:39 +0000 (06:42 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Wed, 8 Jan 2014 05:49:18 +0000 (21:49 -0800)
Broadcast promiscuous should only be turned on when general
promiscuous mode is turned on, otherwise VLAN tagged packets out of
the assigned VLAN domain are received.

Add a broadcast MAC filter in order to continue to receive
broadcast traffic on VLANs, MAIN or VMDQ VSI.

Change-Id: I99d8e382a082ee51201228f1226af3b46452ac55
Signed-off-by: Greg Rose <gregory.v.rose@intel.com>
Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
Tested-by: Sibai Li <sibai.li@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/i40e/i40e_main.c
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c

index 483126c..5ddbd54 100644 (file)
@@ -1650,6 +1650,13 @@ int i40e_sync_vsi_filters(struct i40e_vsi *vsi)
                        dev_info(&pf->pdev->dev,
                                 "set uni promisc failed, err %d, aq_err %d\n",
                                 aq_ret, pf->hw.aq.asq_last_status);
+               aq_ret = i40e_aq_set_vsi_broadcast(&vsi->back->hw,
+                                                  vsi->seid,
+                                                  cur_promisc, NULL);
+               if (aq_ret)
+                       dev_info(&pf->pdev->dev,
+                                "set brdcast promisc failed, err %d, aq_err %d\n",
+                                aq_ret, pf->hw.aq.asq_last_status);
        }
 
        clear_bit(__I40E_CONFIG_BUSY, &vsi->state);
@@ -3987,13 +3994,6 @@ static int i40e_open(struct net_device *netdev)
        if (err)
                goto err_up_complete;
 
-       if ((vsi->type == I40E_VSI_MAIN) || (vsi->type == I40E_VSI_VMDQ2)) {
-               err = i40e_aq_set_vsi_broadcast(&pf->hw, vsi->seid, true, NULL);
-               if (err)
-                       netdev_info(netdev,
-                                   "couldn't set broadcast err %d aq_err %d\n",
-                                   err, pf->hw.aq.asq_last_status);
-       }
 #ifdef CONFIG_I40E_VXLAN
        vxlan_get_rx_port(netdev);
 #endif
@@ -6067,6 +6067,7 @@ static const struct net_device_ops i40e_netdev_ops = {
  **/
 static int i40e_config_netdev(struct i40e_vsi *vsi)
 {
+       u8 brdcast[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
        struct i40e_pf *pf = vsi->back;
        struct i40e_hw *hw = &pf->hw;
        struct i40e_netdev_priv *np;
@@ -6116,6 +6117,7 @@ static int i40e_config_netdev(struct i40e_vsi *vsi)
                random_ether_addr(mac_addr);
                i40e_add_filter(vsi, mac_addr, I40E_VLAN_ANY, false, false);
        }
+       i40e_add_filter(vsi, brdcast, I40E_VLAN_ANY, false, false);
 
        memcpy(netdev->dev_addr, mac_addr, ETH_ALEN);
        memcpy(netdev->perm_addr, mac_addr, ETH_ALEN);
index 55ec2db..fee368a 100644 (file)
@@ -369,7 +369,6 @@ static int i40e_alloc_vsi_res(struct i40e_vf *vf, enum i40e_vsi_type type)
 {
        struct i40e_mac_filter *f = NULL;
        struct i40e_pf *pf = vf->pf;
-       struct i40e_hw *hw = &pf->hw;
        struct i40e_vsi *vsi;
        int ret = 0;
 
@@ -383,6 +382,7 @@ static int i40e_alloc_vsi_res(struct i40e_vf *vf, enum i40e_vsi_type type)
                goto error_alloc_vsi_res;
        }
        if (type == I40E_VSI_SRIOV) {
+               u8 brdcast[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
                vf->lan_vsi_index = vsi->idx;
                vf->lan_vsi_id = vsi->id;
                dev_info(&pf->pdev->dev,
@@ -398,6 +398,14 @@ static int i40e_alloc_vsi_res(struct i40e_vf *vf, enum i40e_vsi_type type)
                        i40e_vsi_add_pvid(vsi, vf->port_vlan_id);
                f = i40e_add_filter(vsi, vf->default_lan_addr.addr,
                                    vf->port_vlan_id, true, false);
+               if (!f)
+                       dev_info(&pf->pdev->dev,
+                                "Could not allocate VF MAC addr\n");
+               f = i40e_add_filter(vsi, brdcast, vf->port_vlan_id,
+                                   true, false);
+               if (!f)
+                       dev_info(&pf->pdev->dev,
+                                "Could not allocate VF broadcast filter\n");
        }
 
        if (!f) {
@@ -413,15 +421,6 @@ static int i40e_alloc_vsi_res(struct i40e_vf *vf, enum i40e_vsi_type type)
                goto error_alloc_vsi_res;
        }
 
-       /* accept bcast pkts. by default */
-       ret = i40e_aq_set_vsi_broadcast(hw, vsi->seid, true, NULL);
-       if (ret) {
-               dev_err(&pf->pdev->dev,
-                       "set vsi bcast failed for vf %d, vsi %d, aq_err %d\n",
-                       vf->vf_id, vsi->idx, pf->hw.aq.asq_last_status);
-               ret = -EINVAL;
-       }
-
 error_alloc_vsi_res:
        return ret;
 }