Lines Matching defs:macsec
3 * drivers/net/macsec.c - MACsec device
20 #include <net/macsec.h>
326 static bool macsec_is_offloaded(struct macsec_dev *macsec)
328 if (macsec->offload == MACSEC_OFFLOAD_MAC ||
329 macsec->offload == MACSEC_OFFLOAD_PHY)
337 struct macsec_dev *macsec)
339 if (!macsec || !macsec->real_dev)
343 return macsec->real_dev->phydev &&
344 macsec->real_dev->phydev->macsec_ops;
346 return macsec->real_dev->features & NETIF_F_HW_MACSEC &&
347 macsec->real_dev->macsec_ops;
353 struct macsec_dev *macsec,
361 ctx->phydev = macsec->real_dev->phydev;
363 ctx->netdev = macsec->real_dev;
367 return macsec->real_dev->phydev->macsec_ops;
369 return macsec->real_dev->macsec_ops;
375 static const struct macsec_ops *macsec_get_ops(struct macsec_dev *macsec,
378 if (!macsec_check_offload(macsec->offload, macsec))
381 return __macsec_get_ops(macsec->offload, macsec, ctx);
484 struct macsec_dev *macsec = netdev_priv(dev);
486 skb->dev = macsec->real_dev;
493 struct macsec_dev *macsec = macsec_priv(skb->dev);
494 struct macsec_secy *secy = &macsec->secy;
529 struct macsec_dev *macsec = macsec_priv(dev);
536 macsec_count_tx(skb, &macsec->secy.tx_sc, macsec_skb_cb(skb)->tx_sa);
592 struct macsec_dev *macsec = macsec_priv(dev);
596 secy = &macsec->secy;
647 struct pcpu_secy_stats *secy_stats = this_cpu_ptr(macsec->stats);
831 struct macsec_dev *macsec = macsec_priv(dev);
844 if (!macsec_post_decrypt(skb, &macsec->secy, pn)) {
850 macsec_finalize_skb(skb, macsec->secy.icv_len,
853 macsec_reset_skb(skb, macsec->secy.netdev);
855 if (gro_cells_receive(&macsec->gro_cells, skb) == NET_RX_SUCCESS)
923 /* confidentiality: ethernet + macsec header
998 struct macsec_dev *macsec;
1004 list_for_each_entry_rcu(macsec, &rxd->secys, secys) {
1006 struct pcpu_secy_stats *secy_stats = this_cpu_ptr(macsec->stats);
1007 struct net_device *ndev = macsec->secy.netdev;
1012 if (macsec_is_offloaded(macsec) && netif_running(ndev)) {
1016 rx_sc = find_rx_sc(&macsec->secy, md_dst->u.macsec_info.sci);
1057 if (macsec->secy.validate_frames == MACSEC_VALIDATE_STRICT) {
1061 DEV_STATS_INC(macsec->secy.netdev, rx_dropped);
1093 struct macsec_dev *macsec;
1147 list_for_each_entry_rcu(macsec, &rxd->secys, secys) {
1148 struct macsec_rx_sc *sc = find_rx_sc(&macsec->secy, sci);
1153 secy = &macsec->secy;
1163 macsec = macsec_priv(dev);
1164 secy_stats = this_cpu_ptr(macsec->stats);
1222 DEV_STATS_INC(macsec->secy.netdev, rx_dropped);
1259 ret = gro_cells_receive(&macsec->gro_cells, skb);
1263 DEV_STATS_INC(macsec->secy.netdev, rx_dropped);
1287 list_for_each_entry_rcu(macsec, &rxd->secys, secys) {
1290 secy_stats = this_cpu_ptr(macsec->stats);
1296 macsec->secy.validate_frames == MACSEC_VALIDATE_STRICT) {
1300 DEV_STATS_INC(macsec->secy.netdev, rx_errors);
1311 macsec_reset_skb(nskb, macsec->secy.netdev);
1319 DEV_STATS_INC(macsec->secy.netdev, rx_dropped);
1418 struct macsec_dev *macsec;
1423 list_for_each_entry(macsec, &rxd->secys, secys) {
1424 if (find_rx_sc_rtnl(&macsec->secy, sci))
1755 pr_notice("macsec: nl: add_rxsa: bad key length: %d != %d\n",
1764 pr_notice("macsec: nl: add_rxsa: bad pn length: %d != %d\n",
1777 pr_notice("macsec: nl: add_rxsa: bad salt length: %d != %d\n",
1999 pr_notice("macsec: nl: add_txsa: bad key length: %d != %d\n",
2007 pr_notice("macsec: nl: add_txsa: bad pn length: %d != %d\n",
2020 pr_notice("macsec: nl: add_txsa: bad salt length: %d != %d\n",
2353 pr_notice("macsec: nl: upd_txsa: bad pn length: %d != %d\n",
2451 pr_notice("macsec: nl: upd_rxsa: bad pn length: %d != %d\n",
2570 static bool macsec_is_configured(struct macsec_dev *macsec)
2572 struct macsec_secy *secy = &macsec->secy;
2591 struct macsec_dev *macsec;
2594 macsec = macsec_priv(dev);
2598 !macsec_check_offload(offload, macsec))
2608 if (macsec_is_configured(macsec))
2611 prev_offload = macsec->offload;
2614 macsec, &ctx);
2618 macsec->offload = offload;
2620 ctx.secy = &macsec->secy;
2624 macsec->offload = prev_offload;
2634 struct macsec_dev *macsec;
2656 macsec = macsec_priv(dev);
2665 if (macsec->offload != offload)
2676 struct macsec_dev *macsec = macsec_priv(dev);
2680 if (macsec_is_offloaded(macsec)) {
2684 ops = macsec_get_ops(macsec, &ctx);
2720 struct macsec_dev *macsec = macsec_priv(dev);
2724 if (macsec_is_offloaded(macsec)) {
2728 ops = macsec_get_ops(macsec, &ctx);
2773 struct macsec_dev *macsec = macsec_priv(dev);
2777 if (macsec_is_offloaded(macsec)) {
2781 ops = macsec_get_ops(macsec, &ctx);
2855 struct macsec_dev *macsec = macsec_priv(dev);
2859 if (macsec_is_offloaded(macsec)) {
2863 ops = macsec_get_ops(macsec, &ctx);
2911 struct macsec_dev *macsec = macsec_priv(dev);
2915 if (macsec_is_offloaded(macsec)) {
2919 ops = macsec_get_ops(macsec, &ctx);
3039 struct macsec_dev *macsec = netdev_priv(dev);
3061 if (nla_put_u8(skb, MACSEC_OFFLOAD_ATTR_TYPE, macsec->offload))
3385 struct macsec_dev *macsec = netdev_priv(dev);
3386 struct macsec_secy *secy = &macsec->secy;
3396 skb->dev = macsec->real_dev;
3402 secy_stats = this_cpu_ptr(macsec->stats);
3406 skb->dev = macsec->real_dev;
3427 macsec_count_tx(skb, &macsec->secy.tx_sc, macsec_skb_cb(skb)->tx_sa);
3440 struct macsec_dev *macsec = macsec_priv(dev);
3441 struct net_device *real_dev = macsec->real_dev;
3448 err = gro_cells_init(&macsec->gro_cells, dev);
3467 /* Get macsec's reference to real_dev */
3468 netdev_hold(real_dev, &macsec->dev_tracker, GFP_KERNEL);
3475 struct macsec_dev *macsec = macsec_priv(dev);
3477 gro_cells_destroy(&macsec->gro_cells);
3484 struct macsec_dev *macsec = macsec_priv(dev);
3485 struct net_device *real_dev = macsec->real_dev;
3496 struct macsec_dev *macsec = macsec_priv(dev);
3497 struct net_device *real_dev = macsec->real_dev;
3517 if (macsec_is_offloaded(macsec)) {
3527 ctx.secy = &macsec->secy;
3548 struct macsec_dev *macsec = macsec_priv(dev);
3549 struct net_device *real_dev = macsec->real_dev;
3554 if (macsec_is_offloaded(macsec)) {
3558 ops = macsec_get_ops(macsec, &ctx);
3560 ctx.secy = &macsec->secy;
3604 struct macsec_dev *macsec = macsec_priv(dev);
3605 struct net_device *real_dev = macsec->real_dev;
3625 if (macsec_is_offloaded(macsec)) {
3629 ops = macsec_get_ops(macsec, &ctx);
3631 ctx.secy = &macsec->secy;
3641 struct macsec_dev *macsec = macsec_priv(dev);
3642 unsigned int extra = macsec->secy.icv_len + macsec_extra_len(true);
3644 if (macsec->real_dev->mtu - extra < new_mtu)
3686 .name = "macsec",
3708 struct macsec_dev *macsec = macsec_priv(dev);
3710 if (macsec->secy.tx_sc.md_dst)
3711 metadata_dst_free(macsec->secy.tx_sc.md_dst);
3712 free_percpu(macsec->stats);
3713 free_percpu(macsec->secy.tx_sc.stats);
3715 /* Get rid of the macsec's reference to real_dev */
3716 netdev_put(macsec->real_dev, &macsec->dev_tracker);
3813 struct macsec_dev *macsec = macsec_priv(dev);
3832 memcpy(&secy, &macsec->secy, sizeof(secy));
3833 memcpy(&tx_sc, &macsec->secy.tx_sc, sizeof(tx_sc));
3841 if (macsec->offload != offload) {
3850 if (!macsec_offload_state_change && macsec_is_offloaded(macsec)) {
3860 ctx.secy = &macsec->secy;
3869 memcpy(&macsec->secy.tx_sc, &tx_sc, sizeof(tx_sc));
3870 memcpy(&macsec->secy, &secy, sizeof(secy));
3875 static void macsec_del_dev(struct macsec_dev *macsec)
3879 while (macsec->secy.rx_sc) {
3880 struct macsec_rx_sc *rx_sc = rtnl_dereference(macsec->secy.rx_sc);
3882 rcu_assign_pointer(macsec->secy.rx_sc, rx_sc->next);
3887 struct macsec_tx_sa *sa = rtnl_dereference(macsec->secy.tx_sc.sa[i]);
3890 RCU_INIT_POINTER(macsec->secy.tx_sc.sa[i], NULL);
3898 struct macsec_dev *macsec = macsec_priv(dev);
3899 struct net_device *real_dev = macsec->real_dev;
3902 if (macsec_is_offloaded(macsec)) {
3908 ctx.secy = &macsec->secy;
3914 list_del_rcu(&macsec->secys);
3915 macsec_del_dev(macsec);
3923 struct macsec_dev *macsec = macsec_priv(dev);
3924 struct net_device *real_dev = macsec->real_dev;
3938 struct macsec_dev *macsec = macsec_priv(dev);
3958 list_add_tail_rcu(&macsec->secys, &rxd->secys);
3965 struct macsec_dev *macsec;
3967 list_for_each_entry(macsec, &rxd->secys, secys) {
3968 if (macsec->secy.sci == sci)
3982 struct macsec_dev *macsec = macsec_priv(dev);
3983 struct macsec_secy *secy = &macsec->secy;
3985 macsec->stats = netdev_alloc_pcpu_stats(struct pcpu_secy_stats);
3986 if (!macsec->stats)
3995 /* macsec and secy percpu stats will be freed when unregistering
4030 struct macsec_dev *macsec = macsec_priv(dev);
4047 macsec->real_dev = real_dev;
4050 macsec->offload = nla_get_offload(data[IFLA_MACSEC_OFFLOAD]);
4053 macsec->offload = MACSEC_OFFLOAD_OFF;
4056 if (macsec->offload != MACSEC_OFFLOAD_OFF &&
4057 !macsec_check_offload(macsec->offload, macsec))
4119 if (macsec_is_offloaded(macsec)) {
4123 ops = macsec_get_ops(macsec, &ctx);
4125 ctx.secy = &macsec->secy;
4144 macsec_del_dev(macsec);
4267 struct macsec_dev *macsec;
4271 macsec = macsec_priv(dev);
4272 secy = &macsec->secy;
4299 nla_put_u8(skb, IFLA_MACSEC_OFFLOAD, macsec->offload) ||
4315 .kind = "macsec",
4433 MODULE_ALIAS_RTNL_LINK("macsec");
4434 MODULE_ALIAS_GENL_FAMILY("macsec");