diff options
author | João Valverde <joao.valverde@tecnico.ulisboa.pt> | 2017-07-18 19:47:58 +0100 |
---|---|---|
committer | Anders Broman <a.broman58@gmail.com> | 2017-08-04 05:55:08 +0000 |
commit | 733c19a0720035c1aa19d79f765d72b085d58bdd (patch) | |
tree | c9242cfe94df14569c8d0cd952e9ef010e3fcbfa /epan | |
parent | 936a8f1cf8c314993f7fca6f193764cb53652924 (diff) |
Optimize the "services" dictionary
Remove assignee and other miscellaneous information that changes more
frequently than service name and can be consulted directly in the IANA
registry.
Allow merging identical transports into a single line for convenience
and size/speed optimization (a backward-compatible change).
Remove obsolete make-services.pl.
Change-Id: I3ecbd1a6a68d87c084d77498a0eeb44b7afdab67
Reviewed-on: https://code.wireshark.org/review/22872
Petri-Dish: João Valverde <j@v6e.pt>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan')
-rw-r--r-- | epan/addr_resolv.c | 72 | ||||
-rw-r--r-- | epan/range.c | 12 | ||||
-rw-r--r-- | epan/range.h | 8 |
3 files changed, 51 insertions, 41 deletions
diff --git a/epan/addr_resolv.c b/epan/addr_resolv.c index 9b0ca61a4a..f7e1911aa9 100644 --- a/epan/addr_resolv.c +++ b/epan/addr_resolv.c @@ -234,9 +234,10 @@ typedef struct _resolved_ipv6 static addrinfo_lists_t addrinfo_lists = { NULL, NULL}; -static gchar *cb_service; -static port_type cb_proto = PT_NONE; - +struct cb_serv_data { + gchar *service; + port_type proto; +}; static wmem_map_t *manuf_hashtable = NULL; static wmem_map_t *wka_hashtable = NULL; @@ -252,7 +253,7 @@ static gboolean new_resolved_objects = FALSE; static GPtrArray* extra_hosts_files = NULL; static hashether_t *add_eth_name(const guint8 *addr, const gchar *name); -static void add_serv_port_cb(const guint32 port); +static void add_serv_port_cb(const guint32 port, gpointer ptr); /* http://eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx#existing @@ -475,18 +476,12 @@ add_service_name(port_type proto, const guint port, const char *service_name) static void parse_service_line (char *line) { - /* - * See the services(4) or services(5) man page for services file format - * (not available on all systems). - */ - gchar *cp; gchar *service; gchar *port; port_type proto; - + struct cb_serv_data cb_data; range_t *port_rng = NULL; - guint32 max_port = MAX_UDP_PORT; if ((cp = strchr(line, '#'))) *cp = '\0'; @@ -504,48 +499,43 @@ parse_service_line (char *line) if (strtok(cp, "/") == NULL) return; - if ((cp = strtok(NULL, "/")) == NULL) - return; - - /* seems we got all interesting things from the file */ - if (strcmp(cp, "tcp") == 0) { - max_port = MAX_TCP_PORT; - proto = PT_TCP; - } - else if (strcmp(cp, "udp") == 0) { - max_port = MAX_UDP_PORT; - proto = PT_UDP; - } - else if (strcmp(cp, "sctp") == 0) { - max_port = MAX_SCTP_PORT; - proto = PT_SCTP; - } - else if (strcmp(cp, "dccp") == 0) { - max_port = MAX_DCCP_PORT; - proto = PT_DCCP; - } else { + if (range_convert_str(NULL, &port_rng, port, G_MAXUINT16) != CVT_NO_ERROR) { + wmem_free (NULL, port_rng); return; } - if (CVT_NO_ERROR != range_convert_str(NULL, &port_rng, port, max_port)) { - /* some assertion here? */ - wmem_free (NULL, port_rng); - return; + while ((cp = strtok(NULL, "/")) != NULL) { + if (strcmp(cp, "tcp") == 0) { + proto = PT_TCP; + } + else if (strcmp(cp, "udp") == 0) { + proto = PT_UDP; + } + else if (strcmp(cp, "sctp") == 0) { + proto = PT_SCTP; + } + else if (strcmp(cp, "dccp") == 0) { + proto = PT_DCCP; + } + else { + break; + } + cb_data.service = service; + cb_data.proto = proto; + range_foreach2(port_rng, add_serv_port_cb, &cb_data); } - cb_service = service; - cb_proto = proto; - range_foreach(port_rng, add_serv_port_cb); wmem_free (NULL, port_rng); - cb_proto = PT_NONE; } /* parse_service_line */ static void -add_serv_port_cb(const guint32 port) +add_serv_port_cb(const guint32 port, gpointer ptr) { + struct cb_serv_data *cb_data = (struct cb_serv_data *)ptr; + if ( port ) { - add_service_name(cb_proto, port, cb_service); + add_service_name(cb_data->proto, port, cb_data->service); } } diff --git a/epan/range.c b/epan/range.c index 5bcfc60c95..1d4268967c 100644 --- a/epan/range.c +++ b/epan/range.c @@ -414,6 +414,18 @@ range_foreach(range_t *range, void (*callback)(guint32 val)) } } +void range_foreach2(range_t *range, void (*callback2)(guint32 val, gpointer ptr), gpointer ptr) +{ + guint32 i, j; + + if (range && callback2) { + for (i=0; i < range->nranges; i++) { + for (j = range->ranges[i].low; j <= range->ranges[i].high; j++) + callback2(j, ptr); + } + } +} + /* This function converts a range_t to a (wmem-allocated) string. */ char * range_convert_range(wmem_allocator_t *scope, const range_t *range) diff --git a/epan/range.h b/epan/range.h index f090055240..791719ad59 100644 --- a/epan/range.h +++ b/epan/range.h @@ -137,6 +137,14 @@ WS_DLL_PUBLIC gboolean ranges_are_equal(range_t *a, range_t *b); */ WS_DLL_PUBLIC void range_foreach(range_t *range, void (*callback)(guint32 val)); +/** This function calls the provided callback function for each value in + * in the range. Takes an optional pointer argument. + * @param range the range + * @param callback the callback function + * @param ptr pointer passed to the callback + */ +WS_DLL_PUBLIC void range_foreach2(range_t *range, void (*callback2)(guint32 val, gpointer ptr), gpointer ptr); + /** * This function converts a range_t to a (wmem_alloc()-allocated) string. */ |