]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/sys-linux.c
pppd: Fix usage of BOTHER ioctl API on Linux (#314)
[ppp.git] / pppd / sys-linux.c
index 587242bb1ed7a2cb0107061a2109e17ccdde1dd1..513fc3dc009ef3010f434328121e8dde4b918137 100644 (file)
  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
 #include <sys/ioctl.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <string.h>
 #include <time.h>
 #include <memory.h>
+#ifdef HAVE_UTMP_H
 #include <utmp.h>
+#endif
 #include <mntent.h>
 #include <signal.h>
 #include <fcntl.h>
 #include <ctype.h>
-#include <termios.h>
 #include <unistd.h>
 
 /* This is in netdevice.h. However, this compile will fail miserably if
 #include <linux/ppp_defs.h>
 #include <linux/if_ppp.h>
 
+#ifdef INET6
+#include <linux/netlink.h>
+#include <linux/rtnetlink.h>
+#include <linux/if_addr.h>
+/* glibc versions prior to 2.24 do not define SOL_NETLINK */
+#ifndef SOL_NETLINK
+#define SOL_NETLINK 270
+#endif
+/* linux kernel versions prior to 4.3 do not define/support NETLINK_CAP_ACK */
+#ifndef NETLINK_CAP_ACK
+#define NETLINK_CAP_ACK 10
+#endif
+#endif
+
 #include "pppd.h"
 #include "fsm.h"
 #include "ipcp.h"
 #include <sys/locks.h>
 #endif
 
+/*
+ * Instead of system header file <termios.h> use local "termios_linux.h" header
+ * file as it provides additional support for arbitrary baud rates via BOTHER.
+ */
+#include "termios_linux.h"
+
 #ifdef INET6
 #ifndef _LINUX_IN6_H
 /*
@@ -158,9 +183,9 @@ struct in6_ifreq {
 #endif
 
 #define IN6_LLADDR_FROM_EUI64(sin6, eui64) do {                        \
-       memset(&sin6.s6_addr, 0, sizeof(struct in6_addr));      \
-       sin6.s6_addr16[0] = htons(0xfe80);                      \
-       eui64_copy(eui64, sin6.s6_addr32[2]);                   \
+       memset(&(sin6).s6_addr, 0, sizeof(struct in6_addr));    \
+       (sin6).s6_addr16[0] = htons(0xfe80);                    \
+       eui64_copy(eui64, (sin6).s6_addr32[2]);                 \
        } while (0)
 
 static const eui64_t nulleui64;
@@ -209,6 +234,8 @@ static int  if_is_up;       /* Interface has been marked up */
 static int     if6_is_up;      /* Interface has been marked up for IPv6, to help differentiate */
 static int     have_default_route;     /* Gateway for default route added */
 static int     have_default_route6;    /* Gateway for default IPv6 route added */
+static struct  rtentry old_def_rt;     /* Old default route */
+static int     default_rt_repl_rest;   /* replace and restore old default rt */
 static u_int32_t proxy_arp_addr;       /* Addr for proxy arp entry added */
 static char proxy_arp_dev[16];         /* Device for proxy arp entry */
 static u_int32_t our_old_addr;         /* for detecting address changes */
@@ -660,11 +687,11 @@ static int make_ppp_unit(void)
 
        if (x == 0 && req_ifname[0] != '\0') {
                struct ifreq ifr;
-               char t[MAXIFNAMELEN];
+               char t[IFNAMSIZ];
                memset(&ifr, 0, sizeof(struct ifreq));
                slprintf(t, sizeof(t), "%s%d", PPP_DRV_NAME, ifunit);
-               strlcpy(ifr.ifr_name, t, IF_NAMESIZE);
-               strlcpy(ifr.ifr_newname, req_ifname, IF_NAMESIZE);
+               strlcpy(ifr.ifr_name, t, IFNAMSIZ);
+               strlcpy(ifr.ifr_newname, req_ifname, IFNAMSIZ);
                x = ioctl(sock_fd, SIOCSIFNAME, &ifr);
                if (x < 0)
                    error("Couldn't rename interface %s to %s: %m", t, req_ifname);
@@ -882,6 +909,12 @@ struct speed {
 #ifdef B460800
     { 460800, B460800 },
 #endif
+#ifdef B500000
+    { 500000, B500000 },
+#endif
+#ifdef B576000
+    { 576000, B576000 },
+#endif
 #ifdef B921600
     { 921600, B921600 },
 #endif
@@ -926,7 +959,6 @@ static int translate_speed (int bps)
            if (bps == speedp->speed_int)
                return speedp->speed_val;
        }
-       warn("speed %d not supported", bps);
     }
     return 0;
 }
