@@ -457,21 +457,25 @@ - (void)rtmSendRoute:(int)action
457457 memset (&mask, 0 , sizeof (mask));
458458 mask.sin6_family = AF_INET6 ;
459459 mask.sin6_len = sizeof (mask);
460- memset (&mask.sin6_addr .s6_addr , 0xff , plen / 8 );
461- if (plen % 8 ) {
462- mask.sin6_addr .s6_addr [plen / 8 ] = 0xff ^ (0xff >> (plen % 8 ));
460+ if (plen < 128 ) {
461+ memset (&mask.sin6_addr .s6_addr , 0xff , plen / 8 );
462+ mask.sin6_addr .s6_addr [plen / 8 ] = ~(0xff >> (plen % 8 ));
463+ rtmAppendAddr (rtm, rtm_max_size, RTA_NETMASK , &mask);
464+ } else {
465+ rtm->rtm_flags |= RTF_HOST ;
463466 }
464- rtmAppendAddr (rtm, rtm_max_size, RTA_NETMASK , &mask);
465467 } else if (dest->sa_family == AF_INET ) {
466468 struct sockaddr_in mask;
467469 memset (&mask, 0 , sizeof (mask));
468470 mask.sin_family = AF_INET ;
469471 mask.sin_len = sizeof (mask);
470472 mask.sin_addr .s_addr = 0xffffffff ;
471473 if (plen < 32 ) {
472- mask.sin_addr .s_addr ^= htonl (0xffffffff >> plen);
474+ mask.sin_addr .s_addr = ~htonl (0xffffffff >> plen);
475+ rtmAppendAddr (rtm, rtm_max_size, RTA_NETMASK , &mask);
476+ } else {
477+ rtm->rtm_flags |= RTF_HOST ;
473478 }
474- rtmAppendAddr (rtm, rtm_max_size, RTA_NETMASK , &mask);
475479 }
476480
477481 // Send the routing message into the kernel.
0 commit comments