[ovs-dev] [PATCH] packets: Introduce in6_addr_mapped_ipv4() and use where appropriate.

Ben Pfaff blp at ovn.org
Thu Dec 3 21:00:38 UTC 2015


This allows code to be written more naturally in some cases.

Signed-off-by: Ben Pfaff <blp at ovn.org>
---
 lib/mcast-snooping.c         |  9 +++------
 lib/ovs-router.c             |  3 +--
 lib/packets.c                | 14 ++------------
 lib/packets.h                | 15 ++++++++++-----
 lib/tnl-neigh-cache.c        |  8 ++------
 lib/tnl-ports.c              | 12 ++++--------
 ofproto/ofproto-dpif-xlate.c |  2 +-
 7 files changed, 23 insertions(+), 40 deletions(-)

diff --git a/lib/mcast-snooping.c b/lib/mcast-snooping.c
index ff2382d..ee3e2e1 100644
--- a/lib/mcast-snooping.c
+++ b/lib/mcast-snooping.c
@@ -130,8 +130,7 @@ mcast_snooping_lookup4(const struct mcast_snooping *ms, ovs_be32 ip4,
                       uint16_t vlan)
     OVS_REQ_RDLOCK(ms->rwlock)
 {
-    struct in6_addr addr;
-    in6_addr_set_mapped_ipv4(&addr, ip4);
+    struct in6_addr addr = in6_addr_mapped_ipv4(ip4);
     return mcast_snooping_lookup(ms, &addr, vlan);
 }
 
@@ -434,8 +433,7 @@ mcast_snooping_add_group4(struct mcast_snooping *ms, ovs_be32 ip4,
                          uint16_t vlan, void *port)
     OVS_REQ_WRLOCK(ms->rwlock)
 {
-    struct in6_addr addr;
-    in6_addr_set_mapped_ipv4(&addr, ip4);
+    struct in6_addr addr = in6_addr_mapped_ipv4(ip4);
     return mcast_snooping_add_group(ms, &addr, vlan, port);
 }
 
@@ -588,8 +586,7 @@ bool
 mcast_snooping_leave_group4(struct mcast_snooping *ms, ovs_be32 ip4,
                            uint16_t vlan, void *port)
 {
-    struct in6_addr addr;
-    in6_addr_set_mapped_ipv4(&addr, ip4);
+    struct in6_addr addr = in6_addr_mapped_ipv4(ip4);
     return mcast_snooping_leave_group(ms, &addr, vlan, port);
 }
 
