diff options
author | Martin Willi <martin@revosec.ch> | 2010-11-24 16:52:49 +0100 |
---|---|---|
committer | Martin Willi <martin@revosec.ch> | 2011-01-05 16:45:51 +0100 |
commit | e662d62a762988c79694e10e86f435486590e6e4 (patch) | |
tree | 0e3ff87e3d301d9ab3465c16a89f763f0f2614f2 /src | |
parent | bf029696c67b65b834dee872e77d19d14321342d (diff) | |
download | strongswan-e662d62a762988c79694e10e86f435486590e6e4.tar.bz2 strongswan-e662d62a762988c79694e10e86f435486590e6e4.tar.xz |
Implemented a generic payload field lookup function
Diffstat (limited to 'src')
-rw-r--r-- | src/libcharon/encoding/payloads/payload.c | 20 | ||||
-rw-r--r-- | src/libcharon/encoding/payloads/payload.h | 10 |
2 files changed, 30 insertions, 0 deletions
diff --git a/src/libcharon/encoding/payloads/payload.c b/src/libcharon/encoding/payloads/payload.c index 188dd1c15..d1e677db7 100644 --- a/src/libcharon/encoding/payloads/payload.c +++ b/src/libcharon/encoding/payloads/payload.c @@ -196,3 +196,23 @@ bool payload_is_known(payload_type_t type) #endif return FALSE; } + +/** + * See header. + */ +void* payload_get_field(payload_t *payload, encoding_type_t type, u_int skip) +{ + encoding_rule_t *rule; + size_t count; + int i; + + payload->get_encoding_rules(payload, &rule, &count); + for (i = 0; i < count; i++) + { + if (rule[i].type == type && skip-- == 0) + { + return ((char*)payload) + rule[i].offset; + } + } + return NULL; +} diff --git a/src/libcharon/encoding/payloads/payload.h b/src/libcharon/encoding/payloads/payload.h index 6aa3f0342..9d5ba8f11 100644 --- a/src/libcharon/encoding/payloads/payload.h +++ b/src/libcharon/encoding/payloads/payload.h @@ -268,4 +268,14 @@ payload_t *payload_create(payload_type_t type); */ bool payload_is_known(payload_type_t type); +/** + * Get the value field in a payload using encoding rules. + * + * @param payload payload to look up a field + * @param type encoding rule type to look up + * @param skip number rules of type to skip, 0 to get first + * @return type specific value pointer, NULL if not found + */ +void* payload_get_field(payload_t *payload, encoding_type_t type, u_int skip); + #endif /** PAYLOAD_H_ @}*/ |