/*
 *
 *  Wireless daemon for Linux
 *
 *  Copyright (C) 2019  Intel Corporation. All rights reserved.
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; either
 *  version 2.1 of the License, or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 */

#include <errno.h>

struct auth_proto {
	bool (*start)(struct auth_proto *ap);
	void (*free)(struct auth_proto *ap);
	int (*rx_authenticate)(struct auth_proto *driver,
					const uint8_t *frame, size_t len);
	int (*rx_associate)(struct auth_proto *driver,
					const uint8_t *frame, size_t len);
	bool (*auth_timeout)(struct auth_proto *ap);
	bool (*assoc_timeout)(struct auth_proto *ap);
};

static inline void auth_proto_free(struct auth_proto *ap)
{
	if (ap && ap->free)
		ap->free(ap);
}

static inline bool auth_proto_start(struct auth_proto *ap)
{
	if (ap && ap->start)
		return ap->start(ap);

	return false;
}

static inline int auth_proto_rx_authenticate(struct auth_proto *ap,
						const uint8_t *frame,
						size_t frame_len)
{
	if (ap && ap->rx_authenticate)
		return ap->rx_authenticate(ap, frame, frame_len);

	return -ENOTSUP;
}

static inline int auth_proto_rx_associate(struct auth_proto *ap,
						const uint8_t *frame,
						size_t frame_len)
{
	if (ap && ap->rx_associate)
		return ap->rx_associate(ap, frame, frame_len);

	return -ENOTSUP;
}

static inline bool auth_proto_auth_timeout(struct auth_proto *ap)
{
	if (ap && ap->auth_timeout)
		return ap->auth_timeout(ap);

	return false;
}

static inline bool auth_proto_assoc_timeout(struct auth_proto *ap)
{
	if (ap && ap->assoc_timeout)
		return ap->assoc_timeout(ap);

	return false;
}
