/*
 * EAP proxy definitions
 * Copyright (c) 2011-2013 Qualcomm Atheros, Inc.
 *
 * This software may be distributed under the terms of the BSD license.
 * See README for more details.
 */

#ifndef EAP_PROXY_H
#define EAP_PROXY_H

struct eap_proxy_sm;
struct eapol_callbacks;
struct eap_sm;
struct eap_peer_config;

enum eap_proxy_status {
	EAP_PROXY_FAILURE = 0x00,
	EAP_PROXY_SUCCESS
};

struct eap_proxy_sm *
eap_proxy_init(void *eapol_ctx, struct eapol_callbacks *eapol_cb,
	       void *msg_ctx);

void eap_proxy_deinit(struct eap_proxy_sm *eap_proxy);

int eap_proxy_key_available(struct eap_proxy_sm *sm);

const u8 * eap_proxy_get_eapKeyData(struct eap_proxy_sm *sm, size_t *len);

struct wpabuf * eap_proxy_get_eapRespData(struct eap_proxy_sm *sm);

int eap_proxy_sm_step(struct eap_proxy_sm *sm, struct eap_sm *eap_sm);

enum eap_proxy_status
eap_proxy_packet_update(struct eap_proxy_sm *eap_proxy, u8 *eapReqData,
			int eapReqDataLen);

int eap_proxy_sm_get_status(struct eap_proxy_sm *sm, char *buf, size_t buflen,
			    int verbose);

int eap_proxy_get_imsi(struct eap_proxy_sm *eap_proxy, char *imsi_buf,
		       size_t *imsi_len);

int eap_proxy_notify_config(struct eap_proxy_sm *sm,
			    struct eap_peer_config *config);

#endif /* EAP_PROXY_H */
