summaryrefslogtreecommitdiff
path: root/trafgen_proto.c
diff options
context:
space:
mode:
authorVadim Kochan <vadim4j@gmail.com>2016-08-13 02:11:12 +0300
committerTobias Klauser <tklauser@distanz.ch>2016-09-21 09:54:11 +0200
commitd5bcf8d0f5a2a549c3cbe71e7704bb557c7eb6a3 (patch)
tree24391949bd00fc3b7bb285db28c5249a8cef6e37 /trafgen_proto.c
parent208db0e4a3ceb21a65527d87198cf6f49c4b06dc (diff)
trafgen: proto: Randomize proto field at runtime
Add dynamic proto field function which can generate random value in specified range (default 0 - MAX_UINT32). Signed-off-by: Vadim Kochan <vadim4j@gmail.com> Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
Diffstat (limited to 'trafgen_proto.c')
-rw-r--r--trafgen_proto.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/trafgen_proto.c b/trafgen_proto.c
index 6c37b21..8c316b1 100644
--- a/trafgen_proto.c
+++ b/trafgen_proto.c
@@ -469,6 +469,31 @@ static void field_inc_func(struct proto_field *field)
}
}
+static inline uint32_t field_rand(struct proto_field *field)
+{
+ return field->func.min + (rand() % ((field->func.max - field->func.min) + 1));
+}
+
+static void field_rnd_func(struct proto_field *field)
+{
+ if (field->len == 1) {
+ proto_field_set_u8(field->hdr, field->id,
+ (uint8_t) field_rand(field));
+ } else if (field->len == 2) {
+ proto_field_set_be16(field->hdr, field->id,
+ (uint16_t) field_rand(field));
+ } else if (field->len == 4) {
+ proto_field_set_be32(field->hdr, field->id,
+ (uint32_t) field_rand(field));
+ } else if (field->len > 4) {
+ uint8_t *bytes = __proto_field_get_bytes(field);
+ uint32_t i;
+
+ for (i = 0; i < field->len; i++)
+ bytes[i] = (uint8_t) field_rand(field);
+ }
+}
+
void proto_field_func_add(struct proto_hdr *hdr, uint32_t fid,
struct proto_field_func *func)
{
@@ -499,6 +524,8 @@ void proto_field_func_add(struct proto_hdr *hdr, uint32_t fid,
}
field->func.update_field = field_inc_func;
+ } else if (func->type & PROTO_FIELD_FUNC_RND) {
+ field->func.update_field = field_rnd_func;
}
}