On Tue, Apr 04, 2023 at 10:32:26AM +0200, Gianmarco De Gregori wrote:
> Add the ability for users to specify a custom
> routing table where routes should be installed in.
> As of now routes are always installed in the main
> routing table of the operating system, however,
> with the new --route-table option it is possibile
> to specify the ID of the default routing table
> to be used by --route(-ipv6).
>
> The --route(-ipv6) directives have been extended
> with an additional argument (5th for --route)
> (4th for --route-ipv6) so that each of them
> can possibly use an independent routing table.
>
> Please note: this feature is currently supported
> only by Linux/SITNL.
> Support for other platforms should be added in related backends.
>
> Signed-off-by: Gianmarco De Gregori <[email protected]>
> ---
[...]
> diff --git a/src/openvpn/options.c b/src/openvpn/options.c
> index 2680f268..3914ab23 100644
> --- a/src/openvpn/options.c
> +++ b/src/openvpn/options.c
[...]
> @@ -6998,7 +7020,22 @@ add_option(struct options *options,
> }
> /* p[3] is metric, if present */
> }
> - add_route_ipv6_to_option_list(options->routes_ipv6, p[1], p[2],
> p[3]);
> +
> + /* at the moment the routing table id is supported only by
> Linux/SITNL */
> +#ifndef ENABLE_SITNL
> + if (p[5])
p[4]
> + {
> + static bool route6_table_warned = false;
> +
> + if (!route6_table_warned)
> + {
> + msg(M_WARN, "NOTE: table specified for --route-ipv6, but not
> supported on this platform");
> + route6_table_warned = true;
> + }
> + }
> +#endif
> +
> + add_route_ipv6_to_option_list(options->routes_ipv6, p[1], p[2],
> p[3], p[4]);
> }
> else if (streq(p[0], "max-routes") && !p[2])
> {
[...]
> diff --git a/src/openvpn/route.c b/src/openvpn/route.c
> index 3798bc65..00419dce 100644
> --- a/src/openvpn/route.c
> +++ b/src/openvpn/route.c
[...]
> @@ -437,6 +436,27 @@ init_route(struct route_ipv4 *r,
>
> r->flags |= RT_DEFINED;
>
> + /* routing table id */
> +
> + r->table_id = 0;
> + if (ro->table_id)
> + {
> + r->table_id = atoi(ro->table_id);
> + if (r->table_id < 0)
Isn't r->table_id an uint32 ?
> + {
> + msg(M_WARN, PACKAGE_NAME "ROUTE: routing table id for network %s
> (%s) must be >= 0",
> + ro->network,
> + ro->table_id);
> + goto fail;
> + }
> + r->flags |= RT_TABLE_DEFINED;
> + }
> + else if (rl->spec.flags & RTSA_DEFAULT_TABLE_ID)
> + {
> + r->table_id = rl->spec.table_id;
> + r->flags |= RT_TABLE_DEFINED;
> + }
> +
> return true;
>
> fail:
> @@ -493,6 +513,27 @@ init_route_ipv6(struct route_ipv6 *r6,
>
> r6->flags |= RT_DEFINED;
>
> + /* routing table id */
> +
> + r6->table_id = 0;
> + if (r6o->table_id)
> + {
> + r6->table_id = atoi(r6o->table_id);
> + if (r6->table_id < 0)
Isn't r6->table_id an uint32 ?
> + {
> + msg(M_WARN, PACKAGE_NAME "ROUTE: routing table id for network %s
> (%s) must be >= 0",
> + r6o->prefix,
> + r6o->table_id);
> + goto fail;
> + }
> + r6->flags |= RT_TABLE_DEFINED;
> + }
> + else if (rl6->spec_flags & RTSA_DEFAULT_TABLE_ID)
> + {
> + r6->table_id = rl6->default_route_table_id;
> + r6->flags |= RT_TABLE_DEFINED;
> + }
> +
> return true;
>
> fail:
[...]
> @@ -1978,10 +2043,16 @@ add_route_ipv6(struct route_ipv6 *r6, const struct
> tuntap *tt,
> metric = r6->metric;
> }
>
> + uint32_t table_id = 0;
> + if ((r6->flags & RT_TABLE_DEFINED) && (r6->table_id > 0))
Isn't r6->table_id an uint32 ?
> + {
> + table_id = r6->table_id;
> + }
> +
> status = RTA_SUCCESS;
> int ret = net_route_v6_add(ctx, &r6->network, r6->netbits,
> gateway_needed ? &r6->gateway : NULL,
> - device, 0, metric);
> + device, table_id, metric);
> if (ret == -EEXIST)
> {
> msg(D_ROUTE, "NOTE: Linux route add command failed because route
> exists");
[...]
Regards,
--
Frank Lichtenheld
_______________________________________________
Openvpn-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openvpn-devel