diff options
author | Vadim Kochan <vadim4j@gmail.com> | 2016-12-18 11:52:47 +0200 |
---|---|---|
committer | Tobias Klauser <tklauser@distanz.ch> | 2016-12-21 16:55:28 +0100 |
commit | 7925eea97dfbe30b87217c6db9c6326f4eb66324 (patch) | |
tree | 5e7278596c4c05f6f338c6e7cef62758ba6210ba | |
parent | d552107f5ce59a69b43517e4327ed6a4903bf529 (diff) |
trafgen: proto: Add proto field only setters/getters
Add proto_field_xxx functions to set/get value via specified
proto_field only.
It is good to have such API in case if application needs to set/get
value for some custom proto_field instance.
Signed-off-by: Vadim Kochan <vadim4j@gmail.com>
Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
-rw-r--r-- | trafgen_proto.c | 46 | ||||
-rw-r--r-- | trafgen_proto.h | 10 |
2 files changed, 56 insertions, 0 deletions
diff --git a/trafgen_proto.c b/trafgen_proto.c index f862592..e2b80d4 100644 --- a/trafgen_proto.c +++ b/trafgen_proto.c @@ -431,6 +431,52 @@ void proto_hdr_field_set_default_dev_ipv6(struct proto_hdr *hdr, uint32_t fid) __proto_hdr_field_set_dev_ipv6(hdr, fid, true); } +void proto_field_set_u8(struct proto_field *field, uint8_t val) +{ + __proto_field_set_bytes(field, &val, false, false); +} + +uint8_t proto_field_get_u8(struct proto_field *field) +{ + uint8_t val = *__proto_field_get_bytes(field); + + return field_unmask_and_unshift(field, val); +} + +void proto_field_set_u16(struct proto_field *field, uint16_t val) +{ + __proto_field_set_bytes(field, (uint8_t *)&val, false, false); +} + +uint16_t proto_field_get_u16(struct proto_field *field) +{ + uint16_t val = *(uint16_t *)__proto_field_get_bytes(field); + + return field_unmask_and_unshift(field, be16_to_cpu(val)); +} + +void proto_field_set_u32(struct proto_field *field, uint32_t val) +{ + __proto_field_set_bytes(field, (uint8_t *)&val, false, false); +} + +uint32_t proto_field_get_u32(struct proto_field *field) +{ + uint32_t val = *(uint32_t *)__proto_field_get_bytes(field); + + return field_unmask_and_unshift(field, be32_to_cpu(val)); +} + +void proto_field_set_be16(struct proto_field *field, uint16_t val) +{ + __proto_field_set_bytes(field, (uint8_t *)&val, false, true); +} + +void proto_field_set_be32(struct proto_field *field, uint32_t val) +{ + __proto_field_set_bytes(field, (uint8_t *)&val, false, true); +} + void protos_init(const char *dev) { ctx.dev = dev; diff --git a/trafgen_proto.h b/trafgen_proto.h index 927fcb1..d4427e6 100644 --- a/trafgen_proto.h +++ b/trafgen_proto.h @@ -147,4 +147,14 @@ extern void proto_hdr_field_func_add(struct proto_hdr *hdr, uint32_t fid, extern struct proto_field *proto_hdr_field_by_id(struct proto_hdr *hdr, uint32_t fid); + +extern void proto_field_set_u8(struct proto_field *field, uint8_t val); +extern uint8_t proto_field_get_u8(struct proto_field *field); +extern void proto_field_set_u16(struct proto_field *field, uint16_t val); +extern uint16_t proto_field_get_u16(struct proto_field *field); +extern void proto_field_set_u32(struct proto_field *field, uint32_t val); +extern uint32_t proto_field_get_u32(struct proto_field *field); +extern void proto_field_set_be16(struct proto_field *field, uint16_t val); +extern void proto_field_set_be32(struct proto_field *field, uint32_t val); + #endif /* TRAFGEN_PROTO_H */ |