You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
freshtomato-arm/release/src-rt-6.x.4708/router/eapd_arm/eapd.h

274 lines
9.0 KiB
C

/*
* Broadcom EAP dispatcher (EAPD) module include file
*
* Copyright (C) 2013, Broadcom Corporation
* All Rights Reserved.
*
* This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation;
* the contents of this file may not be disclosed to third parties, copied
* or duplicated in any form, in whole or in part, without the prior
* written permission of Broadcom Corporation.
*
* $Id: eapd.h 409124 2013-06-22 04:35:15Z $
*/
#ifndef _EAPD_H_
#define _EAPD_H_
#include <typedefs.h>
#include <proto/ethernet.h>
#include <wlioctl.h>
#ifndef EAPD_WKSP_AUTO_CONFIG
#define EAPD_WKSP_AUTO_CONFIG 1
#endif
/* Message levels */
#define EAPD_ERROR_VAL 0x00000001
#define EAPD_INFO_VAL 0x00000002
extern uint eapd_msg_level;
#define EAPDBANNER(fmt, arg...) do { \
printf(" EAPD>> %s(%d): "fmt, __FUNCTION__, __LINE__ , ##arg);} while (0)
#define EAPD_ERROR(fmt, arg...)
#define EAPD_INFO(fmt, arg...)
#define EAPD_PRINT(fmt, arg...) printf(fmt , ##arg)
#define EAPD_WKSP_FLAG_SHUTDOWN 0x1
#define EAPD_WKSP_FLAG_DUMP 0x2
#define EAPD_WKSP_RECV_DATA_MAX_LEN 4096
#define EAPD_WKSP_MIN_CMD_LINE_ARGS 16
#define EAPD_WKSP_MAX_CMD_LINE_ARGS 128
#define EAPD_WKSP_MAX_NO_BRIDGE 256
#define EAPD_WKSP_MAX_NO_BRCM 58
#define EAPD_WKSP_MAX_NO_IFNAMES 66
#define EAPD_WKSP_MAX_SUPPLICANTS 128
/* Supplicant cache */
#define EAPD_PAE_HASH(ea) \
((((unsigned char *) ea)[3] ^ ((unsigned char *) ea)[4] ^ ((unsigned char *) ea)[5]) & \
(EAPD_WKSP_MAX_SUPPLICANTS - 1))
typedef struct eapd_sta {
bool used; /* flags use of item */
time_t last_use; /* use timestamp */
struct eapd_sta *next;
struct ether_addr ea; /* STA's ethernet address */
struct ether_addr bssid; /* wl if hwaddr which sta comes in */
char ifname[IFNAMSIZ];
ushort pae_state;
ushort pae_id;
uint32 mode; /* Authentication mode */
uint8 eapol_version; /* eapol version */
} eapd_sta_t;
typedef struct eapd_socket {
char ifname[IFNAMSIZ];
int drvSocket; /* raw socket to communicate with driver */
int ifindex;
int inuseCount;
int flag;
} eapd_brcm_socket_t, eapd_preauth_socket_t;
typedef struct eapd_cb {
char ifname[IFNAMSIZ];
int flags;
eapd_brcm_socket_t *brcmSocket;
eapd_preauth_socket_t preauthSocket; /* only need by NAS */
struct eapd_cb *next;
} eapd_cb_t;
typedef struct eapd_app {
char ifnames[IFNAMSIZ * EAPD_WKSP_MAX_NO_IFNAMES]; /* interface names */
int appSocket; /* loopback socket to communicate with application */
uchar bitvec[WL_EVENTING_MASK_LEN]; /* for each application which need brcmevent */
eapd_cb_t *cb; /* for each interface which running application */
} eapd_app_t, eapd_wps_t, eapd_nas_t, eapd_ses_t, eapd_wai_t, eapd_dcs_t, eapd_mevent_t, eapd_bsd_t;
typedef struct eapd_wksp {
uchar packet[EAPD_WKSP_RECV_DATA_MAX_LEN];
int brcmSocketCount;
eapd_brcm_socket_t brcmSocket[EAPD_WKSP_MAX_NO_BRCM];
eapd_sta_t sta[EAPD_WKSP_MAX_SUPPLICANTS];
eapd_sta_t *sta_hashed[EAPD_WKSP_MAX_SUPPLICANTS];
eapd_wps_t wps;
eapd_nas_t nas;
eapd_ses_t ses;
eapd_wai_t wai;
eapd_dcs_t dcs;
eapd_mevent_t mevent;
eapd_bsd_t bsd;
int flags;
fd_set fdset;
int fdmax;
int difSocket; /* socket to receive dynamic interface events */
} eapd_wksp_t;
typedef enum {
EAPD_SEARCH_ONLY = 0,
EAPD_SEARCH_ENTER
} eapd_lookup_mode_t;
typedef enum {
EAPD_STA_MODE_UNKNOW = 0,
EAPD_STA_MODE_WPS,
EAPD_STA_MODE_WPS_ENR,
EAPD_STA_MODE_SES,
EAPD_STA_MODE_NAS,
EAPD_STA_MODE_NAS_PSK,
EAPD_STA_MODE_WAI
} eapd_sta_mode_t;
typedef enum {
EAPD_APP_UNKNOW = 0,
EAPD_APP_WPS,
EAPD_APP_SES,
EAPD_APP_NAS,
EAPD_APP_WAI,
EAPD_APP_DCS,
EAPD_APP_MEVENT,
EAPD_APP_BSD
} eapd_app_mode_t;
/* PAE states */
typedef enum {
EAPD_INITIALIZE = 0,
EAPD_IDENTITY
} eapd_pae_state_t;
/* EAPD interface application capability */
#define EAPD_CAP_SES 0x1
#define EAPD_CAP_NAS 0x2
#define EAPD_CAP_WPS 0x4
#define EAPD_CAP_WAI 0x8
#define EAPD_CAP_DCS 0x10
#define EAPD_CAP_MEVENT 0x20
#define EAPD_CAP_BSD 0x40
/* Apps */
int wps_app_init(eapd_wksp_t *nwksp);
int wps_app_deinit(eapd_wksp_t *nwksp);
int wps_app_monitor_sendup(eapd_wksp_t *nwksp, uint8 *pData, int Len, char *from);
#if EAPD_WKSP_AUTO_CONFIG
int wps_app_enabled(char *name);
#endif
void wps_app_set_eventmask(eapd_app_t *app);
int wps_app_handle_event(eapd_wksp_t *nwksp, uint8 *pData, int Len, char *from);
void wps_app_recv_handler(eapd_wksp_t *nwksp, char *wlifname, eapd_cb_t *from,
uint8 *pData, int *pLen, struct ether_addr *ap_ea);
int ses_app_init(eapd_wksp_t *nwksp);
int ses_app_deinit(eapd_wksp_t *nwksp);
int ses_app_sendup(eapd_wksp_t *nwksp, uint8 *pData, int pLen, char *fromlan);
#if EAPD_WKSP_AUTO_CONFIG
int ses_app_enabled(char *name);
#endif
void ses_app_set_eventmask(eapd_app_t *app);
int ses_app_handle_event(eapd_wksp_t *nwksp, uint8 *pData, int Len, char *from);
void ses_app_recv_handler(eapd_wksp_t *nwksp, char *wlifname, eapd_cb_t *from,
uint8 *pData, int *pLen);
int nas_app_init(eapd_wksp_t *nwksp);
int nas_app_deinit(eapd_wksp_t *nwksp);
int nas_app_sendup(eapd_wksp_t *nwksp, uint8 *pData, int pLen, char *fromlan);
#if EAPD_WKSP_AUTO_CONFIG
int nas_app_enabled(char *name);
#endif
void nas_app_set_eventmask(eapd_app_t *app);
int nas_app_handle_event(eapd_wksp_t *nwksp, uint8 *pData, int Len, char *from);
void nas_app_recv_handler(eapd_wksp_t *nwksp, char *wlifname, eapd_cb_t *from,
uint8 *pData, int *pLen);
int nas_open_dif_sockets(eapd_wksp_t *nwksp, eapd_cb_t *cb);
void nas_close_dif_sockets(eapd_wksp_t *nwksp, eapd_cb_t *cb);
int wai_app_init(eapd_wksp_t *nwksp);
int wai_app_deinit(eapd_wksp_t *nwksp);
int wai_app_sendup(eapd_wksp_t *nwksp, uint8 *pData, int pLen, char *fromlan);
#if EAPD_WKSP_AUTO_CONFIG
int wai_app_enabled(char *name);
#endif
void wai_app_set_eventmask(eapd_app_t *app);
int wai_app_handle_event(eapd_wksp_t *nwksp, uint8 *pData, int Len, char *from);
void wai_app_recv_handler(eapd_wksp_t *nwksp, eapd_cb_t *from, uint8 *pData, int *pLen);
#ifdef BCM_DCS
int dcs_app_init(eapd_wksp_t *nwksp);
int dcs_app_deinit(eapd_wksp_t *nwksp);
int dcs_app_sendup(eapd_wksp_t *nwksp, uint8 *pData, int pLen, char *fromlan);
#if EAPD_WKSP_AUTO_CONFIG
int dcs_app_enabled(char *name);
#endif
void dcs_app_set_eventmask(eapd_app_t *app);
int dcs_app_handle_event(eapd_wksp_t *nwksp, uint8 *pData, int Len, char *from);
void dcs_app_recv_handler(eapd_wksp_t *nwksp, eapd_cb_t *from,
uint8 *pData, int *pLen);
#endif /* BCM_DCS */
#ifdef BCM_MEVENT
int mevent_app_init(eapd_wksp_t *nwksp);
int mevent_app_deinit(eapd_wksp_t *nwksp);
int mevent_app_sendup(eapd_wksp_t *nwksp, uint8 *pData, int pLen, char *fromlan);
#if EAPD_WKSP_AUTO_CONFIG
int mevent_app_enabled(char *name);
#endif
void mevent_app_set_eventmask(eapd_app_t *app);
int mevent_app_handle_event(eapd_wksp_t *nwksp, uint8 *pData, int Len, char *from);
void mevent_app_recv_handler(eapd_wksp_t *nwksp, eapd_cb_t *from,
uint8 *pData, int *pLen);
#endif /* BCM_MEVENT */
#ifdef BCM_BSD
int bsd_app_init(eapd_wksp_t *nwksp);
int bsd_app_deinit(eapd_wksp_t *nwksp);
int bsd_app_sendup(eapd_wksp_t *nwksp, uint8 *pData, int pLen, char *fromlan);
#if EAPD_WKSP_AUTO_CONFIG
int bsd_app_enabled(char *name);
#endif
void bsd_app_set_eventmask(eapd_app_t *app);
int bsd_app_handle_event(eapd_wksp_t *nwksp, uint8 *pData, int Len, char *from);
void bsd_app_recv_handler(eapd_wksp_t *nwksp, eapd_cb_t *from,
uint8 *pData, int *pLen);
#endif /* BCM_BSD */
/* OS independent function */
void eapd_wksp_display_usage(void);
eapd_wksp_t * eapd_wksp_alloc_workspace(void);
int eapd_wksp_auto_config(eapd_wksp_t *nwksp);
int eapd_wksp_parse_cmd(int argc, char *argv[], eapd_wksp_t *nwksp);
int eapd_wksp_init(eapd_wksp_t *nwksp);
void eapd_wksp_dispatch(eapd_wksp_t *nwksp);
int eapd_wksp_deinit(eapd_wksp_t *nwksp);
void eapd_wksp_free_workspace(eapd_wksp_t * nwksp);
int eapd_wksp_main_loop(eapd_wksp_t *nwksp);
void eapd_wksp_cleanup(eapd_wksp_t *nwksp);
void eapd_wksp_clear_inited(void);
int eapd_wksp_is_inited(void);
eapd_sta_t* sta_lookup(eapd_wksp_t *nwksp, struct ether_addr *sta_ea, struct ether_addr *bssid_ea,
char *ifname, eapd_lookup_mode_t mode);
void sta_remove(eapd_wksp_t *nwksp, eapd_sta_t *sta);
eapd_brcm_socket_t* eapd_add_brcm(eapd_wksp_t *nwksp, char *ifname);
int eapd_del_brcm(eapd_wksp_t *nwksp, eapd_brcm_socket_t *sock);
eapd_brcm_socket_t* eapd_find_brcm(eapd_wksp_t *nwksp, char *ifname);
void eapd_brcm_recv_handler(eapd_wksp_t *nwksp, eapd_brcm_socket_t *from, uint8 *pData, int *pLen);
extern void eapd_preauth_recv_handler(eapd_wksp_t *nwksp, char *from, uint8 *pData, int *pLen);
/* OS dependent function */
void eapd_eapol_canned_send(eapd_wksp_t *nwksp, struct eapd_socket *Socket, eapd_sta_t *sta,
unsigned char code, unsigned char type);
void eapd_message_send(eapd_wksp_t *nwksp, struct eapd_socket *Socket, uint8 *pData, int pLen);
int eapd_brcm_open(eapd_wksp_t *nwksp, eapd_brcm_socket_t *sock);
int eapd_brcm_close(int drvSocket);
int eapd_preauth_open(eapd_wksp_t *nwksp, eapd_preauth_socket_t *sock);
int eapd_preauth_close(int drvSocket);
int eapd_safe_get_conf(char *outval, int outval_size, char *name);
size_t eapd_message_read(int fd, void *buf, size_t nbytes);
#endif /* _EAPD_H_ */