[ovs-dev] [PATCH] tunneling: Separate out multicast port pools.

Jesse Gross jesse at nicira.com
Tue Nov 8 05:04:44 UTC 2011


Currently multicast and unicast tunnel ports share port pools but
there's no overlap between the two in the lookup, which means that
we can do a lookup that has no chance of ever finding a port.  This
separates them out.

Suggested-by: Ben Pfaff <blp at nicira.com>
Signed-off-by: Jesse Gross <jesse at nicira.com>
---
 datapath/tunnel.c |   12 ++++++++++--
 1 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/datapath/tunnel.c b/datapath/tunnel.c
index 6c0e9b7..024861f 100644
--- a/datapath/tunnel.c
+++ b/datapath/tunnel.c
@@ -86,8 +86,10 @@ static DECLARE_DELAYED_WORK(cache_cleaner_wq, cache_cleaner);
  */
 static unsigned int key_local_remote_ports __read_mostly;
 static unsigned int key_remote_ports __read_mostly;
+static unsigned int key_multicast_ports __read_mostly;
 static unsigned int local_remote_ports __read_mostly;
 static unsigned int remote_ports __read_mostly;
+static unsigned int multicast_ports __read_mostly;
 
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)
 #define rt_dst(rt) (rt->dst)
@@ -191,14 +193,20 @@ static void assign_cache_rcu(struct vport *vport, struct tnl_cache *new_cache)
 
 static unsigned int *find_port_pool(const struct tnl_mutable_config *mutable)
 {
+	bool is_multicast = ipv4_is_multicast(mutable->key.daddr);
+
 	if (mutable->flags & TNL_F_IN_KEY_MATCH) {
 		if (mutable->key.saddr)
 			return &local_remote_ports;
+		else if (is_multicast)
+			return &multicast_ports;
 		else
 			return &remote_ports;
 	} else {
 		if (mutable->key.saddr)
 			return &key_local_remote_ports;
+		else if (is_multicast)
+			return &key_multicast_ports;
 		else
 			return &key_remote_ports;
 	}
@@ -328,14 +336,14 @@ struct vport *tnl_find_port(__be32 saddr, __be32 daddr, __be64 key,
 	if (is_multicast) {
 		lookup.saddr = 0;
 		lookup.daddr = saddr;
-		if (key_remote_ports) {
+		if (key_multicast_ports) {
 			lookup.tunnel_type = tunnel_type | TNL_T_KEY_EXACT;
 			lookup.in_key = key;
 			vport = port_table_lookup(&lookup, mutable);
 			if (vport)
 				return vport;
 		}
-		if (remote_ports) {
+		if (multicast_ports) {
 			lookup.tunnel_type = tunnel_type | TNL_T_KEY_MATCH;
 			lookup.in_key = 0;
 			vport = port_table_lookup(&lookup, mutable);
-- 
1.7.5.4




More information about the dev mailing list