identification_t *peer;
/**
- * Our supported EAP types (as eap_vendor_type_t*)
+ * Our supported EAP types (as entry_t*)
*/
linked_list_t *types;
};
/**
- * Compare two eap_vendor_type_t objects
+ * Struct that stores EAP type and vendor ID
*/
-static bool entry_matches(eap_vendor_type_t *item, eap_vendor_type_t *other)
+typedef struct {
+ /** EAP type */
+ eap_type_t type;
+ /** Vendor Id */
+ u_int32_t vendor;
+} entry_t;
+
+/**
+ * Compare two entry_t objects
+ */
+static bool entry_matches(entry_t *item, entry_t *other)
{
return item->type == other->type && item->vendor == other->vendor;
}
*/
static void select_method(private_eap_dynamic_t *this)
{
- eap_vendor_type_t *entry;
+ entry_t *entry;
linked_list_t *outer = this->types, *inner = this->other_types;
char *who = "peer";
enumerator = in->get_types(in);
while (enumerator->enumerate(enumerator, &type, &vendor))
{
- eap_vendor_type_t *entry;
+ entry_t *entry;
if (!type)
{
char *methods)
{
enumerator_t *enumerator;
- eap_vendor_type_t *type, *entry;
+ eap_type_t type;
+ entry_t *entry, *pref_entry;
linked_list_t *preferred;
char *method;
enumerator = enumerator_create_token(methods, ",", " ");
while (enumerator->enumerate(enumerator, &method))
{
- type = eap_vendor_type_from_string(method);
+ type = eap_type_from_string(method);
if (type)
{
- preferred->insert_last(preferred, type);
+ INIT(entry,
+ .type = type,
+ );
+ preferred->insert_last(preferred, entry);
}
}
enumerator->destroy(enumerator);
enumerator = this->types->create_enumerator(this->types);
- while (preferred->remove_last(preferred, (void**)&type) == SUCCESS)
+ while (preferred->remove_last(preferred, (void**)&pref_entry) == SUCCESS)
{ /* move (supported) types to the front, maintain the preferred order */
this->types->reset_enumerator(this->types, enumerator);
while (enumerator->enumerate(enumerator, &entry))
{
- if (entry_matches(entry, type))
+ if (entry_matches(entry, pref_entry))
{
this->types->remove_at(this->types, enumerator);
this->types->insert_first(this->types, entry);
break;
}
}
- free(type);
+ free(pref_entry);
}
enumerator->destroy(enumerator);
preferred->destroy(preferred);
enumerator = charon->eap->create_enumerator(charon->eap, EAP_SERVER);
while (enumerator->enumerate(enumerator, &type, &vendor))
{
- eap_vendor_type_t *entry;
+ entry_t *entry;
INIT(entry,
.type = type,
}
else if (strneq(auth, "eap", 3))
{
- eap_vendor_type_t *type;
+ eap_type_t type;
+ u_int32_t vendor = 0;
cfg->add(cfg, AUTH_RULE_AUTH_CLASS, AUTH_CLASS_EAP);
- type = eap_vendor_type_from_string(auth);
+ type = eap_type_from_string(auth);
if (type)
{
- cfg->add(cfg, AUTH_RULE_EAP_TYPE, type->type);
- if (type->vendor)
+ cfg->add(cfg, AUTH_RULE_EAP_TYPE, type);
+ if (vendor)
{
- cfg->add(cfg, AUTH_RULE_EAP_VENDOR, type->vendor);
+ cfg->add(cfg, AUTH_RULE_EAP_VENDOR, vendor);
}
- free(type);
}
if (msg->add_conn.eap_identity)
}
return 0;
}
-
-/*
- * See header
- */
-eap_vendor_type_t *eap_vendor_type_from_string(char *str)
-{
- enumerator_t *enumerator;
- eap_vendor_type_t *result = NULL;
- eap_type_t type = 0;
- u_int32_t vendor = 0;
- char *part, *end;
-
- /* parse EAP method string of the form: [eap-]type[-vendor] */
- enumerator = enumerator_create_token(str, "-", " ");
- while (enumerator->enumerate(enumerator, &part))
- {
- if (!type)
- {
- if (streq(part, "eap"))
- { /* skip 'eap' at the beginning */
- continue;
- }
- type = eap_type_from_string(part);
- if (!type)
- {
- type = strtoul(part, &end, 0);
- if (*end != '\0' || errno)
- {
- DBG1(DBG_LIB, "unknown or invalid EAP method: %s", part);
- break;
- }
- }
- continue;
- }
- vendor = strtoul(part, &end, 0);
- if (*end != '\0' || errno)
- {
- DBG1(DBG_LIB, "invalid EAP vendor: %s", part);
- type = 0;
- }
- break;
- }
- enumerator->destroy(enumerator);
-
- if (type)
- {
- INIT(result,
- .type = type,
- .vendor = vendor,
- );
- }
- return result;
-}
typedef enum eap_code_t eap_code_t;
typedef enum eap_type_t eap_type_t;
-typedef struct eap_vendor_type_t eap_vendor_type_t;
#include <library.h>
*/
extern enum_name_t *eap_type_short_names;
-/**
- * Struct that stores EAP type and vendor ID
- */
-struct eap_vendor_type_t {
-
- /**
- * EAP type
- */
- eap_type_t type;
-
- /**
- * Vendor Id
- */
- u_int32_t vendor;
-};
-
/**
* EAP packet format
*/
*/
eap_type_t eap_type_from_string(char *name);
-/**
- * Parse a string of the form [eap-]type[-vendor].
- *
- * @param str EAP method string
- * @return parsed type (gets allocated), NULL if unknown or failed
- */
-eap_vendor_type_t *eap_vendor_type_from_string(char *str);
-
#endif /** EAP_H_ @}*/