summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/mcast-snooping.c9
-rw-r--r--lib/ovs-router.c3
-rw-r--r--lib/packets.c14
-rw-r--r--lib/packets.h15
-rw-r--r--lib/tnl-neigh-cache.c8
-rw-r--r--lib/tnl-ports.c12
-rw-r--r--ofproto/ofproto-dpif-xlate.c2
7 files changed, 23 insertions, 40 deletions
diff --git a/lib/mcast-snooping.c b/lib/mcast-snooping.c
index ff2382d05..ee3e2e118 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 480dfd6fc..9a59a24bc 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 fe06ac8a6..5ad16b502 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 4283f59ee..acd317d8e 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 cf4082cb9..1ded16931 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 2d148117f..3006a8b59 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 36a2f662c..beff14fe5 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: