1526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/*
2526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * hostapd / EAP method registration
3526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Copyright (c) 2004-2006, 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
17526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "common.h"
18526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "eap_i.h"
19526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "eap_methods.h"
20526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
21526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
22526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic struct eap_method *eap_methods;
23526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
24526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
25526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/**
26526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eap_server_get_eap_method - Get EAP method based on type number
27526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @vendor: EAP Vendor-Id (0 = IETF)
28526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @method: EAP type number
29526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: Pointer to EAP method or %NULL if not found
30526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */
31526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtconst struct eap_method * eap_server_get_eap_method(int vendor, EapType method)
32526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
33526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	struct eap_method *m;
34526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	for (m = eap_methods; m; m = m->next) {
35526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (m->vendor == vendor && m->method == method)
36526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			return m;
37526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
38526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return NULL;
39526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
40526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
41526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
42526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/**
43526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eap_server_get_type - Get EAP type for the given EAP method name
44526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @name: EAP method name, e.g., TLS
45526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @vendor: Buffer for returning EAP Vendor-Id
46526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: EAP method type or %EAP_TYPE_NONE if not found
47526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *
48526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * This function maps EAP type names into EAP type numbers based on the list of
49526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * EAP methods included in the build.
50526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */
51526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry ShmidtEapType eap_server_get_type(const char *name, int *vendor)
52526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
53526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	struct eap_method *m;
54526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	for (m = eap_methods; m; m = m->next) {
55526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (os_strcmp(m->name, name) == 0) {
56526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			*vendor = m->vendor;
57526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			return m->method;
58526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
59526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
60526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	*vendor = EAP_VENDOR_IETF;
61526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return EAP_TYPE_NONE;
62526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
63526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
64526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
65526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/**
66526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eap_server_method_alloc - Allocate EAP server method structure
67526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @version: Version of the EAP server method interface (set to
68526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * EAP_SERVER_METHOD_INTERFACE_VERSION)
69526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @vendor: EAP Vendor-ID (EAP_VENDOR_*) (0 = IETF)
70526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @method: EAP type number (EAP_TYPE_*)
71526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @name: Name of the method (e.g., "TLS")
72526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: Allocated EAP method structure or %NULL on failure
73526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *
74526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * The returned structure should be freed with eap_server_method_free() when it
75526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * is not needed anymore.
76526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */
77526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstruct eap_method * eap_server_method_alloc(int version, int vendor,
78526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt					    EapType method, const char *name)
79526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
80526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	struct eap_method *eap;
81526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	eap = os_zalloc(sizeof(*eap));
82526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (eap == NULL)
83526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return NULL;
84526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	eap->version = version;
85526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	eap->vendor = vendor;
86526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	eap->method = method;
87526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	eap->name = name;
88526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return eap;
89526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
90526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
91526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
92526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/**
93526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eap_server_method_free - Free EAP server method structure
94526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @method: Method structure allocated with eap_server_method_alloc()
95526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */
96526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid eap_server_method_free(struct eap_method *method)
97526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
98526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	os_free(method);
99526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
100526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
101526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
102526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/**
103526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eap_server_method_register - Register an EAP server method
104526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @method: EAP method to register
105526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: 0 on success, -1 on invalid method, or -2 if a matching EAP method
106526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * has already been registered
107526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *
108526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Each EAP server method needs to call this function to register itself as a
109526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * supported EAP method.
110526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */
111526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint eap_server_method_register(struct eap_method *method)
112526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
113526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	struct eap_method *m, *last = NULL;
114526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
115526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (method == NULL || method->name == NULL ||
116526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    method->version != EAP_SERVER_METHOD_INTERFACE_VERSION)
117526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
118526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
119526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	for (m = eap_methods; m; m = m->next) {
120526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if ((m->vendor == method->vendor &&
121526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		     m->method == method->method) ||
122526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		    os_strcmp(m->name, method->name) == 0)
123526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			return -2;
124526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		last = m;
125526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
126526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
127526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (last)
128526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		last->next = method;
129526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	else
130526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		eap_methods = method;
131526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
132526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return 0;
133526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
134526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
135526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
136526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/**
137526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eap_server_register_methods - Register statically linked EAP server methods
138526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: 0 on success, -1 on failure
139526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *
140526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * This function is called at program initialization to register all EAP server
141526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * methods that were linked in statically.
142526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */
143526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint eap_server_register_methods(void)
144526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
145526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int ret = 0;
146526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
147526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ret == 0) {
148526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		int eap_server_identity_register(void);
149526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ret = eap_server_identity_register();
150526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
151526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
152526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_MD5
153526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ret == 0) {
154526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		int eap_server_md5_register(void);
155526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ret = eap_server_md5_register();
156526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
157526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_MD5 */
158526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
159526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_TLS
160526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ret == 0) {
161526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		int eap_server_tls_register(void);
162526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ret = eap_server_tls_register();
163526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
164526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_TLS */
165526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
166526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_MSCHAPv2
167526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ret == 0) {
168526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		int eap_server_mschapv2_register(void);
169526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ret = eap_server_mschapv2_register();
170526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
171526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_MSCHAPv2 */
172526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
173526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_PEAP
174526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ret == 0) {
175526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		int eap_server_peap_register(void);
176526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ret = eap_server_peap_register();
177526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
178526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_PEAP */
179526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
180526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_TLV
181526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ret == 0) {
182526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		int eap_server_tlv_register(void);
183526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ret = eap_server_tlv_register();
184526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
185526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_TLV */
186526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
187526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_GTC
188526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ret == 0) {
189526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		int eap_server_gtc_register(void);
190526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ret = eap_server_gtc_register();
191526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
192526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_GTC */
193526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
194526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_TTLS
195526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ret == 0) {
196526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		int eap_server_ttls_register(void);
197526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ret = eap_server_ttls_register();
198526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
199526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_TTLS */
200526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
201526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_SIM
202526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ret == 0) {
203526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		int eap_server_sim_register(void);
204526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ret = eap_server_sim_register();
205526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
206526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_SIM */
207526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
208526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_AKA
209526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ret == 0) {
210526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		int eap_server_aka_register(void);
211526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ret = eap_server_aka_register();
212526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
213526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_AKA */
214526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
215526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_AKA_PRIME
216526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ret == 0) {
217526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		int eap_server_aka_prime_register(void);
218526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ret = eap_server_aka_prime_register();
219526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
220526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_AKA_PRIME */
221526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
222526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_PAX
223526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ret == 0) {
224526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		int eap_server_pax_register(void);
225526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ret = eap_server_pax_register();
226526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
227526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_PAX */
228526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
229526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_PSK
230526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ret == 0) {
231526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		int eap_server_psk_register(void);
232526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ret = eap_server_psk_register();
233526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
234526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_PSK */
235526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
236526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_SAKE
237526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ret == 0) {
238526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		int eap_server_sake_register(void);
239526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ret = eap_server_sake_register();
240526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
241526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_SAKE */
242526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
243526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_GPSK
244526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ret == 0) {
245526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		int eap_server_gpsk_register(void);
246526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ret = eap_server_gpsk_register();
247526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
248526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_GPSK */
249526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
250526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_VENDOR_TEST
251526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ret == 0) {
252526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		int eap_server_vendor_test_register(void);
253526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ret = eap_server_vendor_test_register();
254526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
255526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_VENDOR_TEST */
256526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
257526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_FAST
258526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ret == 0) {
259526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		int eap_server_fast_register(void);
260526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ret = eap_server_fast_register();
261526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
262526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_FAST */
263526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
264526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_WSC
265526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ret == 0) {
266526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		int eap_server_wsc_register(void);
267526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ret = eap_server_wsc_register();
268526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
269526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_WSC */
270526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
271526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_IKEV2
272526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ret == 0) {
273526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		int eap_server_ikev2_register(void);
274526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ret = eap_server_ikev2_register();
275526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
276526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_IKEV2 */
277526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
278526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef EAP_TNC
279526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ret == 0) {
280526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		int eap_server_tnc_register(void);
281526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ret = eap_server_tnc_register();
282526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
283526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* EAP_TNC */
284526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
285526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return ret;
286526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
287526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
288526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
289526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/**
290526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eap_server_unregister_methods - Unregister EAP server methods
291526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *
292526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * This function is called at program termination to unregister all EAP server
293526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * methods.
294526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */
295526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid eap_server_unregister_methods(void)
296526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
297526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	struct eap_method *m;
298526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
299526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	while (eap_methods) {
300526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		m = eap_methods;
301526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		eap_methods = eap_methods->next;
302526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
303526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (m->free)
304526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			m->free(m);
305526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		else
306526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			eap_server_method_free(m);
307526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
308526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
309