162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci#include <net/macsec.h> 462306a36Sopenharmony_ci#include "netdevsim.h" 562306a36Sopenharmony_ci 662306a36Sopenharmony_cistatic inline u64 sci_to_cpu(sci_t sci) 762306a36Sopenharmony_ci{ 862306a36Sopenharmony_ci return be64_to_cpu((__force __be64)sci); 962306a36Sopenharmony_ci} 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_cistatic int nsim_macsec_find_secy(struct netdevsim *ns, sci_t sci) 1262306a36Sopenharmony_ci{ 1362306a36Sopenharmony_ci int i; 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci for (i = 0; i < NSIM_MACSEC_MAX_SECY_COUNT; i++) { 1662306a36Sopenharmony_ci if (ns->macsec.nsim_secy[i].sci == sci) 1762306a36Sopenharmony_ci return i; 1862306a36Sopenharmony_ci } 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci return -1; 2162306a36Sopenharmony_ci} 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_cistatic int nsim_macsec_find_rxsc(struct nsim_secy *ns_secy, sci_t sci) 2462306a36Sopenharmony_ci{ 2562306a36Sopenharmony_ci int i; 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci for (i = 0; i < NSIM_MACSEC_MAX_RXSC_COUNT; i++) { 2862306a36Sopenharmony_ci if (ns_secy->nsim_rxsc[i].sci == sci) 2962306a36Sopenharmony_ci return i; 3062306a36Sopenharmony_ci } 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci return -1; 3362306a36Sopenharmony_ci} 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_cistatic int nsim_macsec_add_secy(struct macsec_context *ctx) 3662306a36Sopenharmony_ci{ 3762306a36Sopenharmony_ci struct netdevsim *ns = netdev_priv(ctx->netdev); 3862306a36Sopenharmony_ci int idx; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci if (ns->macsec.nsim_secy_count == NSIM_MACSEC_MAX_SECY_COUNT) 4162306a36Sopenharmony_ci return -ENOSPC; 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci for (idx = 0; idx < NSIM_MACSEC_MAX_SECY_COUNT; idx++) { 4462306a36Sopenharmony_ci if (!ns->macsec.nsim_secy[idx].used) 4562306a36Sopenharmony_ci break; 4662306a36Sopenharmony_ci } 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci if (idx == NSIM_MACSEC_MAX_SECY_COUNT) { 4962306a36Sopenharmony_ci netdev_err(ctx->netdev, "%s: nsim_secy_count not full but all SecYs used\n", 5062306a36Sopenharmony_ci __func__); 5162306a36Sopenharmony_ci return -ENOSPC; 5262306a36Sopenharmony_ci } 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci netdev_dbg(ctx->netdev, "%s: adding new secy with sci %08llx at index %d\n", 5562306a36Sopenharmony_ci __func__, sci_to_cpu(ctx->secy->sci), idx); 5662306a36Sopenharmony_ci ns->macsec.nsim_secy[idx].used = true; 5762306a36Sopenharmony_ci ns->macsec.nsim_secy[idx].nsim_rxsc_count = 0; 5862306a36Sopenharmony_ci ns->macsec.nsim_secy[idx].sci = ctx->secy->sci; 5962306a36Sopenharmony_ci ns->macsec.nsim_secy_count++; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci return 0; 6262306a36Sopenharmony_ci} 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_cistatic int nsim_macsec_upd_secy(struct macsec_context *ctx) 6562306a36Sopenharmony_ci{ 6662306a36Sopenharmony_ci struct netdevsim *ns = netdev_priv(ctx->netdev); 6762306a36Sopenharmony_ci int idx; 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci idx = nsim_macsec_find_secy(ns, ctx->secy->sci); 7062306a36Sopenharmony_ci if (idx < 0) { 7162306a36Sopenharmony_ci netdev_err(ctx->netdev, "%s: sci %08llx not found in secy table\n", 7262306a36Sopenharmony_ci __func__, sci_to_cpu(ctx->secy->sci)); 7362306a36Sopenharmony_ci return -ENOENT; 7462306a36Sopenharmony_ci } 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci netdev_dbg(ctx->netdev, "%s: updating secy with sci %08llx at index %d\n", 7762306a36Sopenharmony_ci __func__, sci_to_cpu(ctx->secy->sci), idx); 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci return 0; 8062306a36Sopenharmony_ci} 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_cistatic int nsim_macsec_del_secy(struct macsec_context *ctx) 8362306a36Sopenharmony_ci{ 8462306a36Sopenharmony_ci struct netdevsim *ns = netdev_priv(ctx->netdev); 8562306a36Sopenharmony_ci int idx; 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci idx = nsim_macsec_find_secy(ns, ctx->secy->sci); 8862306a36Sopenharmony_ci if (idx < 0) { 8962306a36Sopenharmony_ci netdev_err(ctx->netdev, "%s: sci %08llx not found in secy table\n", 9062306a36Sopenharmony_ci __func__, sci_to_cpu(ctx->secy->sci)); 9162306a36Sopenharmony_ci return -ENOENT; 9262306a36Sopenharmony_ci } 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci netdev_dbg(ctx->netdev, "%s: removing SecY with SCI %08llx at index %d\n", 9562306a36Sopenharmony_ci __func__, sci_to_cpu(ctx->secy->sci), idx); 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci ns->macsec.nsim_secy[idx].used = false; 9862306a36Sopenharmony_ci memset(&ns->macsec.nsim_secy[idx], 0, sizeof(ns->macsec.nsim_secy[idx])); 9962306a36Sopenharmony_ci ns->macsec.nsim_secy_count--; 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci return 0; 10262306a36Sopenharmony_ci} 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_cistatic int nsim_macsec_add_rxsc(struct macsec_context *ctx) 10562306a36Sopenharmony_ci{ 10662306a36Sopenharmony_ci struct netdevsim *ns = netdev_priv(ctx->netdev); 10762306a36Sopenharmony_ci struct nsim_secy *secy; 10862306a36Sopenharmony_ci int idx; 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci idx = nsim_macsec_find_secy(ns, ctx->secy->sci); 11162306a36Sopenharmony_ci if (idx < 0) { 11262306a36Sopenharmony_ci netdev_err(ctx->netdev, "%s: sci %08llx not found in secy table\n", 11362306a36Sopenharmony_ci __func__, sci_to_cpu(ctx->secy->sci)); 11462306a36Sopenharmony_ci return -ENOENT; 11562306a36Sopenharmony_ci } 11662306a36Sopenharmony_ci secy = &ns->macsec.nsim_secy[idx]; 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci if (secy->nsim_rxsc_count == NSIM_MACSEC_MAX_RXSC_COUNT) 11962306a36Sopenharmony_ci return -ENOSPC; 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci for (idx = 0; idx < NSIM_MACSEC_MAX_RXSC_COUNT; idx++) { 12262306a36Sopenharmony_ci if (!secy->nsim_rxsc[idx].used) 12362306a36Sopenharmony_ci break; 12462306a36Sopenharmony_ci } 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci if (idx == NSIM_MACSEC_MAX_RXSC_COUNT) 12762306a36Sopenharmony_ci netdev_err(ctx->netdev, "%s: nsim_rxsc_count not full but all RXSCs used\n", 12862306a36Sopenharmony_ci __func__); 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci netdev_dbg(ctx->netdev, "%s: adding new rxsc with sci %08llx at index %d\n", 13162306a36Sopenharmony_ci __func__, sci_to_cpu(ctx->rx_sc->sci), idx); 13262306a36Sopenharmony_ci secy->nsim_rxsc[idx].used = true; 13362306a36Sopenharmony_ci secy->nsim_rxsc[idx].sci = ctx->rx_sc->sci; 13462306a36Sopenharmony_ci secy->nsim_rxsc_count++; 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci return 0; 13762306a36Sopenharmony_ci} 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_cistatic int nsim_macsec_upd_rxsc(struct macsec_context *ctx) 14062306a36Sopenharmony_ci{ 14162306a36Sopenharmony_ci struct netdevsim *ns = netdev_priv(ctx->netdev); 14262306a36Sopenharmony_ci struct nsim_secy *secy; 14362306a36Sopenharmony_ci int idx; 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci idx = nsim_macsec_find_secy(ns, ctx->secy->sci); 14662306a36Sopenharmony_ci if (idx < 0) { 14762306a36Sopenharmony_ci netdev_err(ctx->netdev, "%s: sci %08llx not found in secy table\n", 14862306a36Sopenharmony_ci __func__, sci_to_cpu(ctx->secy->sci)); 14962306a36Sopenharmony_ci return -ENOENT; 15062306a36Sopenharmony_ci } 15162306a36Sopenharmony_ci secy = &ns->macsec.nsim_secy[idx]; 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci idx = nsim_macsec_find_rxsc(secy, ctx->rx_sc->sci); 15462306a36Sopenharmony_ci if (idx < 0) { 15562306a36Sopenharmony_ci netdev_err(ctx->netdev, "%s: sci %08llx not found in RXSC table\n", 15662306a36Sopenharmony_ci __func__, sci_to_cpu(ctx->rx_sc->sci)); 15762306a36Sopenharmony_ci return -ENOENT; 15862306a36Sopenharmony_ci } 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci netdev_dbg(ctx->netdev, "%s: updating RXSC with sci %08llx at index %d\n", 16162306a36Sopenharmony_ci __func__, sci_to_cpu(ctx->rx_sc->sci), idx); 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci return 0; 16462306a36Sopenharmony_ci} 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_cistatic int nsim_macsec_del_rxsc(struct macsec_context *ctx) 16762306a36Sopenharmony_ci{ 16862306a36Sopenharmony_ci struct netdevsim *ns = netdev_priv(ctx->netdev); 16962306a36Sopenharmony_ci struct nsim_secy *secy; 17062306a36Sopenharmony_ci int idx; 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci idx = nsim_macsec_find_secy(ns, ctx->secy->sci); 17362306a36Sopenharmony_ci if (idx < 0) { 17462306a36Sopenharmony_ci netdev_err(ctx->netdev, "%s: sci %08llx not found in secy table\n", 17562306a36Sopenharmony_ci __func__, sci_to_cpu(ctx->secy->sci)); 17662306a36Sopenharmony_ci return -ENOENT; 17762306a36Sopenharmony_ci } 17862306a36Sopenharmony_ci secy = &ns->macsec.nsim_secy[idx]; 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci idx = nsim_macsec_find_rxsc(secy, ctx->rx_sc->sci); 18162306a36Sopenharmony_ci if (idx < 0) { 18262306a36Sopenharmony_ci netdev_err(ctx->netdev, "%s: sci %08llx not found in RXSC table\n", 18362306a36Sopenharmony_ci __func__, sci_to_cpu(ctx->rx_sc->sci)); 18462306a36Sopenharmony_ci return -ENOENT; 18562306a36Sopenharmony_ci } 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ci netdev_dbg(ctx->netdev, "%s: removing RXSC with sci %08llx at index %d\n", 18862306a36Sopenharmony_ci __func__, sci_to_cpu(ctx->rx_sc->sci), idx); 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_ci secy->nsim_rxsc[idx].used = false; 19162306a36Sopenharmony_ci memset(&secy->nsim_rxsc[idx], 0, sizeof(secy->nsim_rxsc[idx])); 19262306a36Sopenharmony_ci secy->nsim_rxsc_count--; 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ci return 0; 19562306a36Sopenharmony_ci} 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_cistatic int nsim_macsec_add_rxsa(struct macsec_context *ctx) 19862306a36Sopenharmony_ci{ 19962306a36Sopenharmony_ci struct netdevsim *ns = netdev_priv(ctx->netdev); 20062306a36Sopenharmony_ci struct nsim_secy *secy; 20162306a36Sopenharmony_ci int idx; 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci idx = nsim_macsec_find_secy(ns, ctx->secy->sci); 20462306a36Sopenharmony_ci if (idx < 0) { 20562306a36Sopenharmony_ci netdev_err(ctx->netdev, "%s: sci %08llx not found in secy table\n", 20662306a36Sopenharmony_ci __func__, sci_to_cpu(ctx->secy->sci)); 20762306a36Sopenharmony_ci return -ENOENT; 20862306a36Sopenharmony_ci } 20962306a36Sopenharmony_ci secy = &ns->macsec.nsim_secy[idx]; 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci idx = nsim_macsec_find_rxsc(secy, ctx->sa.rx_sa->sc->sci); 21262306a36Sopenharmony_ci if (idx < 0) { 21362306a36Sopenharmony_ci netdev_err(ctx->netdev, "%s: sci %08llx not found in RXSC table\n", 21462306a36Sopenharmony_ci __func__, sci_to_cpu(ctx->sa.rx_sa->sc->sci)); 21562306a36Sopenharmony_ci return -ENOENT; 21662306a36Sopenharmony_ci } 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci netdev_dbg(ctx->netdev, "%s: RXSC with sci %08llx, AN %u\n", 21962306a36Sopenharmony_ci __func__, sci_to_cpu(ctx->sa.rx_sa->sc->sci), ctx->sa.assoc_num); 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci return 0; 22262306a36Sopenharmony_ci} 22362306a36Sopenharmony_ci 22462306a36Sopenharmony_cistatic int nsim_macsec_upd_rxsa(struct macsec_context *ctx) 22562306a36Sopenharmony_ci{ 22662306a36Sopenharmony_ci struct netdevsim *ns = netdev_priv(ctx->netdev); 22762306a36Sopenharmony_ci struct nsim_secy *secy; 22862306a36Sopenharmony_ci int idx; 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_ci idx = nsim_macsec_find_secy(ns, ctx->secy->sci); 23162306a36Sopenharmony_ci if (idx < 0) { 23262306a36Sopenharmony_ci netdev_err(ctx->netdev, "%s: sci %08llx not found in secy table\n", 23362306a36Sopenharmony_ci __func__, sci_to_cpu(ctx->secy->sci)); 23462306a36Sopenharmony_ci return -ENOENT; 23562306a36Sopenharmony_ci } 23662306a36Sopenharmony_ci secy = &ns->macsec.nsim_secy[idx]; 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_ci idx = nsim_macsec_find_rxsc(secy, ctx->sa.rx_sa->sc->sci); 23962306a36Sopenharmony_ci if (idx < 0) { 24062306a36Sopenharmony_ci netdev_err(ctx->netdev, "%s: sci %08llx not found in RXSC table\n", 24162306a36Sopenharmony_ci __func__, sci_to_cpu(ctx->sa.rx_sa->sc->sci)); 24262306a36Sopenharmony_ci return -ENOENT; 24362306a36Sopenharmony_ci } 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci netdev_dbg(ctx->netdev, "%s: RXSC with sci %08llx, AN %u\n", 24662306a36Sopenharmony_ci __func__, sci_to_cpu(ctx->sa.rx_sa->sc->sci), ctx->sa.assoc_num); 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci return 0; 24962306a36Sopenharmony_ci} 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_cistatic int nsim_macsec_del_rxsa(struct macsec_context *ctx) 25262306a36Sopenharmony_ci{ 25362306a36Sopenharmony_ci struct netdevsim *ns = netdev_priv(ctx->netdev); 25462306a36Sopenharmony_ci struct nsim_secy *secy; 25562306a36Sopenharmony_ci int idx; 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci idx = nsim_macsec_find_secy(ns, ctx->secy->sci); 25862306a36Sopenharmony_ci if (idx < 0) { 25962306a36Sopenharmony_ci netdev_err(ctx->netdev, "%s: sci %08llx not found in secy table\n", 26062306a36Sopenharmony_ci __func__, sci_to_cpu(ctx->secy->sci)); 26162306a36Sopenharmony_ci return -ENOENT; 26262306a36Sopenharmony_ci } 26362306a36Sopenharmony_ci secy = &ns->macsec.nsim_secy[idx]; 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_ci idx = nsim_macsec_find_rxsc(secy, ctx->sa.rx_sa->sc->sci); 26662306a36Sopenharmony_ci if (idx < 0) { 26762306a36Sopenharmony_ci netdev_err(ctx->netdev, "%s: sci %08llx not found in RXSC table\n", 26862306a36Sopenharmony_ci __func__, sci_to_cpu(ctx->sa.rx_sa->sc->sci)); 26962306a36Sopenharmony_ci return -ENOENT; 27062306a36Sopenharmony_ci } 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci netdev_dbg(ctx->netdev, "%s: RXSC with sci %08llx, AN %u\n", 27362306a36Sopenharmony_ci __func__, sci_to_cpu(ctx->sa.rx_sa->sc->sci), ctx->sa.assoc_num); 27462306a36Sopenharmony_ci 27562306a36Sopenharmony_ci return 0; 27662306a36Sopenharmony_ci} 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_cistatic int nsim_macsec_add_txsa(struct macsec_context *ctx) 27962306a36Sopenharmony_ci{ 28062306a36Sopenharmony_ci struct netdevsim *ns = netdev_priv(ctx->netdev); 28162306a36Sopenharmony_ci int idx; 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_ci idx = nsim_macsec_find_secy(ns, ctx->secy->sci); 28462306a36Sopenharmony_ci if (idx < 0) { 28562306a36Sopenharmony_ci netdev_err(ctx->netdev, "%s: sci %08llx not found in secy table\n", 28662306a36Sopenharmony_ci __func__, sci_to_cpu(ctx->secy->sci)); 28762306a36Sopenharmony_ci return -ENOENT; 28862306a36Sopenharmony_ci } 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_ci netdev_dbg(ctx->netdev, "%s: SECY with sci %08llx, AN %u\n", 29162306a36Sopenharmony_ci __func__, sci_to_cpu(ctx->secy->sci), ctx->sa.assoc_num); 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_ci return 0; 29462306a36Sopenharmony_ci} 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_cistatic int nsim_macsec_upd_txsa(struct macsec_context *ctx) 29762306a36Sopenharmony_ci{ 29862306a36Sopenharmony_ci struct netdevsim *ns = netdev_priv(ctx->netdev); 29962306a36Sopenharmony_ci int idx; 30062306a36Sopenharmony_ci 30162306a36Sopenharmony_ci idx = nsim_macsec_find_secy(ns, ctx->secy->sci); 30262306a36Sopenharmony_ci if (idx < 0) { 30362306a36Sopenharmony_ci netdev_err(ctx->netdev, "%s: sci %08llx not found in secy table\n", 30462306a36Sopenharmony_ci __func__, sci_to_cpu(ctx->secy->sci)); 30562306a36Sopenharmony_ci return -ENOENT; 30662306a36Sopenharmony_ci } 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_ci netdev_dbg(ctx->netdev, "%s: SECY with sci %08llx, AN %u\n", 30962306a36Sopenharmony_ci __func__, sci_to_cpu(ctx->secy->sci), ctx->sa.assoc_num); 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_ci return 0; 31262306a36Sopenharmony_ci} 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_cistatic int nsim_macsec_del_txsa(struct macsec_context *ctx) 31562306a36Sopenharmony_ci{ 31662306a36Sopenharmony_ci struct netdevsim *ns = netdev_priv(ctx->netdev); 31762306a36Sopenharmony_ci int idx; 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ci idx = nsim_macsec_find_secy(ns, ctx->secy->sci); 32062306a36Sopenharmony_ci if (idx < 0) { 32162306a36Sopenharmony_ci netdev_err(ctx->netdev, "%s: sci %08llx not found in secy table\n", 32262306a36Sopenharmony_ci __func__, sci_to_cpu(ctx->secy->sci)); 32362306a36Sopenharmony_ci return -ENOENT; 32462306a36Sopenharmony_ci } 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_ci netdev_dbg(ctx->netdev, "%s: SECY with sci %08llx, AN %u\n", 32762306a36Sopenharmony_ci __func__, sci_to_cpu(ctx->secy->sci), ctx->sa.assoc_num); 32862306a36Sopenharmony_ci 32962306a36Sopenharmony_ci return 0; 33062306a36Sopenharmony_ci} 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_cistatic const struct macsec_ops nsim_macsec_ops = { 33362306a36Sopenharmony_ci .mdo_add_secy = nsim_macsec_add_secy, 33462306a36Sopenharmony_ci .mdo_upd_secy = nsim_macsec_upd_secy, 33562306a36Sopenharmony_ci .mdo_del_secy = nsim_macsec_del_secy, 33662306a36Sopenharmony_ci .mdo_add_rxsc = nsim_macsec_add_rxsc, 33762306a36Sopenharmony_ci .mdo_upd_rxsc = nsim_macsec_upd_rxsc, 33862306a36Sopenharmony_ci .mdo_del_rxsc = nsim_macsec_del_rxsc, 33962306a36Sopenharmony_ci .mdo_add_rxsa = nsim_macsec_add_rxsa, 34062306a36Sopenharmony_ci .mdo_upd_rxsa = nsim_macsec_upd_rxsa, 34162306a36Sopenharmony_ci .mdo_del_rxsa = nsim_macsec_del_rxsa, 34262306a36Sopenharmony_ci .mdo_add_txsa = nsim_macsec_add_txsa, 34362306a36Sopenharmony_ci .mdo_upd_txsa = nsim_macsec_upd_txsa, 34462306a36Sopenharmony_ci .mdo_del_txsa = nsim_macsec_del_txsa, 34562306a36Sopenharmony_ci}; 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_civoid nsim_macsec_init(struct netdevsim *ns) 34862306a36Sopenharmony_ci{ 34962306a36Sopenharmony_ci ns->netdev->macsec_ops = &nsim_macsec_ops; 35062306a36Sopenharmony_ci ns->netdev->features |= NETIF_F_HW_MACSEC; 35162306a36Sopenharmony_ci memset(&ns->macsec, 0, sizeof(ns->macsec)); 35262306a36Sopenharmony_ci} 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_civoid nsim_macsec_teardown(struct netdevsim *ns) 35562306a36Sopenharmony_ci{ 35662306a36Sopenharmony_ci} 357