git://git.onelab.eu
/
sliver-openvswitch.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
tunnel: Only un-wildcard the ECN bits for IP traffic.
[sliver-openvswitch.git]
/
ofproto
/
tunnel.c
diff --git
a/ofproto/tunnel.c
b/ofproto/tunnel.c
index
ffc4057
..
1a39aea
100644
(file)
--- a/
ofproto/tunnel.c
+++ b/
ofproto/tunnel.c
@@
-30,17
+30,13
@@
#include "tunnel.h"
#include "vlog.h"
#include "tunnel.h"
#include "vlog.h"
-/* XXX:
- *
- * Disallow netdevs with names like "gre64_system" to prevent collisions. */
-
VLOG_DEFINE_THIS_MODULE(tunnel);
struct tnl_match {
ovs_be64 in_key;
ovs_be32 ip_src;
ovs_be32 ip_dst;
VLOG_DEFINE_THIS_MODULE(tunnel);
struct tnl_match {
ovs_be64 in_key;
ovs_be32 ip_src;
ovs_be32 ip_dst;
-
uint32
_t odp_port;
+
odp_port
_t odp_port;
uint32_t skb_mark;
bool in_key_flow;
bool ip_src_flow;
uint32_t skb_mark;
bool in_key_flow;
bool ip_src_flow;
@@
-75,7
+71,7
@@
static void tnl_port_mod_log(const struct tnl_port *, const char *action);
static const char *tnl_port_get_name(const struct tnl_port *);
static struct tnl_port *
static const char *tnl_port_get_name(const struct tnl_port *);
static struct tnl_port *
-tnl_port_add__(const struct ofport *ofport,
uint32
_t odp_port,
+tnl_port_add__(const struct ofport *ofport,
odp_port
_t odp_port,
bool warn)
{
const struct netdev_tunnel_config *cfg;
bool warn)
{
const struct netdev_tunnel_config *cfg;
@@
-122,7
+118,7
@@
tnl_port_add__(const struct ofport *ofport, uint32_t odp_port,
* must be added before they can be used by the module. 'ofport' must be a
* tunnel. */
struct tnl_port *
* must be added before they can be used by the module. 'ofport' must be a
* tunnel. */
struct tnl_port *
-tnl_port_add(const struct ofport *ofport,
uint32
_t odp_port)
+tnl_port_add(const struct ofport *ofport,
odp_port
_t odp_port)
{
return tnl_port_add__(ofport, odp_port, true);
}
{
return tnl_port_add__(ofport, odp_port, true);
}
@@
-133,7
+129,7
@@
tnl_port_add(const struct ofport *ofport, uint32_t odp_port)
* 'ofport' and 'odp_port' should be the same as would be passed to
* tnl_port_add(). */
bool
* 'ofport' and 'odp_port' should be the same as would be passed to
* tnl_port_add(). */
bool
-tnl_port_reconfigure(const struct ofport *ofport,
uint32
_t odp_port,
+tnl_port_reconfigure(const struct ofport *ofport,
odp_port
_t odp_port,
struct tnl_port **tnl_portp)
{
struct tnl_port *tnl_port = *tnl_portp;
struct tnl_port **tnl_portp)
{
struct tnl_port *tnl_port = *tnl_portp;
@@
-177,7
+173,7
@@
tnl_port_receive(const struct flow *flow)
struct tnl_match match;
memset(&match, 0, sizeof match);
struct tnl_match match;
memset(&match, 0, sizeof match);
- match.odp_port = flow->in_port;
+ match.odp_port = flow->in_port
.odp_port
;
match.ip_src = flow->tunnel.ip_dst;
match.ip_dst = flow->tunnel.ip_src;
match.in_key = flow->tunnel.tun_id;
match.ip_src = flow->tunnel.ip_dst;
match.ip_dst = flow->tunnel.ip_src;
match.in_key = flow->tunnel.tun_id;
@@
-214,16
+210,17
@@
tnl_port_receive(const struct flow *flow)
/* Given that 'flow' should be output to the ofport corresponding to
* 'tnl_port', updates 'flow''s tunnel headers and returns the actual datapath
/* Given that 'flow' should be output to the ofport corresponding to
* 'tnl_port', updates 'flow''s tunnel headers and returns the actual datapath
- * port that the output should happen on. May return O
VS
P_NONE if the output
+ * port that the output should happen on. May return O
DP
P_NONE if the output
* shouldn't occur. */
* shouldn't occur. */
-uint32_t
-tnl_port_send(const struct tnl_port *tnl_port, struct flow *flow)
+odp_port_t
+tnl_port_send(const struct tnl_port *tnl_port, struct flow *flow,
+ struct flow_wildcards *wc)
{
const struct netdev_tunnel_config *cfg;
char *pre_flow_str = NULL;
if (tnl_port == &void_tnl_port) {
{
const struct netdev_tunnel_config *cfg;
char *pre_flow_str = NULL;
if (tnl_port == &void_tnl_port) {
- return O
VS
P_NONE;
+ return O
DP
P_NONE;
}
cfg = netdev_get_tunnel_config(tnl_port->ofport->netdev);
}
cfg = netdev_get_tunnel_config(tnl_port->ofport->netdev);
@@
-246,17
+243,24
@@
tnl_port_send(const struct tnl_port *tnl_port, struct flow *flow)
}
if (cfg->ttl_inherit && is_ip_any(flow)) {
}
if (cfg->ttl_inherit && is_ip_any(flow)) {
+ wc->masks.nw_ttl = 0xff;
flow->tunnel.ip_ttl = flow->nw_ttl;
} else {
flow->tunnel.ip_ttl = cfg->ttl;
}
if (cfg->tos_inherit && is_ip_any(flow)) {
flow->tunnel.ip_ttl = flow->nw_ttl;
} else {
flow->tunnel.ip_ttl = cfg->ttl;
}
if (cfg->tos_inherit && is_ip_any(flow)) {
+ wc->masks.nw_tos = 0xff;
flow->tunnel.ip_tos = flow->nw_tos & IP_DSCP_MASK;
} else {
flow->tunnel.ip_tos = cfg->tos;
}
flow->tunnel.ip_tos = flow->nw_tos & IP_DSCP_MASK;
} else {
flow->tunnel.ip_tos = cfg->tos;
}
+ /* ECN fields are always inherited. */
+ if (is_ip_any(flow)) {
+ wc->masks.nw_tos |= IP_ECN_MASK;
+ }
+
if ((flow->nw_tos & IP_ECN_MASK) == IP_ECN_CE) {
flow->tunnel.ip_tos |= IP_ECN_ECT_0;
} else {
if ((flow->nw_tos & IP_ECN_MASK) == IP_ECN_CE) {
flow->tunnel.ip_tos |= IP_ECN_ECT_0;
} else {