Use the payloads actual type in unknown_payload_t
This commit is contained in:
parent
9431023ce6
commit
b6c796464d
|
@ -1273,7 +1273,7 @@ static status_t decrypt_payloads(private_message_t *this, aead_t *aead)
|
||||||
}
|
}
|
||||||
encryption->destroy(encryption);
|
encryption->destroy(encryption);
|
||||||
}
|
}
|
||||||
if (type != UNKNOWN_PAYLOAD && !was_encrypted)
|
if (payload_is_known(type) && !was_encrypted)
|
||||||
{
|
{
|
||||||
rule = get_payload_rule(this, type);
|
rule = get_payload_rule(this, type);
|
||||||
if (!rule || rule->encrypted)
|
if (!rule || rule->encrypted)
|
||||||
|
@ -1315,14 +1315,13 @@ static status_t verify(private_message_t *this)
|
||||||
unknown_payload_t *unknown;
|
unknown_payload_t *unknown;
|
||||||
|
|
||||||
type = payload->get_type(payload);
|
type = payload->get_type(payload);
|
||||||
if (type == UNKNOWN_PAYLOAD)
|
if (!payload_is_known(type))
|
||||||
{
|
{
|
||||||
/* unknown payloads are ignored if they are not critical */
|
|
||||||
unknown = (unknown_payload_t*)payload;
|
unknown = (unknown_payload_t*)payload;
|
||||||
if (unknown->is_critical(unknown))
|
if (unknown->is_critical(unknown))
|
||||||
{
|
{
|
||||||
DBG1(DBG_ENC, "%N is not supported, but its critical!",
|
DBG1(DBG_ENC, "payload type %N is not supported, "
|
||||||
payload_type_names, type);
|
"but its critical!", payload_type_names, type);
|
||||||
enumerator->destroy(enumerator);
|
enumerator->destroy(enumerator);
|
||||||
return NOT_SUPPORTED;
|
return NOT_SUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
|
@ -387,12 +387,6 @@ static status_t parse_payload(private_parser_t *this,
|
||||||
DBG3(DBG_ENC, "parsing payload from %b",
|
DBG3(DBG_ENC, "parsing payload from %b",
|
||||||
this->byte_pos, this->input_roof - this->byte_pos);
|
this->byte_pos, this->input_roof - this->byte_pos);
|
||||||
|
|
||||||
if (pld->get_type(pld) == UNKNOWN_PAYLOAD)
|
|
||||||
{
|
|
||||||
DBG1(DBG_ENC, " payload type %d is unknown, handling as %N",
|
|
||||||
payload_type, payload_type_names, UNKNOWN_PAYLOAD);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* base pointer for output, avoids casting in every rule */
|
/* base pointer for output, avoids casting in every rule */
|
||||||
output = pld;
|
output = pld;
|
||||||
|
|
||||||
|
|
|
@ -59,25 +59,23 @@ ENUM_NEXT(payload_type_names, SECURITY_ASSOCIATION, EXTENSIBLE_AUTHENTICATION, N
|
||||||
#ifdef ME
|
#ifdef ME
|
||||||
ENUM_NEXT(payload_type_names, ID_PEER, ID_PEER, EXTENSIBLE_AUTHENTICATION,
|
ENUM_NEXT(payload_type_names, ID_PEER, ID_PEER, EXTENSIBLE_AUTHENTICATION,
|
||||||
"ID_PEER");
|
"ID_PEER");
|
||||||
ENUM_NEXT(payload_type_names, HEADER, UNKNOWN_PAYLOAD, ID_PEER,
|
ENUM_NEXT(payload_type_names, HEADER, CONFIGURATION_ATTRIBUTE, ID_PEER,
|
||||||
"HEADER",
|
"HEADER",
|
||||||
"PROPOSAL_SUBSTRUCTURE",
|
"PROPOSAL_SUBSTRUCTURE",
|
||||||
"TRANSFORM_SUBSTRUCTURE",
|
"TRANSFORM_SUBSTRUCTURE",
|
||||||
"TRANSFORM_ATTRIBUTE",
|
"TRANSFORM_ATTRIBUTE",
|
||||||
"TRAFFIC_SELECTOR_SUBSTRUCTURE",
|
"TRAFFIC_SELECTOR_SUBSTRUCTURE",
|
||||||
"CONFIGURATION_ATTRIBUTE",
|
"CONFIGURATION_ATTRIBUTE");
|
||||||
"UNKNOWN_PAYLOAD");
|
|
||||||
#else
|
#else
|
||||||
ENUM_NEXT(payload_type_names, HEADER, UNKNOWN_PAYLOAD, EXTENSIBLE_AUTHENTICATION,
|
ENUM_NEXT(payload_type_names, HEADER, CONFIGURATION_ATTRIBUTE, EXTENSIBLE_AUTHENTICATION,
|
||||||
"HEADER",
|
"HEADER",
|
||||||
"PROPOSAL_SUBSTRUCTURE",
|
"PROPOSAL_SUBSTRUCTURE",
|
||||||
"TRANSFORM_SUBSTRUCTURE",
|
"TRANSFORM_SUBSTRUCTURE",
|
||||||
"TRANSFORM_ATTRIBUTE",
|
"TRANSFORM_ATTRIBUTE",
|
||||||
"TRAFFIC_SELECTOR_SUBSTRUCTURE",
|
"TRAFFIC_SELECTOR_SUBSTRUCTURE",
|
||||||
"CONFIGURATION_ATTRIBUTE",
|
"CONFIGURATION_ATTRIBUTE");
|
||||||
"UNKNOWN_PAYLOAD");
|
|
||||||
#endif /* ME */
|
#endif /* ME */
|
||||||
ENUM_END(payload_type_names, UNKNOWN_PAYLOAD);
|
ENUM_END(payload_type_names, CONFIGURATION_ATTRIBUTE);
|
||||||
|
|
||||||
/* short forms of payload names */
|
/* short forms of payload names */
|
||||||
ENUM_BEGIN(payload_type_short_names, NO_PAYLOAD, NO_PAYLOAD,
|
ENUM_BEGIN(payload_type_short_names, NO_PAYLOAD, NO_PAYLOAD,
|
||||||
|
@ -102,25 +100,23 @@ ENUM_NEXT(payload_type_short_names, SECURITY_ASSOCIATION, EXTENSIBLE_AUTHENTICAT
|
||||||
#ifdef ME
|
#ifdef ME
|
||||||
ENUM_NEXT(payload_type_short_names, ID_PEER, ID_PEER, EXTENSIBLE_AUTHENTICATION,
|
ENUM_NEXT(payload_type_short_names, ID_PEER, ID_PEER, EXTENSIBLE_AUTHENTICATION,
|
||||||
"IDp");
|
"IDp");
|
||||||
ENUM_NEXT(payload_type_short_names, HEADER, UNKNOWN_PAYLOAD, ID_PEER,
|
ENUM_NEXT(payload_type_short_names, HEADER, CONFIGURATION_ATTRIBUTE, ID_PEER,
|
||||||
"HDR",
|
"HDR",
|
||||||
"PROP",
|
"PROP",
|
||||||
"TRANS",
|
"TRANS",
|
||||||
"TRANSATTR",
|
"TRANSATTR",
|
||||||
"TSSUB",
|
"TSSUB",
|
||||||
"CPATTR",
|
"CPATTR");
|
||||||
"??");
|
|
||||||
#else
|
#else
|
||||||
ENUM_NEXT(payload_type_short_names, HEADER, UNKNOWN_PAYLOAD, EXTENSIBLE_AUTHENTICATION,
|
ENUM_NEXT(payload_type_short_names, HEADER, CONFIGURATION_ATTRIBUTE, EXTENSIBLE_AUTHENTICATION,
|
||||||
"HDR",
|
"HDR",
|
||||||
"PROP",
|
"PROP",
|
||||||
"TRANS",
|
"TRANS",
|
||||||
"TRANSATTR",
|
"TRANSATTR",
|
||||||
"TSSUB",
|
"TSSUB",
|
||||||
"CPATTR",
|
"CPATTR");
|
||||||
"??");
|
|
||||||
#endif /* ME */
|
#endif /* ME */
|
||||||
ENUM_END(payload_type_short_names, UNKNOWN_PAYLOAD);
|
ENUM_END(payload_type_short_names, CONFIGURATION_ATTRIBUTE);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* see header
|
* see header
|
||||||
|
@ -178,7 +174,25 @@ payload_t *payload_create(payload_type_t type)
|
||||||
case ENCRYPTED:
|
case ENCRYPTED:
|
||||||
return (payload_t*)encryption_payload_create();
|
return (payload_t*)encryption_payload_create();
|
||||||
default:
|
default:
|
||||||
return (payload_t*)unknown_payload_create();
|
return (payload_t*)unknown_payload_create(type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* See header.
|
||||||
|
*/
|
||||||
|
bool payload_is_known(payload_type_t type)
|
||||||
|
{
|
||||||
|
if (type == HEADER ||
|
||||||
|
(type >= SECURITY_ASSOCIATION && type <= EXTENSIBLE_AUTHENTICATION))
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
#ifdef ME
|
||||||
|
if (type == ID_PEER)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
|
@ -178,17 +178,8 @@ enum payload_type_t{
|
||||||
* used internally to handle a transform attribute like a payload.
|
* used internally to handle a transform attribute like a payload.
|
||||||
*/
|
*/
|
||||||
CONFIGURATION_ATTRIBUTE = 145,
|
CONFIGURATION_ATTRIBUTE = 145,
|
||||||
|
|
||||||
/**
|
|
||||||
* A unknown payload has a value of PRIVATE USE space.
|
|
||||||
*
|
|
||||||
* This payload type is not sent over wire and just
|
|
||||||
* used internally to handle a unknown payload.
|
|
||||||
*/
|
|
||||||
UNKNOWN_PAYLOAD = 146,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* enum names for payload_type_t.
|
* enum names for payload_type_t.
|
||||||
*/
|
*/
|
||||||
|
@ -269,4 +260,12 @@ struct payload_t {
|
||||||
*/
|
*/
|
||||||
payload_t *payload_create(payload_type_t type);
|
payload_t *payload_create(payload_type_t type);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a specific payload is implemented, or handled as unkown payload.
|
||||||
|
*
|
||||||
|
* @param type type of the payload to check
|
||||||
|
* @return FALSE if payload type handled as unkown payload
|
||||||
|
*/
|
||||||
|
bool payload_is_known(payload_type_t type);
|
||||||
|
|
||||||
#endif /** PAYLOAD_H_ @}*/
|
#endif /** PAYLOAD_H_ @}*/
|
||||||
|
|
|
@ -30,6 +30,11 @@ struct private_unknown_payload_t {
|
||||||
*/
|
*/
|
||||||
unknown_payload_t public;
|
unknown_payload_t public;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Type of this payload
|
||||||
|
*/
|
||||||
|
payload_type_t type;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Next payload type.
|
* Next payload type.
|
||||||
*/
|
*/
|
||||||
|
@ -105,7 +110,7 @@ METHOD(payload_t, get_encoding_rules, void,
|
||||||
METHOD(payload_t, get_payload_type, payload_type_t,
|
METHOD(payload_t, get_payload_type, payload_type_t,
|
||||||
private_unknown_payload_t *this)
|
private_unknown_payload_t *this)
|
||||||
{
|
{
|
||||||
return UNKNOWN_PAYLOAD;
|
return this->type;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(payload_t, get_next_type, payload_type_t,
|
METHOD(payload_t, get_next_type, payload_type_t,
|
||||||
|
@ -148,7 +153,7 @@ METHOD2(payload_t, unknown_payload_t, destroy, void,
|
||||||
/*
|
/*
|
||||||
* Described in header
|
* Described in header
|
||||||
*/
|
*/
|
||||||
unknown_payload_t *unknown_payload_create()
|
unknown_payload_t *unknown_payload_create(payload_type_t type)
|
||||||
{
|
{
|
||||||
private_unknown_payload_t *this;
|
private_unknown_payload_t *this;
|
||||||
|
|
||||||
|
@ -169,6 +174,7 @@ unknown_payload_t *unknown_payload_create()
|
||||||
},
|
},
|
||||||
.next_payload = NO_PAYLOAD,
|
.next_payload = NO_PAYLOAD,
|
||||||
.payload_length = UNKNOWN_PAYLOAD_HEADER_LENGTH,
|
.payload_length = UNKNOWN_PAYLOAD_HEADER_LENGTH,
|
||||||
|
.type = type,
|
||||||
);
|
);
|
||||||
|
|
||||||
return &this->public;
|
return &this->public;
|
||||||
|
|
|
@ -70,10 +70,11 @@ struct unknown_payload_t {
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates an empty unknown_payload_t object.
|
* Creates an empty unknown_payload_t.
|
||||||
*
|
*
|
||||||
* @return unknown_payload_t object
|
* @param type of the payload
|
||||||
|
* @return unknown_payload_t object
|
||||||
*/
|
*/
|
||||||
unknown_payload_t *unknown_payload_create(void);
|
unknown_payload_t *unknown_payload_create(payload_type_t type);
|
||||||
|
|
||||||
#endif /** UNKNOWN_PAYLOAD_H_ @}*/
|
#endif /** UNKNOWN_PAYLOAD_H_ @}*/
|
||||||
|
|
Loading…
Reference in New Issue