Add 'len' parameter to *_set_bytes(...) functoins to have better control over it.
Signed-off-by: Vadim Kochan <vadi...@gmail.com> --- trafgen_l2.c | 6 +++--- trafgen_parser.y | 4 ++-- trafgen_proto.c | 48 ++++++++++++++++++++++++------------------------ trafgen_proto.h | 4 ++-- 4 files changed, 31 insertions(+), 31 deletions(-) diff --git a/trafgen_l2.c b/trafgen_l2.c index 5fc0a0d..427ff9b 100644 --- a/trafgen_l2.c +++ b/trafgen_l2.c @@ -69,7 +69,7 @@ static void pause_header_init(struct proto_hdr *hdr) struct proto_hdr *lower; lower = proto_lower_default_add(hdr, PROTO_ETH); - proto_hdr_field_set_default_bytes(lower, ETH_DST_ADDR, eth_dst); + proto_hdr_field_set_default_bytes(lower, ETH_DST_ADDR, eth_dst, 6); proto_header_fields_add(hdr, pause_fields, array_size(pause_fields)); proto_hdr_field_set_default_be16(hdr, PAUSE_OPCODE, 0x1); @@ -109,7 +109,7 @@ static void pfc_header_init(struct proto_hdr *hdr) struct proto_hdr *lower; lower = proto_lower_default_add(hdr, PROTO_ETH); - proto_hdr_field_set_default_bytes(lower, ETH_DST_ADDR, eth_dst); + proto_hdr_field_set_default_bytes(lower, ETH_DST_ADDR, eth_dst, 6); proto_header_fields_add(hdr, pfc_fields, array_size(pfc_fields)); proto_hdr_field_set_default_be16(hdr, PFC_OPCODE, 0x0101); @@ -180,7 +180,7 @@ static void arp_header_init(struct proto_hdr *hdr) if (lower->ops->id == PROTO_ETH) { const uint8_t bcast[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; - proto_hdr_field_set_default_bytes(lower, ETH_DST_ADDR, bcast); + proto_hdr_field_set_default_bytes(lower, ETH_DST_ADDR, bcast, 6); } proto_header_fields_add(hdr, arp_fields, array_size(arp_fields)); diff --git a/trafgen_parser.y b/trafgen_parser.y index f5f2dc4..8e1884e 100644 --- a/trafgen_parser.y +++ b/trafgen_parser.y @@ -435,12 +435,12 @@ static void proto_field_expr_eval(void) else panic("Invalid value length %zu, can be 1,2 or 4\n", field->len); } else if (field_expr.type & FIELD_EXPR_MAC) { - proto_hdr_field_set_bytes(hdr, field->id, field_expr.val.mac); + proto_hdr_field_set_bytes(hdr, field->id, field_expr.val.mac, 6); } else if (field_expr.type & FIELD_EXPR_IP4_ADDR) { proto_hdr_field_set_u32(hdr, field->id, field_expr.val.ip4_addr.s_addr); } else if (field_expr.type & FIELD_EXPR_IP6_ADDR) { proto_hdr_field_set_bytes(hdr, field->id, - (uint8_t *)&field_expr.val.ip6_addr.s6_addr); + (uint8_t *)&field_expr.val.ip6_addr.s6_addr, 16); } else if ((field_expr.type & FIELD_EXPR_INC) || (field_expr.type & FIELD_EXPR_RND)) { diff --git a/trafgen_proto.c b/trafgen_proto.c index 88e0846..0530032 100644 --- a/trafgen_proto.c +++ b/trafgen_proto.c @@ -182,8 +182,8 @@ set_proto: } static void __proto_field_set_bytes(struct proto_field *field, - const uint8_t *bytes, bool is_default, - bool is_be) + const uint8_t *bytes, size_t len, + bool is_default, bool is_be) { uint8_t *payload, *p8; uint16_t *p16; @@ -234,11 +234,11 @@ static void __proto_field_set_bytes(struct proto_field *field, } void proto_hdr_field_set_bytes(struct proto_hdr *hdr, uint32_t fid, - const uint8_t *bytes) + const uint8_t *bytes, size_t len) { struct proto_field *field = proto_hdr_field_by_id(hdr, fid); - __proto_field_set_bytes(field, bytes, false, false); + __proto_field_set_bytes(field, bytes, len, false, false); } static uint8_t *__proto_field_get_bytes(struct proto_field *field) @@ -248,7 +248,7 @@ static uint8_t *__proto_field_get_bytes(struct proto_field *field) void proto_hdr_field_set_u8(struct proto_hdr *hdr, uint32_t fid, uint8_t val) { - proto_hdr_field_set_bytes(hdr, fid, (uint8_t *)&val); + proto_hdr_field_set_bytes(hdr, fid, (uint8_t *)&val, 1); } uint8_t proto_hdr_field_get_u8(struct proto_hdr *hdr, uint32_t fid) @@ -261,7 +261,7 @@ uint8_t proto_hdr_field_get_u8(struct proto_hdr *hdr, uint32_t fid) void proto_hdr_field_set_u16(struct proto_hdr *hdr, uint32_t fid, uint16_t val) { - proto_hdr_field_set_bytes(hdr, fid, (uint8_t *)&val); + proto_hdr_field_set_bytes(hdr, fid, (uint8_t *)&val, 2); } uint16_t proto_hdr_field_get_u16(struct proto_hdr *hdr, uint32_t fid) @@ -274,7 +274,7 @@ uint16_t proto_hdr_field_get_u16(struct proto_hdr *hdr, uint32_t fid) void proto_hdr_field_set_u32(struct proto_hdr *hdr, uint32_t fid, uint32_t val) { - proto_hdr_field_set_bytes(hdr, fid, (uint8_t *)&val); + proto_hdr_field_set_bytes(hdr, fid, (uint8_t *)&val, 4); } uint32_t proto_hdr_field_get_u32(struct proto_hdr *hdr, uint32_t fid) @@ -286,60 +286,60 @@ uint32_t proto_hdr_field_get_u32(struct proto_hdr *hdr, uint32_t fid) } void proto_hdr_field_set_default_bytes(struct proto_hdr *hdr, uint32_t fid, - const uint8_t *bytes) + const uint8_t *bytes, size_t len) { struct proto_field *field = proto_hdr_field_by_id(hdr, fid); - __proto_field_set_bytes(field, bytes, true, false); + __proto_field_set_bytes(field, bytes, len, true, false); } void proto_hdr_field_set_default_u8(struct proto_hdr *hdr, uint32_t fid, uint8_t val) { struct proto_field *field = proto_hdr_field_by_id(hdr, fid); - __proto_field_set_bytes(field, (uint8_t *)&val, true, false); + __proto_field_set_bytes(field, (uint8_t *)&val, 1, true, false); } void proto_hdr_field_set_default_u16(struct proto_hdr *hdr, uint32_t fid, uint16_t val) { struct proto_field *field = proto_hdr_field_by_id(hdr, fid); - __proto_field_set_bytes(field, (uint8_t *)&val, true, false); + __proto_field_set_bytes(field, (uint8_t *)&val, 2, true, false); } void proto_hdr_field_set_default_u32(struct proto_hdr *hdr, uint32_t fid, uint32_t val) { struct proto_field *field = proto_hdr_field_by_id(hdr, fid); - __proto_field_set_bytes(field, (uint8_t *)&val, true, false); + __proto_field_set_bytes(field, (uint8_t *)&val, 4, true, false); } void proto_hdr_field_set_be16(struct proto_hdr *hdr, uint32_t fid, uint16_t val) { struct proto_field *field = proto_hdr_field_by_id(hdr, fid); - __proto_field_set_bytes(field, (uint8_t *)&val, false, true); + __proto_field_set_bytes(field, (uint8_t *)&val, 2, false, true); } void proto_hdr_field_set_be32(struct proto_hdr *hdr, uint32_t fid, uint32_t val) { struct proto_field *field = proto_hdr_field_by_id(hdr, fid); - __proto_field_set_bytes(field, (uint8_t *)&val, false, true); + __proto_field_set_bytes(field, (uint8_t *)&val, 4, false, true); } void proto_hdr_field_set_default_be16(struct proto_hdr *hdr, uint32_t fid, uint16_t val) { struct proto_field *field = proto_hdr_field_by_id(hdr, fid); - __proto_field_set_bytes(field, (uint8_t *)&val, true, true); + __proto_field_set_bytes(field, (uint8_t *)&val, 2, true, true); } void proto_hdr_field_set_default_be32(struct proto_hdr *hdr, uint32_t fid, uint32_t val) { struct proto_field *field = proto_hdr_field_by_id(hdr, fid); - __proto_field_set_bytes(field, (uint8_t *)&val, true, true); + __proto_field_set_bytes(field, (uint8_t *)&val, 4, true, true); } static void __proto_hdr_field_set_dev_mac(struct proto_hdr *hdr, uint32_t fid, @@ -356,7 +356,7 @@ static void __proto_hdr_field_set_dev_mac(struct proto_hdr *hdr, uint32_t fid, if (ret < 0) panic("Could not get device hw address\n"); - __proto_field_set_bytes(field, mac, is_default, false); + __proto_field_set_bytes(field, mac, 6, is_default, false); } void proto_hdr_field_set_dev_mac(struct proto_hdr *hdr, uint32_t fid) @@ -387,7 +387,7 @@ static void __proto_hdr_field_set_dev_ipv4(struct proto_hdr *hdr, uint32_t fid, } ss4 = (struct sockaddr_in *) &ss; - __proto_field_set_bytes(field, (uint8_t *)&ss4->sin_addr.s_addr, is_default, false); + __proto_field_set_bytes(field, (uint8_t *)&ss4->sin_addr.s_addr, 4, is_default, false); } void proto_hdr_field_set_dev_ipv4(struct proto_hdr *hdr, uint32_t fid) @@ -418,7 +418,7 @@ static void __proto_hdr_field_set_dev_ipv6(struct proto_hdr *hdr, uint32_t fid, } ss6 = (struct sockaddr_in6 *) &ss; - __proto_field_set_bytes(field, (uint8_t *)&ss6->sin6_addr.s6_addr, is_default, false); + __proto_field_set_bytes(field, (uint8_t *)&ss6->sin6_addr.s6_addr, 16, is_default, false); } void proto_hdr_field_set_dev_ipv6(struct proto_hdr *hdr, uint32_t fid) @@ -433,7 +433,7 @@ void proto_hdr_field_set_default_dev_ipv6(struct proto_hdr *hdr, uint32_t fid) void proto_field_set_u8(struct proto_field *field, uint8_t val) { - __proto_field_set_bytes(field, &val, false, false); + __proto_field_set_bytes(field, &val, 1, false, false); } uint8_t proto_field_get_u8(struct proto_field *field) @@ -445,7 +445,7 @@ uint8_t proto_field_get_u8(struct proto_field *field) void proto_field_set_u16(struct proto_field *field, uint16_t val) { - __proto_field_set_bytes(field, (uint8_t *)&val, false, false); + __proto_field_set_bytes(field, (uint8_t *)&val, 2, false, false); } uint16_t proto_field_get_u16(struct proto_field *field) @@ -457,7 +457,7 @@ uint16_t proto_field_get_u16(struct proto_field *field) void proto_field_set_u32(struct proto_field *field, uint32_t val) { - __proto_field_set_bytes(field, (uint8_t *)&val, false, false); + __proto_field_set_bytes(field, (uint8_t *)&val, 4, false, false); } uint32_t proto_field_get_u32(struct proto_field *field) @@ -469,12 +469,12 @@ uint32_t proto_field_get_u32(struct proto_field *field) void proto_field_set_be16(struct proto_field *field, uint16_t val) { - __proto_field_set_bytes(field, (uint8_t *)&val, false, true); + __proto_field_set_bytes(field, (uint8_t *)&val, 2, false, true); } void proto_field_set_be32(struct proto_field *field, uint32_t val) { - __proto_field_set_bytes(field, (uint8_t *)&val, false, true); + __proto_field_set_bytes(field, (uint8_t *)&val, 4, false, true); } void protos_init(const char *dev) diff --git a/trafgen_proto.h b/trafgen_proto.h index 29d68db..fa41d3b 100644 --- a/trafgen_proto.h +++ b/trafgen_proto.h @@ -108,7 +108,7 @@ extern void proto_header_fields_add(struct proto_hdr *hdr, extern bool proto_hdr_field_is_set(struct proto_hdr *hdr, uint32_t fid); extern void proto_hdr_field_set_bytes(struct proto_hdr *hdr, uint32_t fid, - const uint8_t *bytes); + const uint8_t *bytes, size_t len); extern void proto_hdr_field_set_u8(struct proto_hdr *hdr, uint32_t fid, uint8_t val); extern uint8_t proto_hdr_field_get_u8(struct proto_hdr *hdr, uint32_t fid); extern void proto_hdr_field_set_u16(struct proto_hdr *hdr, uint32_t fid, uint16_t val); @@ -117,7 +117,7 @@ extern void proto_hdr_field_set_u32(struct proto_hdr *hdr, uint32_t fid, uint32_ extern uint32_t proto_hdr_field_get_u32(struct proto_hdr *hdr, uint32_t fid); extern void proto_hdr_field_set_default_bytes(struct proto_hdr *hdr, uint32_t fid, - const uint8_t *bytes); + const uint8_t *bytes, size_t len); extern void proto_hdr_field_set_default_u8(struct proto_hdr *hdr, uint32_t fid, uint8_t val); extern void proto_hdr_field_set_default_u16(struct proto_hdr *hdr, uint32_t fid, -- 2.11.0 -- You received this message because you are subscribed to the Google Groups "netsniff-ng" group. To unsubscribe from this group and stop receiving emails from it, send an email to netsniff-ng+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.