Implemented a generic payload field lookup function
authorMartin Willi <martin@revosec.ch>
Wed, 24 Nov 2010 15:52:49 +0000 (16:52 +0100)
committerMartin Willi <martin@revosec.ch>
Wed, 5 Jan 2011 15:45:51 +0000 (16:45 +0100)
src/libcharon/encoding/payloads/payload.c
src/libcharon/encoding/payloads/payload.h

index 188dd1c..d1e677d 100644 (file)
@@ -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;
+}
index 6aa3f03..9d5ba8f 100644 (file)
@@ -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_ @}*/