@@ -1005,26 +1037,53 @@ void set_up_tty(int tty_fd, int local)
     if (stop_bits >= 2)
        tios.c_cflag |= CSTOPB;
 
-    speed = translate_speed(inspeed);
-    if (speed) {
-       cfsetospeed (&tios, speed);
-       cfsetispeed (&tios, speed);
+    if (inspeed) {
+       speed = translate_speed(inspeed);
+       if (speed) {
+           cfsetospeed (&tios, speed);
+           cfsetispeed (&tios, speed);
+           speed = cfgetospeed(&tios);
+           baud_rate = baud_rate_of(speed);
+       } else {
+#ifdef BOTHER
+           tios.c_cflag &= ~CBAUD;
+           tios.c_cflag |= BOTHER;
+           tios.c_ospeed = inspeed;
+#ifdef IBSHIFT
+           /* B0 sets input baudrate to the output baudrate */
+           tios.c_cflag &= ~(CBAUD << IBSHIFT);
+           tios.c_cflag |= B0 << IBSHIFT;
+           tios.c_ispeed = inspeed;
+#endif
+           baud_rate = inspeed;
+#else
+           baud_rate = 0;
+#endif
+       }
+    }
+    else {
+       speed = cfgetospeed(&tios);
+       baud_rate = baud_rate_of(speed);
+#ifdef BOTHER
+       if (!baud_rate)
+           baud_rate = tios.c_ospeed;
+#endif
     }
+
 /*
- * We can't proceed if the serial port speed is B0,
+ * We can't proceed if the serial port baud rate is unknown,
  * since that implies that the serial port is disabled.
  */
-    else {
-       speed = cfgetospeed(&tios);
-       if (speed == B0)
+    if (!baud_rate) {
+       if (inspeed)
+           fatal("speed %d not supported", inspeed);
+       else
            fatal("Baud rate for %s is 0; need explicit baud rate", devnam);
     }
 
     while (tcsetattr(tty_fd, TCSAFLUSH, &tios) < 0 && !ok_error(errno))
        if (errno != EINTR)
            fatal("tcsetattr: %m (line %d)", __LINE__);
-
-    baud_rate    = baud_rate_of(speed);
     restore_term = 1;
 }
 
@@ -1573,6 +1632,9 @@ static int read_route_table(struct rtentry *rt)
        p = NULL;
     }
 
+    SET_SA_FAMILY (rt->rt_dst,     AF_INET);
+    SET_SA_FAMILY (rt->rt_gateway, AF_INET);
+
     SIN_ADDR(rt->rt_dst) = strtoul(cols[route_dest_col], NULL, 16);
     SIN_ADDR(rt->rt_gateway) = strtoul(cols[route_gw_col], NULL, 16);
     SIN_ADDR(rt->rt_genmask) = strtoul(cols[route_mask_col], NULL, 16);
@@ -1645,20 +1707,53 @@ int have_route_to(u_int32_t addr)
 /********************************************************************
  *
  * sifdefaultroute - assign a default route through the address given.
+ *
+ * If the global default_rt_repl_rest flag is set, then this function
+ * already replaced the original system defaultroute with some other
+ * route and it should just replace the current defaultroute with
+ * another one, without saving the current route. Use: demand mode,
+ * when pppd sets first a defaultroute it it's temporary ppp0 addresses
+ * and then changes the temporary addresses to the addresses for the real
+ * ppp connection when it has come up.
  */
 
