vxlan: introduce vxlan_fdb_find_rdst
authorMike Rapoport <mike.rapoport@ravellosystems.com>
Tue, 25 Jun 2013 13:01:52 +0000 (16:01 +0300)
committerStephen Hemminger <stephen@networkplumber.org>
Tue, 25 Jun 2013 16:31:36 +0000 (09:31 -0700)
which will be reused by vxlan_fdb_delete

Signed-off-by: Mike Rapoport <mike.rapoport@ravellosystems.com>
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
drivers/net/vxlan.c

index bdfe46e..306bd94 100644 (file)
@@ -388,21 +388,34 @@ static struct vxlan_fdb *vxlan_find_mac(struct vxlan_dev *vxlan,
        return f;
 }
 
-/* Add/update destinations for multicast */
-static int vxlan_fdb_append(struct vxlan_fdb *f,
-                           __be32 ip, __be16 port, __u32 vni, __u32 ifindex)
+/* caller should hold vxlan->hash_lock */
+static struct vxlan_rdst *vxlan_fdb_find_rdst(struct vxlan_fdb *f,
+                                             __be32 ip, __be16 port,
+                                             __u32 vni, __u32 ifindex)
 {
        struct vxlan_rdst *rd;
 
-       /* protected by vxlan->hash_lock */
        list_for_each_entry(rd, &f->remotes, list) {
                if (rd->remote_ip == ip &&
                    rd->remote_port == port &&
                    rd->remote_vni == vni &&
                    rd->remote_ifindex == ifindex)
-                       return 0;
+                       return rd;
        }
 
+       return NULL;
+}
+
+/* Add/update destinations for multicast */
+static int vxlan_fdb_append(struct vxlan_fdb *f,
+                           __be32 ip, __be16 port, __u32 vni, __u32 ifindex)
+{
+       struct vxlan_rdst *rd;
+
+       rd = vxlan_fdb_find_rdst(f, ip, port, vni, ifindex);
+       if (rd)
+               return 0;
+
        rd = kmalloc(sizeof(*rd), GFP_ATOMIC);
        if (rd == NULL)
                return -ENOBUFS;