This allows code to be written more naturally in some cases.
Signed-off-by: Ben Pfaff <blp@ovn.org>
Acked-by: Thadeu Lima de Souza Cascardo <cascardo@redhat.com>
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);
}
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);
}
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);
}
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;
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
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
{
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) {
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);
}
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);
}
}
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)) {
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);
}
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)) {
.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,
.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: