Skip to content

Commit 43eca05

Browse files
Cosmin Ratiuklassert
authored andcommitted
xfrm: Add explicit dev to .xdo_dev_state_{add,delete,free}
Previously, device driver IPSec offload implementations would fall into two categories: 1. Those that used xso.dev to determine the offload device. 2. Those that used xso.real_dev to determine the offload device. The first category didn't work with bonding while the second did. In a non-bonding setup the two pointers are the same. This commit adds explicit pointers for the offload netdevice to .xdo_dev_state_add() / .xdo_dev_state_delete() / .xdo_dev_state_free() which eliminates the confusion and allows drivers from the first category to work with bonding. xso.real_dev now becomes a private pointer managed by the bonding driver. Signed-off-by: Cosmin Ratiu <[email protected]> Reviewed-by: Leon Romanovsky <[email protected]> Reviewed-by: Nikolay Aleksandrov <[email protected]> Signed-off-by: Steffen Klassert <[email protected]>
1 parent d53dda2 commit 43eca05

File tree

14 files changed

+136
-99
lines changed

14 files changed

+136
-99
lines changed

Documentation/networking/xfrm_device.rst

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,13 @@ Callbacks to implement
6565
/* from include/linux/netdevice.h */
6666
struct xfrmdev_ops {
6767
/* Crypto and Packet offload callbacks */
68-
int (*xdo_dev_state_add) (struct xfrm_state *x, struct netlink_ext_ack *extack);
69-
void (*xdo_dev_state_delete) (struct xfrm_state *x);
70-
void (*xdo_dev_state_free) (struct xfrm_state *x);
68+
int (*xdo_dev_state_add)(struct net_device *dev,
69+
struct xfrm_state *x,
70+
struct netlink_ext_ack *extack);
71+
void (*xdo_dev_state_delete)(struct net_device *dev,
72+
struct xfrm_state *x);
73+
void (*xdo_dev_state_free)(struct net_device *dev,
74+
struct xfrm_state *x);
7175
bool (*xdo_dev_offload_ok) (struct sk_buff *skb,
7276
struct xfrm_state *x);
7377
void (*xdo_dev_state_advance_esn) (struct xfrm_state *x);

drivers/net/bonding/bond_main.c

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -453,13 +453,14 @@ static struct net_device *bond_ipsec_dev(struct xfrm_state *xs)
453453

454454
/**
455455
* bond_ipsec_add_sa - program device with a security association
456+
* @bond_dev: pointer to the bond net device
456457
* @xs: pointer to transformer state struct
457458
* @extack: extack point to fill failure reason
458459
**/
459-
static int bond_ipsec_add_sa(struct xfrm_state *xs,
460+
static int bond_ipsec_add_sa(struct net_device *bond_dev,
461+
struct xfrm_state *xs,
460462
struct netlink_ext_ack *extack)
461463
{
462-
struct net_device *bond_dev = xs->xso.dev;
463464
struct net_device *real_dev;
464465
netdevice_tracker tracker;
465466
struct bond_ipsec *ipsec;
@@ -496,7 +497,7 @@ static int bond_ipsec_add_sa(struct xfrm_state *xs,
496497
}
497498

498499
xs->xso.real_dev = real_dev;
499-
err = real_dev->xfrmdev_ops->xdo_dev_state_add(xs, extack);
500+
err = real_dev->xfrmdev_ops->xdo_dev_state_add(real_dev, xs, extack);
500501
if (!err) {
501502
ipsec->xs = xs;
502503
INIT_LIST_HEAD(&ipsec->list);
@@ -540,7 +541,8 @@ static void bond_ipsec_add_sa_all(struct bonding *bond)
540541
continue;
541542

542543
ipsec->xs->xso.real_dev = real_dev;
543-
if (real_dev->xfrmdev_ops->xdo_dev_state_add(ipsec->xs, NULL)) {
544+
if (real_dev->xfrmdev_ops->xdo_dev_state_add(real_dev,
545+
ipsec->xs, NULL)) {
544546
slave_warn(bond_dev, real_dev, "%s: failed to add SA\n", __func__);
545547
ipsec->xs->xso.real_dev = NULL;
546548
}
@@ -551,11 +553,12 @@ static void bond_ipsec_add_sa_all(struct bonding *bond)
551553

552554
/**
553555
* bond_ipsec_del_sa - clear out this specific SA
556+
* @bond_dev: pointer to the bond net device
554557
* @xs: pointer to transformer state struct
555558
**/
556-
static void bond_ipsec_del_sa(struct xfrm_state *xs)
559+
static void bond_ipsec_del_sa(struct net_device *bond_dev,
560+
struct xfrm_state *xs)
557561
{
558-
struct net_device *bond_dev = xs->xso.dev;
559562
struct net_device *real_dev;
560563
netdevice_tracker tracker;
561564
struct bond_ipsec *ipsec;
@@ -587,7 +590,7 @@ static void bond_ipsec_del_sa(struct xfrm_state *xs)
587590
goto out;
588591
}
589592

590-
real_dev->xfrmdev_ops->xdo_dev_state_delete(xs);
593+
real_dev->xfrmdev_ops->xdo_dev_state_delete(real_dev, xs);
591594
out:
592595
netdev_put(real_dev, &tracker);
593596
mutex_lock(&bond->ipsec_lock);
@@ -624,18 +627,20 @@ static void bond_ipsec_del_sa_all(struct bonding *bond)
624627
slave_warn(bond_dev, real_dev,
625628
"%s: no slave xdo_dev_state_delete\n",
626629
__func__);
627-
} else {
628-
real_dev->xfrmdev_ops->xdo_dev_state_delete(ipsec->xs);
629-
if (real_dev->xfrmdev_ops->xdo_dev_state_free)
630-
real_dev->xfrmdev_ops->xdo_dev_state_free(ipsec->xs);
630+
continue;
631631
}
632+
real_dev->xfrmdev_ops->xdo_dev_state_delete(real_dev,
633+
ipsec->xs);
634+
if (real_dev->xfrmdev_ops->xdo_dev_state_free)
635+
real_dev->xfrmdev_ops->xdo_dev_state_free(real_dev,
636+
ipsec->xs);
632637
}
633638
mutex_unlock(&bond->ipsec_lock);
634639
}
635640

636-
static void bond_ipsec_free_sa(struct xfrm_state *xs)
641+
static void bond_ipsec_free_sa(struct net_device *bond_dev,
642+
struct xfrm_state *xs)
637643
{
638-
struct net_device *bond_dev = xs->xso.dev;
639644
struct net_device *real_dev;
640645
netdevice_tracker tracker;
641646
struct bonding *bond;
@@ -661,7 +666,7 @@ static void bond_ipsec_free_sa(struct xfrm_state *xs)
661666

662667
if (real_dev && real_dev->xfrmdev_ops &&
663668
real_dev->xfrmdev_ops->xdo_dev_state_free)
664-
real_dev->xfrmdev_ops->xdo_dev_state_free(xs);
669+
real_dev->xfrmdev_ops->xdo_dev_state_free(real_dev, xs);
665670
out:
666671
netdev_put(real_dev, &tracker);
667672
}

drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6480,10 +6480,11 @@ static const struct tlsdev_ops cxgb4_ktls_ops = {
64806480

64816481
#if IS_ENABLED(CONFIG_CHELSIO_IPSEC_INLINE)
64826482

6483-
static int cxgb4_xfrm_add_state(struct xfrm_state *x,
6483+
static int cxgb4_xfrm_add_state(struct net_device *dev,
6484+
struct xfrm_state *x,
64846485
struct netlink_ext_ack *extack)
64856486
{
6486-
struct adapter *adap = netdev2adap(x->xso.dev);
6487+
struct adapter *adap = netdev2adap(dev);
64876488
int ret;
64886489

64896490
if (!mutex_trylock(&uld_mutex)) {
@@ -6494,17 +6495,18 @@ static int cxgb4_xfrm_add_state(struct xfrm_state *x,
64946495
if (ret)
64956496
goto out_unlock;
64966497

6497-
ret = adap->uld[CXGB4_ULD_IPSEC].xfrmdev_ops->xdo_dev_state_add(x, extack);
6498+
ret = adap->uld[CXGB4_ULD_IPSEC].xfrmdev_ops->xdo_dev_state_add(dev, x,
6499+
extack);
64986500

64996501
out_unlock:
65006502
mutex_unlock(&uld_mutex);
65016503

65026504
return ret;
65036505
}
65046506

6505-
static void cxgb4_xfrm_del_state(struct xfrm_state *x)
6507+
static void cxgb4_xfrm_del_state(struct net_device *dev, struct xfrm_state *x)
65066508
{
6507-
struct adapter *adap = netdev2adap(x->xso.dev);
6509+
struct adapter *adap = netdev2adap(dev);
65086510

65096511
if (!mutex_trylock(&uld_mutex)) {
65106512
dev_dbg(adap->pdev_dev,
@@ -6514,15 +6516,15 @@ static void cxgb4_xfrm_del_state(struct xfrm_state *x)
65146516
if (chcr_offload_state(adap, CXGB4_XFRMDEV_OPS))
65156517
goto out_unlock;
65166518

6517-
adap->uld[CXGB4_ULD_IPSEC].xfrmdev_ops->xdo_dev_state_delete(x);
6519+
adap->uld[CXGB4_ULD_IPSEC].xfrmdev_ops->xdo_dev_state_delete(dev, x);
65186520

65196521
out_unlock:
65206522
mutex_unlock(&uld_mutex);
65216523
}
65226524

6523-
static void cxgb4_xfrm_free_state(struct xfrm_state *x)
6525+
static void cxgb4_xfrm_free_state(struct net_device *dev, struct xfrm_state *x)
65246526
{
6525-
struct adapter *adap = netdev2adap(x->xso.dev);
6527+
struct adapter *adap = netdev2adap(dev);
65266528

65276529
if (!mutex_trylock(&uld_mutex)) {
65286530
dev_dbg(adap->pdev_dev,
@@ -6532,7 +6534,7 @@ static void cxgb4_xfrm_free_state(struct xfrm_state *x)
65326534
if (chcr_offload_state(adap, CXGB4_XFRMDEV_OPS))
65336535
goto out_unlock;
65346536

6535-
adap->uld[CXGB4_ULD_IPSEC].xfrmdev_ops->xdo_dev_state_free(x);
6537+
adap->uld[CXGB4_ULD_IPSEC].xfrmdev_ops->xdo_dev_state_free(dev, x);
65366538

65376539
out_unlock:
65386540
mutex_unlock(&uld_mutex);

drivers/net/ethernet/chelsio/inline_crypto/ch_ipsec/chcr_ipsec.c

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,12 @@ static int ch_ipsec_uld_state_change(void *handle, enum cxgb4_state new_state);
7575
static int ch_ipsec_xmit(struct sk_buff *skb, struct net_device *dev);
7676
static void *ch_ipsec_uld_add(const struct cxgb4_lld_info *infop);
7777
static void ch_ipsec_advance_esn_state(struct xfrm_state *x);
78-
static void ch_ipsec_xfrm_free_state(struct xfrm_state *x);
79-
static void ch_ipsec_xfrm_del_state(struct xfrm_state *x);
80-
static int ch_ipsec_xfrm_add_state(struct xfrm_state *x,
78+
static void ch_ipsec_xfrm_free_state(struct net_device *dev,
79+
struct xfrm_state *x);
80+
static void ch_ipsec_xfrm_del_state(struct net_device *dev,
81+
struct xfrm_state *x);
82+
static int ch_ipsec_xfrm_add_state(struct net_device *dev,
83+
struct xfrm_state *x,
8184
struct netlink_ext_ack *extack);
8285

8386
static const struct xfrmdev_ops ch_ipsec_xfrmdev_ops = {
@@ -223,7 +226,8 @@ static int ch_ipsec_setkey(struct xfrm_state *x,
223226
* returns 0 on success, negative error if failed to send message to FPGA
224227
* positive error if FPGA returned a bad response
225228
*/
226-
static int ch_ipsec_xfrm_add_state(struct xfrm_state *x,
229+
static int ch_ipsec_xfrm_add_state(struct net_device *dev,
230+
struct xfrm_state *x,
227231
struct netlink_ext_ack *extack)
228232
{
229233
struct ipsec_sa_entry *sa_entry;
@@ -302,14 +306,16 @@ static int ch_ipsec_xfrm_add_state(struct xfrm_state *x,
302306
return res;
303307
}
304308

305-
static void ch_ipsec_xfrm_del_state(struct xfrm_state *x)
309+
static void ch_ipsec_xfrm_del_state(struct net_device *dev,
310+
struct xfrm_state *x)
306311
{
307312
/* do nothing */
308313
if (!x->xso.offload_handle)
309314
return;
310315
}
311316

312-
static void ch_ipsec_xfrm_free_state(struct xfrm_state *x)
317+
static void ch_ipsec_xfrm_free_state(struct net_device *dev,
318+
struct xfrm_state *x)
313319
{
314320
struct ipsec_sa_entry *sa_entry;
315321

drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
#define IXGBE_IPSEC_KEY_BITS 160
1010
static const char aes_gcm_name[] = "rfc4106(gcm(aes))";
1111

12-
static void ixgbe_ipsec_del_sa(struct xfrm_state *xs);
12+
static void ixgbe_ipsec_del_sa(struct net_device *dev, struct xfrm_state *xs);
1313

1414
/**
1515
* ixgbe_ipsec_set_tx_sa - set the Tx SA registers
@@ -321,7 +321,7 @@ void ixgbe_ipsec_restore(struct ixgbe_adapter *adapter)
321321

322322
if (r->used) {
323323
if (r->mode & IXGBE_RXTXMOD_VF)
324-
ixgbe_ipsec_del_sa(r->xs);
324+
ixgbe_ipsec_del_sa(adapter->netdev, r->xs);
325325
else
326326
ixgbe_ipsec_set_rx_sa(hw, i, r->xs->id.spi,
327327
r->key, r->salt,
@@ -330,7 +330,7 @@ void ixgbe_ipsec_restore(struct ixgbe_adapter *adapter)
330330

331331
if (t->used) {
332332
if (t->mode & IXGBE_RXTXMOD_VF)
333-
ixgbe_ipsec_del_sa(t->xs);
333+
ixgbe_ipsec_del_sa(adapter->netdev, t->xs);
334334
else
335335
ixgbe_ipsec_set_tx_sa(hw, i, t->key, t->salt);
336336
}
@@ -417,17 +417,18 @@ static struct xfrm_state *ixgbe_ipsec_find_rx_state(struct ixgbe_ipsec *ipsec,
417417

418418
/**
419419
* ixgbe_ipsec_parse_proto_keys - find the key and salt based on the protocol
420+
* @dev: pointer to net device
420421
* @xs: pointer to xfrm_state struct
421422
* @mykey: pointer to key array to populate
422423
* @mysalt: pointer to salt value to populate
423424
*
424425
* This copies the protocol keys and salt to our own data tables. The
425426
* 82599 family only supports the one algorithm.
426427
**/
427-
static int ixgbe_ipsec_parse_proto_keys(struct xfrm_state *xs,
428+
static int ixgbe_ipsec_parse_proto_keys(struct net_device *dev,
429+
struct xfrm_state *xs,
428430
u32 *mykey, u32 *mysalt)
429431
{
430-
struct net_device *dev = xs->xso.real_dev;
431432
unsigned char *key_data;
432433
char *alg_name = NULL;
433434
int key_len;
@@ -473,11 +474,12 @@ static int ixgbe_ipsec_parse_proto_keys(struct xfrm_state *xs,
473474

474475
/**
475476
* ixgbe_ipsec_check_mgmt_ip - make sure there is no clash with mgmt IP filters
477+
* @dev: pointer to net device
476478
* @xs: pointer to transformer state struct
477479
**/
478-
static int ixgbe_ipsec_check_mgmt_ip(struct xfrm_state *xs)
480+
static int ixgbe_ipsec_check_mgmt_ip(struct net_device *dev,
481+
struct xfrm_state *xs)
479482
{
480-
struct net_device *dev = xs->xso.real_dev;
481483
struct ixgbe_adapter *adapter = netdev_priv(dev);
482484
struct ixgbe_hw *hw = &adapter->hw;
483485
u32 mfval, manc, reg;
@@ -556,13 +558,14 @@ static int ixgbe_ipsec_check_mgmt_ip(struct xfrm_state *xs)
556558

557559
/**
558560
* ixgbe_ipsec_add_sa - program device with a security association
561+
* @dev: pointer to device to program
559562
* @xs: pointer to transformer state struct
560563
* @extack: extack point to fill failure reason
561564
**/
562-
static int ixgbe_ipsec_add_sa(struct xfrm_state *xs,
565+
static int ixgbe_ipsec_add_sa(struct net_device *dev,
566+
struct xfrm_state *xs,
563567
struct netlink_ext_ack *extack)
564568
{
565-
struct net_device *dev = xs->xso.real_dev;
566569
struct ixgbe_adapter *adapter = netdev_priv(dev);
567570
struct ixgbe_ipsec *ipsec = adapter->ipsec;
568571
struct ixgbe_hw *hw = &adapter->hw;
@@ -581,7 +584,7 @@ static int ixgbe_ipsec_add_sa(struct xfrm_state *xs,
581584
return -EINVAL;
582585
}
583586

584-
if (ixgbe_ipsec_check_mgmt_ip(xs)) {
587+
if (ixgbe_ipsec_check_mgmt_ip(dev, xs)) {
585588
NL_SET_ERR_MSG_MOD(extack, "IPsec IP addr clash with mgmt filters");
586589
return -EINVAL;
587590
}
@@ -615,7 +618,7 @@ static int ixgbe_ipsec_add_sa(struct xfrm_state *xs,
615618
rsa.decrypt = xs->ealg || xs->aead;
616619

617620
/* get the key and salt */
618-
ret = ixgbe_ipsec_parse_proto_keys(xs, rsa.key, &rsa.salt);
621+
ret = ixgbe_ipsec_parse_proto_keys(dev, xs, rsa.key, &rsa.salt);
619622
if (ret) {
620623
NL_SET_ERR_MSG_MOD(extack, "Failed to get key data for Rx SA table");
621624
return ret;
@@ -724,7 +727,7 @@ static int ixgbe_ipsec_add_sa(struct xfrm_state *xs,
724727
if (xs->id.proto & IPPROTO_ESP)
725728
tsa.encrypt = xs->ealg || xs->aead;
726729

727-
ret = ixgbe_ipsec_parse_proto_keys(xs, tsa.key, &tsa.salt);
730+
ret = ixgbe_ipsec_parse_proto_keys(dev, xs, tsa.key, &tsa.salt);
728731
if (ret) {
729732
NL_SET_ERR_MSG_MOD(extack, "Failed to get key data for Tx SA table");
730733
memset(&tsa, 0, sizeof(tsa));
@@ -752,11 +755,11 @@ static int ixgbe_ipsec_add_sa(struct xfrm_state *xs,
752755

753756
/**
754757
* ixgbe_ipsec_del_sa - clear out this specific SA
758+
* @dev: pointer to device to program
755759
* @xs: pointer to transformer state struct
756760
**/
757-
static void ixgbe_ipsec_del_sa(struct xfrm_state *xs)
761+
static void ixgbe_ipsec_del_sa(struct net_device *dev, struct xfrm_state *xs)
758762
{
759-
struct net_device *dev = xs->xso.real_dev;
760763
struct ixgbe_adapter *adapter = netdev_priv(dev);
761764
struct ixgbe_ipsec *ipsec = adapter->ipsec;
762765
struct ixgbe_hw *hw = &adapter->hw;
@@ -841,7 +844,8 @@ void ixgbe_ipsec_vf_clear(struct ixgbe_adapter *adapter, u32 vf)
841844
continue;
842845
if (ipsec->rx_tbl[i].mode & IXGBE_RXTXMOD_VF &&
843846
ipsec->rx_tbl[i].vf == vf)
844-
ixgbe_ipsec_del_sa(ipsec->rx_tbl[i].xs);
847+
ixgbe_ipsec_del_sa(adapter->netdev,
848+
ipsec->rx_tbl[i].xs);
845849
}
846850

847851
/* search tx sa table */
@@ -850,7 +854,8 @@ void ixgbe_ipsec_vf_clear(struct ixgbe_adapter *adapter, u32 vf)
850854
continue;
851855
if (ipsec->tx_tbl[i].mode & IXGBE_RXTXMOD_VF &&
852856
ipsec->tx_tbl[i].vf == vf)
853-
ixgbe_ipsec_del_sa(ipsec->tx_tbl[i].xs);
857+
ixgbe_ipsec_del_sa(adapter->netdev,
858+
ipsec->tx_tbl[i].xs);
854859
}
855860
}
856861

@@ -930,7 +935,7 @@ int ixgbe_ipsec_vf_add_sa(struct ixgbe_adapter *adapter, u32 *msgbuf, u32 vf)
930935
memcpy(xs->aead->alg_name, aes_gcm_name, sizeof(aes_gcm_name));
931936

932937
/* set up the HW offload */
933-
err = ixgbe_ipsec_add_sa(xs, NULL);
938+
err = ixgbe_ipsec_add_sa(adapter->netdev, xs, NULL);
934939
if (err)
935940
goto err_aead;
936941

@@ -1034,7 +1039,7 @@ int ixgbe_ipsec_vf_del_sa(struct ixgbe_adapter *adapter, u32 *msgbuf, u32 vf)
10341039
xs = ipsec->tx_tbl[sa_idx].xs;
10351040
}
10361041

1037-
ixgbe_ipsec_del_sa(xs);
1042+
ixgbe_ipsec_del_sa(adapter->netdev, xs);
10381043

10391044
/* remove the xs that was made-up in the add request */
10401045
kfree_sensitive(xs);

0 commit comments

Comments
 (0)