-int sifdefaultroute (int unit, u_int32_t ouraddr, u_int32_t gateway)
+int sifdefaultroute (int unit, u_int32_t ouraddr, u_int32_t gateway, bool replace)
 {
-    struct rtentry rt;
+    struct rtentry rt, tmp_rt;
+    struct rtentry *del_rt = NULL;
 
-    if (defaultroute_exists(&rt, dfl_route_metric) && strcmp(rt.rt_dev, ifname) != 0) {
-       if (rt.rt_flags & RTF_GATEWAY)
-           error("not replacing existing default route via %I with metric %d",
-                 SIN_ADDR(rt.rt_gateway), dfl_route_metric);
-       else
-           error("not replacing existing default route through %s with metric %d",
-                 rt.rt_dev, dfl_route_metric);
-       return 0;
+    if (default_rt_repl_rest) {
+       /* We have already replaced the original defaultroute, if we
+        * are called again, we will delete the current default route
+        * and set the new default route in this function.
+        * - this is normally only the case the doing demand: */
+       if (defaultroute_exists(&tmp_rt, -1))
+           del_rt = &tmp_rt;
+    } else if (defaultroute_exists(&old_def_rt, -1           ) &&
+                           strcmp( old_def_rt.rt_dev, ifname) != 0) {
+       /*
+        * We did not yet replace an existing default route, let's
+        * check if we should save and replace a default route:
+        */
+       u_int32_t old_gateway = SIN_ADDR(old_def_rt.rt_gateway);
+
+       if (old_gateway != gateway) {
+           if (!replace) {
+               error("not replacing default route to %s [%I]",
+                       old_def_rt.rt_dev, old_gateway);
+               return 0;
+           } else {
+               /* we need to copy rt_dev because we need it permanent too: */
+               char * tmp_dev = malloc(strlen(old_def_rt.rt_dev)+1);
+               strcpy(tmp_dev, old_def_rt.rt_dev);
+               old_def_rt.rt_dev = tmp_dev;
+
+               notice("replacing old default route to %s [%I]",
+                       old_def_rt.rt_dev, old_gateway);
+               default_rt_repl_rest = 1;
+               del_rt = &old_def_rt;
+           }
+       }
     }
 
     memset (&rt, 0, sizeof (rt));
@@ -1678,6 +1773,12 @@ int sifdefaultroute (int unit, u_int32_t ouraddr, u_int32_t gateway)
            error("default route ioctl(SIOCADDRT): %m");
        return 0;
     }
+    if (default_rt_repl_rest && del_rt)
+       if (ioctl(sock_fd, SIOCDELRT, del_rt) < 0) {
+           if ( ! ok_error ( errno ))
+               error("del old default route ioctl(SIOCDELRT): %m(%d)", errno);
+           return 0;
+       }
 
     have_default_route = 1;
     return 1;
@@ -1716,6 +1817,16 @@ int cifdefaultroute (int unit, u_int32_t ouraddr, u_int32_t gateway)
            return 0;
        }
     }
+    if (default_rt_repl_rest) {
+       notice("restoring old default route to %s [%I]",
+                       old_def_rt.rt_dev, SIN_ADDR(old_def_rt.rt_gateway));
+       if (ioctl(sock_fd, SIOCADDRT, &old_def_rt) < 0) {
+           if ( ! ok_error ( errno ))
+               error("restore default route ioctl(SIOCADDRT): %m(%d)", errno);
+           return 0;
+       }
+       default_rt_repl_rest = 0;
+    }
 
     return 1;
 }
@@ -2105,12 +2216,11 @@ get_if_hwaddr(u_char *addr, char *name)
 }
 
 /*
- * get_first_ethernet - return the name of the first ethernet-style
- * interface on this system.
+ * get_first_ether_hwaddr - get the hardware address for the first
+ * ethernet-style interface on this system.
  */