diff --git a/lib/ovs-router.c b/lib/ovs-router.c
index 480dfd6..9a59a24 100644
--- a/lib/ovs-router.c
+++ b/lib/ovs-router.c
@@ -86,10 +86,9 @@ ovs_router_lookup(const struct in6_addr *ip6_dst, char output_bridge[],
 bool
 ovs_router_lookup4(ovs_be32 ip_dst, char output_bridge[], ovs_be32 *gw)
 {
-    struct in6_addr ip6_dst;
+    struct in6_addr ip6_dst = in6_addr_mapped_ipv4(ip_dst);
     struct in6_addr gw6;
 
-    in6_addr_set_mapped_ipv4(&ip6_dst, ip_dst);
     if (ovs_router_lookup(&ip6_dst, output_bridge, &gw6)) {
         *gw = in6_addr_get_mapped_ipv4(&gw6);
         return true;
diff --git a/lib/packets.c b/lib/packets.c
index fe06ac8..5ad16b5 100644
--- a/lib/packets.c
+++ b/lib/packets.c
@@ -39,23 +39,13 @@ const struct in6_addr in6addr_all_hosts = IN6ADDR_ALL_HOSTS_INIT;
 struct in6_addr
 flow_tnl_dst(const struct flow_tnl *tnl)
 {
-    struct in6_addr addr;
-    if (tnl->ip_dst) {
-        in6_addr_set_mapped_ipv4(&addr, tnl->ip_dst);
-        return addr;
-    }
-    return tnl->ipv6_dst;
+    return tnl->ip_dst ? in6_addr_mapped_ipv4(tnl->ip_dst) : tnl->ipv6_dst;
 }
 
 struct in6_addr
 flow_tnl_src(const struct flow_tnl *tnl)
 {
-    struct in6_addr addr;
-    if (tnl->ip_src) {
-        in6_addr_set_mapped_ipv4(&addr, tnl->ip_src);
-        return addr;
-    }
-    return tnl->ipv6_src;
+    return tnl->ip_src ? in6_addr_mapped_ipv4(tnl->ip_src) : tnl->ipv6_src;
 }
 
 /* Parses 's' as a 16-digit hexadecimal number representing a datapath ID.  On
diff --git a/lib/packets.h b/lib/packets.h
index 4283f59..acd317d 100644
--- a/lib/packets.h
+++ b/lib/packets.h
@@ -916,13 +916,18 @@ static inline bool ipv6_addr_is_multicast(const struct in6_addr *ip) {
     return ip->s6_addr[0] == 0xff;
 }
 
+static inline struct in6_addr
+in6_addr_mapped_ipv4(ovs_be32 ip4)
+{
+    struct in6_addr ip6 = { .s6_addr = { [10] = 0xff, [11] = 0xff } };
+    memcpy(&ip6.s6_addr[12], &ip4, 4);
+    return ip6;
+}
+
 static inline void
-in6_addr_set_mapped_ipv4(struct in6_addr *addr, ovs_be32 ip4)
+in6_addr_set_mapped_ipv4(struct in6_addr *ip6, ovs_be32 ip4)
 {
-    union ovs_16aligned_in6_addr *taddr = (void *) addr;
-    memset(taddr->be16, 0, sizeof(taddr->be16));
-    taddr->be16[5] = OVS_BE16_MAX;
-    put_16aligned_be32(&taddr->be32[3], ip4);
+    *ip6 = in6_addr_mapped_ipv4(ip4);
 }
 
 static inline ovs_be32
diff --git a/lib/tnl-neigh-cache.c b/lib/tnl-neigh-cache.c
index cf4082c..1ded169 100644
--- a/lib/tnl-neigh-cache.c
+++ b/lib/tnl-neigh-cache.c
@@ -86,9 +86,7 @@ tnl_arp_lookup(const char br_name[IFNAMSIZ], ovs_be32 dst,
 {
     struct tnl_neigh_entry *neigh;
     int res = ENOENT;
-    struct in6_addr dst6;
-
-    in6_addr_set_mapped_ipv4(&dst6, dst);
+    struct in6_addr dst6 = in6_addr_mapped_ipv4(dst);
 
     neigh = tnl_neigh_lookup__(br_name, &dst6);
     if (neigh) {
@@ -158,9 +156,7 @@ static void
 tnl_arp_set(const char name[IFNAMSIZ], ovs_be32 dst,
             const struct eth_addr mac)
 {
-    struct in6_addr dst6;
-
-    in6_addr_set_mapped_ipv4(&dst6, dst);
+    struct in6_addr dst6 = in6_addr_mapped_ipv4(dst);
     tnl_neigh_set__(name, &dst6, mac);
 }
 
diff --git a/lib/tnl-ports.c b/lib/tnl-ports.c
index 2d14811..3006a8b 100644
--- a/lib/tnl-ports.c
+++ b/lib/tnl-ports.c
@@ -166,8 +166,7 @@ tnl_port_map_insert(odp_port_t port,
 
     LIST_FOR_EACH(ip_dev, node, &addr_list) {
         if (ip_dev->addr4 != INADDR_ANY) {
-            struct in6_addr addr4;
-            in6_addr_set_mapped_ipv4(&addr4, ip_dev->addr4);
+            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);
         }
@@ -226,8 +225,7 @@ 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_set_mapped_ipv4(&addr4, ip_dev->addr4);
+            struct in6_addr addr4 = in6_addr_mapped_ipv4(ip_dev->addr4);
             map_delete(ip_dev->mac, &addr4, udp_port);
         }
         if (ipv6_addr_is_set(&ip_dev->addr6)) {
@@ -328,8 +326,7 @@ map_insert_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_set_mapped_ipv4(&addr4, ip_dev->addr4);
+            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);
         }
@@ -387,8 +384,7 @@ 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_set_mapped_ipv4(&addr4, ip_dev->addr4);
+            struct in6_addr addr4 = in6_addr_mapped_ipv4(ip_dev->addr4);
             map_delete(ip_dev->mac, &addr4, p->udp_port);
         }
         if (ipv6_addr_is_set(&ip_dev->addr6)) {
diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
index 36a2f66..beff14f 100644
--- a/ofproto/ofproto-dpif-xlate.c
+++ b/ofproto/ofproto-dpif-xlate.c
@@ -5017,6 +5017,7 @@ xlate_actions(struct xlate_in *xin, struct xlate_out *xout)
         .xin = xin,
         .xout = xout,
         .base_flow = *flow,
+        .orig_tunnel_ipv6_dst = in6_addr_mapped_ipv4(flow->tunnel.ip_dst),
         .xbridge = xbridge,
         .stack = OFPBUF_STUB_INITIALIZER(stack_stub),
         .rule = xin->rule,
@@ -5049,7 +5050,6 @@ xlate_actions(struct xlate_in *xin, struct xlate_out *xout)
         .action_set_has_group = false,
         .action_set = OFPBUF_STUB_INITIALIZER(action_set_stub),
     };
-    in6_addr_set_mapped_ipv4(&ctx.orig_tunnel_ipv6_dst, flow->tunnel.ip_dst);
 
     /* 'base_flow' reflects the packet as it came in, but we need it to reflect
      * the packet as the datapath will treat it for output actions:
-- 
2.1.3




More information about the dev mailing list