OVS IPsec tunnel support has issues: 1. It only works for GRE. 2. only works on Debian. 3. It does not allow user to match on packet-mark on packet received on tunnel ports.
Therefore following patch provide alternative to completely disable ipsec-tunnel support by vswitchd command line option. This way user can use external daemon to manage IPsec tunnel traffic and stir it using skb-mark match action in OVS bridge. This patch deprecates support for IPsec tunnel port. Signed-off-by: Pravin B Shelar <pshe...@ovn.org> --- NEWS | 2 ++ debian/changelog | 2 ++ debian/control | 1 + lib/netdev-vport.c | 3 +++ lib/netdev.c | 1 + lib/netdev.h | 1 + ofproto/tunnel.c | 30 ++++++++++++++++++++++-------- ofproto/tunnel.h | 2 ++ vswitchd/ovs-vswitchd.c | 7 +++++++ vswitchd/vswitch.xml | 8 ++++++++ 10 files changed, 49 insertions(+), 8 deletions(-) diff --git a/NEWS b/NEWS index 21ab538..057edfd 100644 --- a/NEWS +++ b/NEWS @@ -149,6 +149,8 @@ v2.6.0 - xx xxx xxxx * Flow based tunnel match and action can be used for IPv6 address using tun_ipv6_src, tun_ipv6_dst fields. * Added support for IPv6 tunnels, for details checkout FAQ. + * Allow external IPsec tunnel management. Deprecated support for IPsec + tunnels ports. - A wrapper script, 'ovs-tcpdump', to easily port-mirror an OVS port and watch with tcpdump - Introduce --no-self-confinement flag that allows daemons to work with diff --git a/debian/changelog b/debian/changelog index d73e636..8add140 100644 --- a/debian/changelog +++ b/debian/changelog @@ -108,6 +108,8 @@ openvswitch (2.6.0-1) unstable; urgency=low * Flow based tunnel match and action can be used for IPv6 address using tun_ipv6_src, tun_ipv6_dst fields. * Added support for IPv6 tunnels, for details checkout FAQ. + * Allow external IPsec tunnel management. Deprecated support for IPsec + tunnels ports. - A wrapper script, 'ovs-tcpdump', to easily port-mirror an OVS port and watch with tcpdump - Introduce --no-self-confinement flag that allows daemons to work with diff --git a/debian/control b/debian/control index 6e704f1..da86fe9 100644 --- a/debian/control +++ b/debian/control @@ -200,6 +200,7 @@ Description: Open vSwitch GRE-over-IPsec support . The ovs-monitor-ipsec script provides support for encrypting GRE tunnels with IPsec. + IPsec tunnels support is deprecated. Package: openvswitch-pki Architecture: all diff --git a/lib/netdev-vport.c b/lib/netdev-vport.c index 8d22cf5..6bf4d2d 100755 --- a/lib/netdev-vport.c +++ b/lib/netdev-vport.c @@ -543,6 +543,9 @@ set_tunnel_config(struct netdev *dev_, const struct smap *args) static struct ovs_mutex mutex = OVS_MUTEX_INITIALIZER; static pid_t pid = 0; + VLOG_ERR("%s: OVS IPsec tunnel support is deprecated. " + "See man page for details", name); + #ifndef _WIN32 ovs_mutex_lock(&mutex); if (pid <= 0) { diff --git a/lib/netdev.c b/lib/netdev.c index 6c4c657..a626f18 100644 --- a/lib/netdev.c +++ b/lib/netdev.c @@ -98,6 +98,7 @@ static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 20); static void restore_all_flags(void *aux OVS_UNUSED); void update_device_args(struct netdev *, const struct shash *args); +bool enable_ipsec_tnl = true; int netdev_n_txq(const struct netdev *netdev) diff --git a/lib/netdev.h b/lib/netdev.h index 634c665..870ce22 100644 --- a/lib/netdev.h +++ b/lib/netdev.h @@ -299,6 +299,7 @@ int netdev_dump_queue_stats(const struct netdev *, netdev_dump_queue_stats_cb *, void *aux); extern struct seq *tnl_conf_seq; +extern bool enable_ipsec_tnl; #ifndef _WIN32 void netdev_get_addrs_list_flush(void); diff --git a/ofproto/tunnel.c b/ofproto/tunnel.c index 9a69071..595a1bd 100644 --- a/ofproto/tunnel.c +++ b/ofproto/tunnel.c @@ -164,7 +164,10 @@ tnl_port_add__(const struct ofport_dpif *ofport, const struct netdev *netdev, tnl_port->match.ipv6_dst = cfg->ipv6_dst; tnl_port->match.ip_src_flow = cfg->ip_src_flow; tnl_port->match.ip_dst_flow = cfg->ip_dst_flow; - tnl_port->match.pkt_mark = cfg->ipsec ? IPSEC_MARK : 0; + + if (enable_ipsec_tnl) { + tnl_port->match.pkt_mark = cfg->ipsec ? IPSEC_MARK : 0; + } tnl_port->match.in_key_flow = cfg->in_key_flow; tnl_port->match.odp_port = odp_port; @@ -357,7 +360,9 @@ tnl_process_ecn(struct flow *flow) flow->nw_tos |= IP_ECN_CE; } - flow->pkt_mark &= ~IPSEC_MARK; + if (enable_ipsec_tnl) { + flow->pkt_mark &= ~IPSEC_MARK; + } return true; } @@ -383,8 +388,11 @@ tnl_wc_init(struct flow *flow, struct flow_wildcards *wc) wc->masks.tunnel.tp_src = 0; wc->masks.tunnel.tp_dst = 0; - memset(&wc->masks.pkt_mark, 0xff, sizeof wc->masks.pkt_mark); - + if (enable_ipsec_tnl) { + memset(&wc->masks.pkt_mark, 0xff, sizeof wc->masks.pkt_mark); + } else { + memset(&wc->masks.pkt_mark, 0, sizeof wc->masks.pkt_mark); + } if (is_ip_any(flow) && IP_ECN_is_ce(flow->tunnel.ip_tos)) { wc->masks.nw_tos |= IP_ECN_MASK; @@ -435,8 +443,10 @@ tnl_port_send(const struct ofport_dpif *ofport, struct flow *flow, flow->tunnel.ipv6_dst = in6addr_any; } } - flow->pkt_mark |= tnl_port->match.pkt_mark; - wc->masks.pkt_mark |= tnl_port->match.pkt_mark; + if (enable_ipsec_tnl) { + flow->pkt_mark |= tnl_port->match.pkt_mark; + wc->masks.pkt_mark |= tnl_port->match.pkt_mark; + } if (!cfg->out_key_flow) { flow->tunnel.tun_id = cfg->out_key; @@ -561,7 +571,9 @@ tnl_find(const struct flow *flow) OVS_REQ_RDLOCK(rwlock) match.ipv6_dst = flow_tnl_src(&flow->tunnel); } match.odp_port = flow->in_port.odp_port; - match.pkt_mark = flow->pkt_mark; + if (enable_ipsec_tnl) { + match.pkt_mark = flow->pkt_mark; + } match.in_key_flow = in_key_flow; match.ip_dst_flow = ip_dst_flow; match.ip_src_flow = ip_src == IP_SRC_FLOW; @@ -616,7 +628,9 @@ tnl_match_fmt(const struct tnl_match *match, struct ds *ds) } ds_put_format(ds, ", dp port=%"PRIu32, match->odp_port); - ds_put_format(ds, ", pkt mark=%"PRIu32, match->pkt_mark); + if (enable_ipsec_tnl) { + ds_put_format(ds, ", pkt mark=%"PRIu32, match->pkt_mark); + } } static void diff --git a/ofproto/tunnel.h b/ofproto/tunnel.h index b0ec67c..b2f5590 100644 --- a/ofproto/tunnel.h +++ b/ofproto/tunnel.h @@ -30,6 +30,8 @@ struct ofport_dpif; struct netdev; struct netdev_tnl_build_header_params; +extern bool enable_ipsec_tnl; + void ofproto_tunnel_init(void); bool tnl_port_reconfigure(const struct ofport_dpif *, const struct netdev *, odp_port_t, bool native_tnl, const char name[]); diff --git a/vswitchd/ovs-vswitchd.c b/vswitchd/ovs-vswitchd.c index 72448bb..84c9b96 100644 --- a/vswitchd/ovs-vswitchd.c +++ b/vswitchd/ovs-vswitchd.c @@ -146,6 +146,7 @@ parse_options(int argc, char *argv[], char **unixctl_pathp) DAEMON_OPTION_ENUMS, OPT_DPDK, OPT_DUMMY_NUMA, + OPT_DISABLE_IPSEC_TNL, }; static const struct option long_options[] = { {"help", no_argument, NULL, 'h'}, @@ -161,6 +162,7 @@ parse_options(int argc, char *argv[], char **unixctl_pathp) {"disable-system", no_argument, NULL, OPT_DISABLE_SYSTEM}, {"dpdk", optional_argument, NULL, OPT_DPDK}, {"dummy-numa", required_argument, NULL, OPT_DUMMY_NUMA}, + {"external-ipsec-tunneling", no_argument, NULL, OPT_DISABLE_IPSEC_TNL}, {NULL, 0, NULL, 0}, }; char *short_options = ovs_cmdl_long_options_to_short_options(long_options); @@ -220,6 +222,10 @@ parse_options(int argc, char *argv[], char **unixctl_pathp) ovs_numa_set_dummy(optarg); break; + case OPT_DISABLE_IPSEC_TNL: + enable_ipsec_tnl = false; + break; + default: abort(); } @@ -259,6 +265,7 @@ usage(void) ); printf("\nOther options:\n" " --unixctl=SOCKET override default control socket name\n" + " --external-ipsec-tunneling Disable native IPsec tunnel support to allow external IPsec tunnel management\n" " -h, --help display this help message\n" " -V, --version display version information\n"); exit(EXIT_SUCCESS); diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml index e73023d..d6fc508 100644 --- a/vswitchd/vswitch.xml +++ b/vswitchd/vswitch.xml @@ -2008,6 +2008,14 @@ <dd> An Ethernet over RFC 2890 Generic Routing Encapsulation over IPv4/IPv6 IPsec tunnel. + IPsec tunnel port are deprecated. The support will be completely + removed in next version. + Better way to implement IPsec Tunnel is to use external daemon to manage + IPsec tunnel traffic using strongswan and stir it using skb-mark match + action in OVS bridge. To match on skb-marked tunnel packet, OVS IPsec + tunnel port support needs to be disabled using command line ovs-vswitchd + daemon option (--external-ipsec-tunneling). + </dd> <dt><code>vxlan</code></dt> -- 1.9.1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev