[ovs-dev] [PATCH 7/8] tnl-ports: Handle STT ports.
Pravin B Shelar
pshelar at nicira.com
Mon Jan 11 07:18:13 UTC 2016
STT uses TCP port so we need to filter traffic on basis of TCP
port numbers.
Signed-off-by: Pravin B Shelar <pshelar at nicira.com>
---
lib/tnl-ports.c | 55 +++++++++++++++++++++++++++++++------------------------
lib/tnl-ports.h | 4 ++--
ofproto/tunnel.c | 5 ++++-
3 files changed, 37 insertions(+), 27 deletions(-)
diff --git a/lib/tnl-ports.c b/lib/tnl-ports.c
index e7f2066..13d114d 100644
--- a/lib/tnl-ports.c
+++ b/lib/tnl-ports.c
@@ -51,8 +51,9 @@ static struct ovs_list addr_list;
struct tnl_port {
odp_port_t port;
- ovs_be16 udp_port;
+ ovs_be16 tp_port;
char dev_name[IFNAMSIZ];
+ char type[IFNAMSIZ];
struct ovs_list node;
};
@@ -82,7 +83,7 @@ tnl_port_free(struct tnl_port_in *p)
static void
tnl_port_init_flow(struct flow *flow, struct eth_addr mac,
- struct in6_addr *addr, ovs_be16 udp_port)
+ struct in6_addr *addr, ovs_be16 tp_port, const char type[])
{
memset(flow, 0, sizeof *flow);
@@ -95,24 +96,28 @@ tnl_port_init_flow(struct flow *flow, struct eth_addr mac,
flow->ipv6_dst = *addr;
}
- if (udp_port) {
- flow->nw_proto = IPPROTO_UDP;
+ if (tp_port) {
+ if (!strcmp(type, "stt")) {
+ flow->nw_proto = IPPROTO_TCP;
+ } else {
+ flow->nw_proto = IPPROTO_UDP;
+ }
} else {
flow->nw_proto = IPPROTO_GRE;
}
- flow->tp_dst = udp_port;
+ flow->tp_dst = tp_port;
}
static void
map_insert(odp_port_t port, struct eth_addr mac, struct in6_addr *addr,
- ovs_be16 udp_port, const char dev_name[])
+ ovs_be16 tp_port, const char dev_name[], const char type[])
{
const struct cls_rule *cr;
struct tnl_port_in *p;
struct match match;
memset(&match, 0, sizeof match);
- tnl_port_init_flow(&match.flow, mac, addr, udp_port);
+ tnl_port_init_flow(&match.flow, mac, addr, tp_port, type);
do {
cr = classifier_lookup(&cls, CLS_MAX_VERSION, &match.flow, NULL);
@@ -129,9 +134,9 @@ map_insert(odp_port_t port, struct eth_addr mac, struct in6_addr *addr,
/* XXX: No fragments support. */
match.wc.masks.nw_frag = FLOW_NW_FRAG_MASK;
- /* 'udp_port' is zero for non-UDP tunnels (e.g. GRE). In this case it
+ /* 'tp_port' is zero for non-UDP tunnels (e.g. GRE). In this case it
* doesn't make sense to match on UDP port numbers. */
- if (udp_port) {
+ if (tp_port) {
match.wc.masks.tp_dst = OVS_BE16_MAX;
}
if (IN6_IS_ADDR_V4MAPPED(addr)) {
@@ -152,33 +157,34 @@ map_insert(odp_port_t port, struct eth_addr mac, struct in6_addr *addr,
void
tnl_port_map_insert(odp_port_t port,
- ovs_be16 udp_port, const char dev_name[])
+ ovs_be16 tp_port, const char dev_name[], const char type[])
{
struct tnl_port *p;
struct ip_device *ip_dev;
ovs_mutex_lock(&mutex);
LIST_FOR_EACH(p, node, &port_list) {
- if (udp_port == p->udp_port) {
+ if (tp_port == p->tp_port) {
goto out;
}
}
p = xzalloc(sizeof *p);
p->port = port;
- p->udp_port = udp_port;
+ p->tp_port = tp_port;
ovs_strlcpy(p->dev_name, dev_name, sizeof p->dev_name);
+ ovs_strlcpy(p->type, type, sizeof p->dev_name);
list_insert(&port_list, &p->node);
LIST_FOR_EACH(ip_dev, node, &addr_list) {
if (ip_dev->addr4 != INADDR_ANY) {
struct in6_addr addr4 = in6_addr_mapped_ipv4(ip_dev->addr4);
map_insert(p->port, ip_dev->mac, &addr4,
- p->udp_port, p->dev_name);
+ p->tp_port, p->dev_name, p->type);
}
if (ipv6_addr_is_set(&ip_dev->addr6)) {
map_insert(p->port, ip_dev->mac, &ip_dev->addr6,
- p->udp_port, p->dev_name);
+ p->tp_port, p->dev_name, p->type);
}
}
@@ -199,19 +205,20 @@ tnl_port_unref(const struct cls_rule *cr)
}
static void
-map_delete(struct eth_addr mac, struct in6_addr *addr, ovs_be16 udp_port)
+map_delete(struct eth_addr mac, struct in6_addr *addr,
+ ovs_be16 tp_port, const char type[])
{
const struct cls_rule *cr;
struct flow flow;
- tnl_port_init_flow(&flow, mac, addr, udp_port);
+ tnl_port_init_flow(&flow, mac, addr, tp_port, type);
cr = classifier_lookup(&cls, CLS_MAX_VERSION, &flow, NULL);
tnl_port_unref(cr);
}
void
-tnl_port_map_delete(ovs_be16 udp_port)
+tnl_port_map_delete(ovs_be16 tp_port)
{
struct tnl_port *p, *next;
struct ip_device *ip_dev;
@@ -219,7 +226,7 @@ tnl_port_map_delete(ovs_be16 udp_port)
ovs_mutex_lock(&mutex);
LIST_FOR_EACH_SAFE(p, next, node, &port_list) {
- if (p->udp_port == udp_port) {
+ if (p->tp_port == tp_port) {
list_remove(&p->node);
found = true;
break;
@@ -232,10 +239,10 @@ tnl_port_map_delete(ovs_be16 udp_port)
LIST_FOR_EACH(ip_dev, node, &addr_list) {
if (ip_dev->addr4 != INADDR_ANY) {
struct in6_addr addr4 = in6_addr_mapped_ipv4(ip_dev->addr4);
- map_delete(ip_dev->mac, &addr4, udp_port);
+ map_delete(ip_dev->mac, &addr4, tp_port, p->type);
}
if (ipv6_addr_is_set(&ip_dev->addr6)) {
- map_delete(ip_dev->mac, &ip_dev->addr6, udp_port);
+ map_delete(ip_dev->mac, &ip_dev->addr6, tp_port, p->type);
}
}
@@ -334,11 +341,11 @@ map_insert_ipdev(struct ip_device *ip_dev)
if (ip_dev->addr4 != INADDR_ANY) {
struct in6_addr addr4 = in6_addr_mapped_ipv4(ip_dev->addr4);
map_insert(p->port, ip_dev->mac, &addr4,
- p->udp_port, p->dev_name);
+ p->tp_port, p->dev_name, p->type);
}
if (ipv6_addr_is_set(&ip_dev->addr6)) {
map_insert(p->port, ip_dev->mac, &ip_dev->addr6,
- p->udp_port, p->dev_name);
+ p->tp_port, p->dev_name, p->type);
}
}
}
@@ -391,10 +398,10 @@ delete_ipdev(struct ip_device *ip_dev)
LIST_FOR_EACH(p, node, &port_list) {
if (ip_dev->addr4 != INADDR_ANY) {
struct in6_addr addr4 = in6_addr_mapped_ipv4(ip_dev->addr4);
- map_delete(ip_dev->mac, &addr4, p->udp_port);
+ map_delete(ip_dev->mac, &addr4, p->tp_port, p->type);
}
if (ipv6_addr_is_set(&ip_dev->addr6)) {
- map_delete(ip_dev->mac, &ip_dev->addr6, p->udp_port);
+ map_delete(ip_dev->mac, &ip_dev->addr6, p->tp_port, p->type);
}
}
diff --git a/lib/tnl-ports.h b/lib/tnl-ports.h
index 4195e6a..8dbee06 100644
--- a/lib/tnl-ports.h
+++ b/lib/tnl-ports.h
@@ -26,8 +26,8 @@
odp_port_t tnl_port_map_lookup(struct flow *flow, struct flow_wildcards *wc);
-void tnl_port_map_insert(odp_port_t port, ovs_be16 udp_port,
- const char dev_name[]);
+void tnl_port_map_insert(odp_port_t port, ovs_be16 tp_port,
+ const char dev_name[], const char type[]);
void tnl_port_map_delete(ovs_be16 udp_port);
void tnl_port_map_insert_ipdev(const char dev[]);
diff --git a/ofproto/tunnel.c b/ofproto/tunnel.c
index 7ac8841..7aa0a05 100644
--- a/ofproto/tunnel.c
+++ b/ofproto/tunnel.c
@@ -194,7 +194,10 @@ tnl_port_add__(const struct ofport_dpif *ofport, const struct netdev *netdev,
tnl_port_mod_log(tnl_port, "adding");
if (native_tnl) {
- tnl_port_map_insert(odp_port, cfg->dst_port, name);
+ const char *type;
+
+ type = netdev_get_type(netdev);
+ tnl_port_map_insert(odp_port, cfg->dst_port, name, type);
}
return true;
}
--
1.8.3.1
More information about the dev
mailing list