diff mbox series

[40/90] rtnl: Add support for extracting the metric/priority.

Message ID 20231206235056.322578-42-gerickson@nuovations.com (mailing list archive)
State Not Applicable, archived
Headers show
Series Add Gateway Low-priority Default Routes for Non-default Services | expand

Commit Message

Grant Erickson Dec. 6, 2023, 11:50 p.m. UTC
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(-)
diff mbox series

Patch

diff --git a/src/rtnl.c b/src/rtnl.c
index eb0ba63961cd..fe53eb2eb5b6 100644
--- a/src/rtnl.c
+++ b/src/rtnl.c
@@ -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));