From 48178cd649b48196e16e0481ca44dea206fe04d4 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Tue, 9 Aug 2016 12:09:23 +0200 Subject: trafgen: proto: Store registered protocols in an array Protocols are registered early at startup and aren't changed at runtime. In order to speed up lookup while parsing, store the pointers to the protocol definitions (struct proto_hdr) in an array, indexed by protocol id rather than in a linked list. Signed-off-by: Tobias Klauser --- trafgen_proto.c | 19 +++++++------------ trafgen_proto.h | 3 ++- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/trafgen_proto.c b/trafgen_proto.c index f55c1b7..8baacbe 100644 --- a/trafgen_proto.c +++ b/trafgen_proto.c @@ -27,7 +27,7 @@ struct ctx { }; static struct ctx ctx; -static struct proto_hdr *registered; +static const struct proto_hdr *registered[__PROTO_MAX]; struct proto_hdr *proto_lower_header(struct proto_hdr *hdr) { @@ -52,21 +52,16 @@ uint8_t *proto_header_ptr(struct proto_hdr *hdr) return &packet_get(hdr->pkt_id)->payload[hdr->pkt_offset]; } -static struct proto_hdr *proto_header_by_id(enum proto_id id) +static const struct proto_hdr *proto_header_by_id(enum proto_id id) { - struct proto_hdr *p = registered; - - for (; p; p = p->next) - if (p->id == id) - return p; - - panic("Can't lookup proto by id %u\n", id); + bug_on(id >= __PROTO_MAX); + return registered[id]; } void proto_header_register(struct proto_hdr *hdr) { - hdr->next = registered; - registered = hdr; + bug_on(hdr->id >= __PROTO_MAX); + registered[hdr->id] = hdr; hdr->fields = NULL; hdr->fields_count = 0; @@ -128,7 +123,7 @@ bool proto_field_is_set(struct proto_hdr *hdr, uint32_t fid) struct proto_hdr *proto_header_init(enum proto_id pid) { struct proto_hdr **headers = current_packet()->headers; - struct proto_hdr *hdr = proto_header_by_id(pid); + const struct proto_hdr *hdr = proto_header_by_id(pid); struct proto_hdr *new_hdr; bug_on(current_packet()->headers_count >= PROTO_MAX_LAYERS); diff --git a/trafgen_proto.h b/trafgen_proto.h index f25078a..a66f8d3 100644 --- a/trafgen_proto.h +++ b/trafgen_proto.h @@ -6,7 +6,7 @@ #include enum proto_id { - PROTO_NONE, + PROTO_NONE = 0, PROTO_ETH, PROTO_VLAN, PROTO_ARP, @@ -17,6 +17,7 @@ enum proto_id { PROTO_ICMP6, PROTO_UDP, PROTO_TCP, + __PROTO_MAX, }; enum proto_layer { -- cgit v1.2.3-54-g00ecf