diff options
author | Gert Doering <gert@mobile.greenie.muc.de> | 2011-12-30 21:08:49 +0100 |
---|---|---|
committer | David Sommerseth <davids@redhat.com> | 2012-01-04 11:46:49 +0100 |
commit | 9140223643f7d9bdfd2214304a7bd6ab4b662f97 (patch) | |
tree | 1c89b6f77e8d6adc6970c457728b0e3b9612223b /route.c | |
parent | 1d5c4433cdb7ab0a9d9f7496e6dc2cee189d375f (diff) | |
download | openvpn-9140223643f7d9bdfd2214304a7bd6ab4b662f97.tar.gz openvpn-9140223643f7d9bdfd2214304a7bd6ab4b662f97.tar.xz openvpn-9140223643f7d9bdfd2214304a7bd6ab4b662f97.zip |
Fix build-up of duplicate IPv6 routes on reconnect.
options.c: extend pre_pull_save() and pre_pull_restore() to
save/restore options->routes_ipv6 as well
options.h: add routes_ipv6 to "struct options_pre_pull"
route.h, route.c: add clone_route_ipv6_option_list() and
copy_route_ipv6_option_list() helper functions
Signed-off-by: Gert Doering <gert@greenie.muc.de>
Acked-by: David Sommerseth <davids@redhat.com>
Signed-off-by: David Sommerseth <davids@redhat.com>
Diffstat (limited to 'route.c')
-rw-r--r-- | route.c | 19 |
1 files changed, 19 insertions, 0 deletions
@@ -108,6 +108,15 @@ clone_route_option_list (const struct route_option_list *src, struct gc_arena *a return ret; } +struct route_ipv6_option_list * +clone_route_ipv6_option_list (const struct route_ipv6_option_list *src, struct gc_arena *a) +{ + const size_t rl_size = array_mult_safe (sizeof(struct route_ipv6_option), src->capacity, sizeof(struct route_ipv6_option_list)); + struct route_ipv6_option_list *ret = gc_malloc (rl_size, false, a); + memcpy (ret, src, rl_size); + return ret; +} + void copy_route_option_list (struct route_option_list *dest, const struct route_option_list *src) { @@ -117,6 +126,16 @@ copy_route_option_list (struct route_option_list *dest, const struct route_optio memcpy (dest, src, src_size); } +void +copy_route_ipv6_option_list (struct route_ipv6_option_list *dest, + const struct route_ipv6_option_list *src) +{ + const size_t src_size = array_mult_safe (sizeof(struct route_ipv6_option), src->capacity, sizeof(struct route_ipv6_option_list)); + if (src->n > dest->capacity) + msg (M_FATAL, PACKAGE_NAME " ROUTE: (copy) number of route options in src (%d) is greater than route list capacity in dest (%d)", src->n, dest->capacity); + memcpy (dest, src, src_size); +} + struct route_list * new_route_list (const int max_routes, struct gc_arena *a) { |