@@ -571,3 +571,34 @@ int in_addr_prefix_from_string_auto(
571571 return 0 ;
572572
573573}
574+
575+ void in_addr_data_hash_func (const void * p , struct siphash * state ) {
576+ const struct in_addr_data * a = p ;
577+
578+ siphash24_compress (& a -> family , sizeof (a -> family ), state );
579+
580+ if (a -> family == AF_INET )
581+ siphash24_compress (& a -> address .in , sizeof (a -> address .in ), state );
582+ else if (a -> family == AF_INET6 )
583+ siphash24_compress (& a -> address .in6 , sizeof (a -> address .in6 ), state );
584+ }
585+
586+ int in_addr_data_compare_func (const void * a , const void * b ) {
587+ const struct in_addr_data * x = a , * y = b ;
588+
589+ if (x -> family != y -> family )
590+ return x -> family - y -> family ;
591+
592+ if (x -> family == AF_INET )
593+ return memcmp (& x -> address .in .s_addr , & y -> address .in .s_addr , sizeof (struct in_addr ));
594+
595+ if (x -> family == AF_INET6 )
596+ return memcmp (& x -> address .in6 .s6_addr , & y -> address .in6 .s6_addr , sizeof (struct in6_addr ));
597+
598+ return trivial_compare_func (a , b );
599+ }
600+
601+ const struct hash_ops in_addr_data_hash_ops = {
602+ .hash = in_addr_data_hash_func ,
603+ .compare = in_addr_data_compare_func ,
604+ };
0 commit comments