@@ -993,6 +993,7 @@ static DWORD gateway_and_prefix_addresses_alloc( IP_ADAPTER_ADDRESSES *aa, ULONG
993993{
994994 struct nsi_ipv4_forward_key * key4 ;
995995 struct nsi_ipv6_forward_key * key6 ;
996+ struct nsi_ip_forward_rw * rw ;
996997 IP_ADAPTER_GATEWAY_ADDRESS * gw , * * gw_next ;
997998 IP_ADAPTER_PREFIX * prefix , * * prefix_next ;
998999 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
10021003 void * key ;
10031004
10041005 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 );
10061007 if (err ) return err ;
10071008
10081009 while (aa )
10091010 {
1011+ if (family == AF_INET ) aa -> Ipv4Metric = ~0u ;
1012+ else aa -> Ipv6Metric = ~0u ;
1013+
10101014 for (gw_next = & aa -> FirstGatewayAddress ; * gw_next ; gw_next = & (* gw_next )-> Next )
10111015 ;
10121016 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
10191023 luid = (family == AF_INET ) ? & key4 -> luid : & key6 -> luid ;
10201024 if (luid -> Value != aa -> Luid .Value ) continue ;
10211025
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+
10221032 if (flags & GAA_FLAG_INCLUDE_ALL_GATEWAYS )
10231033 {
10241034 memset ( & sockaddr , 0 , sizeof (sockaddr ) );
@@ -1103,7 +1113,7 @@ static DWORD gateway_and_prefix_addresses_alloc( IP_ADAPTER_ADDRESSES *aa, ULONG
11031113 }
11041114
11051115err :
1106- NsiFreeTable ( key , NULL , NULL , NULL );
1116+ NsiFreeTable ( key , rw , NULL , NULL );
11071117 return err ;
11081118}
11091119
@@ -1269,11 +1279,8 @@ static DWORD adapters_addresses_alloc( ULONG family, ULONG flags, IP_ADAPTER_ADD
12691279 if (err ) goto err ;
12701280 }
12711281
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 ;
12771284
12781285 err = dns_info_alloc ( aa , family , flags );
12791286 if (err ) goto err ;
0 commit comments