X-Git-Url: https://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppd%2Fsys-solaris.c;h=113eb7bdf74c7617e577a41c1dfac9a0e74d8b67;hp=d134fe9fc4095c3fd4d6e81a7abb35a3d13c8f54;hb=505ec5cbd15ec23ed84282462ae9e451a1978133;hpb=e5b7cafa28aeba66499fa26b286192529e5fde15 diff --git a/pppd/sys-solaris.c b/pppd/sys-solaris.c index d134fe9..113eb7b 100644 --- a/pppd/sys-solaris.c +++ b/pppd/sys-solaris.c @@ -27,16 +27,11 @@ * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The name(s) of the authors of this software must not be used to + * 2. The name(s) of the authors of this software must not be used to * endorse or promote products derived from this software without * prior written permission. * - * 4. Redistributions of any form whatsoever must retain the following + * 3. Redistributions of any form whatsoever must retain the following * acknowledgment: * "This product includes software developed by Paul Mackerras * ". @@ -90,7 +85,7 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#define RCSID "$Id: sys-solaris.c,v 1.11 2003/04/07 00:01:46 paulus Exp $" +#define RCSID "$Id: sys-solaris.c,v 1.16 2008/01/30 14:26:53 carlsonj Exp $" #include #include @@ -107,6 +102,7 @@ #endif #include #include +#include #include #include #include @@ -118,6 +114,7 @@ #include #include #include +#include #include #include #include @@ -170,7 +167,6 @@ #define UDP6_DEV_NAME "/dev/udp6" #endif /* !defined(UDP6_DEV_NAME) && defined(SOL2) */ -static const char rcsid[] = RCSID; #if defined(SOL2) /* @@ -193,21 +189,35 @@ static int ip6fd; /* IP file descriptor */ static int ip6muxid = -1; /* Multiplexer file descriptor */ static int if6_is_up = 0; /* IPv6 interface has been marked up */ +#define IN6_SOCKADDR_FROM_EUI64(s, eui64) do { \ + (s)->sin6_family = AF_INET6; \ + (s)->sin6_addr.s6_addr32[0] = htonl(0xfe800000); \ + eui64_copy(eui64, (s)->sin6_addr.s6_addr32[2]); \ + } while(0) + #define _IN6_LLX_FROM_EUI64(l, s, eui64, as) do { \ s->sin6_addr.s6_addr32[0] = htonl(as); \ eui64_copy(eui64, s->sin6_addr.s6_addr32[2]); \ s->sin6_family = AF_INET6; \ l.lifr_addr.ss_family = AF_INET6; \ - l.lifr_addrlen = 10; \ + l.lifr_addrlen = 64; \ l.lifr_addr = laddr; \ } while (0) +#define _IN6A_LLX_FROM_EUI64(s, eui64, as) do { \ + s->s6_addr32[0] = htonl(as); \ + eui64_copy(eui64, s->s6_addr32[2]); \ + } while (0) + #define IN6_LLADDR_FROM_EUI64(l, s, eui64) \ _IN6_LLX_FROM_EUI64(l, s, eui64, 0xfe800000) #define IN6_LLTOKEN_FROM_EUI64(l, s, eui64) \ _IN6_LLX_FROM_EUI64(l, s, eui64, 0) +#define IN6A_LLADDR_FROM_EUI64(s, eui64) \ + _IN6A_LLX_FROM_EUI64(s, eui64, 0xfe800000) + #endif /* defined(INET6) && defined(SOL2) */ #if defined(INET6) && defined(SOL2) @@ -242,6 +252,7 @@ static int tty_npushed; static int if_is_up; /* Interface has been marked up */ static u_int32_t remote_addr; /* IP address of peer */ static u_int32_t default_route_gateway; /* Gateway for default route added */ +static eui64_t default_route_gateway6; /* Gateway for default IPv6 route added */ static u_int32_t proxy_arp_addr; /* Addr for proxy arp entry added */ /* Prototypes for procedures local to this file. */ @@ -791,6 +802,8 @@ sys_cleanup() sifdown(0); if (default_route_gateway) cifdefaultroute(0, default_route_gateway, default_route_gateway); + if (default_route_gateway6.e32[0] != 0 || default_route_gateway6.e32[1] != 0) + cif6defaultroute(0, default_route_gateway6, default_route_gateway6); if (proxy_arp_addr) cifproxyarp(0, proxy_arp_addr); #if defined(SOL2) @@ -1229,6 +1242,9 @@ set_up_tty(fd, local) } #endif + if (stop_bits >= 2) + tios.c_cflag |= CSTOPB; + tios.c_cflag |= CS8 | CREAD | HUPCL; if (local || !modem) tios.c_cflag |= CLOCAL; @@ -1535,6 +1551,26 @@ netif_set_mtu(unit, mtu) #endif /* defined(INET6) && defined(SOL2) */ } + + +/* + * netif_get_mtu - get the MTU on the PPP network interface. + */ +int +netif_get_mtu(int unit) +{ + struct ifreq ifr; + + memset (&ifr, '\0', sizeof (ifr)); + strlcpy(ifr.ifr_name, ifname, sizeof (ifr.ifr_name)); + + if (ioctl(ipfd, SIOCGIFMTU, (caddr_t) &ifr) < 0) { + error("ioctl(SIOCGIFMTU): %m (line %d)", __LINE__); + return 0; + } + return ifr.ifr_mtu; +} + /* * tty_send_config - configure the transmit characteristics of * the ppp interface. @@ -1958,6 +1994,70 @@ cif6addr(u, o, h) return 1; } +/* + * sif6defaultroute - assign a default route through the address given. + */ +int +sif6defaultroute(u, l, g) + int u; + eui64_t l, g; +{ + struct { + struct rt_msghdr rtm; + struct sockaddr_in6 dst; + struct sockaddr_in6 gw; + } rmsg; + static int seq; + int rtsock; + +#if defined(__USLC__) + g = l; /* use the local address as gateway */ +#endif + memset(&rmsg, 0, sizeof(rmsg)); + + rmsg.rtm.rtm_msglen = sizeof (rmsg); + rmsg.rtm.rtm_version = RTM_VERSION; + rmsg.rtm.rtm_type = RTM_ADD; + rmsg.rtm.rtm_flags = RTF_GATEWAY; + rmsg.rtm.rtm_addrs = RTA_DST | RTA_GATEWAY; + rmsg.rtm.rtm_pid = getpid(); + rmsg.rtm.rtm_seq = seq++; + + rmsg.dst.sin6_family = AF_INET6; + + rmsg.gw.sin6_family = AF_INET6; + IN6_SOCKADDR_FROM_EUI64(&rmsg.gw, g); + + rtsock = socket(PF_ROUTE, SOCK_RAW, 0); + + if (rtsock < 0) { + error("Can't add default route: %m"); + return 0; + } + + if (write(rtsock, &rmsg, sizeof(rmsg)) < 0) + error("Can't add default route: %m"); + + close(rtsock); + + default_route_gateway6 = g; + return 1; +} + +/* + * cif6defaultroute - delete a default route through the address given. + */ +int +cif6defaultroute(u, l, g) + int u; + eui64_t l, g; +{ + /* No need to do this on Solaris; the kernel deletes the + route when the interface goes down. */ + memset(&default_route_gateway6, 0, sizeof(default_route_gateway6)); + return 1; +} + #endif /* defined(SOL2) && defined(INET6) */ @@ -2224,7 +2324,7 @@ get_hw_addr_dlpi(name, hwaddr) char *name; struct sockaddr *hwaddr; { - char *p, *q; + char *q; int unit, iffd, adrlen; unsigned char *adrp; char ifdev[24]; @@ -2347,7 +2447,7 @@ dlpi_get_reply(fd, reply, expected_prim, maxlen) pfd.events = POLLIN | POLLPRI; do { n = poll(&pfd, 1, 1000); - } while (n == -1 && errno == EINTR); + } while (n == -1 && errno == EINTR && !got_sigterm); if (n <= 0) return -1; @@ -2469,8 +2569,13 @@ logwtmp(line, name, host) if (name[0] != 0) { /* logging in */ strncpy(utmpx.ut_user, name, sizeof(utmpx.ut_user)); - strncpy(utmpx.ut_id, ifname, sizeof(utmpx.ut_id)); strncpy(utmpx.ut_line, line, sizeof(utmpx.ut_line)); + strncpy(utmpx.ut_host, host, sizeof(utmpx.ut_host)); + if (*host != '\0') { + utmpx.ut_syslen = strlen(host) + 1; + if (utmpx.ut_syslen > sizeof(utmpx.ut_host)) + utmpx.ut_syslen = sizeof(utmpx.ut_host); + } utmpx.ut_pid = getpid(); utmpx.ut_type = USER_PROCESS; } else { @@ -2743,7 +2848,6 @@ get_pty(master_fdp, slave_fdp, slave_name, uid) { int mfd, sfd; char *pty_name; - struct termios tios; mfd = open("/dev/ptmx", O_RDWR); if (mfd < 0) { @@ -2780,3 +2884,13 @@ get_pty(master_fdp, slave_fdp, slave_name, uid) return 1; } + +/******************************************************************** + * + * get_time - Get current time, monotonic if possible. + */ +int +get_time(struct timeval *tv) +{ + return gettimeofday(tv, NULL); +}