Hi, On 20/08/17 18:03, Steffan Karger wrote: > Hi, > > On 19-08-17 06:39, Antonio Quartulli wrote: >> From: Antonio Quartulli <anto...@openvpn.net> >> >> Function prototypes should be included when compiling their >> definitions so that it is clear to compilers and static >> analyzers that they are not static. >> >> This means that several declarations have to be moved to the >> related header files which in turn have to be included by the >> source files implementing them. >> >> Generally speaking this also improves the coding style and >> makes this code more consistent with the rest that already >> follows this rule. >> >> Signed-off-by: Antonio Quartulli <anto...@openvpn.net> >> --- >> >> v2: rebased on top of latest master to avoid conflict >> >> src/openvpn/crypto.h | 3 +++ >> src/openvpn/error.c | 3 +-- >> src/openvpn/forward-inline.h | 28 ++-------------------------- >> src/openvpn/forward.h | 35 +++++++++++++++++++++++++++++++++++ >> src/openvpn/init.h | 2 ++ >> src/openvpn/lladdr.c | 1 + >> src/openvpn/manage.h | 11 ++++++----- >> src/openvpn/mbuf.h | 4 ++-- >> src/openvpn/mroute.h | 21 +++++++++++---------- >> src/openvpn/multi.h | 7 +++---- >> src/openvpn/occ-inline.h | 8 ++------ >> src/openvpn/occ.h | 6 ++++++ >> src/openvpn/pf-inline.h | 6 ++---- >> src/openvpn/pf.h | 6 ++++++ >> src/openvpn/ping-inline.h | 6 ++---- >> src/openvpn/ping.h | 4 ++++ >> src/openvpn/plugin.h | 2 ++ >> src/openvpn/socket.h | 13 +++++++------ >> 18 files changed, 97 insertions(+), 69 deletions(-) >> >> diff --git a/src/openvpn/crypto.h b/src/openvpn/crypto.h >> index f1b6c20a..5f0790a6 100644 >> --- a/src/openvpn/crypto.h >> +++ b/src/openvpn/crypto.h >> @@ -467,6 +467,9 @@ void prng_bytes(uint8_t *output, int len); >> >> void prng_uninit(void); >> >> +/* an analogue to the random() function, but use prng_bytes */ >> +long int get_random(void); >> + > > Though I agree that crypto.h is a better place for get_random() than > misc.h, we already have one in misc.h. So if you move this here, remove > it from misc.h.
Oh I hadn't realized we had a declaration for get_random() in misc.h. The function is defined in crypto.c therefore I expected its declaration in crypto.h. I'll remove it from misc.h then. > >> void test_crypto(struct crypto_options *co, struct frame *f); >> >> >> diff --git a/src/openvpn/error.c b/src/openvpn/error.c >> index 04bf0da5..e885ec3b 100644 >> --- a/src/openvpn/error.c >> +++ b/src/openvpn/error.c >> @@ -31,6 +31,7 @@ >> >> #include "error.h" >> #include "buffer.h" >> +#include "init.h" >> #include "misc.h" >> #include "win32.h" >> #include "socket.h" >> @@ -734,8 +735,6 @@ openvpn_exit(const int status) >> { >> if (!forked) >> { >> - void tun_abort(); >> - >> #ifdef ENABLE_PLUGIN >> void plugin_abort(void); >> >> diff --git a/src/openvpn/forward-inline.h b/src/openvpn/forward-inline.h >> index ab83ea40..04601e8c 100644 >> --- a/src/openvpn/forward-inline.h >> +++ b/src/openvpn/forward-inline.h >> @@ -24,6 +24,8 @@ >> #ifndef FORWARD_INLINE_H >> #define FORWARD_INLINE_H >> >> +#include "forward.h" >> + > > If we do this, I think we should better merge forward_inline.h into > forward.h. It seems someone was trying to prevent including forward.h, > adding all these forward declarations into forward-inline.h. But > looking at the current code, everything that includes forward-inline.h > now somehow also includes forward.h. So I see no reason to keep these > separate. > > If you agree with me, and decide to merge there, could you please do > that in a separate patch? That makes it a bit easier to review. Agreed. In the past there was a reason for having the -inline.h header files, but now I think this reason is gone (or at least I can't see it anymore). > >> /* >> * Inline functions >> */ >> @@ -35,8 +37,6 @@ static inline void >> check_tls(struct context *c) >> { >> #if defined(ENABLE_CRYPTO) >> - void check_tls_dowork(struct context *c); >> - >> if (c->c2.tls_multi) >> { >> check_tls_dowork(c); >> @@ -52,10 +52,6 @@ static inline void >> check_tls_errors(struct context *c) >> { >> #if defined(ENABLE_CRYPTO) >> - void check_tls_errors_co(struct context *c); >> - >> - void check_tls_errors_nco(struct context *c); >> - >> if (c->c2.tls_multi && c->c2.tls_exit_signal) >> { >> if (link_socket_connection_oriented(c->c2.link_socket)) >> @@ -84,8 +80,6 @@ static inline void >> check_incoming_control_channel(struct context *c) >> { >> #if P2MP >> - void check_incoming_control_channel_dowork(struct context *c); >> - >> if (tls_test_payload_len(c->c2.tls_multi) > 0) >> { >> check_incoming_control_channel_dowork(c); >> @@ -100,8 +94,6 @@ check_incoming_control_channel(struct context *c) >> static inline void >> check_connection_established(struct context *c) >> { >> - void check_connection_established_dowork(struct context *c); >> - >> if (event_timeout_defined(&c->c2.wait_for_connect)) >> { >> check_connection_established_dowork(c); >> @@ -114,8 +106,6 @@ check_connection_established(struct context *c) >> static inline void >> check_add_routes(struct context *c) >> { >> - void check_add_routes_dowork(struct context *c); >> - >> if (event_timeout_trigger(&c->c2.route_wakeup, &c->c2.timeval, >> ETT_DEFAULT)) >> { >> check_add_routes_dowork(c); >> @@ -128,8 +118,6 @@ check_add_routes(struct context *c) >> static inline void >> check_inactivity_timeout(struct context *c) >> { >> - void check_inactivity_timeout_dowork(struct context *c); >> - >> if (c->options.inactivity_timeout >> && event_timeout_trigger(&c->c2.inactivity_interval, >> &c->c2.timeval, ETT_DEFAULT)) >> { >> @@ -142,8 +130,6 @@ check_inactivity_timeout(struct context *c) >> static inline void >> check_server_poll_timeout(struct context *c) >> { >> - void check_server_poll_timeout_dowork(struct context *c); >> - >> if (c->options.ce.connect_timeout >> && event_timeout_trigger(&c->c2.server_poll_interval, >> &c->c2.timeval, ETT_DEFAULT)) >> { >> @@ -157,8 +143,6 @@ check_server_poll_timeout(struct context *c) >> static inline void >> check_scheduled_exit(struct context *c) >> { >> - void check_scheduled_exit_dowork(struct context *c); >> - >> if (event_timeout_defined(&c->c2.scheduled_exit)) >> { >> if (event_timeout_trigger(&c->c2.scheduled_exit, &c->c2.timeval, >> ETT_DEFAULT)) >> @@ -175,8 +159,6 @@ check_scheduled_exit(struct context *c) >> static inline void >> check_status_file(struct context *c) >> { >> - void check_status_file_dowork(struct context *c); >> - >> if (c->c1.status_output) >> { >> if (status_trigger_tv(c->c1.status_output, &c->c2.timeval)) >> @@ -193,8 +175,6 @@ check_status_file(struct context *c) >> static inline void >> check_fragment(struct context *c) >> { >> - void check_fragment_dowork(struct context *c); >> - >> if (c->c2.fragment) >> { >> check_fragment_dowork(c); >> @@ -210,8 +190,6 @@ check_fragment(struct context *c) >> static inline void >> check_push_request(struct context *c) >> { >> - void check_push_request_dowork(struct context *c); >> - >> if (event_timeout_trigger(&c->c2.push_request_interval, &c->c2.timeval, >> ETT_DEFAULT)) >> { >> check_push_request_dowork(c); >> @@ -313,8 +291,6 @@ p2p_iow_flags(const struct context *c) >> static inline void >> io_wait(struct context *c, const unsigned int flags) >> { >> - void io_wait_dowork(struct context *c, const unsigned int flags); >> - >> if (c->c2.fast_io && (flags & (IOW_TO_TUN|IOW_TO_LINK|IOW_MBUF))) >> { >> /* fast path -- only for TUN/TAP/UDP writes */ >> diff --git a/src/openvpn/forward.h b/src/openvpn/forward.h >> index 9fde5a30..bc016e5d 100644 >> --- a/src/openvpn/forward.h >> +++ b/src/openvpn/forward.h >> @@ -60,6 +60,41 @@ >> >> #define IOW_READ (IOW_READ_TUN|IOW_READ_LINK) >> >> +extern counter_type link_read_bytes_global; >> + >> +extern counter_type link_write_bytes_global; >> + >> +#ifdef ENABLE_CRYPTO >> +void check_tls_dowork(struct context *c); >> + >> +void check_tls_errors_co(struct context *c); >> + >> +void check_tls_errors_nco(struct context *c); >> +#endif /* ENABLE_CRYPTO */ >> + >> +#if P2MP >> +void check_incoming_control_channel_dowork(struct context *c); >> + >> +void check_scheduled_exit_dowork(struct context *c); >> + >> +void check_push_request_dowork(struct context *c); >> +#endif /* P2MP */ >> + >> +#ifdef ENABLE_FRAGMENT >> +void check_fragment_dowork(struct context *c); >> +#endif /* ENABLE_FRAGMENT */ >> + >> +void check_connection_established_dowork(struct context *c); >> + >> +void check_add_routes_dowork(struct context *c); >> + >> +void check_inactivity_timeout_dowork(struct context *c); >> + >> +void check_server_poll_timeout_dowork(struct context *c); >> + >> +void check_status_file_dowork(struct context *c); >> + >> +void io_wait_dowork(struct context *c, const unsigned int flags); > > These are already declared in forward-inline.h. I don't see why we need > extra declarations here. But, if you follow my suggestion to merge > these files, we don't have to discuss that any further :) > >> >> void pre_select(struct context *c); >> >> diff --git a/src/openvpn/init.h b/src/openvpn/init.h >> index 15feb677..b681cd9d 100644 >> --- a/src/openvpn/init.h >> +++ b/src/openvpn/init.h >> @@ -140,4 +140,6 @@ void open_plugins(struct context *c, const bool >> import_options, int init_point); >> >> #endif >> >> +void tun_abort(void); >> + >> #endif /* ifndef INIT_H */ >> diff --git a/src/openvpn/lladdr.c b/src/openvpn/lladdr.c >> index ff71e48c..ea35e4d9 100644 >> --- a/src/openvpn/lladdr.c >> +++ b/src/openvpn/lladdr.c >> @@ -11,6 +11,7 @@ >> #include "syshead.h" >> #include "error.h" >> #include "misc.h" >> +#include "lladdr.h" >> >> int >> set_lladdr(const char *ifname, const char *lladdr, >> diff --git a/src/openvpn/manage.h b/src/openvpn/manage.h >> index 676be640..d77e5f18 100644 >> --- a/src/openvpn/manage.h >> +++ b/src/openvpn/manage.h >> @@ -581,6 +581,12 @@ management_bytes_in(struct management *man, const int >> size) >> } >> } >> >> + >> +void man_bytecount_output_server(struct management *man, >> + const counter_type *bytes_in_total, >> + const counter_type *bytes_out_total, >> + struct man_def_auth_context *mdac); >> + > > This function is defined inside #ifdef MANAGEMENT_DEF_AUTH, so the > declaration should be moved down after: ops..thanks! > >> #ifdef MANAGEMENT_DEF_AUTH >> >> static inline void >> @@ -589,11 +595,6 @@ management_bytes_server(struct management *man, >> const counter_type *bytes_out_total, >> struct man_def_auth_context *mdac) >> { >> - void man_bytecount_output_server(struct management *man, >> - const counter_type *bytes_in_total, >> - const counter_type *bytes_out_total, >> - struct man_def_auth_context *mdac); >> - >> if (man->connection.bytecount_update_seconds > 0 >> && now >= mdac->bytecount_last_update + >> man->connection.bytecount_update_seconds >> && (mdac->flags & >> (DAF_CONNECTION_ESTABLISHED|DAF_CONNECTION_CLOSED)) == >> DAF_CONNECTION_ESTABLISHED) >> diff --git a/src/openvpn/mbuf.h b/src/openvpn/mbuf.h >> index e0643de1..1c35432f 100644 >> --- a/src/openvpn/mbuf.h >> +++ b/src/openvpn/mbuf.h >> @@ -96,11 +96,11 @@ mbuf_maximum_queued(const struct mbuf_set *ms) >> return (int) ms->max_queued; >> } >> >> +struct multi_instance *mbuf_peek_dowork(struct mbuf_set *ms); >> + >> static inline struct multi_instance * >> mbuf_peek(struct mbuf_set *ms) >> { >> - struct multi_instance *mbuf_peek_dowork(struct mbuf_set *ms); >> - >> if (mbuf_defined(ms)) >> { >> return mbuf_peek_dowork(ms); >> diff --git a/src/openvpn/mroute.h b/src/openvpn/mroute.h >> index 26421f88..3c06346f 100644 >> --- a/src/openvpn/mroute.h >> +++ b/src/openvpn/mroute.h >> @@ -170,6 +170,17 @@ void mroute_helper_add_iroute46(struct mroute_helper >> *mh, int netbits); >> >> void mroute_helper_del_iroute46(struct mroute_helper *mh, int netbits); >> >> + > > Nit: one newline too many? Yes. We need only one empty line. > >> +unsigned int mroute_extract_addr_ip(struct mroute_addr *src, >> + struct mroute_addr *dest, >> + const struct buffer *buf); >> + >> +unsigned int mroute_extract_addr_ether(struct mroute_addr *src, >> + struct mroute_addr *dest, >> + struct mroute_addr *esrc, >> + struct mroute_addr *edest, >> + const struct buffer *buf); >> + >> /* >> * Given a raw packet in buf, return the src and dest >> * addresses of the packet. >> @@ -182,16 +193,6 @@ mroute_extract_addr_from_packet(struct mroute_addr *src, >> const struct buffer *buf, >> int tunnel_type) >> { >> - unsigned int mroute_extract_addr_ip(struct mroute_addr *src, >> - struct mroute_addr *dest, >> - const struct buffer *buf); >> - >> - unsigned int mroute_extract_addr_ether(struct mroute_addr *src, >> - struct mroute_addr *dest, >> - struct mroute_addr *esrc, >> - struct mroute_addr *edest, >> - const struct buffer *buf); >> - >> unsigned int ret = 0; >> verify_align_4(buf); >> if (tunnel_type == DEV_TYPE_TUN) >> diff --git a/src/openvpn/multi.h b/src/openvpn/multi.h >> index 63afbaf0..5892ac07 100644 >> --- a/src/openvpn/multi.h >> +++ b/src/openvpn/multi.h >> @@ -536,11 +536,12 @@ clear_prefix(void) >> */ >> #define MULTI_CACHE_ROUTE_TTL 60 >> >> +void multi_reap_process_dowork(const struct multi_context *m); >> +void multi_process_per_second_timers_dowork(struct multi_context *m); >> + >> static inline void >> multi_reap_process(const struct multi_context *m) >> { >> - void multi_reap_process_dowork(const struct multi_context *m); >> - >> if (m->reaper->last_call != now) >> { >> multi_reap_process_dowork(m); >> @@ -552,8 +553,6 @@ multi_process_per_second_timers(struct multi_context *m) >> { >> if (m->per_second_trigger != now) >> { >> - void multi_process_per_second_timers_dowork(struct multi_context >> *m); >> - >> multi_process_per_second_timers_dowork(m); >> m->per_second_trigger = now; >> } >> diff --git a/src/openvpn/occ-inline.h b/src/openvpn/occ-inline.h >> index 0fa8e5ba..7ca2a26f 100644 >> --- a/src/openvpn/occ-inline.h >> +++ b/src/openvpn/occ-inline.h >> @@ -26,6 +26,8 @@ >> >> #ifdef ENABLE_OCC >> >> +#include "occ.h" >> + > > Same as for forward-inline.h: everything that includes occ-inline.h > also seems to include occ.h somehow. I suggest to merge these files (in > a separate commit). > >> /* >> * Inline functions >> */ >> @@ -42,8 +44,6 @@ occ_reset_op(void) >> static inline void >> check_send_occ_req(struct context *c) >> { >> - void check_send_occ_req_dowork(struct context *c); >> - >> if (event_timeout_defined(&c->c2.occ_interval) >> && event_timeout_trigger(&c->c2.occ_interval, >> &c->c2.timeval, >> @@ -59,8 +59,6 @@ check_send_occ_req(struct context *c) >> static inline void >> check_send_occ_load_test(struct context *c) >> { >> - void check_send_occ_load_test_dowork(struct context *c); >> - >> if (event_timeout_defined(&c->c2.occ_mtu_load_test_interval) >> && event_timeout_trigger(&c->c2.occ_mtu_load_test_interval, >> &c->c2.timeval, >> @@ -76,8 +74,6 @@ check_send_occ_load_test(struct context *c) >> static inline void >> check_send_occ_msg(struct context *c) >> { >> - void check_send_occ_msg_dowork(struct context *c); >> - >> if (c->c2.occ_op >= 0) >> { >> if (!TO_LINK_DEF(c)) >> diff --git a/src/openvpn/occ.h b/src/openvpn/occ.h >> index 12d7bc57..29de99c2 100644 >> --- a/src/openvpn/occ.h >> +++ b/src/openvpn/occ.h >> @@ -90,5 +90,11 @@ is_occ_msg(const struct buffer *buf) >> >> void process_received_occ_msg(struct context *c); >> >> +void check_send_occ_req_dowork(struct context *c); >> + >> +void check_send_occ_load_test_dowork(struct context *c); >> + >> +void check_send_occ_msg_dowork(struct context *c); >> + >> #endif /* ifdef ENABLE_OCC */ >> #endif /* ifndef OCC_H */ >> diff --git a/src/openvpn/pf-inline.h b/src/openvpn/pf-inline.h >> index ac19ac4c..0db7b262 100644 >> --- a/src/openvpn/pf-inline.h >> +++ b/src/openvpn/pf-inline.h >> @@ -24,6 +24,8 @@ >> #if defined(ENABLE_PF) && !defined(PF_INLINE_H) >> #define PF_INLINE_H >> >> +#include "pf.h" >> + > > This one seems to still be somewhat independent of pf.h, but let's merge > these too. Yeah. > >> /* >> * Inline functions >> */ >> @@ -33,8 +35,6 @@ >> static inline bool >> pf_c2c_test(const struct context *src, const struct context *dest, const >> char *prefix) >> { >> - bool pf_cn_test(struct pf_set *pfs, const struct tls_multi *tm, const >> int type, const char *prefix); >> - >> return (!src->c2.pf.enabled || pf_cn_test(src->c2.pf.pfs, >> dest->c2.tls_multi, PCT_DEST, prefix)) >> && (!dest->c2.pf.enabled || pf_cn_test(dest->c2.pf.pfs, >> src->c2.tls_multi, PCT_SRC, prefix)); >> } >> @@ -42,8 +42,6 @@ pf_c2c_test(const struct context *src, const struct >> context *dest, const char *p >> static inline bool >> pf_addr_test(const struct context *src, const struct mroute_addr *dest, >> const char *prefix) >> { >> - bool pf_addr_test_dowork(const struct context *src, const struct >> mroute_addr *dest, const char *prefix); >> - >> if (src->c2.pf.enabled) >> { >> return pf_addr_test_dowork(src, dest, prefix); >> diff --git a/src/openvpn/pf.h b/src/openvpn/pf.h >> index 414c85b8..f6a3b61e 100644 >> --- a/src/openvpn/pf.h >> +++ b/src/openvpn/pf.h >> @@ -101,4 +101,10 @@ void pf_context_print(const struct pf_context *pfc, >> const char *prefix, const in >> >> #endif >> >> +bool pf_cn_test(struct pf_set *pfs, const struct tls_multi *tm, const int >> type, >> + const char *prefix); >> + >> +bool pf_addr_test_dowork(const struct context *src, >> + const struct mroute_addr *dest, const char >> *prefix); >> + >> #endif /* if defined(ENABLE_PF) && !defined(OPENVPN_PF_H) */ >> diff --git a/src/openvpn/ping-inline.h b/src/openvpn/ping-inline.h >> index 0642b851..9d590dc4 100644 >> --- a/src/openvpn/ping-inline.h >> +++ b/src/openvpn/ping-inline.h >> @@ -24,6 +24,8 @@ >> #ifndef PING_INLINE_H >> #define PING_INLINE_H >> >> +#include "ping.h" >> + > > As for pf.h > >> /* >> * Should we exit or restart due to ping (or other authenticated packet) >> * not received in n seconds? >> @@ -31,8 +33,6 @@ >> static inline void >> check_ping_restart(struct context *c) >> { >> - void check_ping_restart_dowork(struct context *c); >> - >> if (c->options.ping_rec_timeout >> && event_timeout_trigger(&c->c2.ping_rec_interval, >> &c->c2.timeval, >> @@ -50,8 +50,6 @@ check_ping_restart(struct context *c) >> static inline void >> check_ping_send(struct context *c) >> { >> - void check_ping_send_dowork(struct context *c); >> - >> if (c->options.ping_send_timeout >> && event_timeout_trigger(&c->c2.ping_send_interval, >> &c->c2.timeval, >> diff --git a/src/openvpn/ping.h b/src/openvpn/ping.h >> index 5bd5c089..66c3a54f 100644 >> --- a/src/openvpn/ping.h >> +++ b/src/openvpn/ping.h >> @@ -43,4 +43,8 @@ is_ping_msg(const struct buffer *buf) >> return buf_string_match(buf, ping_string, PING_STRING_SIZE); >> } >> >> +void check_ping_restart_dowork(struct context *c); >> + >> +void check_ping_send_dowork(struct context *c); >> + >> #endif >> diff --git a/src/openvpn/plugin.h b/src/openvpn/plugin.h >> index 818b6285..67549cda 100644 >> --- a/src/openvpn/plugin.h >> +++ b/src/openvpn/plugin.h >> @@ -216,4 +216,6 @@ plugin_call(const struct plugin_list *pl, >> ); >> } >> >> +void plugin_abort(void); >> + >> #endif /* OPENVPN_PLUGIN_H */ >> diff --git a/src/openvpn/socket.h b/src/openvpn/socket.h >> index 81e9e9ae..13b94606 100644 >> --- a/src/openvpn/socket.h >> +++ b/src/openvpn/socket.h >> @@ -1021,11 +1021,11 @@ void stream_buf_close(struct stream_buf *sb); >> >> bool stream_buf_added(struct stream_buf *sb, int length_added); >> >> +bool stream_buf_read_setup_dowork(struct link_socket *sock); >> + >> static inline bool >> stream_buf_read_setup(struct link_socket *sock) >> { >> - bool stream_buf_read_setup_dowork(struct link_socket *sock); >> - >> if (link_socket_connection_oriented(sock)) >> { >> return stream_buf_read_setup_dowork(sock); >> @@ -1130,16 +1130,17 @@ link_socket_write_win32(struct link_socket *sock, >> >> #else /* ifdef _WIN32 */ >> >> +size_t link_socket_write_udp_posix_sendmsg(struct link_socket *sock, >> + struct buffer *buf, >> + struct link_socket_actual *to); >> + >> + >> static inline size_t >> link_socket_write_udp_posix(struct link_socket *sock, >> struct buffer *buf, >> struct link_socket_actual *to) >> { >> #if ENABLE_IP_PKTINFO >> - size_t link_socket_write_udp_posix_sendmsg(struct link_socket *sock, >> - struct buffer *buf, >> - struct link_socket_actual >> *to); >> - >> if (proto_is_udp(sock->info.proto) && (sock->sockflags & >> SF_USE_IP_PKTINFO) >> && addr_defined_ipi(to)) >> { >> > > Curious whether you agree with me. Yeah, I do. As I said above, in the past there was a reason for having the -forward.h files that did not depend on the plain .h. I remember I have tried to get rid of the -forward.h already but something exploded. Now it seems merging should just work. I'll send two new patches soon. Thanks for reviewing! Cheers, > > -Steffan > > ------------------------------------------------------------------------------ > Check out the vibrant tech community on one of the world's most > engaging tech sites, Slashdot.org! http://sdm.link/slashdot > _______________________________________________ > Openvpn-devel mailing list > Openvpn-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/openvpn-devel > -- Antonio Quartulli
signature.asc
Description: OpenPGP digital signature
------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________ Openvpn-devel mailing list Openvpn-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openvpn-devel