@@ -671,7 +671,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,
- uint32_t *table_id)
+ uint32_t *table_id,
+ uint32_t *metric)
{
struct rtattr *attr;
@@ -694,6 +695,10 @@ static void extract_ipv4_route(struct rtmsg *msg, int bytes, int *index,
if (table_id)
*table_id = *((uint32_t *) RTA_DATA(attr));
break;
+ case RTA_PRIORITY:
+ if (metric)
+ *metric = *((uint32_t *) RTA_DATA(attr));
+ break;
}
}
}
@@ -701,7 +706,8 @@ static void extract_ipv4_route(struct rtmsg *msg, int bytes, int *index,
static void extract_ipv6_route(struct rtmsg *msg, int bytes, int *index,
struct in6_addr *dst,
struct in6_addr *gateway,
- uint32_t *table_id)
+ uint32_t *table_id,
+ uint32_t *metric)
{
struct rtattr *attr;
@@ -725,6 +731,10 @@ static void extract_ipv6_route(struct rtmsg *msg, int bytes, int *index,
if (table_id)
*table_id = *((uint32_t *) RTA_DATA(attr));
break;
+ case RTA_PRIORITY:
+ if (metric)
+ *metric = *((uint32_t *) RTA_DATA(attr));
+ break;
}
}
}
@@ -741,7 +751,7 @@ static void process_newroute(unsigned char family, unsigned char scope,
struct in_addr dst = { INADDR_ANY }, gateway = { INADDR_ANY };
extract_ipv4_route(msg, bytes, &index, &dst, &gateway,
- &table_id);
+ &table_id, NULL);
inet_ntop(family, &dst, dststr, sizeof(dststr));
inet_ntop(family, &gateway, gatewaystr, sizeof(gatewaystr));
@@ -763,7 +773,7 @@ static void process_newroute(unsigned char family, unsigned char scope,
gateway = IN6ADDR_ANY_INIT;
extract_ipv6_route(msg, bytes, &index, &dst, &gateway,
- &table_id);
+ &table_id, NULL);
inet_ntop(family, &dst, dststr, sizeof(dststr));
inet_ntop(family, &gateway, gatewaystr, sizeof(gatewaystr));
@@ -803,7 +813,7 @@ static void process_delroute(unsigned char family, unsigned char scope,
struct in_addr dst = { INADDR_ANY }, gateway = { INADDR_ANY };
extract_ipv4_route(msg, bytes, &index, &dst, &gateway,
- &table_id);
+ &table_id, NULL);
inet_ntop(family, &dst, dststr, sizeof(dststr));
inet_ntop(family, &gateway, gatewaystr, sizeof(gatewaystr));
@@ -825,7 +835,7 @@ static void process_delroute(unsigned char family, unsigned char scope,
gateway = IN6ADDR_ANY_INIT;
extract_ipv6_route(msg, bytes, &index, &dst, &gateway,
- &table_id);
+ &table_id, NULL);
inet_ntop(family, &dst, dststr, sizeof(dststr));
inet_ntop(family, &gateway, gatewaystr, sizeof(gatewaystr));
From: Grant Erickson <erick205@umn.edu> This adds support for extracting the Routing Netlink (rtnl) table metric/priority attribute from rtnl messages. --- src/rtnl.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-)