ixgbe: register ipsec offload with the xfrm subsystem
authorShannon Nelson <shannon.nelson@oracle.com>
Wed, 20 Dec 2017 00:00:02 +0000 (16:00 -0800)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Tue, 23 Jan 2018 18:09:12 +0000 (10:09 -0800)
With all the support code in place we can now link in the ipsec
offload operations and set the ESP feature flag for the XFRM
subsystem to see.

Signed-off-by: Shannon Nelson <shannon.nelson@oracle.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c

index c25b0bb2c4e628911b4c466b456c0f7dbeffdc8e..93eacddb6704d4ebc7ed8b55dc2121adda7b5e31 100644 (file)
@@ -718,10 +718,23 @@ static bool ixgbe_ipsec_offload_ok(struct sk_buff *skb, struct xfrm_state *xs)
        return true;
 }
 
+/**
+ * ixgbe_ipsec_free - called by xfrm garbage collections
+ * @xs: pointer to transformer state struct
+ *
+ * We don't have any garbage to collect, so we shouldn't bother
+ * implementing this function, but the XFRM code doesn't check for
+ * existence before calling the API callback.
+ **/
+static void ixgbe_ipsec_free(struct xfrm_state *xs)
+{
+}
+
 static const struct xfrmdev_ops ixgbe_xfrmdev_ops = {
        .xdo_dev_state_add = ixgbe_ipsec_add_sa,
        .xdo_dev_state_delete = ixgbe_ipsec_del_sa,
        .xdo_dev_offload_ok = ixgbe_ipsec_offload_ok,
+       .xdo_dev_state_free = ixgbe_ipsec_free,
 };
 
 /**
@@ -895,6 +908,10 @@ void ixgbe_init_ipsec_offload(struct ixgbe_adapter *adapter)
        ixgbe_ipsec_stop_engine(adapter);
        ixgbe_ipsec_clear_hw_tables(adapter);
 
+       adapter->netdev->xfrmdev_ops = &ixgbe_xfrmdev_ops;
+       adapter->netdev->features |= NETIF_F_HW_ESP;
+       adapter->netdev->hw_enc_features |= NETIF_F_HW_ESP;
+
        return;
 
 err2:
index 58b36ce35b28aa68310e88e5d84cc23b0205babf..722cc3153a99baf286f9c1840d66591239b08885 100644 (file)
@@ -9895,6 +9895,12 @@ ixgbe_features_check(struct sk_buff *skb, struct net_device *dev,
        if (skb->encapsulation && !(features & NETIF_F_TSO_MANGLEID))
                features &= ~NETIF_F_TSO;
 
+#ifdef CONFIG_XFRM_OFFLOAD
+       /* IPsec offload doesn't get along well with others *yet* */
+       if (skb->sp)
+               features &= ~(NETIF_F_TSO | NETIF_F_HW_CSUM);
+#endif
+
        return features;
 }