1526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/* 2526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * EAP peer: Method registration 3526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Copyright (c) 2004-2007, Jouni Malinen <j@w1.fi> 4526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 5526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * This program is free software; you can redistribute it and/or modify 6526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * it under the terms of the GNU General Public License version 2 as 7526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * published by the Free Software Foundation. 8526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 9526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Alternatively, this software may be distributed under the terms of BSD 10526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * license. 11526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 12526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * See README and COPYING for more details. 13526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 14526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 15526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "includes.h" 16526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_DYNAMIC_EAP_METHODS 17526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include <dlfcn.h> 18526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_DYNAMIC_EAP_METHODS */ 19526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 20526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "common.h" 21526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "eap_i.h" 22526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "eap_methods.h" 23526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 24526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 25526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic struct eap_method *eap_methods = NULL; 26526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 27526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 28526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 29526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eap_peer_get_eap_method - Get EAP method based on type number 30526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @vendor: EAP Vendor-Id (0 = IETF) 31526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @method: EAP type number 32526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: Pointer to EAP method or %NULL if not found 33526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 34526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtconst struct eap_method * eap_peer_get_eap_method(int vendor, EapType method) 35526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 36526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct eap_method *m; 37526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt for (m = eap_methods; m; m = m->next) { 38526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (m->vendor == vendor && m->method == method) 39526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return m; 40526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 41526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return NULL; 42526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 43526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 44526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 45526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 46526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eap_peer_get_type - Get EAP type for the given EAP method name 47526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @name: EAP method name, e.g., TLS 48526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @vendor: Buffer for returning EAP Vendor-Id 49526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: EAP method type or %EAP_TYPE_NONE if not found 50526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 51526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * This function maps EAP type names into EAP type numbers based on the list of 52526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * EAP methods included in the build. 53526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 54526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry ShmidtEapType eap_peer_get_type(const char *name, int *vendor) 55526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 56526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct eap_method *m; 57526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt for (m = eap_methods; m; m = m->next) { 58526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (os_strcmp(m->name, name) == 0) { 59526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *vendor = m->vendor; 60526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return m->method; 61526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 62526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 63526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *vendor = EAP_VENDOR_IETF; 64526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return EAP_TYPE_NONE; 65526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 66526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 67526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 68526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 69526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eap_get_name - Get EAP method name for the given EAP type 70526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @vendor: EAP Vendor-Id (0 = IETF) 71526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @type: EAP method type 72526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: EAP method name, e.g., TLS, or %NULL if not found 73526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 74526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * This function maps EAP type numbers into EAP type names based on the list of 75526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * EAP methods included in the build. 76526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 77526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtconst char * eap_get_name(int vendor, EapType type) 78526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 79526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct eap_method *m; 80526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt for (m = eap_methods; m; m = m->next) { 81526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (m->vendor == vendor && m->method == type) 82526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return m->name; 83526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 84526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return NULL; 85526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 86526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 87526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 88526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 89526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eap_get_names - Get space separated list of names for supported EAP methods 90526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @buf: Buffer for names 91526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @buflen: Buffer length 92526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: Number of characters written into buf (not including nul 93526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * termination) 94526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 95526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtsize_t eap_get_names(char *buf, size_t buflen) 96526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 97526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *pos, *end; 98526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct eap_method *m; 99526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int ret; 100526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 101526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (buflen == 0) 102526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 103526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 104526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos = buf; 105526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt end = pos + buflen; 106526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 107526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt for (m = eap_methods; m; m = m->next) { 108526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "%s%s", 109526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt m == eap_methods ? "" : " ", m->name); 110526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 111526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt break; 112526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 113526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 114526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt buf[buflen - 1] = '\0'; 115526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 116526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 117526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 118526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 119526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 120526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 121526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eap_get_names_as_string_array - Get supported EAP methods as string array 122526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @num: Buffer for returning the number of items in array, not including %NULL 123526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * terminator. This parameter can be %NULL if the length is not needed. 124526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: A %NULL-terminated array of strings, or %NULL on error. 125526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 126526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * This function returns the list of names for all supported EAP methods as an 127526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * array of strings. The caller must free the returned array items and the 128526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * array. 129526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 130526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtchar ** eap_get_names_as_string_array(size_t *num) 131526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 132526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct eap_method *m; 133526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt size_t array_len = 0; 134526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char **array; 135526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int i = 0, j; 136526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 137526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt for (m = eap_methods; m; m = m->next) 138526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt array_len++; 139526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 140526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt array = os_zalloc(sizeof(char *) * (array_len + 1)); 141526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (array == NULL) 142526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return NULL; 143526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 144526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt for (m = eap_methods; m; m = m->next) { 145526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt array[i++] = os_strdup(m->name); 146526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (array[i - 1] == NULL) { 147526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt for (j = 0; j < i; j++) 148526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_free(array[j]); 149526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_free(array); 150526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return NULL; 151526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 152526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 153526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt array[i] = NULL; 154526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 155526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (num) 156526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *num = array_len; 157526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 158526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return array; 159526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 160526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 161526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 162526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 163526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eap_peer_get_methods - Get a list of enabled EAP peer methods 164526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @count: Set to number of available methods 165526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: List of enabled EAP peer methods 166526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 167526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtconst struct eap_method * eap_peer_get_methods(size_t *count) 168526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 169526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int c = 0; 170526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct eap_method *m; 171526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 172526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt for (m = eap_methods; m; m = m->next) 173526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt c++; 174526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 175526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *count = c; 176526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return eap_methods; 177526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 178526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 179526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 180526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_DYNAMIC_EAP_METHODS 181526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 182526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eap_peer_method_load - Load a dynamic EAP method library (shared object) 183526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @so: File path for the shared object file to load 184526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: 0 on success, -1 on failure 185526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 186526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint eap_peer_method_load(const char *so) 187526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 188526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt void *handle; 189526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int (*dyn_init)(void); 190526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int ret; 191526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 192526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt handle = dlopen(so, RTLD_LAZY); 193526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (handle == NULL) { 194526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_ERROR, "EAP: Failed to open dynamic EAP method " 195526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "'%s': %s", so, dlerror()); 196526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 197526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 198526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 199526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt dyn_init = dlsym(handle, "eap_peer_method_dynamic_init"); 200526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (dyn_init == NULL) { 201526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt dlclose(handle); 202526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_ERROR, "EAP: Invalid EAP method '%s' - no " 203526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "eap_peer_method_dynamic_init()", so); 204526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 205526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 206526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 207526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = dyn_init(); 208526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret) { 209526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt dlclose(handle); 210526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_ERROR, "EAP: Failed to add EAP method '%s' - " 211526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ret %d", so, ret); 212526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return ret; 213526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 214526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 215526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt /* Store the handle for this shared object. It will be freed with 216526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * dlclose() when the EAP method is unregistered. */ 217526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eap_methods->dl_handle = handle; 218526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 219526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "EAP: Loaded dynamic EAP method: '%s'", so); 220526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 221526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 222526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 223526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 224526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 225526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 226526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eap_peer_method_unload - Unload a dynamic EAP method library (shared object) 227526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @method: Pointer to the dynamically loaded EAP method 228526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: 0 on success, -1 on failure 229526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 230526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * This function can be used to unload EAP methods that have been previously 231526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * loaded with eap_peer_method_load(). Before unloading the method, all 232526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * references to the method must be removed to make sure that no dereferences 233526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * of freed memory will occur after unloading. 234526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 235526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint eap_peer_method_unload(struct eap_method *method) 236526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 237526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct eap_method *m, *prev; 238526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt void *handle; 239526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 240526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt m = eap_methods; 241526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt prev = NULL; 242526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt while (m) { 243526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (m == method) 244526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt break; 245526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt prev = m; 246526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt m = m->next; 247526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 248526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 249526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (m == NULL || m->dl_handle == NULL) 250526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 251526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 252526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (prev) 253526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt prev->next = m->next; 254526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt else 255526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eap_methods = m->next; 256526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 257526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt handle = m->dl_handle; 258526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 259526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (m->free) 260526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt m->free(m); 261526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt else 262526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eap_peer_method_free(m); 263526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 264526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt dlclose(handle); 265526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 266526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 267526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 268526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_DYNAMIC_EAP_METHODS */ 269526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 270526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 271526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 272526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eap_peer_method_alloc - Allocate EAP peer method structure 273526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @version: Version of the EAP peer method interface (set to 274526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * EAP_PEER_METHOD_INTERFACE_VERSION) 275526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @vendor: EAP Vendor-ID (EAP_VENDOR_*) (0 = IETF) 276526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @method: EAP type number (EAP_TYPE_*) 277526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @name: Name of the method (e.g., "TLS") 278526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: Allocated EAP method structure or %NULL on failure 279526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 280526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * The returned structure should be freed with eap_peer_method_free() when it 281526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * is not needed anymore. 282526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 283526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstruct eap_method * eap_peer_method_alloc(int version, int vendor, 284526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt EapType method, const char *name) 285526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 286526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct eap_method *eap; 287526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eap = os_zalloc(sizeof(*eap)); 288526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (eap == NULL) 289526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return NULL; 290526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eap->version = version; 291526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eap->vendor = vendor; 292526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eap->method = method; 293526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eap->name = name; 294526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return eap; 295526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 296526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 297526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 298526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 299526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eap_peer_method_free - Free EAP peer method structure 300526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @method: Method structure allocated with eap_peer_method_alloc() 301526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 302526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid eap_peer_method_free(struct eap_method *method) 303526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 304526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_free(method); 305526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 306526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 307526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 308526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 309526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eap_peer_method_register - Register an EAP peer method 310526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @method: EAP method to register 311526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: 0 on success, -1 on invalid method, or -2 if a matching EAP method 312526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * has already been registered 313526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 314526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Each EAP peer method needs to call this function to register itself as a 315526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * supported EAP method. 316526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 317526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint eap_peer_method_register(struct eap_method *method) 318526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 319526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct eap_method *m, *last = NULL; 320526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 321526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (method == NULL || method->name == NULL || 322526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt method->version != EAP_PEER_METHOD_INTERFACE_VERSION) 323526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 324526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 325526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt for (m = eap_methods; m; m = m->next) { 326526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if ((m->vendor == method->vendor && 327526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt m->method == method->method) || 328526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_strcmp(m->name, method->name) == 0) 329526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -2; 330526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt last = m; 331526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 332526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 333526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (last) 334526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt last->next = method; 335526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt else 336526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eap_methods = method; 337526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 338526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 339526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 340526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 341526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 342526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 343526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eap_peer_register_methods - Register statically linked EAP peer methods 344526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: 0 on success, -1 on failure 345526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 346526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * This function is called at program initialization to register all EAP peer 347526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * methods that were linked in statically. 348526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 349526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint eap_peer_register_methods(void) 350526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 351526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int ret = 0; 352526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 353526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_MD5 354526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret == 0) { 355526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int eap_peer_md5_register(void); 356526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = eap_peer_md5_register(); 357526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 358526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_MD5 */ 359526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 360526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_TLS 361526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret == 0) { 362526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int eap_peer_tls_register(void); 363526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = eap_peer_tls_register(); 364526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 365526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_TLS */ 366526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 367526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_MSCHAPv2 368526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret == 0) { 369526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int eap_peer_mschapv2_register(void); 370526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = eap_peer_mschapv2_register(); 371526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 372526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_MSCHAPv2 */ 373526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 374526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_PEAP 375526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret == 0) { 376526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int eap_peer_peap_register(void); 377526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = eap_peer_peap_register(); 378526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 379526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_PEAP */ 380526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 381526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_TTLS 382526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret == 0) { 383526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int eap_peer_ttls_register(void); 384526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = eap_peer_ttls_register(); 385526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 386526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_TTLS */ 387526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 388526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_GTC 389526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret == 0) { 390526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int eap_peer_gtc_register(void); 391526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = eap_peer_gtc_register(); 392526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 393526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_GTC */ 394526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 395526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_OTP 396526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret == 0) { 397526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int eap_peer_otp_register(void); 398526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = eap_peer_otp_register(); 399526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 400526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_OTP */ 401526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 402526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_SIM 403526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret == 0) { 404526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int eap_peer_sim_register(void); 405526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = eap_peer_sim_register(); 406526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 407526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_SIM */ 408526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 409526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_LEAP 410526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret == 0) { 411526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int eap_peer_leap_register(void); 412526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = eap_peer_leap_register(); 413526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 414526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_LEAP */ 415526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 416526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_PSK 417526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret == 0) { 418526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int eap_peer_psk_register(void); 419526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = eap_peer_psk_register(); 420526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 421526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_PSK */ 422526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 423526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_AKA 424526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret == 0) { 425526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int eap_peer_aka_register(void); 426526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = eap_peer_aka_register(); 427526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 428526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_AKA */ 429526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 430526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_AKA_PRIME 431526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret == 0) { 432526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int eap_peer_aka_prime_register(void); 433526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = eap_peer_aka_prime_register(); 434526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 435526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_AKA_PRIME */ 436526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 437526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_FAST 438526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret == 0) { 439526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int eap_peer_fast_register(void); 440526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = eap_peer_fast_register(); 441526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 442526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_FAST */ 443526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 444526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_PAX 445526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret == 0) { 446526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int eap_peer_pax_register(void); 447526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = eap_peer_pax_register(); 448526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 449526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_PAX */ 450526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 451526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_SAKE 452526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret == 0) { 453526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int eap_peer_sake_register(void); 454526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = eap_peer_sake_register(); 455526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 456526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_SAKE */ 457526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 458526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_GPSK 459526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret == 0) { 460526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int eap_peer_gpsk_register(void); 461526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = eap_peer_gpsk_register(); 462526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 463526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_GPSK */ 464526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 465526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_WSC 466526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret == 0) { 467526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int eap_peer_wsc_register(void); 468526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = eap_peer_wsc_register(); 469526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 470526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_WSC */ 471526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 472526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_IKEV2 473526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret == 0) { 474526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int eap_peer_ikev2_register(void); 475526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = eap_peer_ikev2_register(); 476526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 477526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_IKEV2 */ 478526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 479526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_VENDOR_TEST 480526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret == 0) { 481526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int eap_peer_vendor_test_register(void); 482526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = eap_peer_vendor_test_register(); 483526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 484526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_VENDOR_TEST */ 485526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 486526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_TNC 487526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret == 0) { 488526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int eap_peer_tnc_register(void); 489526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = eap_peer_tnc_register(); 490526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 491526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_TNC */ 492526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 493526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return ret; 494526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 495526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 496526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 497526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 498526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eap_peer_unregister_methods - Unregister EAP peer methods 499526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 500526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * This function is called at program termination to unregister all EAP peer 501526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * methods. 502526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 503526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid eap_peer_unregister_methods(void) 504526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 505526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct eap_method *m; 506526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_DYNAMIC_EAP_METHODS 507526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt void *handle; 508526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_DYNAMIC_EAP_METHODS */ 509526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 510526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt while (eap_methods) { 511526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt m = eap_methods; 512526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eap_methods = eap_methods->next; 513526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 514526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_DYNAMIC_EAP_METHODS 515526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt handle = m->dl_handle; 516526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_DYNAMIC_EAP_METHODS */ 517526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 518526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (m->free) 519526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt m->free(m); 520526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt else 521526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eap_peer_method_free(m); 522526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 523526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_DYNAMIC_EAP_METHODS 524526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (handle) 525526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt dlclose(handle); 526526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_DYNAMIC_EAP_METHODS */ 527526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 528526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 529