drivers/net/netdevsim/macsec.c

Source file repositories/reference/linux-study-clean/drivers/net/netdevsim/macsec.c

File Facts

System
Linux kernel
Corpus path
drivers/net/netdevsim/macsec.c
Extension
.c
Size
9365 bytes
Lines
352
Domain
Driver Families
Bucket
drivers/net
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

// SPDX-License-Identifier: GPL-2.0

#include <net/macsec.h>
#include "netdevsim.h"

static int nsim_macsec_find_secy(struct netdevsim *ns, sci_t sci)
{
	int i;

	for (i = 0; i < NSIM_MACSEC_MAX_SECY_COUNT; i++) {
		if (ns->macsec.nsim_secy[i].sci == sci)
			return i;
	}

	return -1;
}

static int nsim_macsec_find_rxsc(struct nsim_secy *ns_secy, sci_t sci)
{
	int i;

	for (i = 0; i < NSIM_MACSEC_MAX_RXSC_COUNT; i++) {
		if (ns_secy->nsim_rxsc[i].sci == sci)
			return i;
	}

	return -1;
}

static int nsim_macsec_add_secy(struct macsec_context *ctx)
{
	struct netdevsim *ns = netdev_priv(ctx->netdev);
	int idx;

	if (ns->macsec.nsim_secy_count == NSIM_MACSEC_MAX_SECY_COUNT)
		return -ENOSPC;

	for (idx = 0; idx < NSIM_MACSEC_MAX_SECY_COUNT; idx++) {
		if (!ns->macsec.nsim_secy[idx].used)
			break;
	}

	if (idx == NSIM_MACSEC_MAX_SECY_COUNT) {
		netdev_err(ctx->netdev, "%s: nsim_secy_count not full but all SecYs used\n",
			   __func__);
		return -ENOSPC;
	}

	netdev_dbg(ctx->netdev, "%s: adding new secy with sci %016llx at index %d\n",
		   __func__, sci_to_cpu(ctx->secy->sci), idx);
	ns->macsec.nsim_secy[idx].used = true;
	ns->macsec.nsim_secy[idx].nsim_rxsc_count = 0;
	ns->macsec.nsim_secy[idx].sci = ctx->secy->sci;
	ns->macsec.nsim_secy_count++;

	return 0;
}

static int nsim_macsec_upd_secy(struct macsec_context *ctx)
{
	struct netdevsim *ns = netdev_priv(ctx->netdev);
	int idx;

	idx = nsim_macsec_find_secy(ns, ctx->secy->sci);
	if (idx < 0) {
		netdev_err(ctx->netdev, "%s: sci %016llx not found in secy table\n",
			   __func__, sci_to_cpu(ctx->secy->sci));
		return -ENOENT;
	}

	netdev_dbg(ctx->netdev, "%s: updating secy with sci %016llx at index %d\n",
		   __func__, sci_to_cpu(ctx->secy->sci), idx);

	return 0;
}

static int nsim_macsec_del_secy(struct macsec_context *ctx)
{
	struct netdevsim *ns = netdev_priv(ctx->netdev);
	int idx;

	idx = nsim_macsec_find_secy(ns, ctx->secy->sci);
	if (idx < 0) {
		netdev_err(ctx->netdev, "%s: sci %016llx not found in secy table\n",
			   __func__, sci_to_cpu(ctx->secy->sci));
		return -ENOENT;
	}

	netdev_dbg(ctx->netdev, "%s: removing SecY with SCI %016llx at index %d\n",
		   __func__, sci_to_cpu(ctx->secy->sci), idx);

Annotation

Implementation Notes