Skip to content

Commit c1699b5

Browse files
committed
Set RTF_HOST for host routes instead of using a netmask
1 parent 51ba366 commit c1699b5

1 file changed

Lines changed: 10 additions & 6 deletions

File tree

macos/networkextension/wireguardtunnel.mm

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)