139beb93cSSam Leffler /* 239beb93cSSam Leffler * EAP peer: Method registration 339beb93cSSam Leffler * Copyright (c) 2004-2007, Jouni Malinen <j@w1.fi> 439beb93cSSam Leffler * 539beb93cSSam Leffler * This program is free software; you can redistribute it and/or modify 639beb93cSSam Leffler * it under the terms of the GNU General Public License version 2 as 739beb93cSSam Leffler * published by the Free Software Foundation. 839beb93cSSam Leffler * 939beb93cSSam Leffler * Alternatively, this software may be distributed under the terms of BSD 1039beb93cSSam Leffler * license. 1139beb93cSSam Leffler * 1239beb93cSSam Leffler * See README and COPYING for more details. 1339beb93cSSam Leffler */ 1439beb93cSSam Leffler 1539beb93cSSam Leffler #include "includes.h" 1639beb93cSSam Leffler #ifdef CONFIG_DYNAMIC_EAP_METHODS 1739beb93cSSam Leffler #include <dlfcn.h> 1839beb93cSSam Leffler #endif /* CONFIG_DYNAMIC_EAP_METHODS */ 1939beb93cSSam Leffler 2039beb93cSSam Leffler #include "common.h" 2139beb93cSSam Leffler #include "eap_i.h" 2239beb93cSSam Leffler #include "eap_methods.h" 2339beb93cSSam Leffler 2439beb93cSSam Leffler 2539beb93cSSam Leffler static struct eap_method *eap_methods = NULL; 2639beb93cSSam Leffler 2739beb93cSSam Leffler 2839beb93cSSam Leffler /** 2939beb93cSSam Leffler * eap_peer_get_eap_method - Get EAP method based on type number 3039beb93cSSam Leffler * @vendor: EAP Vendor-Id (0 = IETF) 3139beb93cSSam Leffler * @method: EAP type number 3239beb93cSSam Leffler * Returns: Pointer to EAP method or %NULL if not found 3339beb93cSSam Leffler */ 3439beb93cSSam Leffler const struct eap_method * eap_peer_get_eap_method(int vendor, EapType method) 3539beb93cSSam Leffler { 3639beb93cSSam Leffler struct eap_method *m; 3739beb93cSSam Leffler for (m = eap_methods; m; m = m->next) { 3839beb93cSSam Leffler if (m->vendor == vendor && m->method == method) 3939beb93cSSam Leffler return m; 4039beb93cSSam Leffler } 4139beb93cSSam Leffler return NULL; 4239beb93cSSam Leffler } 4339beb93cSSam Leffler 4439beb93cSSam Leffler 4539beb93cSSam Leffler /** 4639beb93cSSam Leffler * eap_peer_get_type - Get EAP type for the given EAP method name 4739beb93cSSam Leffler * @name: EAP method name, e.g., TLS 4839beb93cSSam Leffler * @vendor: Buffer for returning EAP Vendor-Id 4939beb93cSSam Leffler * Returns: EAP method type or %EAP_TYPE_NONE if not found 5039beb93cSSam Leffler * 5139beb93cSSam Leffler * This function maps EAP type names into EAP type numbers based on the list of 5239beb93cSSam Leffler * EAP methods included in the build. 5339beb93cSSam Leffler */ 5439beb93cSSam Leffler EapType eap_peer_get_type(const char *name, int *vendor) 5539beb93cSSam Leffler { 5639beb93cSSam Leffler struct eap_method *m; 5739beb93cSSam Leffler for (m = eap_methods; m; m = m->next) { 5839beb93cSSam Leffler if (os_strcmp(m->name, name) == 0) { 5939beb93cSSam Leffler *vendor = m->vendor; 6039beb93cSSam Leffler return m->method; 6139beb93cSSam Leffler } 6239beb93cSSam Leffler } 6339beb93cSSam Leffler *vendor = EAP_VENDOR_IETF; 6439beb93cSSam Leffler return EAP_TYPE_NONE; 6539beb93cSSam Leffler } 6639beb93cSSam Leffler 6739beb93cSSam Leffler 6839beb93cSSam Leffler /** 6939beb93cSSam Leffler * eap_get_name - Get EAP method name for the given EAP type 7039beb93cSSam Leffler * @vendor: EAP Vendor-Id (0 = IETF) 7139beb93cSSam Leffler * @type: EAP method type 7239beb93cSSam Leffler * Returns: EAP method name, e.g., TLS, or %NULL if not found 7339beb93cSSam Leffler * 7439beb93cSSam Leffler * This function maps EAP type numbers into EAP type names based on the list of 7539beb93cSSam Leffler * EAP methods included in the build. 7639beb93cSSam Leffler */ 7739beb93cSSam Leffler const char * eap_get_name(int vendor, EapType type) 7839beb93cSSam Leffler { 7939beb93cSSam Leffler struct eap_method *m; 8039beb93cSSam Leffler for (m = eap_methods; m; m = m->next) { 8139beb93cSSam Leffler if (m->vendor == vendor && m->method == type) 8239beb93cSSam Leffler return m->name; 8339beb93cSSam Leffler } 8439beb93cSSam Leffler return NULL; 8539beb93cSSam Leffler } 8639beb93cSSam Leffler 8739beb93cSSam Leffler 8839beb93cSSam Leffler /** 8939beb93cSSam Leffler * eap_get_names - Get space separated list of names for supported EAP methods 9039beb93cSSam Leffler * @buf: Buffer for names 9139beb93cSSam Leffler * @buflen: Buffer length 9239beb93cSSam Leffler * Returns: Number of characters written into buf (not including nul 9339beb93cSSam Leffler * termination) 9439beb93cSSam Leffler */ 9539beb93cSSam Leffler size_t eap_get_names(char *buf, size_t buflen) 9639beb93cSSam Leffler { 9739beb93cSSam Leffler char *pos, *end; 9839beb93cSSam Leffler struct eap_method *m; 9939beb93cSSam Leffler int ret; 10039beb93cSSam Leffler 10139beb93cSSam Leffler if (buflen == 0) 10239beb93cSSam Leffler return 0; 10339beb93cSSam Leffler 10439beb93cSSam Leffler pos = buf; 10539beb93cSSam Leffler end = pos + buflen; 10639beb93cSSam Leffler 10739beb93cSSam Leffler for (m = eap_methods; m; m = m->next) { 10839beb93cSSam Leffler ret = os_snprintf(pos, end - pos, "%s%s", 10939beb93cSSam Leffler m == eap_methods ? "" : " ", m->name); 11039beb93cSSam Leffler if (ret < 0 || ret >= end - pos) 11139beb93cSSam Leffler break; 11239beb93cSSam Leffler pos += ret; 11339beb93cSSam Leffler } 11439beb93cSSam Leffler buf[buflen - 1] = '\0'; 11539beb93cSSam Leffler 11639beb93cSSam Leffler return pos - buf; 11739beb93cSSam Leffler } 11839beb93cSSam Leffler 11939beb93cSSam Leffler 12039beb93cSSam Leffler /** 12139beb93cSSam Leffler * eap_get_names_as_string_array - Get supported EAP methods as string array 12239beb93cSSam Leffler * @num: Buffer for returning the number of items in array, not including %NULL 12339beb93cSSam Leffler * terminator. This parameter can be %NULL if the length is not needed. 12439beb93cSSam Leffler * Returns: A %NULL-terminated array of strings, or %NULL on error. 12539beb93cSSam Leffler * 12639beb93cSSam Leffler * This function returns the list of names for all supported EAP methods as an 12739beb93cSSam Leffler * array of strings. The caller must free the returned array items and the 12839beb93cSSam Leffler * array. 12939beb93cSSam Leffler */ 13039beb93cSSam Leffler char ** eap_get_names_as_string_array(size_t *num) 13139beb93cSSam Leffler { 13239beb93cSSam Leffler struct eap_method *m; 13339beb93cSSam Leffler size_t array_len = 0; 13439beb93cSSam Leffler char **array; 13539beb93cSSam Leffler int i = 0, j; 13639beb93cSSam Leffler 13739beb93cSSam Leffler for (m = eap_methods; m; m = m->next) 13839beb93cSSam Leffler array_len++; 13939beb93cSSam Leffler 14039beb93cSSam Leffler array = os_zalloc(sizeof(char *) * (array_len + 1)); 14139beb93cSSam Leffler if (array == NULL) 14239beb93cSSam Leffler return NULL; 14339beb93cSSam Leffler 14439beb93cSSam Leffler for (m = eap_methods; m; m = m->next) { 14539beb93cSSam Leffler array[i++] = os_strdup(m->name); 14639beb93cSSam Leffler if (array[i - 1] == NULL) { 14739beb93cSSam Leffler for (j = 0; j < i; j++) 14839beb93cSSam Leffler os_free(array[j]); 14939beb93cSSam Leffler os_free(array); 15039beb93cSSam Leffler return NULL; 15139beb93cSSam Leffler } 15239beb93cSSam Leffler } 15339beb93cSSam Leffler array[i] = NULL; 15439beb93cSSam Leffler 15539beb93cSSam Leffler if (num) 15639beb93cSSam Leffler *num = array_len; 15739beb93cSSam Leffler 15839beb93cSSam Leffler return array; 15939beb93cSSam Leffler } 16039beb93cSSam Leffler 16139beb93cSSam Leffler 16239beb93cSSam Leffler /** 16339beb93cSSam Leffler * eap_peer_get_methods - Get a list of enabled EAP peer methods 16439beb93cSSam Leffler * @count: Set to number of available methods 16539beb93cSSam Leffler * Returns: List of enabled EAP peer methods 16639beb93cSSam Leffler */ 16739beb93cSSam Leffler const struct eap_method * eap_peer_get_methods(size_t *count) 16839beb93cSSam Leffler { 16939beb93cSSam Leffler int c = 0; 17039beb93cSSam Leffler struct eap_method *m; 17139beb93cSSam Leffler 17239beb93cSSam Leffler for (m = eap_methods; m; m = m->next) 17339beb93cSSam Leffler c++; 17439beb93cSSam Leffler 17539beb93cSSam Leffler *count = c; 17639beb93cSSam Leffler return eap_methods; 17739beb93cSSam Leffler } 17839beb93cSSam Leffler 17939beb93cSSam Leffler 18039beb93cSSam Leffler #ifdef CONFIG_DYNAMIC_EAP_METHODS 18139beb93cSSam Leffler /** 18239beb93cSSam Leffler * eap_peer_method_load - Load a dynamic EAP method library (shared object) 18339beb93cSSam Leffler * @so: File path for the shared object file to load 18439beb93cSSam Leffler * Returns: 0 on success, -1 on failure 18539beb93cSSam Leffler */ 18639beb93cSSam Leffler int eap_peer_method_load(const char *so) 18739beb93cSSam Leffler { 18839beb93cSSam Leffler void *handle; 18939beb93cSSam Leffler int (*dyn_init)(void); 19039beb93cSSam Leffler int ret; 19139beb93cSSam Leffler 19239beb93cSSam Leffler handle = dlopen(so, RTLD_LAZY); 19339beb93cSSam Leffler if (handle == NULL) { 19439beb93cSSam Leffler wpa_printf(MSG_ERROR, "EAP: Failed to open dynamic EAP method " 19539beb93cSSam Leffler "'%s': %s", so, dlerror()); 19639beb93cSSam Leffler return -1; 19739beb93cSSam Leffler } 19839beb93cSSam Leffler 19939beb93cSSam Leffler dyn_init = dlsym(handle, "eap_peer_method_dynamic_init"); 20039beb93cSSam Leffler if (dyn_init == NULL) { 20139beb93cSSam Leffler dlclose(handle); 20239beb93cSSam Leffler wpa_printf(MSG_ERROR, "EAP: Invalid EAP method '%s' - no " 20339beb93cSSam Leffler "eap_peer_method_dynamic_init()", so); 20439beb93cSSam Leffler return -1; 20539beb93cSSam Leffler } 20639beb93cSSam Leffler 20739beb93cSSam Leffler ret = dyn_init(); 20839beb93cSSam Leffler if (ret) { 20939beb93cSSam Leffler dlclose(handle); 21039beb93cSSam Leffler wpa_printf(MSG_ERROR, "EAP: Failed to add EAP method '%s' - " 21139beb93cSSam Leffler "ret %d", so, ret); 21239beb93cSSam Leffler return ret; 21339beb93cSSam Leffler } 21439beb93cSSam Leffler 21539beb93cSSam Leffler /* Store the handle for this shared object. It will be freed with 21639beb93cSSam Leffler * dlclose() when the EAP method is unregistered. */ 21739beb93cSSam Leffler eap_methods->dl_handle = handle; 21839beb93cSSam Leffler 21939beb93cSSam Leffler wpa_printf(MSG_DEBUG, "EAP: Loaded dynamic EAP method: '%s'", so); 22039beb93cSSam Leffler 22139beb93cSSam Leffler return 0; 22239beb93cSSam Leffler } 22339beb93cSSam Leffler 22439beb93cSSam Leffler 22539beb93cSSam Leffler /** 22639beb93cSSam Leffler * eap_peer_method_unload - Unload a dynamic EAP method library (shared object) 22739beb93cSSam Leffler * @method: Pointer to the dynamically loaded EAP method 22839beb93cSSam Leffler * Returns: 0 on success, -1 on failure 22939beb93cSSam Leffler * 23039beb93cSSam Leffler * This function can be used to unload EAP methods that have been previously 23139beb93cSSam Leffler * loaded with eap_peer_method_load(). Before unloading the method, all 23239beb93cSSam Leffler * references to the method must be removed to make sure that no dereferences 23339beb93cSSam Leffler * of freed memory will occur after unloading. 23439beb93cSSam Leffler */ 23539beb93cSSam Leffler int eap_peer_method_unload(struct eap_method *method) 23639beb93cSSam Leffler { 23739beb93cSSam Leffler struct eap_method *m, *prev; 23839beb93cSSam Leffler void *handle; 23939beb93cSSam Leffler 24039beb93cSSam Leffler m = eap_methods; 24139beb93cSSam Leffler prev = NULL; 24239beb93cSSam Leffler while (m) { 24339beb93cSSam Leffler if (m == method) 24439beb93cSSam Leffler break; 24539beb93cSSam Leffler prev = m; 24639beb93cSSam Leffler m = m->next; 24739beb93cSSam Leffler } 24839beb93cSSam Leffler 24939beb93cSSam Leffler if (m == NULL || m->dl_handle == NULL) 25039beb93cSSam Leffler return -1; 25139beb93cSSam Leffler 25239beb93cSSam Leffler if (prev) 25339beb93cSSam Leffler prev->next = m->next; 25439beb93cSSam Leffler else 25539beb93cSSam Leffler eap_methods = m->next; 25639beb93cSSam Leffler 25739beb93cSSam Leffler handle = m->dl_handle; 25839beb93cSSam Leffler 25939beb93cSSam Leffler if (m->free) 26039beb93cSSam Leffler m->free(m); 26139beb93cSSam Leffler else 26239beb93cSSam Leffler eap_peer_method_free(m); 26339beb93cSSam Leffler 26439beb93cSSam Leffler dlclose(handle); 26539beb93cSSam Leffler 26639beb93cSSam Leffler return 0; 26739beb93cSSam Leffler } 26839beb93cSSam Leffler #endif /* CONFIG_DYNAMIC_EAP_METHODS */ 26939beb93cSSam Leffler 27039beb93cSSam Leffler 27139beb93cSSam Leffler /** 27239beb93cSSam Leffler * eap_peer_method_alloc - Allocate EAP peer method structure 27339beb93cSSam Leffler * @version: Version of the EAP peer method interface (set to 27439beb93cSSam Leffler * EAP_PEER_METHOD_INTERFACE_VERSION) 27539beb93cSSam Leffler * @vendor: EAP Vendor-ID (EAP_VENDOR_*) (0 = IETF) 27639beb93cSSam Leffler * @method: EAP type number (EAP_TYPE_*) 27739beb93cSSam Leffler * @name: Name of the method (e.g., "TLS") 27839beb93cSSam Leffler * Returns: Allocated EAP method structure or %NULL on failure 27939beb93cSSam Leffler * 28039beb93cSSam Leffler * The returned structure should be freed with eap_peer_method_free() when it 28139beb93cSSam Leffler * is not needed anymore. 28239beb93cSSam Leffler */ 28339beb93cSSam Leffler struct eap_method * eap_peer_method_alloc(int version, int vendor, 28439beb93cSSam Leffler EapType method, const char *name) 28539beb93cSSam Leffler { 28639beb93cSSam Leffler struct eap_method *eap; 28739beb93cSSam Leffler eap = os_zalloc(sizeof(*eap)); 28839beb93cSSam Leffler if (eap == NULL) 28939beb93cSSam Leffler return NULL; 29039beb93cSSam Leffler eap->version = version; 29139beb93cSSam Leffler eap->vendor = vendor; 29239beb93cSSam Leffler eap->method = method; 29339beb93cSSam Leffler eap->name = name; 29439beb93cSSam Leffler return eap; 29539beb93cSSam Leffler } 29639beb93cSSam Leffler 29739beb93cSSam Leffler 29839beb93cSSam Leffler /** 29939beb93cSSam Leffler * eap_peer_method_free - Free EAP peer method structure 30039beb93cSSam Leffler * @method: Method structure allocated with eap_peer_method_alloc() 30139beb93cSSam Leffler */ 30239beb93cSSam Leffler void eap_peer_method_free(struct eap_method *method) 30339beb93cSSam Leffler { 30439beb93cSSam Leffler os_free(method); 30539beb93cSSam Leffler } 30639beb93cSSam Leffler 30739beb93cSSam Leffler 30839beb93cSSam Leffler /** 30939beb93cSSam Leffler * eap_peer_method_register - Register an EAP peer method 31039beb93cSSam Leffler * @method: EAP method to register 31139beb93cSSam Leffler * Returns: 0 on success, -1 on invalid method, or -2 if a matching EAP method 31239beb93cSSam Leffler * has already been registered 31339beb93cSSam Leffler * 31439beb93cSSam Leffler * Each EAP peer method needs to call this function to register itself as a 31539beb93cSSam Leffler * supported EAP method. 31639beb93cSSam Leffler */ 31739beb93cSSam Leffler int eap_peer_method_register(struct eap_method *method) 31839beb93cSSam Leffler { 31939beb93cSSam Leffler struct eap_method *m, *last = NULL; 32039beb93cSSam Leffler 32139beb93cSSam Leffler if (method == NULL || method->name == NULL || 32239beb93cSSam Leffler method->version != EAP_PEER_METHOD_INTERFACE_VERSION) 32339beb93cSSam Leffler return -1; 32439beb93cSSam Leffler 32539beb93cSSam Leffler for (m = eap_methods; m; m = m->next) { 32639beb93cSSam Leffler if ((m->vendor == method->vendor && 32739beb93cSSam Leffler m->method == method->method) || 32839beb93cSSam Leffler os_strcmp(m->name, method->name) == 0) 32939beb93cSSam Leffler return -2; 33039beb93cSSam Leffler last = m; 33139beb93cSSam Leffler } 33239beb93cSSam Leffler 33339beb93cSSam Leffler if (last) 33439beb93cSSam Leffler last->next = method; 33539beb93cSSam Leffler else 33639beb93cSSam Leffler eap_methods = method; 33739beb93cSSam Leffler 33839beb93cSSam Leffler return 0; 33939beb93cSSam Leffler } 34039beb93cSSam Leffler 34139beb93cSSam Leffler 34239beb93cSSam Leffler /** 34339beb93cSSam Leffler * eap_peer_register_methods - Register statically linked EAP peer methods 34439beb93cSSam Leffler * Returns: 0 on success, -1 on failure 34539beb93cSSam Leffler * 34639beb93cSSam Leffler * This function is called at program initialization to register all EAP peer 34739beb93cSSam Leffler * methods that were linked in statically. 34839beb93cSSam Leffler */ 34939beb93cSSam Leffler int eap_peer_register_methods(void) 35039beb93cSSam Leffler { 35139beb93cSSam Leffler int ret = 0; 35239beb93cSSam Leffler 35339beb93cSSam Leffler #ifdef EAP_MD5 35439beb93cSSam Leffler if (ret == 0) { 35539beb93cSSam Leffler int eap_peer_md5_register(void); 35639beb93cSSam Leffler ret = eap_peer_md5_register(); 35739beb93cSSam Leffler } 35839beb93cSSam Leffler #endif /* EAP_MD5 */ 35939beb93cSSam Leffler 36039beb93cSSam Leffler #ifdef EAP_TLS 36139beb93cSSam Leffler if (ret == 0) { 36239beb93cSSam Leffler int eap_peer_tls_register(void); 36339beb93cSSam Leffler ret = eap_peer_tls_register(); 36439beb93cSSam Leffler } 36539beb93cSSam Leffler #endif /* EAP_TLS */ 36639beb93cSSam Leffler 36739beb93cSSam Leffler #ifdef EAP_MSCHAPv2 36839beb93cSSam Leffler if (ret == 0) { 36939beb93cSSam Leffler int eap_peer_mschapv2_register(void); 37039beb93cSSam Leffler ret = eap_peer_mschapv2_register(); 37139beb93cSSam Leffler } 37239beb93cSSam Leffler #endif /* EAP_MSCHAPv2 */ 37339beb93cSSam Leffler 37439beb93cSSam Leffler #ifdef EAP_PEAP 37539beb93cSSam Leffler if (ret == 0) { 37639beb93cSSam Leffler int eap_peer_peap_register(void); 37739beb93cSSam Leffler ret = eap_peer_peap_register(); 37839beb93cSSam Leffler } 37939beb93cSSam Leffler #endif /* EAP_PEAP */ 38039beb93cSSam Leffler 38139beb93cSSam Leffler #ifdef EAP_TTLS 38239beb93cSSam Leffler if (ret == 0) { 38339beb93cSSam Leffler int eap_peer_ttls_register(void); 38439beb93cSSam Leffler ret = eap_peer_ttls_register(); 38539beb93cSSam Leffler } 38639beb93cSSam Leffler #endif /* EAP_TTLS */ 38739beb93cSSam Leffler 38839beb93cSSam Leffler #ifdef EAP_GTC 38939beb93cSSam Leffler if (ret == 0) { 39039beb93cSSam Leffler int eap_peer_gtc_register(void); 39139beb93cSSam Leffler ret = eap_peer_gtc_register(); 39239beb93cSSam Leffler } 39339beb93cSSam Leffler #endif /* EAP_GTC */ 39439beb93cSSam Leffler 39539beb93cSSam Leffler #ifdef EAP_OTP 39639beb93cSSam Leffler if (ret == 0) { 39739beb93cSSam Leffler int eap_peer_otp_register(void); 39839beb93cSSam Leffler ret = eap_peer_otp_register(); 39939beb93cSSam Leffler } 40039beb93cSSam Leffler #endif /* EAP_OTP */ 40139beb93cSSam Leffler 40239beb93cSSam Leffler #ifdef EAP_SIM 40339beb93cSSam Leffler if (ret == 0) { 40439beb93cSSam Leffler int eap_peer_sim_register(void); 40539beb93cSSam Leffler ret = eap_peer_sim_register(); 40639beb93cSSam Leffler } 40739beb93cSSam Leffler #endif /* EAP_SIM */ 40839beb93cSSam Leffler 40939beb93cSSam Leffler #ifdef EAP_LEAP 41039beb93cSSam Leffler if (ret == 0) { 41139beb93cSSam Leffler int eap_peer_leap_register(void); 41239beb93cSSam Leffler ret = eap_peer_leap_register(); 41339beb93cSSam Leffler } 41439beb93cSSam Leffler #endif /* EAP_LEAP */ 41539beb93cSSam Leffler 41639beb93cSSam Leffler #ifdef EAP_PSK 41739beb93cSSam Leffler if (ret == 0) { 41839beb93cSSam Leffler int eap_peer_psk_register(void); 41939beb93cSSam Leffler ret = eap_peer_psk_register(); 42039beb93cSSam Leffler } 42139beb93cSSam Leffler #endif /* EAP_PSK */ 42239beb93cSSam Leffler 42339beb93cSSam Leffler #ifdef EAP_AKA 42439beb93cSSam Leffler if (ret == 0) { 42539beb93cSSam Leffler int eap_peer_aka_register(void); 42639beb93cSSam Leffler ret = eap_peer_aka_register(); 42739beb93cSSam Leffler } 42839beb93cSSam Leffler #endif /* EAP_AKA */ 42939beb93cSSam Leffler 43039beb93cSSam Leffler #ifdef EAP_AKA_PRIME 43139beb93cSSam Leffler if (ret == 0) { 43239beb93cSSam Leffler int eap_peer_aka_prime_register(void); 43339beb93cSSam Leffler ret = eap_peer_aka_prime_register(); 43439beb93cSSam Leffler } 43539beb93cSSam Leffler #endif /* EAP_AKA_PRIME */ 43639beb93cSSam Leffler 43739beb93cSSam Leffler #ifdef EAP_FAST 43839beb93cSSam Leffler if (ret == 0) { 43939beb93cSSam Leffler int eap_peer_fast_register(void); 44039beb93cSSam Leffler ret = eap_peer_fast_register(); 44139beb93cSSam Leffler } 44239beb93cSSam Leffler #endif /* EAP_FAST */ 44339beb93cSSam Leffler 44439beb93cSSam Leffler #ifdef EAP_PAX 44539beb93cSSam Leffler if (ret == 0) { 44639beb93cSSam Leffler int eap_peer_pax_register(void); 44739beb93cSSam Leffler ret = eap_peer_pax_register(); 44839beb93cSSam Leffler } 44939beb93cSSam Leffler #endif /* EAP_PAX */ 45039beb93cSSam Leffler 45139beb93cSSam Leffler #ifdef EAP_SAKE 45239beb93cSSam Leffler if (ret == 0) { 45339beb93cSSam Leffler int eap_peer_sake_register(void); 45439beb93cSSam Leffler ret = eap_peer_sake_register(); 45539beb93cSSam Leffler } 45639beb93cSSam Leffler #endif /* EAP_SAKE */ 45739beb93cSSam Leffler 45839beb93cSSam Leffler #ifdef EAP_GPSK 45939beb93cSSam Leffler if (ret == 0) { 46039beb93cSSam Leffler int eap_peer_gpsk_register(void); 46139beb93cSSam Leffler ret = eap_peer_gpsk_register(); 46239beb93cSSam Leffler } 46339beb93cSSam Leffler #endif /* EAP_GPSK */ 46439beb93cSSam Leffler 46539beb93cSSam Leffler #ifdef EAP_WSC 46639beb93cSSam Leffler if (ret == 0) { 46739beb93cSSam Leffler int eap_peer_wsc_register(void); 46839beb93cSSam Leffler ret = eap_peer_wsc_register(); 46939beb93cSSam Leffler } 47039beb93cSSam Leffler #endif /* EAP_WSC */ 47139beb93cSSam Leffler 47239beb93cSSam Leffler #ifdef EAP_IKEV2 47339beb93cSSam Leffler if (ret == 0) { 47439beb93cSSam Leffler int eap_peer_ikev2_register(void); 47539beb93cSSam Leffler ret = eap_peer_ikev2_register(); 47639beb93cSSam Leffler } 47739beb93cSSam Leffler #endif /* EAP_IKEV2 */ 47839beb93cSSam Leffler 47939beb93cSSam Leffler #ifdef EAP_VENDOR_TEST 48039beb93cSSam Leffler if (ret == 0) { 48139beb93cSSam Leffler int eap_peer_vendor_test_register(void); 48239beb93cSSam Leffler ret = eap_peer_vendor_test_register(); 48339beb93cSSam Leffler } 48439beb93cSSam Leffler #endif /* EAP_VENDOR_TEST */ 48539beb93cSSam Leffler 48639beb93cSSam Leffler #ifdef EAP_TNC 48739beb93cSSam Leffler if (ret == 0) { 48839beb93cSSam Leffler int eap_peer_tnc_register(void); 48939beb93cSSam Leffler ret = eap_peer_tnc_register(); 49039beb93cSSam Leffler } 49139beb93cSSam Leffler #endif /* EAP_TNC */ 49239beb93cSSam Leffler 49339beb93cSSam Leffler return ret; 49439beb93cSSam Leffler } 49539beb93cSSam Leffler 49639beb93cSSam Leffler 49739beb93cSSam Leffler /** 49839beb93cSSam Leffler * eap_peer_unregister_methods - Unregister EAP peer methods 49939beb93cSSam Leffler * 50039beb93cSSam Leffler * This function is called at program termination to unregister all EAP peer 50139beb93cSSam Leffler * methods. 50239beb93cSSam Leffler */ 50339beb93cSSam Leffler void eap_peer_unregister_methods(void) 50439beb93cSSam Leffler { 50539beb93cSSam Leffler struct eap_method *m; 50639beb93cSSam Leffler #ifdef CONFIG_DYNAMIC_EAP_METHODS 50739beb93cSSam Leffler void *handle; 50839beb93cSSam Leffler #endif /* CONFIG_DYNAMIC_EAP_METHODS */ 50939beb93cSSam Leffler 51039beb93cSSam Leffler while (eap_methods) { 51139beb93cSSam Leffler m = eap_methods; 51239beb93cSSam Leffler eap_methods = eap_methods->next; 51339beb93cSSam Leffler 51439beb93cSSam Leffler #ifdef CONFIG_DYNAMIC_EAP_METHODS 51539beb93cSSam Leffler handle = m->dl_handle; 51639beb93cSSam Leffler #endif /* CONFIG_DYNAMIC_EAP_METHODS */ 51739beb93cSSam Leffler 51839beb93cSSam Leffler if (m->free) 51939beb93cSSam Leffler m->free(m); 52039beb93cSSam Leffler else 52139beb93cSSam Leffler eap_peer_method_free(m); 52239beb93cSSam Leffler 52339beb93cSSam Leffler #ifdef CONFIG_DYNAMIC_EAP_METHODS 52439beb93cSSam Leffler if (handle) 52539beb93cSSam Leffler dlclose(handle); 52639beb93cSSam Leffler #endif /* CONFIG_DYNAMIC_EAP_METHODS */ 52739beb93cSSam Leffler } 52839beb93cSSam Leffler } 529