On 2016-07-26 at 21:35:18 +0200, Vadim Kochan <vadi...@gmail.com> wrote:
> Add 'dinc()' function in 'field_expr' rules to be used for dynamically
> incrementing of any specified field:
> 
> SYNTAX := dinc() | dinc(inc) | dinc(min, max) | dinc(inc, min, max)

This should definitely follow the same parameter order as the existing
dinc() function!!!

> EXAMPLES:
>     { udp(sport=dinc() }
>     { udp(sport=dinc(1) }
>     { udp(sport=dinc(5, 100, 125) }

> Signed-off-by: Vadim Kochan <vadi...@gmail.com>
> ---
>  trafgen_parser.y | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 51 insertions(+)
> 
> diff --git a/trafgen_parser.y b/trafgen_parser.y
> index 58ac999..7872b7c 100644
> --- a/trafgen_parser.y
> +++ b/trafgen_parser.y
> @@ -74,6 +74,7 @@ enum field_expr_type_t {
>       FIELD_EXPR_MAC,
>       FIELD_EXPR_IP4_ADDR,
>       FIELD_EXPR_IP6_ADDR,
> +     FIELD_EXPR_INC,
>  };
>  
>  struct proto_field_expr {
> @@ -85,6 +86,7 @@ struct proto_field_expr {
>               struct in6_addr ip6_addr;
>               long long int number;
>               uint8_t bytes[256];
> +             struct proto_field_func func;
>       } val;
>  };
>  
> @@ -125,6 +127,12 @@ static inline void __init_new_csum_slot(struct 
> packet_dyn *slot)
>       slot->slen = 0;
>  }
>  
> +static inline void __init_new_fields_slot(struct packet_dyn *slot)
> +{
> +     slot->fields = NULL;
> +     slot->flen = 0;
> +}
> +
>  static inline void __setup_new_counter(struct counter *c, uint8_t start,
>                                      uint8_t stop, uint8_t stepping,
>                                      int type)
> @@ -167,6 +175,7 @@ static void realloc_packet(void)
>       __init_new_counter_slot(&packet_dyn[packetd_last]);
>       __init_new_randomizer_slot(&packet_dyn[packetd_last]);
>       __init_new_csum_slot(&packet_dyn[packetd_last]);
> +     __init_new_fields_slot(&packet_dyn[packetd_last]);
>  }
>  
>  struct packet *current_packet(void)
> @@ -376,6 +385,19 @@ static void proto_field_set(uint32_t fid)
>       field_expr.field = proto_field_by_id(hdr, fid);
>  }
>  
> +static void proto_field_func_setup(struct proto_field *field, struct 
> proto_field_func *func)
> +{
> +     struct packet_dyn *pkt_dyn;
> +
> +     proto_field_func_add(field->hdr, field->id, func);
> +
> +     pkt_dyn = &packet_dyn[packetd_last];
> +     pkt_dyn->flen++;
> +     pkt_dyn->fields = (struct proto_field **)xrealloc(pkt_dyn->fields, 
> pkt_dyn->flen *
> +                             sizeof(struct proto_field *));

No need to case the return value of xrealloc()

> +     pkt_dyn->fields[pkt_dyn->flen - 1] = field;
> +}
> +
>  static void proto_field_expr_eval(void)
>  {
>       struct proto_field *field = field_expr.field;
> @@ -405,6 +427,14 @@ static void proto_field_expr_eval(void)
>                       (uint8_t *)&field_expr.val.ip6_addr.s6_addr);
>               break;
>  
> +     case FIELD_EXPR_INC:
> +             if (field_expr.val.func.min > field_expr.val.func.max)
> +                     panic("dinc(): min(%u) can't be greater than max(%u)\n",
> +                             field_expr.val.func.min, 
> field_expr.val.func.max);
> +
> +             proto_field_func_setup(field, &field_expr.val.func);
> +             break;
> +
>       case FIELD_EXPR_UNKNOWN:
>       default:
>               bug();
> @@ -685,6 +715,26 @@ field_expr
>                    field_expr.val.ip4_addr = $1; }
>       | ip6_addr { field_expr.type = FIELD_EXPR_IP6_ADDR;
>                    field_expr.val.ip6_addr = $1; }
> +     | K_DINC '(' ')' { field_expr.type = FIELD_EXPR_INC;
> +                        field_expr.val.func.type = PROTO_FIELD_FUNC_INC;
> +                        field_expr.val.func.inc = 1; }
> +     | K_DINC '(' number ')'
> +                     { field_expr.type = FIELD_EXPR_INC;
> +                       field_expr.val.func.inc = $3; }
> +     | K_DINC '(' number delimiter number ')'
> +                     { field_expr.type = FIELD_EXPR_INC;
> +                       field_expr.val.func.type  = PROTO_FIELD_FUNC_INC;
> +                       field_expr.val.func.type |= PROTO_FIELD_FUNC_MIN;
> +                       field_expr.val.func.inc = 1;
> +                       field_expr.val.func.min = $3;
> +                       field_expr.val.func.max = $5; }
> +     | K_DINC '(' number delimiter number delimiter number ')'
> +                     { field_expr.type = FIELD_EXPR_INC;
> +                       field_expr.val.func.type  = PROTO_FIELD_FUNC_INC;
> +                       field_expr.val.func.type |= PROTO_FIELD_FUNC_MIN;
> +                       field_expr.val.func.inc = $3;
> +                       field_expr.val.func.min = $5;
> +                       field_expr.val.func.max = $7; }
>       ;
>  
>  eth_proto
> @@ -1097,6 +1147,7 @@ void cleanup_packets(void)
>       for (i = 0; i < dlen; ++i) {
>               free(packet_dyn[i].cnt);
>               free(packet_dyn[i].rnd);
> +             free(packet_dyn[i].fields);
>       }
>  
>       free(packet_dyn);
> -- 
> 2.6.3
> 

-- 
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.

Reply via email to