aboutsummaryrefslogtreecommitdiff
path: root/lib/string.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/string.c')
0 files changed, 0 insertions, 0 deletions
dir); ret = aq_mss_get_egress_common_counters(hw, &egress_counters); if (unlikely(ret)) return ret; stats->out.ctl_pkts = STATS_2x32_TO_64(egress_counters.ctl_pkt); stats->out.unknown_sa_pkts = STATS_2x32_TO_64(egress_counters.unknown_sa_pkts); stats->out.untagged_pkts = STATS_2x32_TO_64(egress_counters.untagged_pkts); stats->out.too_long = STATS_2x32_TO_64(egress_counters.too_long); stats->out.ecc_error_pkts = STATS_2x32_TO_64(egress_counters.ecc_error_pkts); stats->out.unctrl_hit_drop_redir = STATS_2x32_TO_64(egress_counters.unctrl_hit_drop_redir); return 0; } static int aq_get_rxsa_stats(struct aq_hw_s *hw, const int sa_idx, struct aq_macsec_rx_sa_stats *stats) { struct aq_mss_ingress_sa_counters i_sa_counters; int ret; ret = aq_mss_get_ingress_sa_counters(hw, &i_sa_counters, sa_idx); if (unlikely(ret)) return ret; stats->untagged_hit_pkts = STATS_2x32_TO_64(i_sa_counters.untagged_hit_pkts); stats->ctrl_hit_drop_redir_pkts = STATS_2x32_TO_64(i_sa_counters.ctrl_hit_drop_redir_pkts); stats->not_using_sa = STATS_2x32_TO_64(i_sa_counters.not_using_sa); stats->unused_sa = STATS_2x32_TO_64(i_sa_counters.unused_sa); stats->not_valid_pkts = STATS_2x32_TO_64(i_sa_counters.not_valid_pkts); stats->invalid_pkts = STATS_2x32_TO_64(i_sa_counters.invalid_pkts); stats->ok_pkts = STATS_2x32_TO_64(i_sa_counters.ok_pkts); stats->late_pkts = STATS_2x32_TO_64(i_sa_counters.late_pkts); stats->delayed_pkts = STATS_2x32_TO_64(i_sa_counters.delayed_pkts); stats->unchecked_pkts = STATS_2x32_TO_64(i_sa_counters.unchecked_pkts); stats->validated_octets = STATS_2x32_TO_64(i_sa_counters.validated_octets); stats->decrypted_octets = STATS_2x32_TO_64(i_sa_counters.decrypted_octets); return 0; } static int aq_get_txsa_stats(struct aq_hw_s *hw, const int sa_idx, struct aq_macsec_tx_sa_stats *stats) { struct aq_mss_egress_sa_counters e_sa_counters; int ret; ret = aq_mss_get_egress_sa_counters(hw, &e_sa_counters, sa_idx); if (unlikely(ret)) return ret; stats->sa_hit_drop_redirect = STATS_2x32_TO_64(e_sa_counters.sa_hit_drop_redirect); stats->sa_protected2_pkts = STATS_2x32_TO_64(e_sa_counters.sa_protected2_pkts); stats->sa_protected_pkts = STATS_2x32_TO_64(e_sa_counters.sa_protected_pkts); stats->sa_encrypted_pkts = STATS_2x32_TO_64(e_sa_counters.sa_encrypted_pkts); return 0; } static int aq_get_txsa_next_pn(struct aq_hw_s *hw, const int sa_idx, u32 *pn) { struct aq_mss_egress_sa_record sa_rec; int ret; ret = aq_mss_get_egress_sa_record(hw, &sa_rec, sa_idx); if (likely(!ret)) *pn = sa_rec.next_pn; return ret; } static int aq_get_rxsa_next_pn(struct aq_hw_s *hw, const int sa_idx, u32 *pn) { struct aq_mss_ingress_sa_record sa_rec; int ret; ret = aq_mss_get_ingress_sa_record(hw, &sa_rec, sa_idx); if (likely(!ret)) *pn = (!sa_rec.sat_nextpn) ? sa_rec.next_pn : 0; return ret; } static int aq_get_txsc_stats(struct aq_hw_s *hw, const int sc_idx, struct aq_macsec_tx_sc_stats *stats) { struct aq_mss_egress_sc_counters e_sc_counters; int ret; ret = aq_mss_get_egress_sc_counters(hw, &e_sc_counters, sc_idx); if (unlikely(ret)) return ret; stats->sc_protected_pkts = STATS_2x32_TO_64(e_sc_counters.sc_protected_pkts); stats->sc_encrypted_pkts = STATS_2x32_TO_64(e_sc_counters.sc_encrypted_pkts); stats->sc_protected_octets = STATS_2x32_TO_64(e_sc_counters.sc_protected_octets); stats->sc_encrypted_octets = STATS_2x32_TO_64(e_sc_counters.sc_encrypted_octets); return 0; } static int aq_mdo_dev_open(struct macsec_context *ctx) { struct aq_nic_s *nic = macsec_netdev_priv(ctx->netdev); int ret = 0; if (netif_carrier_ok(nic->ndev)) ret = aq_apply_secy_cfg(nic, ctx->secy); return ret; } static int aq_mdo_dev_stop(struct macsec_context *ctx) { struct aq_nic_s *nic = macsec_netdev_priv(ctx->netdev); int i; for (i = 0; i < AQ_MACSEC_MAX_SC; i++) { if (nic->macsec_cfg->txsc_idx_busy & BIT(i)) aq_clear_secy(nic, nic->macsec_cfg->aq_txsc[i].sw_secy, AQ_CLEAR_HW); } return 0; } static int aq_set_txsc(struct aq_nic_s *nic, const int txsc_idx) { struct aq_macsec_txsc *aq_txsc = &nic->macsec_cfg->aq_txsc[txsc_idx]; struct aq_mss_egress_class_record tx_class_rec = { 0 }; const struct macsec_secy *secy = aq_txsc->sw_secy; struct aq_mss_egress_sc_record sc_rec = { 0 }; unsigned int sc_idx = aq_txsc->hw_sc_idx; struct aq_hw_s *hw = nic->aq_hw; int ret = 0; aq_ether_addr_to_mac(tx_class_rec.mac_sa, secy->netdev->dev_addr); put_unaligned_be64((__force u64)secy->sci, tx_class_rec.sci); tx_class_rec.sci_mask = 0; tx_class_rec.sa_mask = 0x3f; tx_class_rec.action = 0; /* forward to SA/SC table */ tx_class_rec.valid = 1; tx_class_rec.sc_idx = sc_idx; tx_class_rec.sc_sa = nic->macsec_cfg->sc_sa; ret = aq_mss_set_egress_class_record(hw, &tx_class_rec, txsc_idx); if (ret) return ret; sc_rec.protect = secy->protect_frames; if (secy->tx_sc.encrypt) sc_rec.tci |= BIT(1); if (secy->tx_sc.scb) sc_rec.tci |= BIT(2); if (secy->tx_sc.send_sci) sc_rec.tci |= BIT(3); if (secy->tx_sc.end_station) sc_rec.tci |= BIT(4); /* The C bit is clear if and only if the Secure Data is * exactly the same as the User Data and the ICV is 16 octets long. */ if (!(secy->icv_len == 16 && !secy->tx_sc.encrypt)) sc_rec.tci |= BIT(0); sc_rec.an_roll = 0; switch (secy->key_len) { case AQ_MACSEC_KEY_LEN_128_BIT: sc_rec.sak_len = 0; break; case AQ_MACSEC_KEY_LEN_192_BIT: sc_rec.sak_len = 1; break; case AQ_MACSEC_KEY_LEN_256_BIT: sc_rec.sak_len = 2; break; default: WARN_ONCE(true, "Invalid sc_sa"); return -EINVAL; } sc_rec.curr_an = secy->tx_sc.encoding_sa; sc_rec.valid = 1; sc_rec.fresh = 1; return aq_mss_set_egress_sc_record(hw, &sc_rec, sc_idx); } static u32 aq_sc_idx_max(const enum aq_macsec_sc_sa sc_sa) { u32 result = 0; switch (sc_sa) { case aq_macsec_sa_sc_4sa_8sc: result = 8; break; case aq_macsec_sa_sc_2sa_16sc: result = 16; break; case aq_macsec_sa_sc_1sa_32sc: result = 32; break; default: break; } return result; } static u32 aq_to_hw_sc_idx(const u32 sc_idx, const enum aq_macsec_sc_sa sc_sa) { switch (sc_sa) { case aq_macsec_sa_sc_4sa_8sc: return sc_idx << 2; case aq_macsec_sa_sc_2sa_16sc: return sc_idx << 1; case aq_macsec_sa_sc_1sa_32sc: return sc_idx; default: WARN_ONCE(true, "Invalid sc_sa"); } return sc_idx; } static enum aq_macsec_sc_sa sc_sa_from_num_an(const int num_an) { enum aq_macsec_sc_sa sc_sa = aq_macsec_sa_sc_not_used; switch (num_an) { case 4: sc_sa = aq_macsec_sa_sc_4sa_8sc; break; case 2: sc_sa = aq_macsec_sa_sc_2sa_16sc; br