This allows code to be written more naturally in some cases. Signed-off-by: Ben Pfaff <b...@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 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev