diff options
-rw-r--r-- | lib/mcast-snooping.c | 9 | ||||
-rw-r--r-- | lib/ovs-router.c | 3 | ||||
-rw-r--r-- | lib/packets.c | 14 | ||||
-rw-r--r-- | lib/packets.h | 15 | ||||
-rw-r--r-- | lib/tnl-neigh-cache.c | 8 | ||||
-rw-r--r-- | lib/tnl-ports.c | 12 | ||||
-rw-r--r-- | 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 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: |