On Thu, Aug 11, 2016 at 06:16:27PM +0200, Tobias Klauser wrote: > Currently struct proto_hdr is used twofold: > > 1) Statically define protocol behavior, i.e. all the *_hdr definitions in > trafgen_l{2,3,4}.c which map a protocol id/layer to a set of callback > functions. > > 2) For each packet created at parse time the struct is memcpy()'ed > (including all the static information from 1) and then used to store > dynamic information at parse/run time. > > Thus, struct proto_hdr members such as the proto id, layer and the > pointers callback functions get copied for each created packet (in > addition to the other fields which get changed during parsing). Also, > static/dynamic information get mixed and we e.g. can't make the protocol > definitions const to ensure they'll not get changed by mistake. > > Rather than copying the struct proto_hdr for every packet, clearly > separate the two purposes defined above by splitting struct proto_hdr > into two structs: > > 1) struct proto_ops for the static (const) protocol behavior definition > > 2) struct proto_hdr (reduced) for dynamic information > > struct proto_hdr keeps a pointer to the corresponding proto_ops instance > and uses it to execute the corresponding callbacks.
You can add my "Acked-by" if it is needed. > > Reference: > https://groups.google.com/forum/#!msg/netsniff-ng/20RvwJdh50Y/eMkbmKSaBgAJ > Signed-off-by: Tobias Klauser <tklau...@distanz.ch> > --- > trafgen_l2.c | 24 ++++++++++----------- > trafgen_l3.c | 8 +++---- > trafgen_l4.c | 22 +++++++++---------- > trafgen_parser.y | 2 +- > trafgen_proto.c | 65 > +++++++++++++++++++++++++++++--------------------------- > trafgen_proto.h | 40 +++++++++++++++++----------------- > 6 files changed, 83 insertions(+), 78 deletions(-) > > diff --git a/trafgen_l2.c b/trafgen_l2.c > index 1863332b3543..f09b2a61cacc 100644 > --- a/trafgen_l2.c > +++ b/trafgen_l2.c > @@ -47,7 +47,7 @@ static void eth_header_init(struct proto_hdr *hdr) > proto_field_set_default_dev_mac(hdr, ETH_SRC_ADDR); > } > > > -struct proto_hdr *proto_header_init(enum proto_id pid) > +struct proto_hdr *proto_header_new(enum proto_id pid) The old name was really bad by may be something like: {proto,packet}_header_{add,push} might be better ? > { > struct proto_hdr **headers = current_packet()->headers; > - const struct proto_hdr *hdr = proto_header_by_id(pid); > - struct proto_hdr *new_hdr; > + const struct proto_ops *ops = proto_ops_by_id(pid); > + struct proto_hdr *hdr; > > bug_on(current_packet()->headers_count >= PROTO_MAX_LAYERS); > > - new_hdr = xmalloc(sizeof(*new_hdr)); > - memcpy(new_hdr, hdr, sizeof(*new_hdr)); > + hdr = xzmalloc(sizeof(*hdr)); > + hdr->ops = ops; > + hdr->pkt_id = current_packet_id(); > > - new_hdr->pkt_id = current_packet_id(); > + if (ops && ops->header_init) > + ops->header_init(hdr); > > - if (new_hdr->header_init) > - new_hdr->header_init(new_hdr); > + headers[current_packet()->headers_count++] = hdr; > > - headers[current_packet()->headers_count++] = new_hdr; > - return new_hdr; > + return hdr; > } > Thanks! Vadim Kochan, -- 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.