aboutsummaryrefslogtreecommitdiff
path: root/usr.bin/netstat/route.c
diff options
context:
space:
mode:
authorBruce M Simpson <bms@FreeBSD.org>2007-02-14 14:17:01 +0000
committerBruce M Simpson <bms@FreeBSD.org>2007-02-14 14:17:01 +0000
commitd092c06c3a14818f5a3d64d92e02c97e5cb59953 (patch)
tree343921ec2462ac43f2c2eee6599a28f012c93318 /usr.bin/netstat/route.c
parent46a1d9bfe83fdadc418f71071c3296859ebb56cb (diff)
downloadsrc-d092c06c3a14818f5a3d64d92e02c97e5cb59953.tar.gz
src-d092c06c3a14818f5a3d64d92e02c97e5cb59953.zip
Retire most of the classful network behaviour of netstat -r output, for IPv4.
Without -n, we now only print a "network name" without the prefix length under the following conditions: 1) the network address and mask matches a classful network prefix; 2) getnetbyaddr(3) returns a network name for this network address. With -n, we unconditionally print the full unabbreviated CIDR network prefix in the form "a.b.c.d/p". 0.0.0.0/0 is still printed as "default". This change is in preparation for changes such as equal-cost multipath, and to more generally assist operational deployment of FreeBSD as a modern IPv4 router. There are currently no plans to backport this change. Discussed on: freebsd-net
Notes
Notes: svn path=/head/; revision=166711
Diffstat (limited to 'usr.bin/netstat/route.c')
-rw-r--r--usr.bin/netstat/route.c61
1 files changed, 9 insertions, 52 deletions
diff --git a/usr.bin/netstat/route.c b/usr.bin/netstat/route.c
index 8122bd29a377..f13dff8c2d29 100644
--- a/usr.bin/netstat/route.c
+++ b/usr.bin/netstat/route.c
@@ -134,7 +134,6 @@ static const char *fmt_sockaddr (struct sockaddr *sa, struct sockaddr *mask,
static void p_flags (int, const char *);
static const char *fmt_flags(int f);
static void p_rtentry (struct rtentry *);
-static u_long forgemask (u_long);
static void domask (char *, u_long, u_long);
/*
@@ -801,26 +800,18 @@ routename(u_long in)
return (line);
}
-static u_long
-forgemask(u_long a)
-{
- u_long m;
-
- if (IN_CLASSA(a))
- m = IN_CLASSA_NET;
- else if (IN_CLASSB(a))
- m = IN_CLASSB_NET;
- else
- m = IN_CLASSC_NET;
- return (m);
-}
+#define NSHIFT(m) ( \
+ (m) == IN_CLASSA_NET ? IN_CLASSA_NSHIFT : \
+ (m) == IN_CLASSB_NET ? IN_CLASSB_NSHIFT : \
+ (m) == IN_CLASSC_NET ? IN_CLASSC_NSHIFT : \
+ 0)
static void
domask(char *dst, u_long addr, u_long mask)
{
int b, i;
- if (!mask || (forgemask(addr) == mask)) {
+ if (mask == 0 || (!numeric_addr && NSHIFT(mask) != 0)) {
*dst = '\0';
return;
}
@@ -853,62 +844,28 @@ netname(u_long in, u_long mask)
char *cp = 0;
static char line[MAXHOSTNAMELEN];
struct netent *np = 0;
- u_long dmask;
u_long i;
-#define NSHIFT(m) ( \
- (m) == IN_CLASSA_NET ? IN_CLASSA_NSHIFT : \
- (m) == IN_CLASSB_NET ? IN_CLASSB_NSHIFT : \
- (m) == IN_CLASSC_NET ? IN_CLASSC_NSHIFT : \
- 0)
-
i = ntohl(in);
- dmask = forgemask(i);
if (!numeric_addr && i) {
np = getnetbyaddr(i >> NSHIFT(mask), AF_INET);
- if (np == NULL && mask == 0)
- np = getnetbyaddr(i >> NSHIFT(dmask), AF_INET);
if (np != NULL) {
cp = np->n_name;
trimdomain(cp, strlen(cp));
}
}
-#undef NSHIFT
if (cp != NULL) {
strncpy(line, cp, sizeof(line) - 1);
line[sizeof(line) - 1] = '\0';
} else {
- switch (dmask) {
- case IN_CLASSA_NET:
- if ((i & IN_CLASSA_HOST) == 0) {
- sprintf(line, "%lu", C(i >> 24));
- break;
- }
- /* FALLTHROUGH */
- case IN_CLASSB_NET:
- if ((i & IN_CLASSB_HOST) == 0) {
- sprintf(line, "%lu.%lu",
- C(i >> 24), C(i >> 16));
- break;
- }
- /* FALLTHROUGH */
- case IN_CLASSC_NET:
- if ((i & IN_CLASSC_HOST) == 0) {
- sprintf(line, "%lu.%lu.%lu",
- C(i >> 24), C(i >> 16), C(i >> 8));
- break;
- }
- /* FALLTHROUGH */
- default:
- sprintf(line, "%lu.%lu.%lu.%lu",
- C(i >> 24), C(i >> 16), C(i >> 8), C(i));
- break;
- }
+ inet_ntop(AF_INET, (char *)&in, line, sizeof(line) - 1);
}
domask(line + strlen(line), i, mask);
return (line);
}
+#undef NSHIFT
+
#ifdef INET6
const char *
netname6(struct sockaddr_in6 *sa6, struct in6_addr *mask)