1/* 2 * Original code based on Host AP (software wireless LAN access point) driver 3 * for Intersil Prism2/2.5/3. 4 * 5 * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen 6 * <jkmaline@cc.hut.fi> 7 * Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi> 8 * 9 * Adaption to a generic IEEE 802.11 stack by James Ketrenos 10 * <jketreno@linux.intel.com> 11 * 12 * Copyright (c) 2004, Intel Corporation 13 * 14 * This program is free software; you can redistribute it and/or modify 15 * it under the terms of the GNU General Public License version 2 as 16 * published by the Free Software Foundation. See README and COPYING for 17 * more details. 18 */ 19 20/* 21 * This file defines the interface to the ieee80211 crypto module. 22 */ 23#ifndef IEEE80211_CRYPT_H 24#define IEEE80211_CRYPT_H 25 26#include <linux/skbuff.h> 27 28struct ieee80211_crypto_ops { 29 const char *name; 30 31 /* init new crypto context (e.g., allocate private data space, 32 * select IV, etc.); returns NULL on failure or pointer to allocated 33 * private data on success 34 */ 35 void * (*init)(int keyidx); 36 37 /* deinitialize crypto context and free allocated private data */ 38 void (*deinit)(void *priv); 39 40 /* encrypt/decrypt return < 0 on error or >= 0 on success. The return 41 * value from decrypt_mpdu is passed as the keyidx value for 42 * decrypt_msdu. skb must have enough head and tail room for the 43 * encryption; if not, error will be returned; these functions are 44 * called for all MPDUs (i.e., fragments). 45 */ 46 int (*encrypt_mpdu)(struct sk_buff *skb, int hdr_len, void *priv); 47 int (*decrypt_mpdu)(struct sk_buff *skb, int hdr_len, void *priv); 48 49 /* These functions are called for full MSDUs, i.e. full frames. 50 * These can be NULL if full MSDU operations are not needed. 51 */ 52 int (*encrypt_msdu)(struct sk_buff *skb, int hdr_len, void *priv); 53 int (*decrypt_msdu)(struct sk_buff *skb, int keyidx, int hdr_len, 54 void *priv); 55 56 int (*set_key)(void *key, int len, u8 *seq, void *priv); 57 int (*get_key)(void *key, int len, u8 *seq, void *priv); 58 59 /* procfs handler for printing out key information and possible 60 * statistics 61 */ 62 char * (*print_stats)(char *p, void *priv); 63 64 /* maximum number of bytes added by encryption; encrypt buf is 65 * allocated with extra_prefix_len bytes, copy of in_buf, and 66 * extra_postfix_len; encrypt need not use all this space, but 67 * the result must start at the beginning of the buffer and correct 68 * length must be returned 69 */ 70 int extra_prefix_len, extra_postfix_len; 71 72 struct module *owner; 73}; 74 75struct ieee80211_crypt_data { 76 struct list_head list; /* delayed deletion list */ 77 struct ieee80211_crypto_ops *ops; 78 void *priv; 79 atomic_t refcnt; 80}; 81 82int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops); 83int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops); 84struct ieee80211_crypto_ops *ieee80211_get_crypto_ops(const char *name); 85void ieee80211_crypt_deinit_entries(struct ieee80211_device *ieee, int force); 86void ieee80211_crypt_deinit_handler(unsigned long data); 87void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, 88 struct ieee80211_crypt_data **crypt); 89 90#endif 91