Solaris: Add support for wired IEEE 802.1X client
authorMasashi Honma <honma@ictec.co.jp>
Sat, 28 Aug 2010 08:40:07 +0000 (11:40 +0300)
committerJouni Malinen <j@w1.fi>
Sat, 28 Aug 2010 08:40:07 +0000 (11:40 +0300)
This patch adds support for wired IEEE 802.1X client on the Solaris.

I have tested with these:
OS : OpenSolaris 2009.06
EAP : EAP-MD5
Switch : Cisco Catalyst 2950

src/common/wpa_ctrl.c
src/drivers/driver_wired.c
src/l2_packet/l2_packet_freebsd.c
src/utils/os_unix.c
wpa_supplicant/defconfig

index 2b4e3aa..81fe6ba 100644 (file)
@@ -81,7 +81,7 @@ struct wpa_ctrl * wpa_ctrl_open(const char *ctrl_path)
        counter++;
 try_again:
        ret = os_snprintf(ctrl->local.sun_path, sizeof(ctrl->local.sun_path),
-                         "/tmp/wpa_ctrl_%d-%d", getpid(), counter);
+                         "/tmp/wpa_ctrl_%d-%d", (int) getpid(), counter);
        if (ret < 0 || (size_t) ret >= sizeof(ctrl->local.sun_path)) {
                close(ctrl->s);
                os_free(ctrl);
index 2b197f0..de038e2 100644 (file)
@@ -24,6 +24,9 @@
 #if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__)
 #include <net/if_dl.h>
 #endif /* defined(__FreeBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__) */
+#ifdef __sun__
+#include <sys/sockio.h>
+#endif /* __sun__ */
 
 #include "common.h"
 #include "eloop.h"
@@ -462,6 +465,10 @@ static int wpa_driver_wired_multi(const char *ifname, const u8 *addr, int add)
        struct ifreq ifr;
        int s;
 
+#ifdef __sun__
+       return -1;
+#endif /* __sun__ */
+
        s = socket(PF_INET, SOCK_DGRAM, 0);
        if (s < 0) {
                perror("socket");
index 009e02c..e24277c 100644 (file)
 #include <pcap.h>
 
 #include <sys/ioctl.h>
+#ifdef __sun__
+#include <libdlpi.h>
+#else /* __sun__ */
 #include <sys/sysctl.h>
+#endif /* __sun__ */
 
 #include <net/if.h>
 #include <net/if_dl.h>
@@ -139,6 +143,7 @@ static int l2_packet_init_libpcap(struct l2_packet_data *l2,
        }
 
        pcap_freecode(&pcap_fp);
+#ifndef __sun__
        /*
         * When libpcap uses BPF we must enable "immediate mode" to
         * receive frames right away; otherwise the system may
@@ -153,6 +158,7 @@ static int l2_packet_init_libpcap(struct l2_packet_data *l2,
                        /* XXX should we fail? */
                }
        }
+#endif /* __sun__ */
 
        eloop_register_read_sock(pcap_get_selectable_fd(l2->pcap),
                                 l2_packet_receive, l2, l2->pcap);
@@ -163,6 +169,30 @@ static int l2_packet_init_libpcap(struct l2_packet_data *l2,
 
 static int eth_get(const char *device, u8 ea[ETH_ALEN])
 {
+#ifdef __sun__
+       dlpi_handle_t dh;
+       u32 physaddrlen = DLPI_PHYSADDR_MAX;
+       u8 physaddr[DLPI_PHYSADDR_MAX];
+       int retval;
+
+       retval = dlpi_open(device, &dh, 0);
+       if (retval != DLPI_SUCCESS) {
+               wpa_printf(MSG_ERROR, "dlpi_open error: %s",
+                          dlpi_strerror(retval));
+               return -1;
+       }
+
+       retval = dlpi_get_physaddr(dh, DL_CURR_PHYS_ADDR, physaddr,
+                                  &physaddrlen);
+       if (retval != DLPI_SUCCESS) {
+               wpa_printf(MSG_ERROR, "dlpi_get_physaddr error: %s",
+                          dlpi_strerror(retval));
+               dlpi_close(dh);
+               return -1;
+       }
+       os_memcpy(ea, physaddr, ETH_ALEN);
+       dlpi_close(dh);
+#else /* __sun__ */
        struct if_msghdr *ifm;
        struct sockaddr_dl *sdl;
        u_char *p, *buf;
@@ -195,6 +225,7 @@ static int eth_get(const char *device, u8 ea[ETH_ALEN])
                errno = ESRCH;
                return -1;
        }
+#endif /* __sun__ */
        return 0;
 }
 
index 6f58fa4..c696fae 100644 (file)
@@ -135,9 +135,9 @@ static int os_daemon(int nochdir, int noclose)
 
 int os_daemonize(const char *pid_file)
 {
-#ifdef __uClinux__
+#if defined(__uClinux__) || defined(__sun__)
        return -1;
-#else /* __uClinux__ */
+#else /* defined(__uClinux__) || defined(__sun__) */
        if (os_daemon(0, 0)) {
                perror("daemon");
                return -1;
@@ -152,7 +152,7 @@ int os_daemonize(const char *pid_file)
        }
 
        return -0;
-#endif /* __uClinux__ */
+#endif /* defined(__uClinux__) || defined(__sun__) */
 }
 
 
index 8c32cb3..3e3808d 100644 (file)
@@ -123,6 +123,10 @@ CONFIG_DRIVER_WIRED=y
 # Driver interface for no driver (e.g., WPS ER only)
 #CONFIG_DRIVER_NONE=y
 
+# Solaris libraries
+#LIBS += -lsocket -ldlpi -lnsl
+#LIBS_c += -lsocket
+
 # Enable IEEE 802.1X Supplicant (automatically included if any EAP method is
 # included)
 CONFIG_IEEE8021X_EAPOL=y