]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/sys-solaris.c
Merge pull request #165 from pali/lcp
[ppp.git] / pppd / sys-solaris.c
index 1d6f012c90f2fc9113461dc5d9f051fce31babc6..113eb7bdf74c7617e577a41c1dfac9a0e74d8b67 100644 (file)
 #include <sys/dlpi.h>
 #include <sys/stat.h>
 #include <sys/mkdev.h>
+#include <sys/time.h>
 #include <net/if.h>
 #include <net/if_arp.h>
 #include <net/route.h>
@@ -188,6 +189,12 @@ 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]);   \
@@ -795,7 +802,7 @@ sys_cleanup()
        sifdown(0);
     if (default_route_gateway)
        cifdefaultroute(0, default_route_gateway, default_route_gateway);
-    if (default_route_gateway6)
+    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);
@@ -1544,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.
@@ -1975,22 +2002,44 @@ sif6defaultroute(u, l, g)
     int u;
     eui64_t l, g;
 {
-    struct rtentry rt;
+    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(&rt, 0, sizeof(rt));
-    memset(&rt.rtmsg_dst, 0, sizeof(rt.rtmsg_dst));
-    rt.rtmsg_dst_len = 0;
-    IN6A_LLADDR_FROM_EUI64(&rt.rtmsg_gateway, g);
-    rt.rtmsg_flags = RTF_GATEWAY;
+    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 (ioctl(ip6fd, SIOCADDRT, &rt) < 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;
 }
@@ -2003,23 +2052,9 @@ cif6defaultroute(u, l, g)
     int u;
     eui64_t l, g;
 {
-    struct rtentry rt;
-
-#if defined(__USLC__)
-    g = l;                     /* use the local address as gateway */
-#endif
-    memset(&rt, 0, sizeof(rt));
-    memset(&rt.rtmsg_dst, 0, sizeof(rt.rtmsg_dst));
-    rt.rtmsg_dst_len = 0;
-    IN6A_LLADDR_FROM_EUI64(&rt.rtmsg_gateway, g);
-    rt.rtmsg_flags = RTF_GATEWAY;
-
-    if (ioctl(ip6fd, SIOCDELRT, &rt) < 0) {
-       error("Can't delete default route: %m");
-       return 0;
-    }
-
-    default_route_gateway6 = 0;
+    /* 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;
 }
 
@@ -2412,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;
 
@@ -2849,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);
+}