cvs commit: src/sbin/dhclient dispatch.c

Jung-uk Kim jkim at FreeBSD.org
Mon Dec 10 10:43:28 PST 2007


On Monday 10 December 2007 12:49 pm, Jung-uk Kim wrote:
> jkim        2007-12-10 17:49:16 UTC
>
>   FreeBSD src repository
>
>   Modified files:        (Branch: RELENG_7)
>     sbin/dhclient        dispatch.c
>   Log:
>   MFC:    1.3
>
>   Teach dhclient(8) about net80211 link (association) status.
>
>   Especially it helps ndis(4) where it is used with
> wpa_supplicant(8) since 0.5.8 is imported.  Previously
> ndis_events(8) was used to notify link status to wpa_supplicant but
> it is defuct now, i. e., external event notification mechanism is
> removed by the vendor and there is no substitute for ndisulator
> yet.
>
>   Reviewed by:    brooks
>   OK'd by:        sam
>   Approved by:    re (kensmith)
>
>   Revision  Changes    Path
>   1.2.2.1   +4 -1      src/sbin/dhclient/dispatch.c

FYI, see:

http://hostap.epitest.fi/cgi-bin/viewcvs.cgi/hostap/wpa_supplicant/driver_ndis_.c?r1=1.9&r2=1.10&makepatch=1&diff_format=u

Vendor commit log:
Removed ndis_events.cpp and possibility of using external
ndis_events.exe; C version (ndis_events.c) is fully functional and
there is no desire to maintain two separate versions of this
implementation.

Then driver_ndis_.c was moved to Attic in our version:

http://docs.freebsd.org/cgi/mid.cgi?200707111558.l6BFwqhl036966

Since we don't have ndis_events.c equivalent for ndis(4), its 
functionality is effectively lost.  Therefore, I'd like to disconnect 
ndis_events(8) from build (patch attached).

Any objection?

Jung-uk Kim
-------------- next part --------------
--- src/UPDATING	28 Nov 2007 13:04:11 -0000	1.513
+++ src/UPDATING	10 Dec 2007 18:12:14 -0000
@@ -21,6 +21,11 @@
 	developers choose to disable these features on build machines
 	to maximize performance.
 
+20071210:
+	ndis_events(8) has been retired. Unfortunately its functionality
+	is lost because wpa_supplicant(8) does not listen to external
+	events any more and there is no substitute for ndis(4) since 0.5.x.
+
 20071128:
 	The ADAPTIVE_GIANT kernel option has been retired because its
 	functionality is the default now.
--- src/usr.sbin/wpa/Makefile	17 Nov 2006 19:38:51 -0000	1.4
+++ src/usr.sbin/wpa/Makefile	10 Dec 2007 18:06:49 -0000
@@ -2,6 +2,5 @@
 
 SUBDIR= wpa_supplicant wpa_cli wpa_passphrase
 SUBDIR+= hostapd hostapd_cli
-SUBDIR+= ndis_events
 
 .include <bsd.subdir.mk>
