From 201e18a8841a2cb341a752ca180014a3b8fe5234 Mon Sep 17 00:00:00 2001 From: Eugeniy Meshcheryakov Date: Mon, 7 Sep 2009 11:01:14 +0200 Subject: Fix build-id check for relocatable kernel Save offset of build id relative to _stext instead of absolute address for kernel and apply relocations at run-time. This fixes Debian bug #545277 (http://bugs.debian.org/545277). --- runtime/sym.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'runtime') diff --git a/runtime/sym.c b/runtime/sym.c index dd2235cc..856ccbcc 100644 --- a/runtime/sym.c +++ b/runtime/sym.c @@ -259,7 +259,8 @@ static int _stp_module_check(void) /* notes end address */ if (!strcmp(m->name, "kernel")) { - notes_addr = m->build_id_offset; + notes_addr = _stp_module_relocate("kernel", + "_stext", m->build_id_offset); base_addr = _stp_module_relocate("kernel", "_stext", 0); } else { -- cgit From 0ed88eb252bdeb3dd9c5cd425d6a0e26816635b6 Mon Sep 17 00:00:00 2001 From: Dave Brolley Date: Tue, 8 Sep 2009 17:02:51 -0400 Subject: Warn if the pid specified by -x does not belong to an unprivileged user. --- runtime/task_finder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'runtime') diff --git a/runtime/task_finder.c b/runtime/task_finder.c index 1a9a738a..eb81b8d3 100644 --- a/runtime/task_finder.c +++ b/runtime/task_finder.c @@ -1443,7 +1443,7 @@ stap_start_task_finder(void) #ifndef STP_PRIVILEGED /* Make sure unprivileged users only probe their own threads. */ if (_stp_uid != tsk_euid) { - if (tgt->pid != 0) { + if (tgt->pid != 0 || _stp_target) { _stp_warn("Process %d does not belong to unprivileged user %d", tsk->pid, _stp_uid); } -- cgit From cf509e712520c6e18ecdf290b5ef85811e8ef013 Mon Sep 17 00:00:00 2001 From: "Frank Ch. Eigler" Date: Fri, 4 Sep 2009 16:41:55 -0400 Subject: runtime diagnostics: remove ANSI goo, add -DSTAP_DEBUG_PRINTK option. * runtime/io.c (_stp_vlog): Don't put ansi highlighting into debugging messages. #if STAP_DEBUG_PRINTK, direct all diagnostics to appropriate printk channel instead of runtime trace buffer. --- runtime/io.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'runtime') diff --git a/runtime/io.c b/runtime/io.c index 687926fd..0136aae5 100644 --- a/runtime/io.c +++ b/runtime/io.c @@ -32,7 +32,7 @@ static void _stp_vlog (enum code type, const char *func, int line, const char *f int start = 0; if (type == DBUG) { - start = _stp_snprintf(buf, STP_LOG_BUF_LEN, "\033[36m%s:%d:\033[0m ", func, line); + start = _stp_snprintf(buf, STP_LOG_BUF_LEN, "%s:%d: ", func, line); } else if (type == WARN) { strcpy (buf, WARN_STRING); start = sizeof(WARN_STRING) - 1; @@ -49,12 +49,19 @@ static void _stp_vlog (enum code type, const char *func, int line, const char *f buf[num + start] = '\0'; } +#ifdef STAP_DEBUG_PRINTK + if (type == DBUG) printk (KERN_DEBUG "%s", buf); + else if (type == WARN) printk (KERN_WARNING "%s", buf); + else if (type == ERROR) printk (KERN_ERR "%s", buf); + else printk (KERN_INFO "%s", buf); +#else if (type != DBUG) _stp_ctl_write(STP_OOB_DATA, buf, start + num + 1); else { _stp_print(buf); _stp_print_flush(); } +#endif } put_cpu(); } -- cgit From 9b7a17471dd57572a63944fe46679c08c23faa13 Mon Sep 17 00:00:00 2001 From: "Frank Ch. Eigler" Date: Fri, 4 Sep 2009 16:43:35 -0400 Subject: task_finder diagnostics: emit start_task_finder dbug message at end of fn. * task_finder.c (stap_start_task_finder): Emit _stp_dbug message at end rather at beginning, so printed utrace-engine attach counts reflect status at end of initialization rather than at beginning. --- runtime/task_finder.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'runtime') diff --git a/runtime/task_finder.c b/runtime/task_finder.c index eb81b8d3..488a6a2e 100644 --- a/runtime/task_finder.c +++ b/runtime/task_finder.c @@ -1357,7 +1357,6 @@ stap_start_task_finder(void) char *mmpath_buf; uid_t tsk_euid; - debug_task_finder_report(); mmpath_buf = _stp_kmalloc(PATH_MAX); if (mmpath_buf == NULL) { _stp_error("Unable to allocate space for path"); @@ -1462,8 +1461,8 @@ stap_start_task_finder(void) } while_each_thread(grp, tsk); stf_err: rcu_read_unlock(); - _stp_kfree(mmpath_buf); + debug_task_finder_report(); // report at end for utrace engine counting return rc; } -- cgit From 7622ef6a5183220fa56dedabaeb8fa87b0e43919 Mon Sep 17 00:00:00 2001 From: "Frank Ch. Eigler" Date: Mon, 7 Sep 2009 17:34:39 -0400 Subject: task_finder diagnostics: standardize on STP_DEBUG_PRINTK * io.c (DEBUG_TASK_FINDER_PRINTK): Remove conditional. --- runtime/task_finder.c | 8 -------- 1 file changed, 8 deletions(-) (limited to 'runtime') diff --git a/runtime/task_finder.c b/runtime/task_finder.c index 488a6a2e..6b50f1b9 100644 --- a/runtime/task_finder.c +++ b/runtime/task_finder.c @@ -45,18 +45,10 @@ static atomic_t __stp_attach_count = ATOMIC_INIT (0); #define debug_task_finder_attach() (atomic_inc(&__stp_attach_count)) #define debug_task_finder_detach() (atomic_dec(&__stp_attach_count)) -#ifdef DEBUG_TASK_FINDER_PRINTK -#define debug_task_finder_report() (printk(KERN_ERR \ - "%s:%d attach count: %d, inuse count: %d\n", \ - __FUNCTION__, __LINE__, \ - atomic_read(&__stp_attach_count), \ - atomic_read(&__stp_inuse_count))) -#else #define debug_task_finder_report() (_stp_dbug(__FUNCTION__, __LINE__, \ "attach count: %d, inuse count: %d\n", \ atomic_read(&__stp_attach_count), \ atomic_read(&__stp_inuse_count))) -#endif /* !DEBUG_TASK_FINDER_PRINTK */ #else #define debug_task_finder_attach() /* empty */ #define debug_task_finder_detach() /* empty */ -- cgit From 20b69eca3931d338b09134b9c1f5dee2c49ca55b Mon Sep 17 00:00:00 2001 From: "Frank Ch. Eigler" Date: Tue, 8 Sep 2009 17:32:26 -0400 Subject: PR10575: emit KERN_ERRORs on transport control message failures Suspecting that some kernel->user control messages may be getting lost, let's more robustly log these occurrences. * runtime/transport/control.c (_stp_ctl_send): printk(KERN_ERROR) instead of ignoring errors. --- runtime/transport/control.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'runtime') diff --git a/runtime/transport/control.c b/runtime/transport/control.c index 925a6768..2b368320 100644 --- a/runtime/transport/control.c +++ b/runtime/transport/control.c @@ -173,6 +173,9 @@ static int _stp_ctl_send(int type, void *data, int len) msleep(5); if (err > 0) wake_up_interruptible(&_stp_ctl_wq); + else + // printk instead of _stp_error since an error here means our transport is suspect + printk(KERN_ERROR "ctl_send (type=%d len=%d) failed: %d\n", type, len, err); dbug_trans(1, "returning %d\n", err); return err; } -- cgit From d1292e962e1207cddf686a0196effa6bc8f6a217 Mon Sep 17 00:00:00 2001 From: "Frank Ch. Eigler" Date: Tue, 8 Sep 2009 19:04:16 -0400 Subject: fix typo: KERN_ERROR -> KERN_ERR from last commit --- runtime/transport/control.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'runtime') diff --git a/runtime/transport/control.c b/runtime/transport/control.c index 2b368320..0e18bb8b 100644 --- a/runtime/transport/control.c +++ b/runtime/transport/control.c @@ -175,7 +175,7 @@ static int _stp_ctl_send(int type, void *data, int len) wake_up_interruptible(&_stp_ctl_wq); else // printk instead of _stp_error since an error here means our transport is suspect - printk(KERN_ERROR "ctl_send (type=%d len=%d) failed: %d\n", type, len, err); + printk(KERN_ERR "ctl_send (type=%d len=%d) failed: %d\n", type, len, err); dbug_trans(1, "returning %d\n", err); return err; } -- cgit From 89ba308506249736c6d0c8490d3c897af4e42df8 Mon Sep 17 00:00:00 2001 From: "Frank Ch. Eigler" Date: Tue, 8 Sep 2009 20:23:42 -0400 Subject: PR10524: reduce massive-uprobe script modules' .data consumption The general approach is to rip out task_finder_tgt's from all over the place (including the unwindsym vmcbs, and the stap_uprobe_specs), and instead have a small handful of them: one for all unwindsyms, and one per abstract probed process (PID or NAME). These are in turn shared by all new stap_unwind_specs by index. Before: probe process("./stap").function("*") -rw-r--r--. 1 fche users 11775283 2009-09-08 20:26 /var/tmp/fche/systemtap/cache/96/stap_96c0479d674db55ec98d8a8750a790e7_7989596.ko text data bss dec hex filename 445158 8351944 4306472 13103574 c7f1d6 /var/tmp/fche/systemtap/cache/96/stap_96c0479d674db55ec98d8a8750a790e7_7989596.ko After: (Note how data shrank, though text gained a bit in const-init-data.) -rw-r--r--. 1 fche users 4021569 2009-09-08 20:27 /var/tmp/fche/systemtap/cache/e4/stap_e46e88634efd850b1586e81c231c239a_8058419.ko text data bss dec hex filename 1896511 2192 4324808 6223511 5ef697 /var/tmp/fche/systemtap/cache/e4/stap_e46e88634efd850b1586e81c231c239a_8058419.ko * tapsets.cxx (uprobe_derived_probe_group): Rewrite emit_module_decls, and adjust emit_module_init. * runtime/sym.c (_stp_sym_init): Initialize unwindsyms-shared vmcb. * runtime/sym.h (_stp_module): Remove *vmcb field. * translate.cxx (emit_module_init, dump_unwindsyms): Adapt. * translate.h (assert_0_indent): Flush output before possibly assert-failing. --- runtime/sym.c | 55 ++++++++++++++++++++++++++++++++++++++++--------------- runtime/sym.h | 2 -- 2 files changed, 40 insertions(+), 17 deletions(-) (limited to 'runtime') diff --git a/runtime/sym.c b/runtime/sym.c index 856ccbcc..0baa1a5e 100644 --- a/runtime/sym.c +++ b/runtime/sym.c @@ -16,21 +16,6 @@ #include "string.c" #include "task_finder_vma.c" -/** @file sym.c - * @addtogroup sym Symbolic Functions - * Symbolic Lookup Functions - * @{ - */ - -static void _stp_sym_init(void) -{ - static int initialized = 0; - if (! initialized) { - __stp_tf_vma_initialize(); - initialized = 1; - } -} - /* Callback that needs to be registered (in session.unwindsyms_modules) for every user task path for which we might need symbols or unwind info. */ @@ -409,4 +394,44 @@ static void _stp_symbol_snprint(char *str, size_t len, unsigned long address, } /** @} */ + + +/** @file sym.c + * @addtogroup sym Symbolic Functions + * Symbolic Lookup Functions + * @{ + */ +static void _stp_sym_init(void) +{ + // NB: it's too "early" to make this conditional on STP_NEED_VMA_TRACKER, + // since we're #included at the top of the generated module, before any + // tapset-induced #define's. +#if defined(CONFIG_UTRACE) + static int initialized = 0; + static struct stap_task_finder_target vmcb = { + // NB: no .pid, no .procname filters here. + // This means that we get a system-wide mmap monitoring + // widget while the script is running. (The system-wideness may + // be restricted by stap -c or -x.) But this seems to + // be necessary if we want to to stack tracebacks through arbitrary + // shared libraries. XXX: There may be an optimization opportunity + // for executables (for which the main task-finder callback should be + // sufficient). + .mmap_callback = &_stp_tf_mmap_cb, + .munmap_callback = &_stp_tf_munmap_cb, + }; + if (! initialized) { + int rc; + __stp_tf_vma_initialize(); + rc = stap_register_task_finder_target (& vmcb); +#ifdef DEBUG_TASK_FINDER_VMA + _stp_dbug(__FUNCTION__, __LINE__, "registered vmcb"); +#endif + (void) rc; // XXX + initialized = 1; + } +#endif +} + + #endif /* _STP_SYM_C_ */ diff --git a/runtime/sym.h b/runtime/sym.h index 262b1776..ca69345f 100644 --- a/runtime/sym.h +++ b/runtime/sym.h @@ -30,8 +30,6 @@ struct _stp_module { struct _stp_section *sections; unsigned num_sections; - struct stap_task_finder_target *vmcb; /* PR10228 */ - /* A pointer to the struct module. Note that we cannot */ /* trust this because as of 2.6.19, there are not yet */ /* any notifier hooks that will tell us when a module */ -- cgit From c2eefc9f0d8a601e4732d80ca5660b5748991595 Mon Sep 17 00:00:00 2001 From: David Smith Date: Wed, 9 Sep 2009 11:04:05 -0500 Subject: Removed unneeded casts. * runtime/transport/ring_buffer.c (_stp_event_to_user): Removed unneeded cast. (_stp_data_write_reserve): Ditto. (_stp_data_write_commit): Ditto. --- runtime/transport/ring_buffer.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'runtime') diff --git a/runtime/transport/ring_buffer.c b/runtime/transport/ring_buffer.c index 43448076..251d6ed9 100644 --- a/runtime/transport/ring_buffer.c +++ b/runtime/transport/ring_buffer.c @@ -162,7 +162,7 @@ _stp_event_to_user(struct ring_buffer_event *event, char __user *ubuf, return -EFAULT; } - entry = (struct _stp_data_entry *)ring_buffer_event_data(event); + entry = ring_buffer_event_data(event); if (entry == NULL) { dbug_trans(1, "returning -EFAULT(2)\n"); return -EFAULT; @@ -578,7 +578,7 @@ _stp_data_write_reserve(size_t size_request, void **entry) if (event) { ssize_t len; - sde = (struct _stp_data_entry *)ring_buffer_event_data(event); + sde = ring_buffer_event_data(event); if (sde->len < size_request) size_request = sde->len; _stp_ring_buffer_consume(iter); @@ -605,7 +605,7 @@ _stp_data_write_reserve(size_t size_request, void **entry) } } - sde = (struct _stp_data_entry *)ring_buffer_event_data(event); + sde = ring_buffer_event_data(event); sde->len = size_request; *entry = event; @@ -620,7 +620,7 @@ static unsigned char *_stp_data_entry_data(void *entry) if (event == NULL) return NULL; - sde = (struct _stp_data_entry *)ring_buffer_event_data(event); + sde = ring_buffer_event_data(event); return sde->buf; } @@ -635,7 +635,7 @@ static int _stp_data_write_commit(void *entry) #if defined(DEBUG_TRANS) && (DEBUG_TRANS >= 2) { - struct _stp_data_entry *sde = (struct _stp_data_entry *)ring_buffer_event_data(event); + struct _stp_data_entry *sde = ring_buffer_event_data(event); char *last = sde->buf + (sde->len - 5); dbug_trans2("commiting %.5s...%.5s\n", sde->buf, last); } -- cgit From ddc0ddd0bc88d370addadcd3a9381e410e7b73cc Mon Sep 17 00:00:00 2001 From: Masami Hiramatsu Date: Wed, 9 Sep 2009 12:53:25 -0400 Subject: Fix relay_old implementation of fsize_max and fnum_max. With old relayfs, out_fd is used only when non-bulk mode. However, open_oldoutfile and open_relayfs_files open files with fopen and set only percpu_tmpfile. This will cause a problem with -S option, that out_fd will be closed when the file size reaches fsize_max and new fd will be opened only on percpu_tmpfile. So, out_fd should be synchronized with percpu_tmpfile. * runtime/staprun/relay_old.c (open_oldoutfile): Set fd of output file to out_fd[cpu]. (open_relayfs_files): Ditto. --- runtime/staprun/relay_old.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'runtime') diff --git a/runtime/staprun/relay_old.c b/runtime/staprun/relay_old.c index 71d8acee..0254173f 100644 --- a/runtime/staprun/relay_old.c +++ b/runtime/staprun/relay_old.c @@ -110,7 +110,8 @@ static int open_oldoutfile(int fnum, int cpu, int remove_file) perr("Couldn't open output file %s", buf); return -1; } - if (set_clexec(fileno(percpu_tmpfile[cpu])) < 0) { + out_fd[cpu] = fileno(percpu_tmpfile[cpu]); + if (set_clexec(out_fd[cpu]) < 0) { perr("Couldn't clear exec bit of open output file %s", buf); return -1; } @@ -181,7 +182,8 @@ static int open_relayfs_files(int cpu, const char *relay_filebase, const char *p perr("Couldn't open output file %s", tmp); goto err2; } - if (set_clexec(fileno(percpu_tmpfile[cpu])) < 0) { + out_fd[cpu] = fileno(percpu_tmpfile[cpu]); + if (set_clexec(out_fd[cpu]) < 0) { perr("Couldn't open output file %s", tmp); goto err2; } -- cgit From 259d54c0270e85f6fbeb4fb966b95c3e52e0dac0 Mon Sep 17 00:00:00 2001 From: "Frank Ch. Eigler" Date: Wed, 9 Sep 2009 13:33:51 -0400 Subject: PR10602: improved fix for REG_IP lvalue * runtime/regs.h (SET_REG_IP): Define. (REG_IP_LVALUE): Undefine. * tapsets.cxx (*::emit_module_decls): Use SET_REG_IP() instead of old LVALUE? conditional. Written by jkenisto & jistone. --- runtime/regs.h | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) (limited to 'runtime') diff --git a/runtime/regs.h b/runtime/regs.h index d80cdf0a..dc6b50af 100644 --- a/runtime/regs.h +++ b/runtime/regs.h @@ -12,53 +12,61 @@ #define _REGS_H_ #if defined (STAPCONF_X86_UNIREGS) && (defined (__x86_64__) || defined (__i386__)) + #define REG_IP(regs) regs->ip -#define REG_IP_LVALUE 1 #define REG_SP(regs) regs->sp #define REG_FP(regs) regs->bp #elif defined (__x86_64__) #define REG_IP(regs) regs->rip -#define REG_IP_LVALUE 1 #define REG_SP(regs) regs->rsp #elif defined (__i386__) #define REG_IP(regs) regs->eip -#define REG_IP_LVALUE 1 #define REG_SP(regs) regs->esp #define REG_FP(regs) regs->ebp #elif defined (__ia64__) + #define REG_IP(regs) ((regs)->cr_iip +ia64_psr(regs)->ri) #define REG_SP(regs) ((regs)->r12) +#define SET_REG_IP(regs, x) \ + (((regs)->cr_iip = (x) & ~3UL), (ia64_psr(regs)->ri = (x) & 3UL)) + #elif defined (__powerpc64__) #define REG_IP(regs) regs->nip -#define REG_IP_LVALUE 1 #define REG_SP(regs) regs->gpr[1] #define REG_LINK(regs) regs->link #elif defined (__arm__) #define REG_IP(regs) regs->ARM_pc -#define REG_IP_LVALUE 1 #define REG_SP(regs) regs->ARM_sp #define REG_LINK(regs) regs->ARM_lr #elif defined (__s390__) || defined (__s390x__) + #ifndef __s390x__ #define PSW_ADDR_AMODE 0x80000000UL +#define PSW_ADDR_INSN 0x7FFFFFFFUL #else /* __s390x__ */ #define PSW_ADDR_AMODE 0x0000000000000000UL +#define PSW_ADDR_INSN 0xFFFFFFFFFFFFFFFFUL #endif /* __s390x__ */ -#define REG_IP(regs) (((regs)->psw.addr) | PSW_ADDR_AMODE) +#define REG_IP(regs) (((regs)->psw.addr) & PSW_ADDR_INSN) #define REG_SP(regs) (regs)->gprs[15] +#define SET_REG_IP(regs,x) (regs)->psw.addr = (x) | PSW_ADDR_AMODE #else #error "Unimplemented architecture" #endif +#ifndef SET_REG_IP +#define SET_REG_IP(regs, x) REG_IP(regs) = x +#endif + #endif /* _REGS_H_ */ -- cgit From 9084f0736c3c53e4210409fb000530fc12c03825 Mon Sep 17 00:00:00 2001 From: "Frank Ch. Eigler" Date: Wed, 9 Sep 2009 13:46:42 -0400 Subject: PR10602 prime: runtime: shrink stack frame of _stp_do_relocation(). * transport/symbols.c (_stp_do_relocation): Make msg static. --- runtime/transport/symbols.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'runtime') diff --git a/runtime/transport/symbols.c b/runtime/transport/symbols.c index 3e6a2fb1..a214d1f2 100644 --- a/runtime/transport/symbols.c +++ b/runtime/transport/symbols.c @@ -15,7 +15,7 @@ static void _stp_do_relocation(const char __user *buf, size_t count) { - struct _stp_msg_relocation msg; + static struct _stp_msg_relocation msg; /* by protocol, never concurrently used */ unsigned mi, si; if (sizeof(msg) != count) -- cgit From ed4abdf95dfadf9f5c28c712e1b792556ba0674b Mon Sep 17 00:00:00 2001 From: "Frank Ch. Eigler" Date: Thu, 10 Sep 2009 10:04:07 -0400 Subject: build: support x86-64 without CONFIG_IA32_EMULATION * runtime/syscall.h (x86_64 MMAP2_SYSCALL_NO): Define. --- runtime/syscall.h | 1 + 1 file changed, 1 insertion(+) (limited to 'runtime') diff --git a/runtime/syscall.h b/runtime/syscall.h index 38b523e1..786965f4 100644 --- a/runtime/syscall.h +++ b/runtime/syscall.h @@ -52,6 +52,7 @@ : __MREMAP_SYSCALL_NO_X86_64) # else #define MMAP_SYSCALL_NO(tsk) __MMAP_SYSCALL_NO_X86_64 +#define MMAP2_SYSCALL_NO(tsk) __MMAP2_SYSCALL_NO_X86_64 #define MPROTECT_SYSCALL_NO(tsk) __MPROTECT_SYSCALL_NO_X86_64 #define MUNMAP_SYSCALL_NO(tsk) __MUNMAP_SYSCALL_NO_X86_64 #define MREMAP_SYSCALL_NO(tsk) __MREMAP_SYSCALL_NO_X86_64 -- cgit From 1b79720abf041b35f8289ed74b77a504f3f5cb40 Mon Sep 17 00:00:00 2001 From: David Smith Date: Thu, 10 Sep 2009 12:36:32 -0500 Subject: Allow ring_buffer to be used if STP_USE_RING_BUFFER is defined. --- runtime/transport/transport.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'runtime') diff --git a/runtime/transport/transport.c b/runtime/transport/transport.c index 1d029e53..f5efce9f 100644 --- a/runtime/transport/transport.c +++ b/runtime/transport/transport.c @@ -31,8 +31,9 @@ static int _stp_ctl_attached = 0; static pid_t _stp_target = 0; static int _stp_probes_started = 0; -// For now, disable transport version 3 -#if STP_TRANSPORT_VERSION == 3 +// For now, disable transport version 3 (unless STP_USE_RING_BUFFER is +// defined). +#if STP_TRANSPORT_VERSION == 3 && !defined(STP_USE_RING_BUFFER) #undef STP_TRANSPORT_VERSION #define STP_TRANSPORT_VERSION 2 #endif -- cgit