net: macsec: PN wrap callback
authorAntoine Tenart <antoine.tenart@bootlin.com>
Mon, 13 Jan 2020 22:31:47 +0000 (23:31 +0100)
committerDavid S. Miller <davem@davemloft.net>
Tue, 14 Jan 2020 19:31:41 +0000 (11:31 -0800)
Allow to call macsec_pn_wrapped from hardware drivers to notify when a
PN rolls over. Some drivers might used an interrupt to implement this.

Signed-off-by: Antoine Tenart <antoine.tenart@bootlin.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/macsec.c
include/net/macsec.h

index e515919..45bfd99 100644 (file)
@@ -424,6 +424,23 @@ static struct macsec_eth_header *macsec_ethhdr(struct sk_buff *skb)
        return (struct macsec_eth_header *)skb_mac_header(skb);
 }
 
+static void __macsec_pn_wrapped(struct macsec_secy *secy,
+                               struct macsec_tx_sa *tx_sa)
+{
+       pr_debug("PN wrapped, transitioning to !oper\n");
+       tx_sa->active = false;
+       if (secy->protect_frames)
+               secy->operational = false;
+}
+
+void macsec_pn_wrapped(struct macsec_secy *secy, struct macsec_tx_sa *tx_sa)
+{
+       spin_lock_bh(&tx_sa->lock);
+       __macsec_pn_wrapped(secy, tx_sa);
+       spin_unlock_bh(&tx_sa->lock);
+}
+EXPORT_SYMBOL_GPL(macsec_pn_wrapped);
+
 static u32 tx_sa_update_pn(struct macsec_tx_sa *tx_sa, struct macsec_secy *secy)
 {
        u32 pn;
@@ -432,12 +449,8 @@ static u32 tx_sa_update_pn(struct macsec_tx_sa *tx_sa, struct macsec_secy *secy)
        pn = tx_sa->next_pn;
 
        tx_sa->next_pn++;
-       if (tx_sa->next_pn == 0) {
-               pr_debug("PN wrapped, transitioning to !oper\n");
-               tx_sa->active = false;
-               if (secy->protect_frames)
-                       secy->operational = false;
-       }
+       if (tx_sa->next_pn == 0)
+               __macsec_pn_wrapped(secy, tx_sa);
        spin_unlock_bh(&tx_sa->lock);
 
        return pn;
index 16e7e50..92e43db 100644 (file)
@@ -219,4 +219,6 @@ struct macsec_ops {
        int (*mdo_del_txsa)(struct macsec_context *ctx);
 };
 
+void macsec_pn_wrapped(struct macsec_secy *secy, struct macsec_tx_sa *tx_sa);
+
 #endif /* _NET_MACSEC_H_ */