2008-09-25 02:13:14 +04:00
/*
* lib80211 . h - - common bits for IEEE802 .11 wireless drivers
*
* Copyright ( c ) 2008 , John W . Linville < linville @ tuxdriver . com >
*
2008-10-29 18:35:05 +03:00
* Some bits copied from old ieee80211 component , w / original copyright
* notices below :
*
* Original code based on Host AP ( software wireless LAN access point ) driver
* for Intersil Prism2 / 2.5 / 3.
*
* Copyright ( c ) 2001 - 2002 , SSH Communications Security Corp and Jouni Malinen
* < j @ w1 . fi >
* Copyright ( c ) 2002 - 2003 , Jouni Malinen < j @ w1 . fi >
*
* Adaption to a generic IEEE 802.11 stack by James Ketrenos
* < jketreno @ linux . intel . com >
*
* Copyright ( c ) 2004 , Intel Corporation
*
2008-09-25 02:13:14 +04:00
*/
# ifndef LIB80211_H
# define LIB80211_H
2008-10-29 18:35:05 +03:00
# include <linux/types.h>
# include <linux/list.h>
# include <linux/module.h>
# include <asm/atomic.h>
# include <linux/if.h>
# include <linux/skbuff.h>
2008-10-01 05:43:03 +04:00
# include <linux/ieee80211.h>
2008-11-19 10:37:43 +03:00
# include <linux/timer.h>
2008-10-01 04:59:05 +04:00
/* print_ssid() is intended to be used in debug (and possibly error)
2008-09-25 02:13:14 +04:00
* messages . It should never be used for passing ssid to user space . */
2008-10-01 04:59:05 +04:00
const char * print_ssid ( char * buf , const char * ssid , u8 ssid_len ) ;
2008-10-01 05:43:03 +04:00
# define DECLARE_SSID_BUF(var) char var[IEEE80211_MAX_SSID_LEN * 4 + 1] __maybe_unused
2008-09-25 02:13:14 +04:00
2008-10-29 18:35:05 +03:00
# define NUM_WEP_KEYS 4
enum {
IEEE80211_CRYPTO_TKIP_COUNTERMEASURES = ( 1 < < 0 ) ,
} ;
struct lib80211_crypto_ops {
const char * name ;
struct list_head list ;
/* init new crypto context (e.g., allocate private data space,
* select IV , etc . ) ; returns NULL on failure or pointer to allocated
* private data on success */
void * ( * init ) ( int keyidx ) ;
/* deinitialize crypto context and free allocated private data */
void ( * deinit ) ( void * priv ) ;
/* encrypt/decrypt return < 0 on error or >= 0 on success. The return
* value from decrypt_mpdu is passed as the keyidx value for
* decrypt_msdu . skb must have enough head and tail room for the
* encryption ; if not , error will be returned ; these functions are
* called for all MPDUs ( i . e . , fragments ) .
*/
int ( * encrypt_mpdu ) ( struct sk_buff * skb , int hdr_len , void * priv ) ;
int ( * decrypt_mpdu ) ( struct sk_buff * skb , int hdr_len , void * priv ) ;
/* These functions are called for full MSDUs, i.e. full frames.
* These can be NULL if full MSDU operations are not needed . */
int ( * encrypt_msdu ) ( struct sk_buff * skb , int hdr_len , void * priv ) ;
int ( * decrypt_msdu ) ( struct sk_buff * skb , int keyidx , int hdr_len ,
void * priv ) ;
int ( * set_key ) ( void * key , int len , u8 * seq , void * priv ) ;
int ( * get_key ) ( void * key , int len , u8 * seq , void * priv ) ;
/* procfs handler for printing out key information and possible
* statistics */
char * ( * print_stats ) ( char * p , void * priv ) ;
/* Crypto specific flag get/set for configuration settings */
unsigned long ( * get_flags ) ( void * priv ) ;
unsigned long ( * set_flags ) ( unsigned long flags , void * priv ) ;
/* maximum number of bytes added by encryption; encrypt buf is
* allocated with extra_prefix_len bytes , copy of in_buf , and
* extra_postfix_len ; encrypt need not use all this space , but
* the result must start at the beginning of the buffer and correct
* length must be returned */
int extra_mpdu_prefix_len , extra_mpdu_postfix_len ;
int extra_msdu_prefix_len , extra_msdu_postfix_len ;
struct module * owner ;
} ;
struct lib80211_crypt_data {
struct list_head list ; /* delayed deletion list */
struct lib80211_crypto_ops * ops ;
void * priv ;
atomic_t refcnt ;
} ;
struct lib80211_crypt_info {
char * name ;
/* Most clients will already have a lock,
so just point to that . */
spinlock_t * lock ;
struct lib80211_crypt_data * crypt [ NUM_WEP_KEYS ] ;
int tx_keyidx ; /* default TX key index (crypt[tx_keyidx]) */
struct list_head crypt_deinit_list ;
struct timer_list crypt_deinit_timer ;
int crypt_quiesced ;
} ;
2008-11-12 00:00:06 +03:00
int lib80211_crypt_info_init ( struct lib80211_crypt_info * info , char * name ,
spinlock_t * lock ) ;
void lib80211_crypt_info_free ( struct lib80211_crypt_info * info ) ;
2008-10-29 18:35:05 +03:00
int lib80211_register_crypto_ops ( struct lib80211_crypto_ops * ops ) ;
int lib80211_unregister_crypto_ops ( struct lib80211_crypto_ops * ops ) ;
struct lib80211_crypto_ops * lib80211_get_crypto_ops ( const char * name ) ;
void lib80211_crypt_deinit_entries ( struct lib80211_crypt_info * , int ) ;
void lib80211_crypt_deinit_handler ( unsigned long ) ;
void lib80211_crypt_delayed_deinit ( struct lib80211_crypt_info * info ,
struct lib80211_crypt_data * * crypt ) ;
void lib80211_crypt_quiescing ( struct lib80211_crypt_info * info ) ;
2008-09-25 02:13:14 +04:00
# endif /* LIB80211_H */