Hello,
Here is a patch to route(8) to automatically choose the right address family
when adding a default route using the "default" keyword.
Index: route.8
===================================================================
RCS file: /cvs/src/sbin/route/route.8,v
retrieving revision 1.79
diff -u -p -r1.79 route.8
--- route.8 1 Jan 2017 01:08:11 -0000 1.79
+++ route.8 28 Jul 2017 13:41:24 -0000
@@ -317,7 +317,8 @@ data, in hexadecimal format
In the absence of modifiers, an address is assumed to be IPv4,
unless containing a
.Sq :\&
-character, when it is treated as IPv6.
+character, when it is treated as IPv6. When using the "default" keyword,
+the address family used is that of the gateway.
.Pp
The optional modifier
.Fl link
Index: route.c
===================================================================
RCS file: /cvs/src/sbin/route/route.c,v
retrieving revision 1.200
diff -u -p -r1.200 route.c
--- route.c 23 Mar 2017 13:28:25 -0000 1.200
+++ route.c 28 Jul 2017 13:41:24 -0000
@@ -72,7 +72,7 @@ union sockunion so_dst, so_gate, so_mask
typedef union sockunion *sup;
pid_t pid;
-int rtm_addrs, s;
+int rtm_addrs, s, defroute = 0;
int forcehost, forcenet, Fflag, nflag, af, qflag, tflag, Tflag;
int iflag, verbose, aflen = sizeof(struct sockaddr_in);
int locking, lockrest, debugonly;
@@ -875,6 +875,10 @@ getaddr(int which, char *s, struct hoste
break;
case RTA_GATEWAY:
su = &so_gate;
+ if (defroute) {
+ so_dst.sa.sa_len = aflen;
+ so_dst.sa.sa_family = af;
+ }
break;
case RTA_NETMASK:
su = &so_mask;
@@ -901,6 +905,8 @@ getaddr(int which, char *s, struct hoste
break;
case RTA_NETMASK:
su->sa.sa_len = 0;
+ af = 0;
+ defroute = 1;
}
return (0);
}