Add configurable TCP and UDP ports for MEMCACHE dissector

svn path=/trunk/; revision=48064
This commit is contained in:
Pascal Quantin 2013-03-04 17:48:56 +00:00
parent 42dce2d033
commit 0efdddc61f
1 changed files with 57 additions and 8 deletions

View File

@ -54,7 +54,7 @@
#define PSNAME "MEMCACHE"
#define PFNAME "memcache"
#define MEMCACHE_PORT 11211
#define MEMCACHE_DEFAULT_RANGE "11211"
#define MEMCACHE_HEADER_LEN 24
/* Magic Byte */
@ -111,6 +111,13 @@
static int proto_memcache = -1;
void proto_reg_handoff_memcache(void);
static range_t *memcache_tcp_port_range = NULL;
static range_t *memcache_udp_port_range = NULL;
static dissector_handle_t memcache_tcp_handle;
static dissector_handle_t memcache_udp_handle;
static int hf_magic = -1;
static int hf_opcode = -1;
static int hf_extras_length = -1;
@ -2121,7 +2128,7 @@ proto_register_memcache (void)
proto_register_subtree_array (ett, array_length (ett));
/* Register our configuration options */
memcache_module = prefs_register_protocol (proto_memcache, NULL);
memcache_module = prefs_register_protocol (proto_memcache, proto_reg_handoff_memcache);
prefs_register_bool_preference (memcache_module, "desegment_headers",
"Reassemble MEMCACHE headers spanning multiple TCP segments",
@ -2138,20 +2145,62 @@ proto_register_memcache (void)
" To use this option, you must also enable \"Allow subdissectors"
" to reassemble TCP streams\" in the TCP protocol settings.",
&memcache_desegment_body);
range_convert_str(&memcache_tcp_port_range, MEMCACHE_DEFAULT_RANGE, 65535);
range_convert_str(&memcache_udp_port_range, MEMCACHE_DEFAULT_RANGE, 65535);
prefs_register_range_preference(memcache_module, "tcp.ports", \
"MEMCACHE TCP Port range", \
"MEMCACHE TCP Port range", \
&memcache_tcp_port_range, \
65535);
prefs_register_range_preference(memcache_module, "udp.ports", \
"MEMCACHE UDP Port range", \
"MEMCACHE UDP Port range", \
&memcache_udp_port_range, \
65535);
}
static void range_delete_tcp_port_callback(guint32 port) {
dissector_delete_uint("tcp.port", port, memcache_tcp_handle);
}
static void range_delete_udp_port_callback(guint32 port) {
dissector_delete_uint("udp.port", port, memcache_udp_handle);
}
static void range_add_tcp_port_callback(guint32 port) {
dissector_add_uint("tcp.port", port, memcache_tcp_handle);
}
static void range_add_udp_port_callback(guint32 port) {
dissector_add_uint("udp.port", port, memcache_udp_handle);
}
/* Register the tcp and udp memcache dissectors. */
void
proto_reg_handoff_memcache (void)
{
dissector_handle_t memcache_tcp_handle;
dissector_handle_t memcache_udp_handle;
static range_t *orig_memcache_tcp_port_range = NULL;
static range_t *orig_memcache_udp_port_range = NULL;
static gboolean initialized = FALSE;
memcache_tcp_handle = find_dissector ("memcache.tcp");
memcache_udp_handle = find_dissector ("memcache.udp");
if (!initialized) {
memcache_tcp_handle = find_dissector("memcache.tcp");
memcache_udp_handle = find_dissector("memcache.udp");
initialized = TRUE;
} else {
range_foreach(orig_memcache_tcp_port_range, range_delete_tcp_port_callback);
range_foreach(orig_memcache_udp_port_range, range_delete_udp_port_callback);
g_free(orig_memcache_tcp_port_range);
g_free(orig_memcache_udp_port_range);
}
dissector_add_uint ("tcp.port", MEMCACHE_PORT, memcache_tcp_handle);
dissector_add_uint ("udp.port", MEMCACHE_PORT, memcache_udp_handle);
orig_memcache_tcp_port_range = range_copy(memcache_tcp_port_range);
orig_memcache_udp_port_range = range_copy(memcache_udp_port_range);
range_foreach(orig_memcache_tcp_port_range, range_add_tcp_port_callback);
range_foreach(orig_memcache_udp_port_range, range_add_udp_port_callback);
}
/*