summaryrefslogtreecommitdiffstats
path: root/usr.sbin/ppp/route.c
diff options
context:
space:
mode:
authorbrian <brian@FreeBSD.org>1997-12-07 04:09:15 +0000
committerbrian <brian@FreeBSD.org>1997-12-07 04:09:15 +0000
commit1a5893522dca2ac497646830f3ace6242210e60c (patch)
tree2cb5b6de0d9b4ba666c8319391dbe82a6f7a0cfe /usr.sbin/ppp/route.c
parentd1f6ae4ce34df5a70d63e6d996f9bb89d98a2f54 (diff)
downloadFreeBSD-src-1a5893522dca2ac497646830f3ace6242210e60c.zip
FreeBSD-src-1a5893522dca2ac497646830f3ace6242210e60c.tar.gz
Only allow one arg to `delete' - the mask & gateway aren't necessary.
Delete AF_LINK routes as well as AF_INET. Allow the word `default' as the arg to `delete' or in place of the first two args (dest & netmask) to `add'. Accept INTERFACE as the third arg to `add'. You can now say `add default interface' to create a default route through the tun interface. It's reported that subsequent bind()s will bind to a broadcast address and not to the address currently assigned to the tun device - this is the first step towards supporting that first connection that was around from before the dynamic IP negotiation....
Diffstat (limited to 'usr.sbin/ppp/route.c')
-rw-r--r--usr.sbin/ppp/route.c78
1 files changed, 44 insertions, 34 deletions
diff --git a/usr.sbin/ppp/route.c b/usr.sbin/ppp/route.c
index 9b1db2b..c1c0b33 100644
--- a/usr.sbin/ppp/route.c
+++ b/usr.sbin/ppp/route.c
@@ -17,7 +17,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: route.c,v 1.28 1997/11/22 13:46:02 brian Exp $
+ * $Id: route.c,v 1.29 1997/12/04 18:49:39 brian Exp $
*
*/
@@ -51,6 +51,7 @@
#include "route.h"
static int IfIndex;
+static const char *Index2Nam(int);
struct rtmsg {
struct rt_msghdr m_rtm;
@@ -69,7 +70,6 @@ OsSetRoute(int cmd,
int s, nb, wb;
char *cp;
const char *cmdstr;
- u_long *lp;
struct sockaddr_in rtdata;
cmdstr = (cmd == RTM_ADD ? "Add" : "Delete");
@@ -81,7 +81,7 @@ OsSetRoute(int cmd,
memset(&rtmes, '\0', sizeof(rtmes));
rtmes.m_rtm.rtm_version = RTM_VERSION;
rtmes.m_rtm.rtm_type = cmd;
- rtmes.m_rtm.rtm_addrs = RTA_DST | RTA_NETMASK;
+ rtmes.m_rtm.rtm_addrs = RTA_DST;
rtmes.m_rtm.rtm_seq = ++seqno;
rtmes.m_rtm.rtm_pid = getpid();
rtmes.m_rtm.rtm_flags = RTF_UP | RTF_GATEWAY | RTF_STATIC;
@@ -95,24 +95,43 @@ OsSetRoute(int cmd,
cp = rtmes.m_space;
memcpy(cp, &rtdata, 16);
cp += 16;
- if (gateway.s_addr) {
- rtdata.sin_addr = gateway;
- memcpy(cp, &rtdata, 16);
- cp += 16;
- rtmes.m_rtm.rtm_addrs |= RTA_GATEWAY;
- }
+ if (cmd == RTM_ADD)
+ if (gateway.s_addr == INADDR_ANY) {
+ /* Add a route through the interface */
+ struct sockaddr_dl dl;
+ const char *iname;
+ int ilen;
+
+ iname = Index2Nam(IfIndex);
+ ilen = strlen(iname);
+ dl.sdl_len = sizeof(dl)-sizeof(dl.sdl_data)+ilen;
+ dl.sdl_family = AF_LINK;
+ dl.sdl_index = IfIndex;
+ dl.sdl_type = 0;
+ dl.sdl_nlen = ilen;
+ dl.sdl_alen = 0;
+ dl.sdl_slen = 0;
+ strcpy(dl.sdl_data, iname);
+
+ memcpy(cp, &dl, dl.sdl_len);
+ cp += dl.sdl_len;
+ rtmes.m_rtm.rtm_addrs |= RTA_GATEWAY;
+ } else {
+ rtdata.sin_addr = gateway;
+ memcpy(cp, &rtdata, 16);
+ cp += 16;
+ rtmes.m_rtm.rtm_addrs |= RTA_GATEWAY;
+ }
+
if (dst.s_addr == INADDR_ANY)
mask.s_addr = INADDR_ANY;
- lp = (u_long *) cp;
-
- if (mask.s_addr) {
- *lp++ = 8;
- cp += sizeof(int);
- *lp = mask.s_addr;
- } else
- *lp = 0;
- cp += sizeof(u_long);
+ if (cmd == RTM_ADD || dst.s_addr == INADDR_ANY) {
+ rtdata.sin_addr = mask;
+ memcpy(cp, &rtdata, 16);
+ cp += 16;
+ rtmes.m_rtm.rtm_addrs |= RTA_NETMASK;
+ }
nb = cp - (char *) &rtmes;
rtmes.m_rtm.rtm_msglen = nb;
@@ -401,13 +420,13 @@ DeleteIfRoutes(int all)
{
struct rt_msghdr *rtm;
struct sockaddr *sa;
- struct in_addr sa_dst, sa_gw, sa_mask;
+ struct in_addr sa_dst, sa_none;
int needed;
char *sp, *cp, *ep;
- u_char *wp;
int mib[6];
LogPrintf(LogDEBUG, "DeleteIfRoutes (%d)\n", IfIndex);
+ sa_none.s_addr = INADDR_ANY;
mib[0] = CTL_NET;
mib[1] = PF_ROUTE;
@@ -446,24 +465,15 @@ DeleteIfRoutes(int all)
rtm->rtm_index == IfIndex &&
(all || (rtm->rtm_flags & RTF_GATEWAY))) {
sa_dst.s_addr = ((struct sockaddr_in *)sa)->sin_addr.s_addr;
- wp = (u_char *) cp + rtm->rtm_msglen;
sa = (struct sockaddr *)((char *)sa + sa->sa_len);
- if (sa->sa_family == AF_INET) {
+ if (sa->sa_family == AF_INET || sa->sa_family == AF_LINK) {
LogPrintf(LogDEBUG, "DeleteIfRoutes: Remove it\n");
- sa_gw.s_addr = ((struct sockaddr_in *)sa)->sin_addr.s_addr;
- sa = (struct sockaddr *)((char *)sa + sa->sa_len);
- if (rtm->rtm_addrs & RTA_NETMASK)
- sa_mask.s_addr = ((struct sockaddr_in *)sa)->sin_addr.s_addr;
- else
- sa_mask.s_addr = 0xffffffff;
- if (sa_dst.s_addr == INADDR_ANY)
- sa_mask.s_addr = INADDR_ANY;
LogPrintf(LogDEBUG, "DeleteIfRoutes: Dst: %s\n", inet_ntoa(sa_dst));
- LogPrintf(LogDEBUG, "DeleteIfRoutes: Gw: %s\n", inet_ntoa(sa_gw));
- LogPrintf(LogDEBUG, "DeleteIfRoutes: Index: %d\n", rtm->rtm_index);
- OsSetRoute(RTM_DELETE, sa_dst, sa_gw, sa_mask);
+ OsSetRoute(RTM_DELETE, sa_dst, sa_none, sa_none);
} else
- LogPrintf(LogDEBUG, "DeleteIfRoutes: Can't remove an AF_LINK !\n");
+ LogPrintf(LogDEBUG,
+ "DeleteIfRoutes: Can't remove routes of %d family !\n",
+ sa->sa_family);
}
}
free(sp);
OpenPOWER on IntegriCloud