[ovs-dev] [PATCH v6 5/5] route-table: Retrieving the preferred source address from Netlink.

2023-03-01 Thread Nobuhiro MIKI
We can use the "ip route add ... src ..." command to set the preferred
source address for each entry in the kernel FIB. OVS has a mechanism to
cache the FIB, but the preferred source address is ignored and
calculated with its own logic. This patch resolves the difference
between kernel FIB and OVS route table cache by retrieving the
RTA_PREFSRC attribute of Netlink messages.

Acked-by: Eelco Chaudron 
Reviewed-by: Simon Horman 
Signed-off-by: Nobuhiro MIKI 
---
 lib/ovs-router.c  |  6 +++---
 lib/ovs-router.h  |  3 ++-
 lib/route-table.c | 16 +++-
 tests/system-route.at | 39 +++
 4 files changed, 59 insertions(+), 5 deletions(-)

diff --git a/lib/ovs-router.c b/lib/ovs-router.c
index 5255049c3a2f..4281e3c97ab7 100644
--- a/lib/ovs-router.c
+++ b/lib/ovs-router.c
@@ -319,13 +319,13 @@ ovs_router_insert__(uint32_t mark, uint8_t priority, bool 
local,
 
 void
 ovs_router_insert(uint32_t mark, const struct in6_addr *ip_dst, uint8_t plen,
-  bool local, const char output_bridge[], 
-  const struct in6_addr *gw)
+  bool local, const char output_bridge[],
+  const struct in6_addr *gw, const struct in6_addr *prefsrc)
 {
 if (use_system_routing_table) {
 uint8_t priority = local ? plen + 64 : plen;
 ovs_router_insert__(mark, priority, local, ip_dst, plen,
-output_bridge, gw, &in6addr_any);
+output_bridge, gw, prefsrc);
 }
 }
 
diff --git a/lib/ovs-router.h b/lib/ovs-router.h
index d8ce3c00ded5..eb4ff85d9e63 100644
--- a/lib/ovs-router.h
+++ b/lib/ovs-router.h
@@ -32,7 +32,8 @@ bool ovs_router_lookup(uint32_t mark, const struct in6_addr 
*ip_dst,
 void ovs_router_init(void);
 void ovs_router_insert(uint32_t mark, const struct in6_addr *ip_dst,
uint8_t plen, bool local,
-   const char output_bridge[], const struct in6_addr *gw);
+   const char output_bridge[], const struct in6_addr *gw,
+   const struct in6_addr *prefsrc);
 void ovs_router_flush(void);
 
 void ovs_router_disable_system_routing_table(void);
diff --git a/lib/route-table.c b/lib/route-table.c
index ac82cf262f86..9927dcc1854b 100644
--- a/lib/route-table.c
+++ b/lib/route-table.c
@@ -51,6 +51,7 @@ struct route_data {
 
 /* Extracted from Netlink attributes. */
 struct in6_addr rta_dst; /* 0 if missing. */
+struct in6_addr rta_prefsrc; /* 0 if missing. */
 struct in6_addr rta_gw;
 char ifname[IFNAMSIZ]; /* Interface name. */
 uint32_t mark;
@@ -201,6 +202,7 @@ route_table_parse(struct ofpbuf *buf, struct 
route_table_msg *change)
 [RTA_OIF] = { .type = NL_A_U32, .optional = true },
 [RTA_GATEWAY] = { .type = NL_A_U32, .optional = true },
 [RTA_MARK] = { .type = NL_A_U32, .optional = true },
+[RTA_PREFSRC] = { .type = NL_A_U32, .optional = true },
 };
 
 static const struct nl_policy policy6[] = {
@@ -208,6 +210,7 @@ route_table_parse(struct ofpbuf *buf, struct 
route_table_msg *change)
 [RTA_OIF] = { .type = NL_A_U32, .optional = true },
 [RTA_MARK] = { .type = NL_A_U32, .optional = true },
 [RTA_GATEWAY] = { .type = NL_A_IPV6, .optional = true },
+[RTA_PREFSRC] = { .type = NL_A_IPV6, .optional = true },
 };
 
 struct nlattr *attrs[ARRAY_SIZE(policy)];
@@ -274,6 +277,16 @@ route_table_parse(struct ofpbuf *buf, struct 
route_table_msg *change)
 } else if (ipv4) {
 in6_addr_set_mapped_ipv4(&change->rd.rta_dst, 0);
 }
+if (attrs[RTA_PREFSRC]) {
+if (ipv4) {
+ovs_be32 prefsrc;
+prefsrc = nl_attr_get_be32(attrs[RTA_PREFSRC]);
+in6_addr_set_mapped_ipv4(&change->rd.rta_prefsrc, prefsrc);
+} else {
+change->rd.rta_prefsrc =
+nl_attr_get_in6_addr(attrs[RTA_PREFSRC]);
+}
+}
 if (attrs[RTA_GATEWAY]) {
 if (ipv4) {
 ovs_be32 gw;
@@ -309,7 +322,8 @@ route_table_handle_msg(const struct route_table_msg *change)
 const struct route_data *rd = &change->rd;
 
 ovs_router_insert(rd->mark, &rd->rta_dst, rd->rtm_dst_len,
-  rd->local, rd->ifname, &rd->rta_gw);
+  rd->local, rd->ifname, &rd->rta_gw,
+  &rd->rta_prefsrc);
 }
 }
 
diff --git a/tests/system-route.at b/tests/system-route.at
index 270956d13f6f..114aaebc77f3 100644
--- a/tests/system-route.at
+++ b/tests/system-route.at
@@ -25,3 +25,42 @@ OVS_WAIT_UNTIL([test `ovs-appctl ovs/route/show | grep -c 
'p1-route'` -eq 0 ])
 
 OVS_TRAFFIC_VSWITCHD_STOP
 AT_CLEANUP
+
+AT_SETUP([ovs-route - add system route with src - ipv4])
+AT_KEYWORDS([route])
+OVS_TRAFFIC_VSWITCHD_START()
+AT_CHECK([ip link set br0 up])
+
+AT_CHECK([ip addr add 192.168.9.2/24 dev br0

Re: [ovs-dev] [PATCH v6 5/5] route-table: Retrieving the preferred source address from Netlink.

2023-03-03 Thread Eelco Chaudron



On 2 Mar 2023, at 7:34, Nobuhiro MIKI wrote:

> We can use the "ip route add ... src ..." command to set the preferred
> source address for each entry in the kernel FIB. OVS has a mechanism to
> cache the FIB, but the preferred source address is ignored and
> calculated with its own logic. This patch resolves the difference
> between kernel FIB and OVS route table cache by retrieving the
> RTA_PREFSRC attribute of Netlink messages.
>
> Acked-by: Eelco Chaudron 
> Reviewed-by: Simon Horman 
> Signed-off-by: Nobuhiro MIKI 

No changes, so just adding my ack for completeness.

Acked-by: Eelco Chaudron 

___
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev