platform: support the RT_VIA attribute for IPv4 routes
The RT_VIA attribute is used to specify a gateway of a different address family. It is currently used only for IPv4 routes. [bgalvani@redhat.com: amended the commit message]
This commit is contained in:

committed by
Beniamino Galvani

parent
84299ed17c
commit
2ffaebd4ae
@@ -5828,7 +5828,22 @@ _nl_msg_new_route(uint16_t nlmsg_type, uint16_t nlmsg_flags, const NMPObject *ob
|
|||||||
|
|
||||||
/* We currently don't have need for multi-hop routes... */
|
/* We currently don't have need for multi-hop routes... */
|
||||||
if (IS_IPv4) {
|
if (IS_IPv4) {
|
||||||
NLA_PUT(msg, RTA_GATEWAY, addr_len, &obj->ip4_route.gateway);
|
if (!obj->ip4_route.gateway && obj->ip4_route.via.addr_family) {
|
||||||
|
struct rtvia *rtvia;
|
||||||
|
|
||||||
|
rtvia = nla_data(nla_reserve(
|
||||||
|
msg,
|
||||||
|
RTA_VIA,
|
||||||
|
sizeof(*rtvia) + nm_utils_addr_family_to_size(obj->ip4_route.via.addr_family)));
|
||||||
|
if (!rtvia)
|
||||||
|
goto nla_put_failure;
|
||||||
|
rtvia->rtvia_family = obj->ip4_route.via.addr_family;
|
||||||
|
memcpy(rtvia->rtvia_addr,
|
||||||
|
obj->ip4_route.via.addr.addr_ptr,
|
||||||
|
nm_utils_addr_family_to_size(obj->ip4_route.via.addr_family));
|
||||||
|
} else {
|
||||||
|
NLA_PUT(msg, RTA_GATEWAY, addr_len, &obj->ip4_route.gateway);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!IN6_IS_ADDR_UNSPECIFIED(&obj->ip6_route.gateway))
|
if (!IN6_IS_ADDR_UNSPECIFIED(&obj->ip6_route.gateway))
|
||||||
NLA_PUT(msg, RTA_GATEWAY, addr_len, &obj->ip6_route.gateway);
|
NLA_PUT(msg, RTA_GATEWAY, addr_len, &obj->ip6_route.gateway);
|
||||||
|
@@ -443,6 +443,12 @@ struct _NMPlatformIP4Route {
|
|||||||
* the first hop. */
|
* the first hop. */
|
||||||
in_addr_t gateway;
|
in_addr_t gateway;
|
||||||
|
|
||||||
|
/* RTA_VIA. Part of the primary key for a route. Allows a gateway for a
|
||||||
|
* route to exist in a different address family.
|
||||||
|
* Only valid if: n_nexthops == 1, gateway == 0, via.family != 0
|
||||||
|
*/
|
||||||
|
NMIPAddrTyped via;
|
||||||
|
|
||||||
/* RTA_PREFSRC (called "src" by iproute2).
|
/* RTA_PREFSRC (called "src" by iproute2).
|
||||||
*
|
*
|
||||||
* pref_src is part of the ID of an IPv4 route. When deleting a route,
|
* pref_src is part of the ID of an IPv4 route. When deleting a route,
|
||||||
@@ -2404,6 +2410,14 @@ nm_platform_ip_route_get_gateway(int addr_family, const NMPlatformIPRoute *route
|
|||||||
return &((NMPlatformIP6Route *) route)->gateway;
|
return &((NMPlatformIP6Route *) route)->gateway;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline const NMIPAddrTyped *
|
||||||
|
nm_platform_ip4_route_get_via(const NMPlatformIP4Route *route)
|
||||||
|
{
|
||||||
|
nm_assert(route);
|
||||||
|
|
||||||
|
return &route->via;
|
||||||
|
}
|
||||||
|
|
||||||
static inline gconstpointer
|
static inline gconstpointer
|
||||||
nm_platform_ip_route_get_pref_src(int addr_family, const NMPlatformIPRoute *route)
|
nm_platform_ip_route_get_pref_src(int addr_family, const NMPlatformIPRoute *route)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user