aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGrant Erickson <erick205@umn.edu>2023-12-01 22:53:24 -0800
committerMarcel Holtmann <marcel@holtmann.org>2023-12-08 01:55:44 +0100
commit8cc2659149fcb6ac97c8e4e9a59db3d5fb353ef0 (patch)
treeb47550ed0ae25bde7aa5f9750c6fc25862583774
parentdb42ec304e58dae6480985a35fce2c377f788179 (diff)
downloadconnman-8cc2659149fcb6ac97c8e4e9a59db3d5fb353ef0.tar.gz
rtnl: Add support for extracting the table identifier.
This adds support for extracting the Routing Netlink (rtnl) table identifier attribute from rtnl messages.
-rw-r--r--src/rtnl.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/src/rtnl.c b/src/rtnl.c
index e8a8325ee..056107831 100644
--- a/src/rtnl.c
+++ b/src/rtnl.c
@@ -670,7 +670,8 @@ static void process_deladdr(unsigned char family, unsigned char prefixlen,
static void extract_ipv4_route(struct rtmsg *msg, int bytes, int *index,
struct in_addr *dst,
- struct in_addr *gateway)
+ struct in_addr *gateway,
+ uint32_t *table_id)
{
struct rtattr *attr;
@@ -689,13 +690,18 @@ static void extract_ipv4_route(struct rtmsg *msg, int bytes, int *index,
if (index)
*index = *((int *) RTA_DATA(attr));
break;
+ case RTA_TABLE:
+ if (table_id)
+ *table_id = *((uint32_t *) RTA_DATA(attr));
+ break;
}
}
}
static void extract_ipv6_route(struct rtmsg *msg, int bytes, int *index,
struct in6_addr *dst,
- struct in6_addr *gateway)
+ struct in6_addr *gateway,
+ uint32_t *table_id)
{
struct rtattr *attr;
@@ -715,6 +721,10 @@ static void extract_ipv6_route(struct rtmsg *msg, int bytes, int *index,
if (index)
*index = *((int *) RTA_DATA(attr));
break;
+ case RTA_TABLE:
+ if (table_id)
+ *table_id = *((uint32_t *) RTA_DATA(attr));
+ break;
}
}
}
@@ -729,7 +739,8 @@ static void process_newroute(unsigned char family, unsigned char scope,
if (family == AF_INET) {
struct in_addr dst = { INADDR_ANY }, gateway = { INADDR_ANY };
- extract_ipv4_route(msg, bytes, &index, &dst, &gateway);
+ extract_ipv4_route(msg, bytes, &index, &dst, &gateway,
+ NULL);
inet_ntop(family, &dst, dststr, sizeof(dststr));
inet_ntop(family, &gateway, gatewaystr, sizeof(gatewaystr));
@@ -749,7 +760,8 @@ static void process_newroute(unsigned char family, unsigned char scope,
struct in6_addr dst = IN6ADDR_ANY_INIT,
gateway = IN6ADDR_ANY_INIT;
- extract_ipv6_route(msg, bytes, &index, &dst, &gateway);
+ extract_ipv6_route(msg, bytes, &index, &dst, &gateway,
+ NULL);
inet_ntop(family, &dst, dststr, sizeof(dststr));
inet_ntop(family, &gateway, gatewaystr, sizeof(gatewaystr));
@@ -786,7 +798,8 @@ static void process_delroute(unsigned char family, unsigned char scope,
if (family == AF_INET) {
struct in_addr dst = { INADDR_ANY }, gateway = { INADDR_ANY };
- extract_ipv4_route(msg, bytes, &index, &dst, &gateway);
+ extract_ipv4_route(msg, bytes, &index, &dst, &gateway,
+ NULL);
inet_ntop(family, &dst, dststr, sizeof(dststr));
inet_ntop(family, &gateway, gatewaystr, sizeof(gatewaystr));
@@ -806,7 +819,8 @@ static void process_delroute(unsigned char family, unsigned char scope,
struct in6_addr dst = IN6ADDR_ANY_INIT,
gateway = IN6ADDR_ANY_INIT;
- extract_ipv6_route(msg, bytes, &index, &dst, &gateway);
+ extract_ipv6_route(msg, bytes, &index, &dst, &gateway,
+ NULL);
inet_ntop(family, &dst, dststr, sizeof(dststr));
inet_ntop(family, &gateway, gatewaystr, sizeof(gatewaystr));