@@ -993,6 +993,7 @@ static DWORD gateway_and_prefix_addresses_alloc( IP_ADAPTER_ADDRESSES *aa, ULONG
993
993
{
994
994
struct nsi_ipv4_forward_key * key4 ;
995
995
struct nsi_ipv6_forward_key * key6 ;
996
+ struct nsi_ip_forward_rw * rw ;
996
997
IP_ADAPTER_GATEWAY_ADDRESS * gw , * * gw_next ;
997
998
IP_ADAPTER_PREFIX * prefix , * * prefix_next ;
998
999
DWORD err , count , i , prefix_len , key_size = (family == AF_INET ) ? sizeof (* key4 ) : sizeof (* key6 );
@@ -1002,11 +1003,14 @@ static DWORD gateway_and_prefix_addresses_alloc( IP_ADAPTER_ADDRESSES *aa, ULONG
1002
1003
void * key ;
1003
1004
1004
1005
err = NsiAllocateAndGetTable ( 1 , ip_module_id ( family ), NSI_IP_FORWARD_TABLE , & key , key_size ,
1005
- NULL , 0 , NULL , 0 , NULL , 0 , & count , 0 );
1006
+ ( void * * ) & rw , sizeof ( * rw ) , NULL , 0 , NULL , 0 , & count , 0 );
1006
1007
if (err ) return err ;
1007
1008
1008
1009
while (aa )
1009
1010
{
1011
+ if (family == AF_INET ) aa -> Ipv4Metric = ~0u ;
1012
+ else aa -> Ipv6Metric = ~0u ;
1013
+
1010
1014
for (gw_next = & aa -> FirstGatewayAddress ; * gw_next ; gw_next = & (* gw_next )-> Next )
1011
1015
;
1012
1016
for (prefix_next = & aa -> FirstPrefix ; * prefix_next ; prefix_next = & (* prefix_next )-> Next )
@@ -1019,6 +1023,12 @@ static DWORD gateway_and_prefix_addresses_alloc( IP_ADAPTER_ADDRESSES *aa, ULONG
1019
1023
luid = (family == AF_INET ) ? & key4 -> luid : & key6 -> luid ;
1020
1024
if (luid -> Value != aa -> Luid .Value ) continue ;
1021
1025
1026
+ if (rw [i ].metric )
1027
+ {
1028
+ if (family == AF_INET ) aa -> Ipv4Metric = min ( aa -> Ipv4Metric , rw [i ].metric );
1029
+ else aa -> Ipv6Metric = min ( aa -> Ipv6Metric , rw [i ].metric );
1030
+ }
1031
+
1022
1032
if (flags & GAA_FLAG_INCLUDE_ALL_GATEWAYS )
1023
1033
{
1024
1034
memset ( & sockaddr , 0 , sizeof (sockaddr ) );
@@ -1103,7 +1113,7 @@ static DWORD gateway_and_prefix_addresses_alloc( IP_ADAPTER_ADDRESSES *aa, ULONG
1103
1113
}
1104
1114
1105
1115
err :
1106
- NsiFreeTable ( key , NULL , NULL , NULL );
1116
+ NsiFreeTable ( key , rw , NULL , NULL );
1107
1117
return err ;
1108
1118
}
1109
1119
@@ -1269,11 +1279,8 @@ static DWORD adapters_addresses_alloc( ULONG family, ULONG flags, IP_ADAPTER_ADD
1269
1279
if (err ) goto err ;
1270
1280
}
1271
1281
1272
- if (flags & (GAA_FLAG_INCLUDE_ALL_GATEWAYS | GAA_FLAG_INCLUDE_PREFIX ))
1273
- {
1274
- err = call_families ( gateway_and_prefix_addresses_alloc , aa , family , flags );
1275
- if (err ) goto err ;
1276
- }
1282
+ err = call_families ( gateway_and_prefix_addresses_alloc , aa , family , flags );
1283
+ if (err ) goto err ;
1277
1284
1278
1285
err = dns_info_alloc ( aa , family , flags );
1279
1286
if (err ) goto err ;
0 commit comments