diff options
author | brian <brian@FreeBSD.org> | 1997-12-07 04:09:15 +0000 |
---|---|---|
committer | brian <brian@FreeBSD.org> | 1997-12-07 04:09:15 +0000 |
commit | 1a5893522dca2ac497646830f3ace6242210e60c (patch) | |
tree | 2cb5b6de0d9b4ba666c8319391dbe82a6f7a0cfe /usr.sbin/ppp/route.c | |
parent | d1f6ae4ce34df5a70d63e6d996f9bb89d98a2f54 (diff) | |
download | FreeBSD-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.c | 78 |
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); |