Boot Linux faster!

Check our new training course

Boot Linux faster!

Check our new training course
and Creative Commons CC-BY-SA
lecture and lab materials

Bootlin logo

Elixir Cross Referencer

/*
 * Copyright (c) 2019 Intel Corporation.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <logging/log.h>
LOG_MODULE_DECLARE(net_l2_ppp, CONFIG_NET_L2_PPP_LOG_LEVEL);

#include <net/net_core.h>
#include <net/net_pkt.h>

#include <net/ppp.h>

#include "net_private.h"

#include "ppp_internal.h"

void ppp_network_up(struct ppp_context *ctx, int proto)
{
	if (ctx->network_protos_up == 0) {
		ppp_change_phase(ctx, PPP_RUNNING);
	}

	ctx->network_protos_up++;

	NET_DBG("[%p] Proto %s (0x%04x) %s (%d)", ctx, ppp_proto2str(proto),
		proto, "up", ctx->network_protos_up);
}

void ppp_network_down(struct ppp_context *ctx, int proto)
{
	ctx->network_protos_up--;

	if (ctx->network_protos_up <= 0) {
		ctx->network_protos_up = 0;
		ppp_change_phase(ctx, PPP_TERMINATE);
	}

	NET_DBG("[%p] Proto %s (0x%04x) %s (%d)", ctx, ppp_proto2str(proto),
		proto, "down", ctx->network_protos_up);
}

void ppp_network_done(struct ppp_context *ctx, int proto)
{
	ctx->network_protos_up--;
	if (ctx->network_protos_up <= 0) {
		const struct ppp_protocol_handler *proto = ppp_lcp_get();

		if (proto) {
			proto->close(ctx, "All networks down");
		}
	}
}

void ppp_network_all_down(struct ppp_context *ctx)
{
	Z_STRUCT_SECTION_FOREACH(ppp_protocol_handler, proto) {
		if (proto->protocol != PPP_LCP && proto->lower_down) {
			proto->lower_down(ctx);
		}

		if (proto->protocol < 0xC000 && proto->close) {
			ctx->network_protos_open--;
			proto->close(ctx, "LCP down");
		}
	}

	if (ctx->network_protos_open > 0) {
		NET_WARN("Not all network protocols were closed (%d)",
			 ctx->network_protos_open);
	}

	ctx->network_protos_open = 0;
}