--- src/usr.sbin/wpa/ndis_events/Makefile	10 Oct 2005 17:51:12 -0000	1.1
+++ src/usr.sbin/wpa/ndis_events/Makefile	1 Jan 1970 00:00:00 -0000
@@ -1,8 +0,0 @@
-# $FreeBSD: src/usr.sbin/wpa/ndis_events/Makefile,v 1.1 2005/10/10 17:51:12 wpaul Exp $
-
-PROG=	ndis_events
-SRCS+=	ndis_events.c
-
-MAN=	ndis_events.8
-
-.include <bsd.prog.mk>
--- src/usr.sbin/wpa/ndis_events/ndis_events.8	7 Sep 2007 22:19:29 -0000	1.7
+++ src/usr.sbin/wpa/ndis_events/ndis_events.8	1 Jan 1970 00:00:00 -0000
@@ -1,135 +0,0 @@
-.\" Copyright (c) 2005
-.\"	Bill Paul <wpaul at windriver.com> All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 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. All advertising materials mentioning features or use of this software
-.\"    must display the following acknowledgement:
-.\"	This product includes software developed by Bill Paul.
-.\" 4. Neither the name of the author nor the names of any co-contributors
-.\"    may be used to endorse or promote products derived from this software
-.\"   without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD
-.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
-.\" THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.\" $FreeBSD: src/usr.sbin/wpa/ndis_events/ndis_events.8,v 1.7 2007/09/07 22:19:29 brueffer Exp $
-.\"
-.Dd August 30, 2007
-.Dt NDIS_EVENTS 8
-.Os
-.Sh NAME
-.Nm ndis_events
-.Nd relay events from
-.Xr ndis 4
-drivers to
-.Xr wpa_supplicant 8
-.Sh SYNOPSIS
-.Nm
-.Op Fl a
-.Op Fl d
-.Op Fl v
-.Sh DESCRIPTION
-The
-.Nm
-utility listens for events generated by an
-.Xr ndis 4
-wireless network driver and relays them to
-.Xr wpa_supplicant 8
-for possible processing.
-The three event types that can occur
-are media connect and disconnect events, such as when a wireless
-interface joins or leaves a network, and media-specific events.
-In particular,
-.Xr ndis 4
-drivers that support WPA2 will generate media-specific events
-containing PMKID candidate information which
-.Xr wpa_supplicant 8
-needs in order to properly associate with WPA2-capable access points.
-.Pp
-The
-.Nm
-daemon works by listening for interface information events via
-a routing socket.
-When it detects an event that was generated by an
-.Xr ndis 4
-interface, it transmits it via UDP packet on the loopback interface,
-where
-.Xr wpa_supplicant 8
-is presumeably listening.
-The standard
-.Xr wpa_supplicant 8
-distribution includes its own version of this utility for use with
-.Tn Windows\[rg] .
-The
-.Fx
-version performs the same functions as the
-.Tn Windows\[rg]
-one, except that it uses an
-.Xr ioctl 4
-and routing socket interface instead of WMI.
-.Pp
-Note that a single instance of
-.Nm
-is sufficient to scan for events for any number of
-.Xr ndis 4
-interfaces in a system.
-.Sh OPTIONS
-The
-.Nm
-daemon supports the following options:
-.Bl -tag -width indent
-.It Fl a
-Process all events.
-By default,
-.Nm
-will only process and forward media-specific events, which contain
-PMKID candidate information, and not bother forwarding connect and
-disconnect events, since
-.Xr wpa_supplicant 8
-normally can determine the current link state on its own.
-In some
-cases, the additional connect and disconnect events only confuse it
-and make the association and authentication process take longer.
-.It Fl d
-Run in debug mode.
-This causes
-.Nm
-to run in the foreground and generate any output to the standard
-error instead of using the
-.Xr syslog 3
-facility.
-.It Fl v
-Run in verbose mode.
-This causes
-.Nm
-to emit notifications when it receives events.
-.El
-.Sh SEE ALSO
-.Xr ndis 4 ,
-.Xr wpa_supplicant 8
-.Sh HISTORY
-The
-.Nm
-utility first appeared in
-.Fx 6.0 .
-.Sh AUTHORS
-The
-.Nm
-utility was written by
-.An Bill Paul Aq wpaul at windriver.com .
--- src/usr.sbin/wpa/ndis_events/ndis_events.c	21 Oct 2005 16:57:57 -0000	1.4
+++ src/usr.sbin/wpa/ndis_events/ndis_events.c	1 Jan 1970 00:00:00 -0000
@@ -1,355 +0,0 @@
-/*-
- * Copyright (c) 2005
- *      Bill Paul <wpaul at windriver.com>.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 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. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *      This product includes software developed by Bill Paul.
- * 4. Neither the name of the author nor the names of any co-contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/usr.sbin/wpa/ndis_events/ndis_events.c,v 1.4 2005/10/21 16:57:57 wpaul Exp $");
-
-/*
- * This program simulates the behavior of the ndis_events utility
- * supplied with wpa_supplicant for Windows. The original utility
- * is designed to translate Windows WMI events. We don't have WMI,
- * but we need to supply certain event info to wpa_supplicant in
- * order to make WPA2 work correctly, so we fake up the interface.
- */
-
-#include <sys/types.h>
-#include <sys/cdefs.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/ioctl.h>
-#include <sys/socket.h>
-#include <sys/errno.h>
-#include <sys/sysctl.h>
-#include <net/if.h>
-#include <net/if_dl.h>
-#include <net/if_var.h>
-
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-#include <net/route.h>
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <err.h>
-#include <syslog.h>
-#include <stdarg.h>
-
-static int verbose = 0;
-static int debug = 0;
-static int all_events = 0;
-
-#define PROGNAME "ndis_events"
-
-#define WPA_SUPPLICANT_PORT	9876
-#define NDIS_INDICATION_LEN	2048
-
-#define EVENT_CONNECT		0
-#define EVENT_DISCONNECT	1
-#define EVENT_MEDIA_SPECIFIC	2
-
-#define NDIS_STATUS_MEDIA_CONNECT		0x4001000B
-#define NDIS_STATUS_MEDIA_DISCONNECT		0x4001000C
-#define NDIS_STATUS_MEDIA_SPECIFIC_INDICATION	0x40010012
-
-struct ndis_evt {
-	uint32_t		ne_sts;
-	uint32_t		ne_len;
-#ifdef notdef
-	char			ne_buf[1];
-#endif
-};
-
-static int find_ifname(int, char *);
-static int announce_event(char *, int, struct sockaddr_in *);
-static void usage(char *);
-
-static void
-dbgmsg(const char *fmt, ...)
-{
-	va_list			ap;
-
-	va_start(ap, fmt);
-	if (debug)
-		vwarnx(fmt, ap);
-	else
-		vsyslog(LOG_ERR, fmt, ap);
-	va_end(ap);
-
-	return;
-}
-
-static int
-find_ifname(idx, name)
-	int			idx;
-	char			*name;
-{
-	int			mib[6];
-	size_t			needed;
-	struct if_msghdr	*ifm;
-	struct sockaddr_dl	*sdl;
-	char			*buf, *lim, *next;
-
-	needed = 0;
-	mib[0] = CTL_NET;
-	mib[1] = PF_ROUTE;
-	mib[2] = 0;             /* protocol */
-	mib[3] = 0;             /* wildcard address family */
-	mib[4] = NET_RT_IFLIST;
-	mib[5] = 0;             /* no flags */
-
-	if (sysctl (mib, 6, NULL, &needed, NULL, 0) < 0)
-		return(EIO);
-
-	buf = malloc (needed);
-	if (buf == NULL)
-		return(ENOMEM);
-
-	if (sysctl (mib, 6, buf, &needed, NULL, 0) < 0) {
-		free(buf);
-		return(EIO);
-	}
-
-	lim = buf + needed;
-
-	next = buf;
-	while (next < lim) {
-		ifm = (struct if_msghdr *)next;
-		if (ifm->ifm_type == RTM_IFINFO) {
-			sdl = (struct sockaddr_dl *)(ifm + 1);
-			if (ifm->ifm_index == idx) {
-				strncpy(name, sdl->sdl_data, sdl->sdl_nlen);
-				name[sdl->sdl_nlen] = '\0';
-				free (buf);
-				return (0);
-			}
-		}
-		next += ifm->ifm_msglen;
-	}
-
-	free (buf);
-
-	return(ENOENT);
-}
-
-static int 
-announce_event(ifname, sock, dst)
-	char			*ifname;
-	int			sock;
-	struct sockaddr_in	*dst;
-{
-	int			s;
-	char			indication[NDIS_INDICATION_LEN];
-        struct ifreq            ifr;
-	struct ndis_evt		*e;
-	char			buf[512], *pos, *end;
-	int			len, type, _type;
-
-	s = socket(PF_INET, SOCK_DGRAM, 0);
-
-	if (s < 0) {
-		dbgmsg("socket creation failed");
-                return(EINVAL);
-	}
-
-        bzero((char *)&ifr, sizeof(ifr));
-	e = (struct ndis_evt *)indication;
-	e->ne_len = NDIS_INDICATION_LEN - sizeof(struct ndis_evt);
-
-        strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
-        ifr.ifr_data = indication;
-
-	if (ioctl(s, SIOCGPRIVATE_0, &ifr) < 0) {
-		close(s);
-		if (verbose) {
-			if (errno == ENOENT)
-				dbgmsg("drained all events from %s",
-				    ifname, errno);
-			else
-				dbgmsg("failed to read event info from %s: %d",
-				    ifname, errno);
-		}
-		return(ENOENT);
-	}
-
-	if (e->ne_sts == NDIS_STATUS_MEDIA_CONNECT) {
-		type = EVENT_CONNECT;
-		if (verbose)
-			dbgmsg("Received a connect event for %s", ifname);
-		if (!all_events) {
-			close(s);
-			return(0);
-		}
-	}
-	if (e->ne_sts == NDIS_STATUS_MEDIA_DISCONNECT) {
-		type = EVENT_DISCONNECT;
-		if (verbose)
-			dbgmsg("Received a disconnect event for %s", ifname);
-		if (!all_events) {
-			close(s);
-			return(0);
-		}
-	}
-	if (e->ne_sts == NDIS_STATUS_MEDIA_SPECIFIC_INDICATION) {
-		type = EVENT_MEDIA_SPECIFIC;
-		if (verbose)
-			dbgmsg("Received a media-specific event for %s",
-			    ifname);
-	}
-
-	end = buf + sizeof(buf);
-	_type = (int) type;
-	memcpy(buf, &_type, sizeof(_type));
-	pos = buf + sizeof(_type);
-
-	len = snprintf(pos + 1, end - pos - 1, "%s", ifname);
-	if (len < 0) {
-		close(s);
-		return(ENOSPC);
-	}
-	if (len > 255)
-		len = 255;
-	*pos = (unsigned char) len;
-	pos += 1 + len;
-	if (e->ne_len) {
-		if (e->ne_len > 255 || 1 + e->ne_len > end - pos) {
-			dbgmsg("Not enough room for send_event data (%d)\n",
-			    e->ne_len);
-			close(s);
-			return(ENOSPC);
- 		}
-		*pos++ = (unsigned char) e->ne_len;
-		memcpy(pos, (indication) + sizeof(struct ndis_evt), e->ne_len);
-		pos += e->ne_len;
-	}
-
-	len = sendto(sock, buf, pos - buf, 0, (struct sockaddr *) dst,
-	    sizeof(struct sockaddr_in));
-
-	close(s);
-	return(0);
-}
-
-static void
-usage(progname)
-	char			*progname;
-{
-	fprintf(stderr, "Usage: ndis_events [-a] [-d] [-v]\n", progname);
-	exit(1);
-}
-
-int
-main(argc, argv)
-	int			argc;
-	char			*argv[];
-{
-	int			s, r, n;
-	struct sockaddr_in	sin;
-	char			msg[NDIS_INDICATION_LEN];
-	struct rt_msghdr	*rtm;
-	struct if_msghdr	*ifm;
-	char			ifname[IFNAMSIZ];
-	int			ch;
-
-	while ((ch = getopt(argc, argv, "dva")) != -1) {
-		switch(ch) {
-		case 'd':
-			debug++;
-			break;
-		case 'v':
-			verbose++;
-			break;
-		case 'a':
-			all_events++;
-			break;
-		default:
-			usage(PROGNAME);
-			break;
-		}
-	}
-
-	if (!debug && daemon(0, 0))
-		err(1, "failed to daemonize ourselves");
-
-	if (!debug)
-		openlog(PROGNAME, LOG_PID | LOG_CONS, LOG_DAEMON);
-
-	bzero((char *)&sin, sizeof(sin));
-
-	/* Create a datagram  socket. */
-
-	s = socket(PF_INET, SOCK_DGRAM, 0);
-	if (s < 0) {
-		dbgmsg("socket creation failed");
-		exit(1);
-	}
-
-	sin.sin_family = AF_INET;
-	sin.sin_addr.s_addr = inet_addr("127.0.0.1");
-	sin.sin_port = htons(WPA_SUPPLICANT_PORT);
-
-	/* Create a routing socket. */
-
-	r = socket (PF_ROUTE, SOCK_RAW, 0);
-	if (r < 0) {
-		dbgmsg("routing socket creation failed");
-		exit(1);
-	}
-
-	/* Now sit and spin, waiting for events. */
-
-	if (verbose)
-		dbgmsg("Listening for events");
-
-	while (1) {
-		n = read(r, msg, NDIS_INDICATION_LEN);
-		rtm = (struct rt_msghdr *)msg;
-		if (rtm->rtm_type != RTM_IFINFO)
-			continue;
-		ifm = (struct if_msghdr *)msg;
-		if (find_ifname(ifm->ifm_index, ifname))
-			continue;
-		if (strstr(ifname, "ndis")) {
-			while(announce_event(ifname, s, &sin) == 0)
-				;
-		} else {
-			if (verbose)
-				dbgmsg("Skipping ifinfo message from %s",
-				    ifname);
-		}
-	}
-
-	/* NOTREACHED */
-	exit(0);
-}


More information about the cvs-all mailing list