/* ****************************************************************************** * INTERPEAK API HEADER FILE * * Document no: @(#) $Name: VXWORKS_ITER40_2019102207 $ $RCSfile: ip8021x.h,v $ $Revision: 1.22 $ * $Source: /home/interpeak/CVSRoot/ip8021x/include/ip8021x.h,v $ * $Author: krosenfe $ $Date: 2010-04-01 20:49:57 $ * $State: Exp $ $Locker: $ * * Copyright 2000-2006 Interpeak AB (http://www.interpeak.se). All rights reserved. * Design and implementation by Roger Boden ****************************************************************************** */ #ifndef IP8021X_H #define IP8021X_H /* **************************************************************************** * 1 DESCRIPTION **************************************************************************** */ /* **************************************************************************** * 2 CONFIGURATION **************************************************************************** */ /* **************************************************************************** * 3 INCLUDE FILES **************************************************************************** */ #include #include #include #include #ifdef IPEAP #include #endif #include "ip8021x_config.h" #ifdef __cplusplus extern "C" { #endif /* **************************************************************************** * 4 DEFINES **************************************************************************** */ #ifdef IPWPS #ifndef IP8021X_AUTH_SUPPORT #define IP8021X_AUTH_SUPPORT #define IP8021X_EAP_REQ_MAX_RETRIES 5 #define IP8021X_EAP_REQ_RETRANSMIT_TMO 500 #endif #endif #define IP8021X_RELEASE 67000 #ifdef IP8021X_SIM_SUPPORT #define IP8021X_IFNAMSIZ 128 #else #define IP8021X_IFNAMSIZ IP_IFNAMSIZ #endif #define IP8021X_RELEASE 67000 /* Return codes for ip8021x_state_get */ #define IP8021X_STATE_LOGOFF 1 #define IP8021X_STATE_DISCONNECTED 2 #define IP8021X_STATE_CONNECTING 3 #define IP8021X_STATE_ACQUIRED 4 #define IP8021X_STATE_AUTHENTICATING 5 #define IP8021X_STATE_HELD 6 #define IP8021X_STATE_AUTHENTICATED 7 /* Return codes for ip8021x_pkt_input */ #define IP8021X_EAP_PENDING 1 /* Keep in sync with IPEAP_PENDING_SEND_OUT_PKT */ #define IP8021X_DROPPED_PKT 2 /* Keep in sync with IPEAP_DROPPED_PKT */ #define IP8021X_EAP_SUCCESS 3 /* Keep in sync with IPEAP_SUCCESS */ #define IP8021X_EAP_FAILURE 4 /* Keep in sync with IPEAP_FAILURE */ #define IP8021X_KEY_MSG 20 #define IP8021X_PROCESS_NAME "ip8021x" /* Deauthentication Reason codes (from IEEE Std 802.11i-2004) */ #define IP8021X_DEAUTH_REASON_MIC_FAILURE 14 /* Michael failure */ #define IP8021X_DEAUTH_REASON_4WAYHS_TIMEOUT 15 /* 4-way handshake timeout */ #define IP8021X_DEAUTH_REASON_IE_MISMATCH 17 /* IE in 4-way handshake doesn't match */ #define IP8021X_MSG1_TIMEOUT 30000 /* In milliseconds*/ #define IP8021X_MAX_SUPPS_BITS 8 /* # of bits used to represent a supplicant instance */ #define IP8021X_MAX_SUPPS (1 << IP8021X_MAX_SUPPS_BITS) /* Maximum # of supported supplicant instances */ #define IP8021X_SUPP_INSTANCE_SHIFT (sizeof(Ip_u32)*8 - IP8021X_MAX_SUPPS_BITS) #define IP8021X_SUPP_INSTANCE_MASK ((IP8021X_MAX_SUPPS-1) << IP8021X_SUPP_INSTANCE_SHIFT) /* Use upper most bits for a mask */ #define IP8021X_ENCODE_SUPP_INSTANCE(word,inst) (((word) & ~IP8021X_SUPP_INSTANCE_MASK) | ((inst & (IP8021X_MAX_SUPPS-1)) << IP8021X_SUPP_INSTANCE_SHIFT)) #define IP8021X_DECODE_SUPP_INSTANCE(word) ((((word) & IP8021X_SUPP_INSTANCE_MASK) >> IP8021X_SUPP_INSTANCE_SHIFT) & (IP8021X_MAX_SUPPS-1)) #define IP8021X_IPD_EVENT_LOGOFF 100 #define IP8021X_IPD_EVENT_DISCONNECT 101 #define IP8021X_IPD_EVENT_CONNECT 102 #define IP8021X_IPD_EVENT_GETSTATUS 103 #define IP8021X_IPD_EVENT_ADD 104 #define IP8021X_IPD_EVENT_DELETE 105 #define IP8021X_IPD_EVENT_LIST 106 #define IP8021X_IPD_EVENT_EAPCR 107 #define IP8021X_IPD_EVENT_PHYPORT_UP 108 #define IP8021X_IPD_EVENT_PHYPORT_DOWN 109 #define IP8021X_IPD_EVENT_MIC_ERR_PAIR 110 #define IP8021X_IPD_EVENT_MIC_ERR_GRP 111 #define IP8021X_IPD_EVENT_DATAMSG 112 #define IP8021X_IPD_EVENT_WPSON 113 /* Enable WPS mode */ #define IP8021X_IPD_EVENT_WPSOFF 114 /* Disable WPS mode */ #define IP8021X_IPD_EVENT_SEND_EAPOL_START 115 #define IP8021X_IPD_EVENT_AUTH_REG 116 /* Authenticator registration */ #define IP8021X_IPD_EVENT_AUTH_DEREG 117 /* Authenticator de-registration */ /* IPD data message subtypes */ #define IP8021X_IPD_DATAMSG_MIB_SUPP_CFG 1 #define IP8021X_IPD_DATAMSG_MIB_SUPP_STATS 2 #define IP8021X_IPD_DATAMSG_MIB_SUPP_HELD_PERIOD 3 #define IP8021X_IPD_DATAMSG_MIB_SUPP_AUTH_PERIOD 4 #define IP8021X_IPD_DATAMSG_MIB_SUPP_START_PERIOD 5 #define IP8021X_IPD_DATAMSG_MIB_SUPP_MAX_START 6 /* **************************************************************************** * 5 TYPES **************************************************************************** */ /* Forward declarations */ struct Ip8021x_ctx_st; struct Ip8021x_eapol_key_msg_st; /* *=========================================================================== * Ip8021x_pkt *=========================================================================== * This type represents an 802.1x packet */ typedef struct Ip8021x_pkt_st { int start; /* Index to first used byte */ int end; /* Index to first free byte */ int len; /* Length of allocated buffer */ int ref; /* No of references to this packet */ Ip_u8* buf; } Ip8021x_pkt; #ifdef IP8021X_USE_STATS /* *=========================================================================== * Ip8021x_stats *=========================================================================== * Supplicant statistic counters as defined in 802.1x */ typedef struct Ip8021x_stats_st { Ip_u32 eapol_frames_recv; Ip_u32 eapol_frames_tx; Ip_u32 eapol_start_frames_tx; Ip_u32 eapol_logoff_frames_tx; Ip_u32 eapol_resp_id_frames_tx; Ip_u32 eapol_resp_frames_tx; Ip_u32 eapol_req_frames_recv; Ip_u32 eapol_req_id_frames_recv; #ifdef IP8021X_AUTH_SUPPORT Ip_u32 eapol_req_id_frames_tx; Ip_u32 eapol_req_frames_tx; Ip_u32 eapol_resp_frames_recv; Ip_u32 eapol_resp_id_frames_recv; #endif Ip_u32 eapol_invalid_frames_recv; Ip_u32 eapol_length_error_frames_recv; Ip_u32 eapol_key_msg_drops; Ip_u32 eapol_key_msg_errors; Ip_u32 eapol_msg1_timeouts; Ip_u8 eapol_last_frame_version; Ip_u8 eapol_last_frame_source_addr[6]; Ip_u32 tkip_mic_errors; Ip_u32 tkip_cm_triggers; Ip_u32 deauth_reqs; Ip_u32 eapol_mic_error_report_sent; Ip_u32 eapol_mic_error_report_fail; } Ip8021x_stats; #endif typedef struct ip8021x_instance_info_st { Ip_u32 instance_id; /* Identifier for the specified ip8021x instance */ char ifname[IP8021X_IFNAMSIZ]; /* Interface name for the specified ip8021x instance */ Ip_u8 mac_addr[6]; /* Interface mac address for the specified ip8021x instance */ } ip8021x_instance_info; typedef struct Ip8021x_mib_supp_cfg_st { int supp_state; int auth_period; int held_period; int start_period; int max_start; } Ip8021x_mib_supp_cfg; #ifdef IP8021X_AUTH_SUPPORT /* external authenticator uses this message to register/deregister on an interface */ typedef struct ip8021x_auth_reg_st { char ifname[IP8021X_IFNAMSIZ]; /* interface */ void *assocCallback; /* callback for (dis)association indications */ void *assocCallbackParm; void *packetCallback; /* callback for incoming EAPOL packets */ void *packetCallbackParm; Ip_bool assocDereg; /* deregister association callback */ Ip_bool packetDereg; /* deregister packet callback */ } Ip8021x_auth_reg; #endif /* For processing MIB messages or * generic comms to the supplicant */ typedef struct Ip8021x_ipd_msg_st { /* This is an overlay struct. DO NOT MOVE THIS MEMBER! */ Ipcom_ipd_msg ipd_msg; int subtype; union { Ip8021x_mib_supp_cfg supp_cfg; #ifdef IP8021X_USE_STATS Ip8021x_stats supp_stats; #endif ip8021x_instance_info ip8021x_info; #ifdef IP8021X_AUTH_SUPPORT Ip8021x_auth_reg auth_reg; #endif } data; } Ip8021x_ipd_msg; /* **************************************************************************** * 6 FUNCTIONS **************************************************************************** */ /* *=========================================================================== * ip8021x_ctx_new *=========================================================================== * Description: * Allocate a new 802.1x context * Parameters: * Returns: * Pointer to a context * IP_NULL if no new context could be created */ IP_PUBLIC struct Ip8021x_ctx_st* ip8021x_ctx_new(void); /* *=========================================================================== * ip8021x_ctx_free *=========================================================================== * Description: * Free an 802.1x context * Parameters: * ctx - pointer to a context * Returns: * */ IP_PUBLIC void ip8021x_ctx_free(struct Ip8021x_ctx_st* ctx); /* *=========================================================================== * ip8021x_ctx_sock_init *=========================================================================== * Description: * Initialize the example implementation of the function callbacks, * based on packet sockets. * Parameters: * ctx - pointer to a context * Returns: * pointer to a function pointer structure. * IP_NULL is case of failure */ IP_PUBLIC struct Ip8021x_funcs_st* ip8021x_ctx_sock_init(struct Ip8021x_ctx_st* ctx); /* *=========================================================================== * ip8021x_wpa_psk_sta_init *=========================================================================== * Description: Initialize the 802.1x context for use in a wireless * environment, using WPA-PSK authentication. WPA-PSK * authentication is sometimes refered to as WPA Personal. * Parameters: * ctx - pointer to a context * Returns: * IPCOM_SUCCESS if the context was successfully initialized * < 0 if the initialization failed */ IP_PUBLIC Ip_err ip8021x_wpa_psk_sta_init(struct Ip8021x_ctx_st* ctx); /* *=========================================================================== * ip8021x_wpa2_psk_sta_init *=========================================================================== * Description: Initialize the 802.1x context for use in a wireless * environment, using WPA-PSK authentication. The key exchange * will be done according to IEEE 802.11i or WPA2. * Parameters: * ctx - pointer to a context * Returns: * IPCOM_SUCCESS if the context was successfully initialized * < 0 if the initialization failed */ IP_PUBLIC Ip_err ip8021x_wpa2_psk_sta_init(struct Ip8021x_ctx_st* ctx); /* *=========================================================================== * ip8021x_wpa_sta_init *=========================================================================== * Description: * Initialize the 802.1x context for use in a wireless environment, using * WPA authentication. WPA authentication is sometimes refered to as WPA * Enterprise. * Parameters: * ctx - pointer to a context * Returns: * IPCOM_SUCCESS if the context was successfully initialized * < 0 if the initialization failed * */ IP_PUBLIC Ip_err ip8021x_wpa_sta_init(struct Ip8021x_ctx_st* ctx); /* *=========================================================================== * ip8021x_wpa2_sta_init *=========================================================================== * Description: * Initialize the 802.1x context for use in a wireless environment, using * WPA authentication. The key exchange will be done according to * IEEE 802.11i or WPA2. * Parameters: * ctx - pointer to a context * Returns: * IPCOM_SUCCESS if the context was successfully initialized * < 0 if the initialization failed * */ IP_PUBLIC Ip_err ip8021x_wpa2_sta_init(struct Ip8021x_ctx_st* ctx); /* *=========================================================================== * ip8021x_wired_suppl_init *=========================================================================== * Description: * Initialize the 802.1x context for use in a wired environment. * Parameters: * ctx - pointer to a context * Returns: * IPCOM_SUCCESS if the context was successfully initialized * < 0 if the initialization failed */ IP_PUBLIC Ip_err ip8021x_wired_suppl_init(struct Ip8021x_ctx_st* ctx); /* *=========================================================================== * ip8021x_wps_suppl_init *=========================================================================== * Description: * Initialize the 802.1x context for use in a wps environment. * Parameters: * ctx - pointer to a context * Returns: * IPCOM_SUCCESS if the context was successfully initialized * < 0 if the initialization failed */ IP_PUBLIC Ip_err ip8021x_wps_suppl_init(struct Ip8021x_ctx_st* ctx); /* *=========================================================================== * ip8021x_ctx_set_callbacks *=========================================================================== * Description: * Setup the function callbacks for this context. * Parameters: * ctx - pointer to a context * Returns: * IPCOM_SUCCESS if the callbacks were successfully set * < 0 in case of failure */ IP_PUBLIC Ip_err ip8021x_ctx_set_callbacks(struct Ip8021x_ctx_st *ctx, struct Ip8021x_funcs_st* funcs); /* *=========================================================================== * ip8021x_ctx_set_if_name *=========================================================================== * Description: * Set the name of the interface this context shall be bound to. * Parameters: * ctx - pointer to the context * if_name - name of the interface that the context shall be bound to. * Returns: * IPCOM_SUCCESS if the interface name was successfully set. * < 0 if the name could not be set. */ IP_PUBLIC Ip_err ip8021x_ctx_set_if_name(struct Ip8021x_ctx_st* ctx, const char* if_name); /* *=========================================================================== * ip8021x_state_get *=========================================================================== * Description: * Returns the 802.1x state of this context * Parameters: * ctx - pointer to the context * Returns: * IP8021X_STATE_LOGOFF * IP8021X_STATE_DISCONNECTED * IP8021X_STATE_CONNECTING * IP8021X_STATE_ACQUIRED * IP8021X_STATE_AUTHENTICATING * IP8021X_STATE_HELD * IP8021X_STATE_AUTHENTICATED */ IP_PUBLIC int ip8021x_state_get(struct Ip8021x_ctx_st* ctx); /* *=========================================================================== * ip8021x_port_status_get *=========================================================================== * Description: * Returns the 802.1x state of this context * Parameters: * ctx - pointer to the context * Returns: * IP8021X_PORT_STATUS_AUTHORIZED * IP8021X_PORT_STATUS_UNAUTHORIZED */ IP_PUBLIC int ip8021x_port_status_get(struct Ip8021x_ctx_st* ctx); /* *=========================================================================== * ip8021x_cfg_get *=========================================================================== * Description: * Returns the supplicant configuration values as defined in IEEE 802.1x * Parameters: * ctx - pointer to the 802.1x context * supp_cfg - pointer to structure where the data will be written * Returns: * */ IP_PUBLIC void ip8021x_cfg_get(struct Ip8021x_ctx_st* ctx, Ip8021x_mib_supp_cfg* supp_cfg); #ifdef IP8021X_USE_STATS /* *=========================================================================== * ip8021x_stats_get *=========================================================================== * Description: * Returns the supplicant statistics counters as defined in IEEE 802.1x * Parameters: * ctx - pointer to the 802.1x context * stats - pointer to structure where the data will be written * Returns: * */ IP_PUBLIC void ip8021x_stats_get(struct Ip8021x_ctx_st* ctx, Ip8021x_stats* stats); #endif /* *=========================================================================== * ip8021x_pkt_input *=========================================================================== * Description: * Processes an incoming 802.1x packet. Any response packet that needs to * be sent will be sent by calling the output function pointer. * Parameters: * ctx - pointer to the 802.1x context * pkt - pointer to the packet that shall be processed. * Returns: * IP8021X_EAP_PENDING - an EAP authentication handshake is in progress. * IP8021X_DROPPED_PKT - packet dropped * IP8021X_EAP_SUCCESS - an EAP success message was received from the authenticator * IP8021X_EAP_FAILURE - an EAP failure message was received from the authenticator * IP8021X_KEY_MSG - an EAPOL key message was received from the authenticator */ IP_PUBLIC Ip_err ip8021x_pkt_input(struct Ip8021x_ctx_st *ctx, Ip8021x_pkt *pkt); /* *=========================================================================== * ip8021x_logoff *=========================================================================== * Description: * Sends an EAPOL logoff frame and sets the 802.1x context in state * IP8021X_STATE_LOGOFF which is transitioned to IP8021X_STATE_DISCONNECTED * Parameters: * ctx - pointer to the 802.1x context * Returns: * IPCOM_SUCCESS */ IP_PUBLIC Ip_err ip8021x_logoff(struct Ip8021x_ctx_st* ctx); /* *=========================================================================== * ip8021x_connecting *=========================================================================== * Description: * Sets the 802.1x context in state IP8021X_STATE_CONNECTING and sends an * EAPOL-START frame. This function is, for instance, called when the * link is up. * Parameters: * ctx - pointer to the 802.1x context * Returns: * IPCOM_SUCCESS */ IP_PUBLIC Ip_err ip8021x_connecting(struct Ip8021x_ctx_st* ctx); /* *=========================================================================== * ip8021x_disconnected *=========================================================================== * Sets the 802.1x context in state IP8021X_STATE_DISCONNECTED. This * function is, for instance, called when the link is down. * Parameters: * ctx - pointer to the 802.1x context * Returns: * IPCOM_SUCCESS */ IP_PUBLIC Ip_err ip8021x_disconnected(struct Ip8021x_ctx_st* ctx); #ifdef IPWPS /* *=========================================================================== * ip8021x_set_wps_mode *=========================================================================== * Description: * Enable/Disable WPS mode for a specific 8021x interface. * During WPS mode, the 8021x module doesn't invoke the IEEE 802.1X state * machine transitions and just behaves as a passthrough for EAPOL and EAP * packets. * * Parameters: * char *wps_if - 8021X interface to enable WPS on * Ip_bool on - IP_TRUE to enable (turn on WPS mode), * IP_FLASE to disable (turn it off). * char *wps_eap_id - (optional) EAP Identity to use when creating the EAP context * ONLY needed when WPS mode is being turned on. * If NULL, then no identity is set. * Ip_u32 *ip8021x_instance - Container for IP8021X instance corresponding to the * WPS interface (valid only upon success) * Ip_u8 *mac_addr - Ptr to buffer that will hold the Mac Address of the interface * corresponding to the ip8021x_instance. * Returns: * IPCOM_SUCCESS upon success, error indication otherwise */ IP_PUBLIC Ip_err ip8021x_set_wps_mode(char *wps_if, Ip_bool on, char *wps_eap_id, Ip_u32 *ip8021x_instance, Ip_u8 *mac_addr); #endif /* *=========================================================================== * ip8021x_send_eapol_start *=========================================================================== * Description: Ask the IP8021X module to send an EAPOL START (auth mode only). * Parameters: * Ip_u32 instance - IP8021X instance to send the EAPOL START. * Returns: * IPCOM_SUCCESS upon success, error indication otherwise */ IP_PUBLIC Ip_err ip8021x_send_eapol_start(Ip_u32 instance); #ifdef __cplusplus } #endif #endif /* **************************************************************************** * END OF FILE **************************************************************************** */