On Wed, Aug 03, 2016 at 04:32:06PM +0200, Tobias Klauser wrote:
> On 2016-07-26 at 21:35:18 +0200, Vadim Kochan <[email protected]> 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!!!
YES, sorry, will fix it !!!
>
> > EXAMPLES:
> > { udp(sport=dinc() }
> > { udp(sport=dinc(1) }
> > { udp(sport=dinc(5, 100, 125) }
>
> > Signed-off-by: Vadim Kochan <[email protected]>
> > ---
> > 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()
Sorry, I did not get it, may be you meant "No need to cast ..." ?
>
> > + 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 [email protected].
For more options, visit https://groups.google.com/d/optout.