-static char first_ether_name[IF_NAMESIZE];
-char *
-get_first_ethernet(void)
+int
+get_first_ether_hwaddr(u_char *addr)
 {
        struct if_nameindex *if_ni, *i;
        struct ifreq ifreq;
@@ -2118,33 +2228,31 @@ get_first_ethernet(void)
 
        sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
        if (sock_fd < 0)
-               return NULL;
+               return -1;
 
        if_ni = if_nameindex();
        if (!if_ni) {
                close(sock_fd);
-               return NULL;
+               return -1;
        }
 
-       first_ether_name[0] = 0;
+       ret = -1;
 
        for (i = if_ni; !(i->if_index == 0 && i->if_name == NULL); i++) {
                memset(&ifreq.ifr_hwaddr, 0, sizeof(struct sockaddr));
                strlcpy(ifreq.ifr_name, i->if_name, sizeof(ifreq.ifr_name));
                ret = ioctl(sock_fd, SIOCGIFHWADDR, &ifreq);
                if (ret >= 0 && ifreq.ifr_hwaddr.sa_family == ARPHRD_ETHER) {
-                       strlcpy(first_ether_name, i->if_name, sizeof(first_ether_name));
+                       memcpy(addr, ifreq.ifr_hwaddr.sa_data, 6);
                        break;
                }
+               ret = -1;
        }
 
        if_freenameindex(if_ni);
        close(sock_fd);
 
-       if (!first_ether_name[0])
-               return NULL;
-
-       return first_ether_name;
+       return ret;
 }
 
 /********************************************************************
@@ -2767,6 +2875,145 @@ int cifaddr (int unit, u_int32_t our_adr, u_int32_t his_adr)
 }
 
 #ifdef INET6
+/********************************************************************
+ *
+ * sif6addr_rtnetlink - Config the interface with both IPv6 link-local addresses via rtnetlink
+ */
+static int sif6addr_rtnetlink(unsigned int iface, eui64_t our_eui64, eui64_t his_eui64)
+{
+    struct {
+        struct nlmsghdr nlh;
+        struct ifaddrmsg ifa;
+        struct {
+            struct rtattr rta;
+            struct in6_addr addr;
+        } addrs[2];
+    } nlreq;
+    struct {
+        struct nlmsghdr nlh;
+        struct nlmsgerr nlerr;
+    } nlresp;
+    struct sockaddr_nl nladdr;
+    struct iovec iov;
+    struct msghdr msg;
+    ssize_t nlresplen;
+    int one;
+    int fd;
+
+    fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
+    if (fd < 0) {
+        error("sif6addr_rtnetlink: socket(NETLINK_ROUTE): %m (line %d)", __LINE__);
+        return 0;
+    }
+
+    /*
+     * Tell kernel to not send to us payload of acknowledgment error message.
+     * NETLINK_CAP_ACK option is supported since Linux kernel version 4.3 and
+     * older kernel versions always send full payload in acknowledgment netlink
+     * message. We ignore payload of this message as we need only error code,
+     * to check if our set remote peer address request succeeded or failed.
+     * So ignore return value from the following setsockopt() call as setting
+     * option NETLINK_CAP_ACK means for us just a kernel hint / optimization.
+     */
+    one = 1;
+    setsockopt(fd, SOL_NETLINK, NETLINK_CAP_ACK, &one, sizeof(one));
+
+    memset(&nladdr, 0, sizeof(nladdr));
+    nladdr.nl_family = AF_NETLINK;
+
+    if (bind(fd, (struct sockaddr *)&nladdr, sizeof(nladdr)) < 0) {
+        error("sif6addr_rtnetlink: bind(AF_NETLINK): %m (line %d)", __LINE__);
+        close(fd);
+        return 0;
+    }
+
+    memset(&nlreq, 0, sizeof(nlreq));
+    nlreq.nlh.nlmsg_len = sizeof(nlreq);
+    nlreq.nlh.nlmsg_type = RTM_NEWADDR;
+    nlreq.nlh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK | NLM_F_EXCL | NLM_F_CREATE;
+    nlreq.ifa.ifa_family = AF_INET6;
+    nlreq.ifa.ifa_prefixlen = 128;
+    nlreq.ifa.ifa_flags = IFA_F_NODAD | IFA_F_PERMANENT;
+    nlreq.ifa.ifa_scope = RT_SCOPE_LINK;
+    nlreq.ifa.ifa_index = iface;
+    nlreq.addrs[0].rta.rta_len = sizeof(nlreq.addrs[0]);
+    nlreq.addrs[0].rta.rta_type = IFA_LOCAL;
+    IN6_LLADDR_FROM_EUI64(nlreq.addrs[0].addr, our_eui64);
+    nlreq.addrs[1].rta.rta_len = sizeof(nlreq.addrs[1]);
+    nlreq.addrs[1].rta.rta_type = IFA_ADDRESS;
+    IN6_LLADDR_FROM_EUI64(nlreq.addrs[1].addr, his_eui64);
+
+    memset(&nladdr, 0, sizeof(nladdr));
+    nladdr.nl_family = AF_NETLINK;
+
+    memset(&iov, 0, sizeof(iov));
+    iov.iov_base = &nlreq;
+    iov.iov_len = sizeof(nlreq);
+
+    memset(&msg, 0, sizeof(msg));
+    msg.msg_name = &nladdr;
+    msg.msg_namelen = sizeof(nladdr);
+    msg.msg_iov = &iov;
+    msg.msg_iovlen = 1;
+
+    if (sendmsg(fd, &msg, 0) < 0) {
+        error("sif6addr_rtnetlink: sendmsg(RTM_NEWADDR/NLM_F_CREATE): %m (line %d)", __LINE__);
+        close(fd);
+        return 0;
+    }
+
+    memset(&iov, 0, sizeof(iov));
+    iov.iov_base = &nlresp;
+    iov.iov_len = sizeof(nlresp);
+
+    memset(&msg, 0, sizeof(msg));
+    msg.msg_name = &nladdr;
+    msg.msg_namelen = sizeof(nladdr);
+    msg.msg_iov = &iov;
+    msg.msg_iovlen = 1;
+
+    nlresplen = recvmsg(fd, &msg, 0);
+
+    if (nlresplen < 0) {
+        error("sif6addr_rtnetlink: recvmsg(NLM_F_ACK): %m (line %d)", __LINE__);
+        close(fd);
+        return 0;
+    }
+
+    close(fd);
+
+    if (nladdr.nl_family != AF_NETLINK) {
+        error("sif6addr_rtnetlink: recvmsg(NLM_F_ACK): Not a netlink packet (line %d)", __LINE__);
+        return 0;
+    }
+
+    if ((size_t)nlresplen != sizeof(nlresp) || nlresp.nlh.nlmsg_len < sizeof(nlresp)) {
+        error("sif6addr_rtnetlink: recvmsg(NLM_F_ACK): Acknowledgment netlink packet too short (line %d)", __LINE__);
+        return 0;
+    }
+
+    /* acknowledgment packet for NLM_F_ACK is NLMSG_ERROR */
+    if (nlresp.nlh.nlmsg_type != NLMSG_ERROR) {
+        error("sif6addr_rtnetlink: recvmsg(NLM_F_ACK): Not an acknowledgment netlink packet (line %d)", __LINE__);
+        return 0;
+    }
+
+    /* error == 0 indicates success, negative value is errno code */
+    if (nlresp.nlerr.error != 0) {
+        /*
+         * Linux kernel versions prior 3.11 do not support setting IPv6 peer
+         * addresses and error response is expected. On older kernel versions
+         * do not show this error message. On error pppd tries to fallback to
+         * the old IOCTL method.
+         */
+        if (kernel_version >= KVERSION(3,11,0))
+            error("sif6addr_rtnetlink: %s (line %d)", strerror(-nlresp.nlerr.error), __LINE__);
+        return 0;
+    }
+
+    return 1;
+}
+
 /********************************************************************
  *
  * sif6addr - Config the interface with an IPv6 link-local address
@@ -2776,6 +3023,7 @@ int sif6addr (int unit, eui64_t our_eui64, eui64_t his_eui64)
     struct in6_ifreq ifr6;
     struct ifreq ifr;
     struct in6_rtmsg rt6;
+    int ret;
 
     if (sock6_fd < 0) {
        errno = -sock6_fd;
@@ -2789,28 +3037,46 @@ int sif6addr (int unit, eui64_t our_eui64, eui64_t his_eui64)
        return 0;
     }
 
-    /* Local interface */
-    memset(&ifr6, 0, sizeof(ifr6));
-    IN6_LLADDR_FROM_EUI64(ifr6.ifr6_addr, our_eui64);
-    ifr6.ifr6_ifindex = ifr.ifr_ifindex;
-    ifr6.ifr6_prefixlen = 128;
-
-    if (ioctl(sock6_fd, SIOCSIFADDR, &ifr6) < 0) {
-       error("sif6addr: ioctl(SIOCSIFADDR): %m (line %d)", __LINE__);
-       return 0;
+    if (kernel_version >= KVERSION(2,1,16)) {
+        /* Set both local address and remote peer address (with route for it) via rtnetlink */
+        ret = sif6addr_rtnetlink(ifr.ifr_ifindex, our_eui64, his_eui64);
+    } else {
+        ret = 0;
     }
 
-    /* Route to remote host */
-    memset(&rt6, 0, sizeof(rt6));
-    IN6_LLADDR_FROM_EUI64(rt6.rtmsg_dst, his_eui64);
-    rt6.rtmsg_flags = RTF_UP;
-    rt6.rtmsg_dst_len = 128;
-    rt6.rtmsg_ifindex = ifr.ifr_ifindex;
-    rt6.rtmsg_metric = 1;
-
-    if (ioctl(sock6_fd, SIOCADDRT, &rt6) < 0) {
-       error("sif6addr: ioctl(SIOCADDRT): %m (line %d)", __LINE__);
-       return 0;
+    /*
+     * Linux kernel versions prior 3.11 do not support setting IPv6 peer address
+     * via rtnetlink. So if sif6addr_rtnetlink() fails then try old IOCTL method.
+     */
+    if (!ret) {
+        /* Local interface */
+        memset(&ifr6, 0, sizeof(ifr6));
+        IN6_LLADDR_FROM_EUI64(ifr6.ifr6_addr, our_eui64);
+        ifr6.ifr6_ifindex = ifr.ifr_ifindex;
+        ifr6.ifr6_prefixlen = 128;
+
+        if (ioctl(sock6_fd, SIOCSIFADDR, &ifr6) < 0) {
+            error("sif6addr: ioctl(SIOCSIFADDR): %m (line %d)", __LINE__);
+            return 0;
+        }
+
+        /*
+         * Linux kernel does not provide AF_INET6 ioctl SIOCSIFDSTADDR for
+         * setting remote peer host address, so set only route to remote host.
+         */
+
+        /* Route to remote host */
+        memset(&rt6, 0, sizeof(rt6));
+        IN6_LLADDR_FROM_EUI64(rt6.rtmsg_dst, his_eui64);
+        rt6.rtmsg_flags = RTF_UP;
+        rt6.rtmsg_dst_len = 128;
+        rt6.rtmsg_ifindex = ifr.ifr_ifindex;
+        rt6.rtmsg_metric = 1;
+
+        if (ioctl(sock6_fd, SIOCADDRT, &rt6) < 0) {
+            error("sif6addr: ioctl(SIOCADDRT): %m (line %d)", __LINE__);
+            return 0;
+        }
     }
 
     return 1;
@@ -3147,54 +3413,6 @@ sys_check_options(void)
     return 1;
 }
 
-#ifdef INET6
-/*
- * ether_to_eui64 - Convert 48-bit Ethernet address into 64-bit EUI
- *
- * convert the 48-bit MAC address of eth0 into EUI 64. caller also assumes
- * that the system has a properly configured Ethernet interface for this
- * function to return non-zero.
- */
-int
-ether_to_eui64(eui64_t *p_eui64)
-{
-    struct ifreq ifr;
-    int skfd;
-    const unsigned char *ptr;
-
-    skfd = socket(PF_INET6, SOCK_DGRAM, 0);
-    if(skfd == -1)
-    {
-        warn("could not open IPv6 socket");
-        return 0;
-    }
-
-    strcpy(ifr.ifr_name, "eth0");
-    if(ioctl(skfd, SIOCGIFHWADDR, &ifr) < 0)
-    {
-        close(skfd);
-        warn("could not obtain hardware address for eth0");
-        return 0;
-    }
-    close(skfd);
-
-    /*
-     * And convert the EUI-48 into EUI-64, per RFC 2472 [sec 4.1]
-     */
-    ptr = (unsigned char *) ifr.ifr_hwaddr.sa_data;
-    p_eui64->e8[0] = ptr[0] | 0x02;
-    p_eui64->e8[1] = ptr[1];
-    p_eui64->e8[2] = ptr[2];
-    p_eui64->e8[3] = 0xFF;
-    p_eui64->e8[4] = 0xFE;
-    p_eui64->e8[5] = ptr[3];
-    p_eui64->e8[6] = ptr[4];
-    p_eui64->e8[7] = ptr[5];
-
-    return 1;
-}
-#endif
-
 /********************************************************************
  *
  * get_time - Get current time, monotonic if possible.