Hi, printing the netmask in hex seems to be a historical artifact in ifconfig; I always wondered about it and I never got used to it.
The following diff changes ifconfig output to print contiguous netmasks in CIDR notation. Non-contiguous netmasks will still be printed in full, tunnels will print explicit "prefixlen" because it is not unambiguous where the mask belongs to in this case. lo1: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> rdomain 1 mtu 32768 index 7 priority 0 llprio 3 groups: lo inet6 ::1/128 inet6 fe80::1%lo1/64 scopeid 0x7 inet 10.2.1.100 netmask 0xffff00ff inet 10.3.100.1/24 A similar change has been done in NetBSD and FreeBSD is doing the FreeBSD thing by providing an -f command-line button to select one of three output modes ... Thoughts? Reyk Index: sbin/ifconfig/ifconfig.c =================================================================== RCS file: /cvs/src/sbin/ifconfig/ifconfig.c,v retrieving revision 1.334 diff -u -p -u -p -r1.334 ifconfig.c --- sbin/ifconfig/ifconfig.c 13 Dec 2016 01:36:21 -0000 1.334 +++ sbin/ifconfig/ifconfig.c 13 Dec 2016 09:36:52 -0000 @@ -3138,6 +3138,7 @@ void in_status(int force) { struct sockaddr_in *sin, sin2; + int prefixlen; getsock(AF_INET); if (s < 0) { @@ -3177,7 +3178,14 @@ in_status(int force) sin = (struct sockaddr_in *)&ifr.ifr_dstaddr; printf(" --> %s", inet_ntoa(sin->sin_addr)); } - printf(" netmask 0x%x", ntohl(netmask.sin_addr.s_addr)); + prefixlen = prefix(&netmask.sin_addr.s_addr, + sizeof(netmask.sin_addr.s_addr)); + if (prefixlen == -1) + printf(" netmask 0x%x", ntohl(netmask.sin_addr.s_addr)); + else if (flags & IFF_POINTOPOINT) + printf("prefixlen %d", prefixlen); + else + printf("/%d", prefixlen); if (flags & IFF_BROADCAST) { memcpy(&ifr.ifr_addr, &sin2, sizeof(sin2)); if (ioctl(s, SIOCGIFBRDADDR, (caddr_t)&ifr) < 0) { @@ -3224,6 +3232,7 @@ in6_alias(struct in6_ifreq *creq) u_int32_t scopeid; char hbuf[NI_MAXHOST]; const int niflag = NI_NUMERICHOST; + int prefixlen; /* Get the non-alias address for this interface. */ getsock(AF_INET6); @@ -3269,8 +3278,17 @@ in6_alias(struct in6_ifreq *creq) warn("SIOCGIFNETMASK_IN6"); } else { sin6 = (struct sockaddr_in6 *)&ifr6.ifr_addr; - printf(" prefixlen %d", prefix(&sin6->sin6_addr, - sizeof(struct in6_addr))); + prefixlen = prefix(&sin6->sin6_addr, + sizeof(struct in6_addr)); + if (prefixlen == -1) { + if (getnameinfo((struct sockaddr *)sin6, sin6->sin6_len, + hbuf, sizeof(hbuf), NULL, 0, niflag) != 0) + strlcpy(hbuf, "", sizeof hbuf); + printf(" netmask %s", hbuf); + } else if (flags & IFF_POINTOPOINT) { + printf(" prefixlen %d", prefixlen); + } else + printf("/%d", prefixlen); } (void) memset(&ifr6, 0, sizeof(ifr6)); @@ -5559,11 +5577,11 @@ prefix(void *val, int size) break; for (; bit != 0; bit--) if (nam[byte] & (1 << bit)) - return (0); + return (-1); byte++; for (; byte < size; byte++) if (nam[byte]) - return (0); + return (-1); return (plen); }