Skip to content

Commit

Permalink
route-table: Support parsing RTA_VIA attribute.
Browse files Browse the repository at this point in the history
This is a prerequisite for parsing RTA_MULTIPATH attribute whose
support will be added in a subsequent patch.

Signed-off-by: Frode Nordahl <[email protected]>
Signed-off-by: 0-day Robot <[email protected]>
  • Loading branch information
fnordahl authored and ovsrobot committed Dec 6, 2024
1 parent 9614050 commit f044c28
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 1 deletion.
22 changes: 21 additions & 1 deletion lib/route-table.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ COVERAGE_DEFINE(route_table_dump);
struct route_data_nexthop {
struct ovs_list nexthop_node;

sa_family_t family;
struct in6_addr addr;
char ifname[IFNAMSIZ]; /* Interface name. */
};
Expand Down Expand Up @@ -272,6 +273,7 @@ route_table_parse__(struct ofpbuf *buf, size_t ofs,
[RTA_PREFSRC] = { .type = NL_A_U32, .optional = true },
[RTA_TABLE] = { .type = NL_A_U32, .optional = true },
[RTA_PRIORITY] = { .type = NL_A_U32, .optional = true },
[RTA_VIA] = { .type = NL_A_UNSPEC, .optional = true },
};

static const struct nl_policy policy6[] = {
Expand All @@ -282,6 +284,7 @@ route_table_parse__(struct ofpbuf *buf, size_t ofs,
[RTA_PREFSRC] = { .type = NL_A_IPV6, .optional = true },
[RTA_TABLE] = { .type = NL_A_U32, .optional = true },
[RTA_PRIORITY] = { .type = NL_A_U32, .optional = true },
[RTA_VIA] = { .type = NL_A_UNSPEC, .optional = true },
};

struct nlattr *attrs[ARRAY_SIZE(policy)];
Expand Down Expand Up @@ -377,7 +380,24 @@ route_table_parse__(struct ofpbuf *buf, size_t ofs,
if (attrs[RTA_PRIORITY]) {
change->rd.rta_priority = nl_attr_get_u32(attrs[RTA_PRIORITY]);
}

if (attrs[RTA_VIA]) {
const struct rtvia *rtvia = nl_attr_get(attrs[RTA_VIA]);
rdnh->family = rtvia->rtvia_family;
ovs_be32 addr;

switch (rdnh->family) {
case AF_INET:
memcpy(&addr, rtvia->rtvia_addr, sizeof(ovs_be32));
in6_addr_set_mapped_ipv4(&rdnh->addr, addr);
break;
case AF_INET6:
memcpy(&rdnh->addr, rtvia->rtvia_addr, sizeof rdnh->addr);
break;
default:
VLOG_DBG_RL(&rl, "No address family in via attribute.");
goto error_out;
}
}
ovs_list_insert(&change->rd.nexthops, &rdnh->nexthop_node);
} else {
VLOG_DBG_RL(&rl, "received unparseable rtnetlink route message");
Expand Down
18 changes: 18 additions & 0 deletions tests/system-route.at
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,24 @@ Cached: fc00:db8:beef::13/128 dev br0 GW fc00:db8:cafe::1 SRC fc00:db8:cafe::2])
OVS_TRAFFIC_VSWITCHD_STOP
AT_CLEANUP

AT_SETUP([ovs-route - add system route - ipv4 via ipv6 nexthop])
AT_KEYWORDS([route])
OVS_TRAFFIC_VSWITCHD_START()
AT_CHECK([ovs-vsctl set bridge br0 other-config:hwaddr=00:53:00:00:00:42])
AT_CHECK([ip link set br0 up])

AT_CHECK([ip addr add 192.168.9.2/24 dev br0], [0], [stdout])

AT_CHECK([ip route add 192.168.10.12/32 via inet6 fe80::253:ff:fe00:51 dev br0], [0], [stdout])

AT_CHECK([ovs-appctl revalidator/wait])

OVS_WAIT_UNTIL_EQUAL([ovs-appctl ovs/route/show | grep -E '192.168.10.12/32' | sort], [dnl
Cached: 192.168.10.12/32 dev br0 GW fe80::253:ff:fe00:51 SRC fe80::253:ff:fe00:42])

OVS_TRAFFIC_VSWITCHD_STOP
AT_CLEANUP

dnl Checks that OVS doesn't use routes from non-standard tables.
AT_SETUP([ovs-route - route tables])
AT_KEYWORDS([route])
Expand Down

0 comments on commit f044c28

Please sign in to comment.