changeset 419:a245241eda54

Update MPD.
author Aleksandr Rybalko <ray@ddteam.net>
date Fri, 14 Sep 2012 02:13:58 +0300
parents 370cf0e347e3
children 68a672dd9d74
files contrib/mpd/Makefile contrib/mpd/conf/dictionary.mpd contrib/mpd/doc/auth.sgml contrib/mpd/doc/changes.sgml contrib/mpd/doc/gencmd.sgml contrib/mpd/doc/interface.sgml contrib/mpd/doc/trafacct.sgml contrib/mpd/port/mpd5.sh contrib/mpd/src/Makefile contrib/mpd/src/auth.c contrib/mpd/src/auth.h contrib/mpd/src/bund.c contrib/mpd/src/ccp.c contrib/mpd/src/ccp_deflate.c contrib/mpd/src/ccp_mppc.c contrib/mpd/src/ccp_pred1.c contrib/mpd/src/chat.c contrib/mpd/src/command.c contrib/mpd/src/console.c contrib/mpd/src/console.h contrib/mpd/src/contrib/libpdel/util/pevent.c contrib/mpd/src/contrib/libpdel/util/typed_mem.c contrib/mpd/src/defs.h contrib/mpd/src/ecp.c contrib/mpd/src/event.c contrib/mpd/src/iface.c contrib/mpd/src/iface.h contrib/mpd/src/ipcp.c contrib/mpd/src/ippool.c contrib/mpd/src/l2tp.c contrib/mpd/src/l2tp_ctrl.c contrib/mpd/src/lcp.c contrib/mpd/src/link.c contrib/mpd/src/main.c contrib/mpd/src/mbuf.h contrib/mpd/src/modem.c contrib/mpd/src/msg.c contrib/mpd/src/nat.h contrib/mpd/src/ng.c contrib/mpd/src/ngfunc.c contrib/mpd/src/phys.c contrib/mpd/src/pppoe.c contrib/mpd/src/pptp.c contrib/mpd/src/pptp_ctrl.c contrib/mpd/src/pptp_ctrl.h contrib/mpd/src/proto.c contrib/mpd/src/radius.c contrib/mpd/src/radius.h contrib/mpd/src/radsrv.c contrib/mpd/src/rep.c contrib/mpd/src/tcp.c contrib/mpd/src/udp.c contrib/mpd/src/util.c contrib/mpd/src/web.c
diffstat 54 files changed, 1519 insertions(+), 757 deletions(-) [+]
line wrap: on
line diff
--- a/contrib/mpd/Makefile	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/Makefile	Fri Sep 14 02:13:58 2012 +0300
@@ -1,11 +1,11 @@
-# $Id: Makefile,v 1.12 2007/09/16 14:03:57 amotin Exp $
+# $Id: Makefile,v 1.13 2011/12/21 14:58:09 amotin Exp $
 
 VERSION!=	cat src/Makefile | grep ^VERSION | awk '{ print $$2 }'
 
 DISTNAME=	mpd-${VERSION}
 TARBALL=	${DISTNAME}.tar.gz
 PORTBALL=	port.tgz
-CVSROOT?=	mpd.cvs.sourceforge.net:/cvsroot/mpd
+CVSROOT?=	:pserver:[email protected]:/cvsroot/mpd
 
 all:		${TARBALL} ${PORTBALL}
 
@@ -38,7 +38,7 @@
 	cp dist/Makefile ${DISTNAME}
 	cp dist/Makefile.conf ${DISTNAME}/conf/Makefile
 	cp dist/Makefile.doc ${DISTNAME}/doc/Makefile
-	cp src/COPYRIGHT* src/Makefile src/[a-z]* ${DISTNAME}/src
+	cp -r src/COPYRIGHT* src/Makefile src/[a-z]* ${DISTNAME}/src
 	sed 's/@[email protected]/${VERSION}/g' < src/Makefile > ${DISTNAME}/src/Makefile
 	cp doc/mpd*.html doc/mpd.ps ${DISTNAME}/doc
 	cp doc/mpd.8 ${DISTNAME}/doc/mpd5.8.in
--- a/contrib/mpd/conf/dictionary.mpd	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/conf/dictionary.mpd	Fri Sep 14 02:13:58 2012 +0300
@@ -23,6 +23,10 @@
 ATTRIBUTE	mpd-input-acct	16	string
 ATTRIBUTE	mpd-output-acct	17	string
 ATTRIBUTE	mpd-action	18	string
+ATTRIBUTE	mpd-peer-ident	19	string
+ATTRIBUTE	mpd-iface-name	20	string
+ATTRIBUTE	mpd-iface-descr	21	string
+ATTRIBUTE	mpd-iface-group	22	string
 ATTRIBUTE	mpd-drop-user	154	integer
 
 END-VENDOR	mpd
--- a/contrib/mpd/doc/auth.sgml	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/doc/auth.sgml	Fri Sep 14 02:13:58 2012 +0300
@@ -1,4 +1,4 @@
-<!-- $Id: auth.sgml,v 1.52 2010/08/27 10:06:03 amotin Exp $ -->
+<!-- $Id: auth.sgml,v 1.55 2011/08/30 11:47:02 dmitryluhtionov Exp $ -->
 <!-- mpd netgraph enabled user mode PPP daemon -->
 
 <!-- <!DOCTYPE linuxdoc PUBLIC '-//FreeBSD//DTD linuxdoc//EN'> -->
@@ -339,6 +339,10 @@
 16  mpd-input-acct		-	+	-	-
 17  mpd-output-acct		-	+	-	-
 18  mpd-action			-	+	-	-
+19  mpd-peer-ident		+	-	+	-
+20  mpd-iface-name		-	+	-	-
+21  mpd-iface-descr		-	+	-	-
+22  mpd-iface-group		-	+	-	-
 154 mpd-drop-user		-	-	-	+
 </VERB>
 
@@ -368,6 +372,10 @@
 ATTRIBUTE	mpd-input-acct	16	string
 ATTRIBUTE	mpd-output-acct	17	string
 ATTRIBUTE	mpd-action	18	string
+ATTRIBUTE	mpd-peer-ident	19	string
+ATTRIBUTE	mpd-iface-name	20	string
+ATTRIBUTE	mpd-iface-descr	21	string
+ATTRIBUTE	mpd-iface-group	22	string
 ATTRIBUTE	mpd-drop-user	154	integer
 
 END-VENDOR	mpd
@@ -561,6 +569,9 @@
 MPD_OUTPUT_PACKETS		-	-	+	-
 MPD_ACTION			-	+	-	-
 MPD_DROP_USER			-	-	-	+
+MPD_IFACE_NAME			-	+	-	-
+MPD_IFACE_DESCR			-	+	-	-
+MPD_IFACE_GROUP			-	+	-	-
 </verb>
 
 Attribute USER_PASSWORD provided in Access-Request only for PAP auth.
--- a/contrib/mpd/doc/changes.sgml	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/doc/changes.sgml	Fri Sep 14 02:13:58 2012 +0300
@@ -1,4 +1,4 @@
-<!-- $Id: changes.sgml,v 1.265 2011/04/15 19:01:36 amotin Exp $ -->
+<!-- $Id: changes.sgml,v 1.278 2012/03/19 08:30:45 amotin Exp $ -->
 <!-- mpd netgraph enabled user mode PPP daemon -->
 
 <!-- <!DOCTYPE linuxdoc PUBLIC '-//FreeBSD//DTD linuxdoc//EN'> -->
@@ -6,10 +6,46 @@
   <sect><heading>Change history<label id="changes"></heading>
 
   <p>
+    Changes since version 5.6:
+    <itemize>
+	<item> New features:
+	<itemize>
+	  <item> Added `unset radius server ...` command.
+	  </item>
+	</itemize>
+	</item>
+	<item> Bugfixes:
+	<itemize>
+	  <item> Restore `show sessions` as unprivileged command.
+	  </item>
+	  <item> Fix infinite event loop when STDIN redirected to /dev/null
+		 after it recently got non-blocking mode support.
+	  </item>
+	</itemize>
+	</item>
+    </itemize>
+  </p>
+  <p>
     Changes since version 5.5:
     <itemize>
 	<item> New features:
 	<itemize>
+	  <item> Added `mpd-iface-name` RADIUS attribute.
+	  </item>
+	  <item> Added `mpd-iface-descr` RADIUS attribute.
+	  </item>
+	  <item> Added `mpd-iface-group` RADIUS attribute.
+	  </item>
+	  <item> Added `mpd-peer-ident` RADIUS attribute.
+	  </item>
+	  <item> Added `set iface name ...` command.
+	  </item>
+	  <item> Added `set iface description ...` command.
+	  </item>
+	  <item> Added `set iface group ...` command.
+	  </item>
+	  <item> Added support for NetFlow v9 export.
+	  </item>
 	  <item> Added `set l2tp|pptp|tcp|udp resolve-once ...` command.
 		They allow to resolve peer address every time on reconnect.
 	  </item>
@@ -24,6 +60,10 @@
 	</item>
 	<item> Bugfixes:
 	<itemize>
+	  <item> Fix invoke `set iface up|down-script` without arguments.
+	  </item>
+	  <item> Fix `show eap` command
+	  </item>
 	  <item> Fix build on older FreeBSD versions.
 	  </item>
 	  <item> Fix several memory leaks.
@@ -32,6 +72,8 @@
 	  </item>
 	  <item> Fix byte order in ports in `set nat red-port`.
 	  </item>
+	  <item> Fix some potential crashes because of NULL dereferences.
+	  </item>
 	</itemize>
 	</item>
     </itemize>
--- a/contrib/mpd/doc/gencmd.sgml	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/doc/gencmd.sgml	Fri Sep 14 02:13:58 2012 +0300
@@ -1,4 +1,4 @@
-<!-- $Id: gencmd.sgml,v 1.46 2009/07/17 12:37:01 amotin Exp $ -->
+<!-- $Id: gencmd.sgml,v 1.47 2012/03/19 08:30:45 amotin Exp $ -->
 <!-- mpd netgraph enabled user mode PPP daemon -->
 
 <!-- <!DOCTYPE linuxdoc PUBLIC '-//FreeBSD//DTD linuxdoc//EN'> -->
@@ -324,6 +324,12 @@
 Sets web server specific configuration parameters
 </descrip>
 
+<tag><tt>unset ...</tt></tag>
+
+<p>
+This command allows to unsets some of configuration information set using
+<tt>set</tt> command.
+
 <tag><tt>open [ <em>layer</em> ] </tt>
 </tag>
 
--- a/contrib/mpd/doc/interface.sgml	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/doc/interface.sgml	Fri Sep 14 02:13:58 2012 +0300
@@ -1,4 +1,4 @@
-<!-- $Id: interface.sgml,v 1.27 2009/10/30 15:31:04 amotin Exp $ -->
+<!-- $Id: interface.sgml,v 1.29 2011/08/30 11:47:02 dmitryluhtionov Exp $ -->
 <!-- mpd netgraph enabled user mode PPP daemon -->
 
 <!-- <!DOCTYPE linuxdoc PUBLIC '-//FreeBSD//DTD linuxdoc//EN'> -->
@@ -19,6 +19,26 @@
 <descrip>
 
 <tag><tt>
+set iface name [ <em>name</em> ]
+</tt></tag>
+
+This command changes interface name from default ngX to specified one.
+If name argument is not specified, original ngX name is restored.
+Note that inside Netgraph original ngX name is always used.
+
+<tag><tt>
+set iface description [ <em>description</em> ]
+</tt></tag>
+
+This command changes interface description.
+
+<tag><tt>
+set iface group [ <em>group</em> ]
+</tt></tag>
+
+This command add interface to specific group.
+
+<tag><tt>
 set iface addrs [!]<em>local-ip</em> [!]<em>remote-ip</em>
 </tt></tag>
 
--- a/contrib/mpd/doc/trafacct.sgml	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/doc/trafacct.sgml	Fri Sep 14 02:13:58 2012 +0300
@@ -1,4 +1,4 @@
-<!-- $Id: trafacct.sgml,v 1.6 2009/02/23 11:17:41 amotin Exp $ -->
+<!-- $Id: trafacct.sgml,v 1.8 2011/08/01 09:04:29 dmitryluhtionov Exp $ -->
 <!-- mpd netgraph enabled user mode PPP daemon -->
 
 <!-- <!DOCTYPE linuxdoc PUBLIC '-//FreeBSD//DTD linuxdoc//EN'> -->
@@ -22,7 +22,7 @@
   so it must be done before first bundle get connected.
 
   <bf>Note:</bf> This feature is available only on FreeBSD 6.0-RELEASE
-  and newer.
+  and newer. NetFlow v9 supprted only on FreeBSD 9.0-RELEASE and newer.
 
 <descrip>
 
@@ -41,6 +41,32 @@
 originate from a specific source.
 
 <tag><tt>
+set netflow version <em>ver</em>
+</tt></tag>
+
+Choose NetFlow version to export. Supported options are 5 or 9.
+
+Default is 5.
+
+<tag><tt>
+set netflow mtu <em>bytes</em>
+</tt></tag>
+
+Set export interface MTU to build packets of specified size (NetFlow
+v9-specific).
+
+Default is 1500.
+
+<tag><tt>
+set netflow template <em>time</em> <em>packets</em>
+</tt></tag>
+
+Modify time and packet timeouts to announce data flow templates (NetFlow
+v9-specific).
+
+Defaults are 600 and 500.
+
+<tag><tt>
 set netflow timeouts <em>inactive</em> <em>active</em>
 </tt></tag>
 
--- a/contrib/mpd/port/mpd5.sh	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/port/mpd5.sh	Fri Sep 14 02:13:58 2012 +0300
@@ -15,7 +15,7 @@
 # mpd_flags (string):	Set to "-b" by default.
 #			Extra flags passed to start command.
 #
-# See mpd(8) for flags.
+# See mpd5(8) for flags.
 #
 
 . %%RC_SUBR%%
--- a/contrib/mpd/src/Makefile	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/Makefile	Fri Sep 14 02:13:58 2012 +0300
@@ -1,4 +1,4 @@
-# $Id: Makefile,v 1.102 2010/12/21 12:14:29 amotin Exp $
+# $Id: Makefile,v 1.107 2012/01/11 11:50:16 amotin Exp $
 #
 # Makefile for mpd, multi-link PPP daemon for FreeBSD
 #
@@ -10,7 +10,7 @@
 PROG?=			mpd5
 PREFIX?=		/usr/local
 BINDIR?=		${PREFIX}/sbin
-VERSION=		5.6a1
+VERSION=		5.7a
 NOMAN=
 NO_MAN=
 
@@ -61,6 +61,10 @@
 
 NOLIBPDEL=		yes
 
+# Build without builtin web server
+
+NOWEB=			yes
+
 # Set syslog logging facility. Change LOG_DAEMON to whatever you like.
 
 SYSLOG_FACILITY=	LOG_DAEMON
@@ -138,15 +142,25 @@
 		console.c command.c ecp.c event.c fsm.c iface.c input.c \
 		ip.c ipcp.c ipv6cp.c lcp.c link.c log.c main.c mbuf.c mp.c \
 		msg.c ngfunc.c pap.c phys.c proto.c radius.c radsrv.c timer.c \
-		util.c vars.c eap.c msoft.c web.c ippool.c
+		util.c vars.c eap.c msoft.c ippool.c
+
+.if defined ( NOWEB )
+COPTS+=		-DNOWEB
+.else
+STDSRCS+=	web.c
+.endif
 
 .if defined ( NOLIBPDEL )
 COPTS+=		-DNOLIBPDEL -I./contrib/libpdel
 PDPATH1=	contrib/libpdel/util:contrib/libpdel/structs
-PDPATH2=	contrib/libpdel/http:contrib/libpdel/http/servlet
-PDPATH3=	contrib/libpdel/sys:contrib/libpdel/io
-PDPATH4=	contrib/libpdel/structs/type
+PDPATH2=	contrib/libpdel/structs/type
+.if defined ( NOWEB )
+VPATH+=		$(PDPATH1):$(PDPATH2)
+.else
+PDPATH3=	contrib/libpdel/http:contrib/libpdel/http/servlet
+PDPATH4=	contrib/libpdel/io
 VPATH+=		$(PDPATH1):$(PDPATH2):$(PDPATH3):$(PDPATH4)
+.endif
 PDELSRCS=	typed_mem.c \
 		pevent.c \
 		paction.c \
@@ -158,8 +172,9 @@
 		structs_type_array.c \
 		structs_type_int.c \
 		structs_type_string.c \
-		structs_type_struct.c \
-		http_connection.c \
+		structs_type_struct.c
+.if !defined ( NOWEB )
+PDELSRCS+=	http_connection.c \
 		http_head.c \
 		http_message.c \
 		http_mime.c \
@@ -174,6 +189,7 @@
 		string_fp.c \
 		timeout_fp.c
 .endif
+.endif
 
 # Add sources and flags for the various physical layer types
 
--- a/contrib/mpd/src/auth.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/auth.c	Fri Sep 14 02:13:58 2012 +0300
@@ -179,6 +179,10 @@
 
 void	authparamsInit(struct authparams *ap) {
     memset(ap,0,sizeof(struct authparams));
+    ap->msdomain = NULL;
+#ifdef SIOCSIFDESCR
+    ap->ifdescr = NULL;
+#endif
     SLIST_INIT(&ap->routes);
 }
 
@@ -212,6 +216,9 @@
     }
 
     Freee(ap->msdomain);
+#ifdef SIOCSIFDESCR
+    Freee(ap->ifdescr);
+#endif
     
     memset(ap,0,sizeof(struct authparams));
 }
@@ -252,6 +259,10 @@
 
     if (src->msdomain)
 	dst->msdomain = Mstrdup(MB_AUTH, src->msdomain);
+#ifdef SIOCSIFDESCR
+    if (src->ifdescr)
+	dst->ifdescr = Mstrdup(MB_AUTH, src->ifdescr);
+#endif
 }
 
 void	authparamsMove(struct authparams *src, struct authparams *dst)
@@ -709,6 +720,14 @@
 
     Printf("Auth Data\r\n");
     Printf("\tPeer authname   : %s\r\n", au->params.authname);
+    Printf("\tInterface name  : %s\r\n", au->params.ifname);
+#ifdef SIOCSIFDESCR
+    Printf("\tInterface descr.: \"%s\"\r\n", 
+	au->params.ifdescr != NULL ? au->params.ifdescr : "<none>");
+#endif
+#ifdef SIOCAIFGROUP
+    Printf("\tInterface group : %s\r\n", au->params.ifgroup);
+#endif
     Printf("\tIP range        : %s\r\n", (au->params.range_valid)?
 	u_rangetoa(&au->params.range,buf,sizeof(buf)):"");
     Printf("\tIP pool         : %s\r\n", au->params.ippool);
@@ -1320,8 +1339,7 @@
     err=errno;
     GIANT_MUTEX_UNLOCK(); /* We must release lock before Log() */
     if (err)
-      Log(LG_ERR, ("[%s] AUTH: Error retrieving passwd: %s",
-        auth->info.lnkname, strerror(errno)));
+      Perror("[%s] AUTH: Error retrieving passwd", auth->info.lnkname);
     else
       Log(LG_AUTH, ("[%s] AUTH: User \"%s\" not found in the systems database",
         auth->info.lnkname, auth->params.authname));
@@ -2274,6 +2292,18 @@
     } else if (strcmp(attr, "MPD_ACTION") == 0) {
 	strlcpy(auth->params.action, val, sizeof(auth->params.action));
 
+    } else if (strcmp(attr, "MPD_IFACE_NAME") == 0) {
+	strlcpy(auth->params.ifname, val, sizeof(auth->params.ifname));
+
+#ifdef SIOCSIFDESCR
+    } else if (strcmp(attr, "MPD_IFACE_DESCR") == 0) {
+	Freee(auth->params.ifdescr);
+	auth->params.ifdescr = Mstrdup(MB_AUTH, val);
+#endif /* SIOCSIFDESCR */
+#ifdef SIOCAIFGROUP
+    } else if (strcmp(attr, "MPD_IFACE_GROUP") == 0) {
+	strlcpy(auth->params.ifgroup, val, sizeof(auth->params.ifgroup));
+#endif
 #if defined(USE_IPFW) || defined(USE_NG_BPF)
     } else if (strncmp(attr, "MPD_", 4) == 0) {
 	struct acl	**acls, *acls1;
--- a/contrib/mpd/src/auth.h	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/auth.h	Fri Sep 14 02:13:58 2012 +0300
@@ -156,6 +156,15 @@
     char		peermacaddr[32];	/* hr representation of the peer MAC address */
     char		peeriface[IFNAMSIZ];	/* hr representation of the peer interface */
 
+    /* Iface stuff */
+    char		ifname[IFNAMSIZ];	/* Interface name */
+#ifdef SIOCSIFDESCR
+    char		*ifdescr;		/* Interface description */
+#endif
+#ifdef SIOCAIFGROUP
+    char		ifgroup[IFNAMSIZ];	/* Interface group */
+#endif
+
     struct {
       int	policy;			/* MPPE_POLICY_* */
       int	types;			/* MPPE_TYPE_*BIT bitmask */
--- a/contrib/mpd/src/bund.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/bund.c	Fri Sep 14 02:13:58 2012 +0300
@@ -907,6 +907,7 @@
 
     /* Update interface MTU */
     IfaceSetMTU(b, mtu);
+ 
 }
 
 /*
@@ -1071,7 +1072,7 @@
     if (ac - stay < 1 || ac - stay > 2)
 	return(-1);
 
-    if (strlen(av[0 + stay]) >= (LINK_MAX_NAME - tmpl * 5))
+    if (strlen(av[0 + stay]) >= (LINK_MAX_NAME - tmpl * (IFNUMLEN + 1)))
 	Error("Bundle name \"%s\" is too long", av[0 + stay]);
 
     /* See if bundle name already taken */
@@ -1247,9 +1248,14 @@
 
     Log(LG_BUND, ("[%s] Bundle: Shutdown", b->name));
     for (k = 0; k < NG_PPP_MAX_LINKS; k++) {
-	if ((l = b->links[k]) != NULL)
+	if ((l = b->links[k]) != NULL) {
 	    if (!l->stay)
 		LinkShutdown(l);
+	    else {
+		l->bund = NULL;
+		b->links[k] = NULL;
+	    }
+	}
     }
 
     if (b->hook[0])
@@ -1257,6 +1263,7 @@
     gBundles[b->id] = NULL;
     MsgUnRegister(&b->msgs);
     b->dead = 1;
+    IfaceDestroy(b);
     UNREF(b);
 }
 
@@ -1673,17 +1680,17 @@
     b->iface.ifindex = if_nametoindex(b->iface.ifname);
     Log(LG_BUND|LG_IFACE, ("[%s] Bundle: Interface %s created",
 	b->name, b->iface.ifname));
- 
+
     /* Create new PPP node */
     snprintf(b->hook, sizeof(b->hook), "b%d", b->id);
-
+    memset(&mp, 0, sizeof(mp));
     strcpy(mp.type, NG_PPP_NODE_TYPE);
     strcpy(mp.ourhook, b->hook);
     strcpy(mp.peerhook, NG_PPP_HOOK_BYPASS);
     if (NgSendMsg(gLinksCsock, ".:",
     	    NGM_GENERIC_COOKIE, NGM_MKPEER, &mp, sizeof(mp)) < 0) {
-	Log(LG_ERR, ("[%s] can't create %s node at \"%s\"->\"%s\": %s",
-    	    b->name, mp.type, ".:", mp.ourhook, strerror(errno)));
+	Perror("[%s] can't create %s node at \"%s\"->\"%s\"",
+    	    b->name, mp.type, ".:", mp.ourhook);
 	goto fail;
     }
     newPpp = 1;
@@ -1692,11 +1699,12 @@
     b->nodeID = NgGetNodeID(gLinksCsock, b->hook);
 
     /* Give it a name */
+    memset(&nm, 0, sizeof(nm));
     snprintf(nm.name, sizeof(nm.name), "mpd%d-%s", gPid, b->name);
     if (NgSendMsg(gLinksCsock, b->hook,
     	    NGM_GENERIC_COOKIE, NGM_NAME, &nm, sizeof(nm)) < 0) {
-	Log(LG_ERR, ("[%s] can't name %s node \"%s\": %s",
-    	    b->name, NG_PPP_NODE_TYPE, b->hook, strerror(errno)));
+	Perror("[%s] can't name %s node \"%s\"",
+    	    b->name, NG_PPP_NODE_TYPE, b->hook);
 	goto fail;
     }
 
--- a/contrib/mpd/src/ccp.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/ccp.c	Fri Sep 14 02:13:58 2012 +0300
@@ -168,8 +168,7 @@
     /* Create a netgraph socket node */
     snprintf(name, sizeof(name), "mpd%d-cso", gPid);
     if (NgMkSockNode(name, &gCcpCsock, &gCcpDsock) < 0) {
-	Log(LG_ERR, ("CcpsInit(): can't create %s node: %s",
-    	    NG_SOCKET_NODE_TYPE, strerror(errno)));
+	Perror("CcpsInit(): can't create %s node", NG_SOCKET_NODE_TYPE);
 	return(-1);
     }
     (void) fcntl(gCcpCsock, F_SETFD, 1);
@@ -318,8 +317,7 @@
 
     /* Read message */
     if ((len = NgRecvMsg(gCcpCsock, &u.msg, sizeof(u), raddr)) < 0) {
-	Log(LG_ERR, ("CcpNgCtrlEvent: can't read message: %s",
-    	    strerror(errno)));
+	Perror("CcpNgCtrlEvent: can't read message");
 	return;
     }
     
@@ -811,8 +809,8 @@
     strcpy(cn.peerhook, NG_PPP_HOOK_COMPRESS);
     if (NgSendMsg(gCcpCsock, ".:",
 	    NGM_GENERIC_COOKIE, NGM_CONNECT, &cn, sizeof(cn)) < 0) {
-	Log(LG_ERR, ("[%s] can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\": %s",
-    	    b->name, ".:", cn.ourhook, cn.path, cn.peerhook, strerror(errno)));
+	Perror("[%s] can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\"",
+    	    b->name, ".:", cn.ourhook, cn.path, cn.peerhook);
     }
   }
 
@@ -823,8 +821,8 @@
     strcpy(cn.peerhook, NG_PPP_HOOK_DECOMPRESS);
     if (NgSendMsg(gCcpCsock, ".:",
 	    NGM_GENERIC_COOKIE, NGM_CONNECT, &cn, sizeof(cn)) < 0) {
-	Log(LG_ERR, ("[%s] can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\": %s",
-    	    b->name, ".:", cn.ourhook, cn.path, cn.peerhook, strerror(errno)));
+	Perror("[%s] can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\"",
+    	    b->name, ".:", cn.ourhook, cn.path, cn.peerhook);
     }
   }
 
--- a/contrib/mpd/src/ccp_deflate.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/ccp_deflate.c	Fri Sep 14 02:13:58 2012 +0300
@@ -95,8 +95,7 @@
     strcpy(mp.peerhook, deflatehook);
     if (NgSendMsg(gCcpCsock, path,
     	    NGM_GENERIC_COOKIE, NGM_MKPEER, &mp, sizeof(mp)) < 0) {
-	Log(LG_ERR, ("[%s] can't create %s node: %s",
-    	    b->name, mp.type, strerror(errno)));
+	Perror("[%s] can't create %s node", b->name, mp.type);
 	return(-1);
     }
 
@@ -113,8 +112,8 @@
     snprintf(path, sizeof(path), "[%x]:", id);
     if (NgSendMsg(gCcpCsock, path,
     	    NGM_DEFLATE_COOKIE, NGM_DEFLATE_CONFIG, &conf, sizeof(conf)) < 0) {
-	Log(LG_ERR, ("[%s] can't config %s node at %s: %s",
-    	    b->name, NG_DEFLATE_NODE_TYPE, path, strerror(errno)));
+	Perror("[%s] can't config %s node at %s",
+    	    b->name, NG_DEFLATE_NODE_TYPE, path);
 	NgFuncShutdownNode(gCcpCsock, b->name, path);
 	return(-1);
     }
@@ -194,8 +193,7 @@
     snprintf(path, sizeof(path), "[%x]:", b->ccp.comp_node_id);
     if (NgSendMsg(gCcpCsock, path,
     	    NGM_DEFLATE_COOKIE, NGM_DEFLATE_RESETREQ, NULL, 0) < 0) {
-	Log(LG_ERR, ("[%s] reset-req to %s node: %s",
-    	    b->name, NG_DEFLATE_NODE_TYPE, strerror(errno)));
+	Perror("[%s] reset-req to %s node", b->name, NG_DEFLATE_NODE_TYPE);
     }
     return(NULL);
 }
@@ -222,8 +220,7 @@
     snprintf(path, sizeof(path), "[%x]:", b->ccp.decomp_node_id);
     if (NgSendMsg(gCcpCsock, path,
     	    NGM_DEFLATE_COOKIE, NGM_DEFLATE_RESETREQ, NULL, 0) < 0) {
-	Log(LG_ERR, ("[%s] reset-ack to %s node: %s",
-    	    b->name, NG_DEFLATE_NODE_TYPE, strerror(errno)));
+	Perror("[%s] reset-ack to %s node", b->name, NG_DEFLATE_NODE_TYPE);
     }
 }
 
@@ -346,8 +343,7 @@
     }
     if (NgFuncSendQuery(path, NGM_DEFLATE_COOKIE, NGM_DEFLATE_GET_STATS, NULL, 0, 
 	&u.reply, sizeof(u), NULL) < 0) {
-	    Log(LG_ERR, ("[%s] can't get %s stats: %s",
-		b->name, NG_DEFLATE_NODE_TYPE, strerror(errno)));
+	    Perror("[%s] can't get %s stats", b->name, NG_DEFLATE_NODE_TYPE);
 	    return(0);
     }
     memcpy(&stats, u.reply.data, sizeof(stats));
--- a/contrib/mpd/src/ccp_mppc.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/ccp_mppc.c	Fri Sep 14 02:13:58 2012 +0300
@@ -191,8 +191,7 @@
     strcpy(mp.peerhook, mppchook);
     if (NgSendMsg(gCcpCsock, path,
 	    NGM_GENERIC_COOKIE, NGM_MKPEER, &mp, sizeof(mp)) < 0) {
-	Log(LG_ERR, ("[%s] can't create %s node: %s",
-    	    b->name, mp.type, strerror(errno)));
+	Perror("[%s] can't create %s node", b->name, mp.type);
 	return(-1);
     }
 
@@ -209,8 +208,8 @@
     snprintf(path, sizeof(path), "[%x]:", id);
     if (NgSendMsg(gCcpCsock, path,
     	    NGM_MPPC_COOKIE, cmd, &conf, sizeof(conf)) < 0) {
-	Log(LG_ERR, ("[%s] can't config %s node at %s: %s",
-    	    b->name, NG_MPPC_NODE_TYPE, path, strerror(errno)));
+	Perror("[%s] can't config %s node at %s",
+    	    b->name, NG_MPPC_NODE_TYPE, path);
 	NgFuncShutdownNode(gCcpCsock, b->name, path);
 	return(-1);
     }
@@ -494,8 +493,7 @@
     snprintf(path, sizeof(path), "[%x]:", b->ccp.comp_node_id);
     if (NgSendMsg(gCcpCsock, path,
     	    NGM_MPPC_COOKIE, NGM_MPPC_RESETREQ, NULL, 0) < 0) {
-	Log(LG_ERR, ("[%s] reset-req to %s node: %s",
-    	    b->name, NG_MPPC_NODE_TYPE, strerror(errno)));
+	Perror("[%s] reset-req to %s node", b->name, NG_MPPC_NODE_TYPE);
     }
 
     /* No ResetAck required for MPPC */
@@ -754,8 +752,7 @@
 
     /* Create a netgraph socket node */
     if (NgMkSockNode(NULL, &cs, &ds) < 0) {
-	Log(LG_ERR, ("MppcTestCap: can't create socket node: %s",
-    	    strerror(errno)));
+	Perror("MppcTestCap: can't create socket node");
     	return(-1);
     }
 
@@ -765,8 +762,7 @@
     strcpy(mp.peerhook, NG_MPPC_HOOK_COMP);
     if (NgSendMsg(cs, ".",
       NGM_GENERIC_COOKIE, NGM_MKPEER, &mp, sizeof(mp)) < 0) {
-	Log(LG_ERR, ("MppcTestCap: can't create %s node: %s",
-    	    mp.type, strerror(errno)));
+	Perror("MppcTestCap: can't create %s node", mp.type);
 	goto done;
     }
 
@@ -779,8 +775,7 @@
     if (NgSendMsg(cs, "mppc",
       NGM_MPPC_COOKIE, NGM_MPPC_CONFIG_COMP, &conf, sizeof(conf)) < 0) {
         if (errno != EPROTONOSUPPORT) {
-	    Log(LG_ERR, ("MppcTestCap: can't config %s node: %s",
-    		NG_MPPC_NODE_TYPE, strerror(errno)));
+	    Perror("MppcTestCap: can't config %s node", NG_MPPC_NODE_TYPE);
 	}
     } else 
 	MPPCPresent = 1;
@@ -791,8 +786,7 @@
     if (NgSendMsg(cs, "mppc",
       NGM_MPPC_COOKIE, NGM_MPPC_CONFIG_COMP, &conf, sizeof(conf)) < 0) {
         if (errno != EPROTONOSUPPORT) {
-	    Log(LG_ERR, ("MppcTestCap: can't config %s node: %s",
-    		NG_MPPC_NODE_TYPE, strerror(errno)));
+	    Perror("MppcTestCap: can't config %s node", NG_MPPC_NODE_TYPE);
 	}
     } else 
 	MPPEPresent = 1;
--- a/contrib/mpd/src/ccp_pred1.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/ccp_pred1.c	Fri Sep 14 02:13:58 2012 +0300
@@ -146,8 +146,7 @@
     strcpy(mp.peerhook, pred1hook);
     if (NgSendMsg(gCcpCsock, path,
     	    NGM_GENERIC_COOKIE, NGM_MKPEER, &mp, sizeof(mp)) < 0) {
-	Log(LG_ERR, ("[%s] can't create %s node: %s",
-    	    b->name, mp.type, strerror(errno)));
+	Perror("[%s] can't create %s node", b->name, mp.type);
 	return(-1);
     }
 
@@ -164,8 +163,8 @@
     snprintf(path, sizeof(path), "[%x]:", id);
     if (NgSendMsg(gCcpCsock, path,
     	    NGM_PRED1_COOKIE, NGM_PRED1_CONFIG, &conf, sizeof(conf)) < 0) {
-	Log(LG_ERR, ("[%s] can't config %s node at %s: %s",
-    	    b->name, NG_PRED1_NODE_TYPE, path, strerror(errno)));
+	Perror("[%s] can't config %s node at %s",
+    	    b->name, NG_PRED1_NODE_TYPE, path);
 	NgFuncShutdownNode(gCcpCsock, b->name, path);
 	return(-1);
     }
@@ -389,8 +388,7 @@
     snprintf(path, sizeof(path), "[%x]:", b->ccp.comp_node_id);
     if (NgSendMsg(gCcpCsock, path,
     	    NGM_PRED1_COOKIE, NGM_PRED1_RESETREQ, NULL, 0) < 0) {
-	Log(LG_ERR, ("[%s] reset to %s node: %s",
-    	    b->name, NG_PRED1_NODE_TYPE, strerror(errno)));
+	Perror("[%s] reset to %s node", b->name, NG_PRED1_NODE_TYPE);
     }
 #endif
 return(NULL);
@@ -424,8 +422,7 @@
     snprintf(path, sizeof(path), "[%x]:", b->ccp.decomp_node_id);
     if (NgSendMsg(gCcpCsock, path,
     	    NGM_PRED1_COOKIE, NGM_PRED1_RESETREQ, NULL, 0) < 0) {
-	Log(LG_ERR, ("[%s] reset to %s node: %s",
-    	    b->name, NG_PRED1_NODE_TYPE, strerror(errno)));
+	Perror("[%s] reset to %s node", b->name, NG_PRED1_NODE_TYPE);
     }
 #endif
 }
@@ -544,8 +541,7 @@
     }
     if (NgFuncSendQuery(path, NGM_PRED1_COOKIE, NGM_PRED1_GET_STATS, NULL, 0, 
 	&u.reply, sizeof(u), NULL) < 0) {
-	    Log(LG_ERR, ("[%s] can't get %s stats: %s",
-		b->name, NG_PRED1_NODE_TYPE, strerror(errno)));
+	    Perror("[%s] can't get %s stats", b->name, NG_PRED1_NODE_TYPE);
 	    return(0);
     }
     memcpy(&stats, u.reply.data, sizeof(stats));
--- a/contrib/mpd/src/chat.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/chat.c	Fri Sep 14 02:13:58 2012 +0300
@@ -379,7 +379,7 @@
     {
       if (errno == EAGAIN)
 	break;
-      Log(LG_ERR, ("[%s] CHAT: read: %s", l->name, strerror(errno)));
+      Perror("[%s] CHAT: read", l->name);
       goto die;
     }
     else if (nread == 0)
@@ -1205,7 +1205,7 @@
   if ((nw = write(c->fd, c->out, c->outLen)) < 0) {
     if (errno == EAGAIN)
       return;
-    Log(LG_ERR, ("[%s] CHAT: write: %s", l->name, strerror(errno)));
+    Perror("[%s] CHAT: write", l->name);
     ChatFailure(c);
     return;
   }
--- a/contrib/mpd/src/command.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/command.c	Fri Sep 14 02:13:58 2012 +0300
@@ -181,21 +181,21 @@
 
   static const struct cmdtab ShowSessCmds[] = {
     { "iface {name}",			"Filter by iface name",
-	ShowSessions, NULL, 2, (void *) SHOW_IFACE },
+	ShowSessions, NULL, 0, (void *) SHOW_IFACE },
     { "ip {ip}",			"Filter by IP address",
-	ShowSessions, NULL, 2, (void *) SHOW_IP },
+	ShowSessions, NULL, 0, (void *) SHOW_IP },
     { "user {name}",			"Filter by user name",
-	ShowSessions, NULL, 2, (void *) SHOW_USER },
+	ShowSessions, NULL, 0, (void *) SHOW_USER },
     { "session {ID}",			"Filter by session ID",
-	ShowSessions, NULL, 2, (void *) SHOW_SESSION },
+	ShowSessions, NULL, 0, (void *) SHOW_SESSION },
     { "msession {ID}",			"Filter by msession ID",
-	ShowSessions, NULL, 2, (void *) SHOW_MSESSION },
+	ShowSessions, NULL, 0, (void *) SHOW_MSESSION },
     { "bundle {name}",			"Filter by bundle name",
-	ShowSessions, NULL, 2, (void *) SHOW_BUNDLE },
+	ShowSessions, NULL, 0, (void *) SHOW_BUNDLE },
     { "link {name}",			"Filter by link name",
-	ShowSessions, NULL, 2, (void *) SHOW_LINK },
+	ShowSessions, NULL, 0, (void *) SHOW_LINK },
     { "peer {name}",			"Filter by peer name",
-	ShowSessions, NULL, 2, (void *) SHOW_PEER },
+	ShowSessions, NULL, 0, (void *) SHOW_PEER },
     { NULL },
   };
 
@@ -273,12 +273,18 @@
     { "version",			"Version string",
 	ShowVersion, NULL, 0, NULL },
     { "sessions [ {param} {value} ]",	"Active sessions",
-	CMD_SUBMENU, NULL, 2, (void *) ShowSessCmds},
+	CMD_SUBMENU, NULL, 0, (void *) ShowSessCmds},
     { "summary",			"Daemon status summary",
 	ShowSummary, NULL, 0, NULL },
     { NULL },
   };
 
+  static const struct cmdtab UnSetCommands[] = {
+   { "radius ...",			"RADIUS stuff",
+	CMD_SUBMENU, AdmitLink, 2, (void *) RadiusUnSetCmds },
+	{ NULL },
+  };
+  
   static const struct cmdtab SetCommands[] = {
     { "bundle ...",			"Bundle specific stuff",
 	CMD_SUBMENU, AdmitBund, 2, (void *) BundSetCmds },
@@ -370,6 +376,8 @@
 	SessionCommand, NULL, 0, NULL },
     { "set ...",			"Set parameters",
 	CMD_SUBMENU, NULL, 0, (void *) SetCommands },
+	{ "unset ...",			"Unset parameters",
+	CMD_SUBMENU, NULL, 0, (void *) UnSetCommands },
     { "show ...",			"Show status",
 	CMD_SUBMENU, NULL, 0, (void *) ShowCommands },
     { NULL },
--- a/contrib/mpd/src/console.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/console.c	Fri Sep 14 02:13:58 2012 +0300
@@ -233,10 +233,13 @@
   cs->write = ConsoleSessionWrite;
   cs->writev = ConsoleSessionWriteV;
   cs->prompt = ConsoleSessionShowPrompt;
-//  cs->state = STATE_USERNAME;
-  cs->state = STATE_AUTHENTIC;
+#ifdef WITH_CONSOLE_AUTH
+    cs->state = STATE_USERNAME;
+#else
+    cs->state = STATE_AUTHENTIC;
+    cs->context.priv = 2;
+#endif
   cs->context.cs = cs;
-  cs->context.priv = 2; //-
   RWLOCK_WRLOCK(c->lock);
   SLIST_INSERT_HEAD(&c->sessions, cs, next);
   RWLOCK_UNLOCK(c->lock);
@@ -301,7 +304,12 @@
     cs->write = StdConsoleSessionWrite;
     cs->writev = StdConsoleSessionWriteV;
     cs->prompt = ConsoleSessionShowPrompt;
+#ifdef WITH_CONSOLE_AUTH
+    cs->state = STATE_USERNAME;
+#else
     cs->state = STATE_AUTHENTIC;
+    cs->context.priv = 2;
+#endif
     cs->context.cs = cs;
     strcpy(cs->user.username, "root");
     cs->context.priv = 2;
@@ -351,6 +359,7 @@
     /* Restore original STDxxx flags. */
     if (gOrigFlags>=0)
 	fcntl(cs->fd, F_SETFL, gOrigFlags);
+    cs->close = NULL;
     return;
 }
 
@@ -375,9 +384,9 @@
       if (n < 0) {
 	if (errno == EAGAIN)
 	  goto out;
-	Log(LG_ERR, ("CONSOLE: Error while reading: %s", strerror(errno)));
+	Perror("CONSOLE: Error while reading");
       } else {
-        if (cs->fd == 0)
+        if (cs->fd == 0 && isatty(cs->fd))
 	  goto out;
 	Log(LG_ERR, ("CONSOLE: Connection closed by peer"));
       }
@@ -827,6 +836,21 @@
 }
 
 /*
+ * ConsoleShutdown()
+ */
+
+void
+ConsoleShutdown(Console c)
+{
+    ConsoleSession s, tmp;
+
+    SLIST_FOREACH_SAFE(s, &c->sessions, next, tmp) {
+	if (s->close != NULL)
+		s->close(s);
+    }
+}
+
+/*
  * UserCommand()
  */
 
--- a/contrib/mpd/src/console.h	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/console.h	Fri Sep 14 02:13:58 2012 +0300
@@ -112,6 +112,7 @@
   extern int	ConsoleClose(Console c);
   extern int	ConsoleStat(Context ctx, int ac, char *av[], void *arg);
   extern Context	StdConsoleConnect(Console c);
+  extern void	ConsoleShutdown(Console c);
 
   extern int	UserCommand(Context ctx, int ac, char *av[], void *arg);
   extern int	UserStat(Context ctx, int ac, char *av[], void *arg);
--- a/contrib/mpd/src/contrib/libpdel/util/pevent.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/contrib/libpdel/util/pevent.c	Fri Sep 14 02:13:58 2012 +0300
@@ -210,13 +210,13 @@
 		if ((errno = pthread_attr_init(&ctx->attr)) != 0)
 			goto fail;
 		ctx->has_attr = 1;
-		pthread_attr_getinheritsched(attr, &value);
+		pthread_attr_getinheritsched((pthread_attr_t *) attr, &value);
 		pthread_attr_setinheritsched(&ctx->attr, value);
-		pthread_attr_getschedparam(attr, &param);
+		pthread_attr_getschedparam((pthread_attr_t *) attr, &param);
 		pthread_attr_setschedparam(&ctx->attr, &param);
-		pthread_attr_getschedpolicy(attr, &value);
+		pthread_attr_getschedpolicy((pthread_attr_t *) attr, &value);
 		pthread_attr_setschedpolicy(&ctx->attr, value);
-		pthread_attr_getscope(attr, &value);
+		pthread_attr_getscope((pthread_attr_t *) attr, &value);
 		pthread_attr_setscope(&ctx->attr, value);
 	}
 
--- a/contrib/mpd/src/contrib/libpdel/util/typed_mem.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/contrib/libpdel/util/typed_mem.c	Fri Sep 14 02:13:58 2012 +0300
@@ -210,8 +210,10 @@
 	pthread_mutexattr_destroy(&mattr);
 
 	/* Fill in guard bytes */
-	for (i = 0; i < ALIGNMENT; i++)
-		typed_mem_guard[i] = typed_mem_guard_data[i % ALIGNMENT];
+	for (i = 0; i < ALIGNMENT; i++) {
+		typed_mem_guard[i] = typed_mem_guard_data[
+		    i % sizeof(typed_mem_guard_data)];
+	}
 
 	/* Done */
 	typed_mem_enabled = 1;
@@ -570,8 +572,12 @@
 	char *s;
 	int r;
 
-	if ((r = vasprintf(ret, fmt, args)) == -1)
+	if ((r = vasprintf(ret, fmt, args)) == -1) {
+		*ret = NULL;
 		return (-1);
+	}
+	if (!typed_mem_enabled)
+		return r;
 	s = *ret;
 #if TYPED_MEM_TRACE
 	*ret = typed_mem_strdup(file, line, type, s);
--- a/contrib/mpd/src/defs.h	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/defs.h	Fri Sep 14 02:13:58 2012 +0300
@@ -108,6 +108,9 @@
   #define DEFAULT_RADSRV_PORT	3799
   #define DEFAULT_RADSRV_IP	"0.0.0.0"
 
+  /* Characters, leave for interface number. For example: ppp9999 */
+  #define IFNUMLEN		(sizeof("9999") - 1)
+
   /* Forward decl's */
   struct linkst;
   typedef struct linkst *Link;
--- a/contrib/mpd/src/ecp.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/ecp.c	Fri Sep 14 02:13:58 2012 +0300
@@ -171,8 +171,7 @@
     /* Create a netgraph socket node */
     snprintf(name, sizeof(name), "mpd%d-eso", gPid);
     if (NgMkSockNode(name, &gEcpCsock, &gEcpDsock) < 0) {
-	Log(LG_ERR, ("EcpsInit(): can't create %s node: %s",
-    	    NG_SOCKET_NODE_TYPE, strerror(errno)));
+	Perror("EcpsInit(): can't create %s node", NG_SOCKET_NODE_TYPE);
 	return(-1);
     }
     (void) fcntl(gEcpCsock, F_SETFD, 1);
@@ -653,8 +652,8 @@
     strcpy(cn.peerhook, NG_PPP_HOOK_DECRYPT);
     if (NgSendMsg(gEcpCsock, ".:",
 	    NGM_GENERIC_COOKIE, NGM_CONNECT, &cn, sizeof(cn)) < 0) {
-	Log(LG_ERR, ("[%s] can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\": %s",
-        b->name, ".:", cn.ourhook, cn.path, cn.peerhook,  strerror(errno)));
+	Perror("[%s] can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\"",
+          b->name, ".:", cn.ourhook, cn.path, cn.peerhook);
     }
   }
   if (ecp->xmit && ecp->xmit->Encrypt)
@@ -665,8 +664,8 @@
     strcpy(cn.peerhook, NG_PPP_HOOK_ENCRYPT);
     if (NgSendMsg(gEcpCsock, ".:",
 	    NGM_GENERIC_COOKIE, NGM_CONNECT, &cn, sizeof(cn)) < 0) {
-	Log(LG_ERR, ("[%s] can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\": %s",
-        b->name, ".:", cn.ourhook, cn.path, cn.peerhook, strerror(errno)));
+	Perror("[%s] can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\"",
+          b->name, ".:", cn.ourhook, cn.path, cn.peerhook);
     }
   }
 
--- a/contrib/mpd/src/event.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/event.c	Fri Sep 14 02:13:58 2012 +0300
@@ -1,7 +1,7 @@
 /*
  * See ``COPYRIGHT.mpd''
  *
- * $Id: event.c,v 1.20 2011/06/30 09:17:28 dmitryluhtionov Exp $
+ * $Id: event.c,v 1.21 2011/07/11 09:09:22 dmitryluhtionov Exp $
  *
  */
 
@@ -84,7 +84,7 @@
 
     if (pevent_register(gPeventCtx, &refp->pe, flags, &gGiantMutex, EventHandler,
 	    refp, type, val) == -1) {
-        Log(LG_ERR, ("%s: error pevent_register: %s", __FUNCTION__, strerror(errno)));
+        Perror("%s: error pevent_register", __FUNCTION__);
         return(-1);
     }
   
--- a/contrib/mpd/src/iface.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/iface.c	Fri Sep 14 02:13:58 2012 +0300
@@ -20,6 +20,7 @@
 #include "util.h"
 
 #include <sys/sockio.h>
+#include <sys/sysctl.h>
 #include <net/if.h>
 #include <net/if_types.h>
 #include <net/if_dl.h>
@@ -71,6 +72,12 @@
     SET_ROUTE,
     SET_MTU,
     SET_NAME,
+#ifdef SIOCSIFDESCR
+    SET_DESCR,
+#endif
+#ifdef SIOCAIFGROUP
+    SET_GROUP,
+#endif
     SET_UP_SCRIPT,
     SET_DOWN_SCRIPT,
     SET_ENABLE,
@@ -131,7 +138,15 @@
   static int	IfaceFindACL (struct acl_pool *ap, char * ifname, int number);
   static char *	IFaceParseACL (char * src, char * ifname);
 #endif
-  
+
+  static int	IfaceSetName(Bund b, const char * ifname);
+#ifdef SIOCSIFDESCR
+  static int	IfaceSetDescr(Bund b, const char * ifdescr);
+#endif
+#ifdef SIOCAIFGROUP
+  static int	IfaceAddGroup(Bund b, const char * ifgroup);
+  static int	IfaceDelGroup(Bund b, const char * ifgroup);
+#endif
 /*
  * GLOBAL VARIABLES
  */
@@ -143,8 +158,16 @@
 	IfaceSetCommand, NULL, 2, (void *) SET_ROUTE },
     { "mtu {size}",			"Set max allowed interface MTU",
 	IfaceSetCommand, NULL, 2, (void *) SET_MTU },
-    { "name {name}",			"Set interface name",
+    { "name [{name}]",			"Set interface name",
 	IfaceSetCommand, NULL, 2, (void *) SET_NAME },
+#ifdef SIOCSIFDESCR
+    { "description [{descr}]",		"Set interface description",
+	IfaceSetCommand, NULL, 2, (void *) SET_DESCR },
+#endif
+#ifdef SIOCAIFGROUP
+    { "group [{group}]",		"Set interface group",
+	IfaceSetCommand, NULL, 2, (void *) SET_GROUP },
+#endif
     { "up-script [{progname}]",		"Interface up script",
 	IfaceSetCommand, NULL, 2, (void *) SET_UP_SCRIPT },
     { "down-script [{progname}]",	"Interface down script",
@@ -169,15 +192,23 @@
   static const struct confinfo	gConfList[] = {
     { 0,	IFACE_CONF_ONDEMAND,		"on-demand"	},
     { 0,	IFACE_CONF_PROXY,		"proxy-arp"	},
+#ifdef USE_NG_TCPMSS
     { 0,	IFACE_CONF_TCPMSSFIX,           "tcpmssfix"	},
+#endif
     { 0,	IFACE_CONF_TEE,			"tee"		},
+#ifdef USE_NG_NAT
     { 0,	IFACE_CONF_NAT,			"nat"		},
+#endif
+#ifdef USE_NG_NETFLOW
     { 0,	IFACE_CONF_NETFLOW_IN,		"netflow-in"	},
     { 0,	IFACE_CONF_NETFLOW_OUT,		"netflow-out"	},
 #ifdef NG_NETFLOW_CONF_ONCE
     { 0,	IFACE_CONF_NETFLOW_ONCE,	"netflow-once"	},
 #endif
+#endif
+#ifdef USE_NG_IPACCT
     { 0,	IFACE_CONF_IPACCT,		"ipacct"	},
+#endif
     { 0,	0,				NULL		},
   };
 
@@ -240,6 +271,10 @@
   /* Default configuration */
   iface->mtu = NG_IFACE_MTU_DEFAULT;
   iface->max_mtu = NG_IFACE_MTU_DEFAULT;
+#ifdef SIOCSIFDESCR
+  iface->ifdescr = NULL;
+  iface->conf.ifdescr = NULL;
+#endif
   Disable(&iface->options, IFACE_CONF_ONDEMAND);
   Disable(&iface->options, IFACE_CONF_PROXY);
   Disable(&iface->options, IFACE_CONF_TCPMSSFIX);
@@ -262,6 +297,28 @@
     IfaceState	const iface = &b->iface;
 
     memcpy(iface, &bt->iface, sizeof(*iface));
+
+    /* Copy interface name from template config to current */
+    if (bt->iface.conf.ifname[0] != 0 && b->tmpl == 0) {
+        snprintf(iface->conf.ifname, sizeof(iface->conf.ifname), "%s%d",
+             bt->iface.conf.ifname, b->id);
+        Log(LG_IFACE2, ("[%s] IFACE: Set conf.ifname to ", iface->conf.ifname));
+    }
+}
+
+/*
+ * IfaceDestroy()
+ */
+
+void
+IfaceDestroy(Bund b)
+{
+#ifdef SIOCSIFDESCR
+    IfaceState	const iface = &b->iface;
+
+    if (iface->conf.ifdescr != NULL)
+	Freee(iface->conf.ifdescr);
+#endif
 }
 
 /*
@@ -417,6 +474,37 @@
 	memset(&iface->idleStats, 0, sizeof(iface->idleStats));
     }
 
+    /* Update interface name and description */
+    if (b->params.ifname[0] != 0) {
+       if (IfaceSetName(b, b->params.ifname) != -1)
+	    Log(LG_BUND|LG_IFACE, ("[%s] IFACE: Rename interface %s to %s",
+		b->name, iface->ngname, b->params.ifname));
+    } else if (iface->conf.ifname[0] != 0) {
+       if (IfaceSetName(b, iface->conf.ifname) != -1)
+	    Log(LG_BUND|LG_IFACE, ("[%s] IFACE: Rename interface %s to %s",
+		b->name, iface->ngname, iface->conf.ifname));
+    }
+#ifdef SIOCSIFDESCR
+    if (b->params.ifdescr != NULL) {
+       if (IfaceSetDescr(b, b->params.ifdescr) != -1) {
+	    Log(LG_BUND|LG_IFACE, ("[%s] IFACE: Add description \"%s\"",
+		b->name, b->params.ifdescr));
+	    iface->ifdescr = b->params.ifdescr;
+	}
+    }
+#endif
+#ifdef SIOCAIFGROUP
+    if (iface->conf.ifgroup[0] != 0) {
+       if (IfaceAddGroup(b, iface->conf.ifgroup) != -1)
+	    Log(LG_BUND|LG_IFACE, ("[%s] IFACE: Add group %s to %s",
+		b->name, iface->conf.ifgroup, iface->ngname));
+    }
+    if (b->params.ifgroup[0] != 0) {
+       if (IfaceAddGroup(b, b->params.ifgroup) != -1)
+	    Log(LG_BUND|LG_IFACE, ("[%s] IFACE: Add group %s to %s",
+		b->name, b->params.ifgroup, iface->ngname));
+    }
+#endif
 #ifdef USE_IPFW
   /* Allocate ACLs */
   acls = b->params.acl_pipe;
@@ -477,7 +565,7 @@
   }
   acls = b->params.acl_table;
   while (acls != NULL) {
-    acl = Mdup(MB_IFACE, acls, sizeof(struct acl) + strlen(acls->rule));
+    acl = Mdup(MB_IPFW, acls, sizeof(struct acl) + strlen(acls->rule));
     acl->next = iface->tables;
     iface->tables = acl;
     ExecCmd(LG_IFACE2, b->name, "%s table %d add %s", PATH_IPFW, acls->real_number, acls->rule);
@@ -600,6 +688,48 @@
       PATH_IPFW, cb);
 #endif /* USE_IPFW */
 
+    /* Revert interface name and description */
+
+    if (strcmp(iface->ngname, iface->ifname) != 0) {
+	if (iface->conf.ifname[0] != 0) {
+	    /* Restore to config defined */
+	    if (IfaceSetName(b, iface->conf.ifname) != -1)
+		Log(LG_BUND|LG_IFACE, ("[%s] IFACE: Rename interface %s to %s",
+		    b->name, iface->ifname, iface->conf.ifname));
+	} else {
+	    /* Restore to original interface name */
+	    if (IfaceSetName(b, iface->ngname) != -1)
+		Log(LG_BUND|LG_IFACE, ("[%s] IFACE: Rename interface %s to %s",
+		    b->name, iface->ifname, iface->ngname));
+	}
+    }
+#ifdef SIOCSIFDESCR
+    if (iface->ifdescr != NULL) {
+	if (iface->conf.ifdescr != NULL) {
+	    /* Restore to config defined */
+	    if (IfaceSetDescr(b, iface->conf.ifdescr) != -1) {
+		Log(LG_BUND|LG_IFACE, ("[%s] IFACE: Set description \"%s\"",
+		    b->name, iface->conf.ifdescr));
+		iface->ifdescr = iface->conf.ifdescr;
+	    } else
+		iface->ifdescr = NULL;
+	} else {
+	    /* Restore to original (empty) */
+	    if (IfaceSetDescr(b, "") != -1) {
+		Log(LG_BUND|LG_IFACE, ("[%s] IFACE: Clear description",
+		    b->name));
+	    }
+	    iface->ifdescr = NULL;
+	}
+    }
+#endif
+#ifdef SIOCAIFGROUP
+    if (b->params.ifgroup[0] != 0) {
+       if (IfaceDelGroup(b, b->params.ifgroup) != -1)
+	    Log(LG_BUND|LG_IFACE, ("[%s] IFACE: Remove group %s from %s",
+		b->name, b->params.ifgroup, iface->ngname));
+    }
+#endif
 }
 
 /*
@@ -640,7 +770,7 @@
     int	i;
     struct acl_pool **rp,*rp1;
 
-    rp1 = Malloc(MB_IFACE, sizeof(struct acl_pool));
+    rp1 = Malloc(MB_IPFW, sizeof(struct acl_pool));
     strlcpy(rp1->ifname, ifname, sizeof(rp1->ifname));
     rp1->acl_number = number;
 
@@ -701,8 +831,8 @@
     int num,real_number;
     struct acl_pool *ap;
     
-    buf = Malloc(MB_IFACE, ACL_LEN);
-    buf1 = Malloc(MB_IFACE, ACL_LEN);
+    buf = Malloc(MB_IPFW, ACL_LEN);
+    buf1 = Malloc(MB_IPFW, ACL_LEN);
 
     strlcpy(buf, src, ACL_LEN);
     do {
@@ -1153,8 +1283,7 @@
 	else {
     	    if (NgFuncWritePppFrame(b, NG_PPP_BUNDLE_LINKNUM,
 		    iface->dodCache.proto, iface->dodCache.pkt) < 0) {
-		Log(LG_ERR, ("[%s] can't write cached pkt: %s",
-	    	    b->name, strerror(errno)));
+		Perror("[%s] can't write cached pkt", b->name);
     	    }
 	}
 	iface->dodCache.pkt = NULL;
@@ -1250,8 +1379,23 @@
 IfaceSetCommand(Context ctx, int ac, char *av[], void *arg)
 {
   IfaceState	const iface = &ctx->bund->iface;
-
-  if (ac == 0)
+  int		empty_arg;
+
+  switch ((intptr_t)arg) {
+    case SET_NAME:
+#ifdef SIOCSIFDESCR
+    case SET_DESCR:
+#endif
+    case SET_UP_SCRIPT:
+    case SET_DOWN_SCRIPT:
+      empty_arg = TRUE;
+      break;
+    default:
+      empty_arg = FALSE;
+      break;
+  }
+
+  if ((ac == 0) && (empty_arg == FALSE))
     return(-1);
   switch ((intptr_t)arg) {
     case SET_IDLE:
@@ -1329,6 +1473,10 @@
       {
 	int	max_mtu;
 
+	/* Check */
+	if (ac != 1)
+	  return(-1);
+
 	max_mtu = atoi(av[0]);
 	if (max_mtu < IFACE_MIN_MTU || max_mtu > IFACE_MAX_MTU)
 	  Error("Invalid interface mtu %d", max_mtu);
@@ -1337,37 +1485,71 @@
       break;
 
     case SET_NAME:
-      {
-	char *name = av[0];
-	struct ifreq ifr;
-	int s;
-
-	if (strlen(name) >= IF_NAMESIZE)
-	  Error("Interface name too long, >15 characters");
-
-	/* Get socket */
-	if ((s = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {
-	  Error("[%s] IFACE: Can't get socket to set name", ctx->bund->name);
+	switch (ac) {
+	  case 0:
+	    /* Restore original interface name */
+	    if (strcmp(iface->ifname, iface->ngname) != 0) {
+		iface->conf.ifname[0] = '\0';
+		return IfaceSetName(ctx->bund, iface->ngname);
+	    }
+	    break;
+	  case 1:
+	    if (strcmp(iface->ifname, av[0]) != 0) {
+		int ifmaxlen = IF_NAMESIZE - ctx->bund->tmpl * IFNUMLEN;
+		if (strlen(av[0]) >= ifmaxlen)
+		    Error("Interface name too long, >%d characters", ifmaxlen-1);
+		if ((strncmp(av[0], "ng", 2) == 0) &&
+		  ((ctx->bund->tmpl && av[0][2] == 0) ||
+		  (av[0][2] >= '0' && av[0][2] <= '9')))
+		    Error("This interface name is reserved");
+		strlcpy(iface->conf.ifname, av[0], sizeof(iface->conf.ifname));
+		return IfaceSetName(ctx->bund, av[0]);
+	    }
+	    break;
+	  default:
+	    return(-1);
 	}
-
-	/* Set name of interface */
-	memset(&ifr, 0, sizeof(ifr));
-	strlcpy(ifr.ifr_name, iface->ifname, sizeof(ifr.ifr_name));
-	ifr.ifr_data = (caddr_t)name;
-	Log(LG_IFACE2, ("[%s] IFACE: setting %s name to %s",
-	  ctx->bund->name, iface->ifname, name));
-	if (ioctl(s, SIOCSIFNAME, (char *)&ifr) != -1) {
-	  close(s);
-	  /* Save name */
-	  strlcpy(iface->ifname, name, sizeof(iface->ifname));
-	} else {
-	  close(s);
-	  Error("[%s] IFACE: ioctl(%s, %s)", ctx->bund->name,
-	    iface->ifname, "SIOCSIFNAME");
+	break;
+#ifdef SIOCSIFDESCR
+    case SET_DESCR:
+	if (ctx->bund->tmpl)
+	    Error("Impossible to apply on template");
+	if (iface->conf.ifdescr != NULL)
+	    Freee(iface->conf.ifdescr);
+	iface->conf.ifdescr = NULL;
+	iface->ifdescr = NULL;
+	switch (ac) {
+	  case 0:
+	    return IfaceSetDescr(ctx->bund, "");
+	    break;
+	  case 1:
+	    iface->conf.ifdescr = Mstrdup(MB_IFACE, av[0]);
+	    if (IfaceSetDescr(ctx->bund, av[0]) == 0) {
+		iface->ifdescr = iface->conf.ifdescr;
+		return(0);
+	    } else
+		return(-1);
+	    break;
+	  default:
+	    return(-1);
 	}
-      }
+	break;
+#endif
+#ifdef SIOCAIFGROUP
+    case SET_GROUP:
+	if (ac != 1)
+	  return(-1);
+
+	if (av[0][0] && isdigit(av[0][strlen(av[0]) - 1]))
+	    Error("Groupnames may not end in a digit");
+	if (strlen(av[0]) >= IFNAMSIZ)
+	    Error("Group name %s too long", av[0]);
+	if (iface->conf.ifgroup[0] != 0)
+	    IfaceDelGroup(ctx->bund, iface->conf.ifgroup);
+	strlcpy(iface->conf.ifgroup, av[0], IFNAMSIZ);
+	return IfaceAddGroup(ctx->bund, av[0]);
       break;
-
+#endif
     case SET_UP_SCRIPT:
       switch (ac) {
 	case 0:
@@ -1427,7 +1609,14 @@
 #endif
 
     Printf("Interface configuration:\r\n");
-    Printf("\tName            : %s\r\n", iface->ifname);
+    Printf("\tName            : %s\r\n", iface->conf.ifname);
+#ifdef SIOCSIFDESCR
+    Printf("\tDescription     : \"%s\"\r\n",
+	(iface->conf.ifdescr != NULL) ? iface->conf.ifdescr : "<none>");
+#endif
+#ifdef SIOCAIFGROUP
+    Printf("\tGroup           : %s\r\n", iface->conf.ifgroup);
+#endif
     Printf("\tMaximum MTU     : %d bytes\r\n", iface->max_mtu);
     Printf("\tIdle timeout    : %d seconds\r\n", iface->idle_timeout);
     Printf("\tSession timeout : %d seconds\r\n", iface->session_timeout);
@@ -1459,6 +1648,11 @@
     Printf("Interface status:\r\n");
     Printf("\tAdmin status    : %s\r\n", iface->open ? "OPEN" : "CLOSED");
     Printf("\tStatus          : %s\r\n", iface->up ? (iface->dod?"DoD":"UP") : "DOWN");
+    Printf("\tName            : %s\r\n", iface->ifname);
+#ifdef SIOCSIFDESCR
+    Printf("\tDescription     : \"%s\"\r\n",
+	(iface->ifdescr != NULL) ? iface->ifdescr : "<none>");
+#endif
     if (iface->up) {
 	Printf("\tSession time    : %ld seconds\r\n", (long int)(time(NULL) - iface->last_up));
 	if (b->params.idle_timeout || iface->idle_timeout)
@@ -1591,8 +1785,8 @@
     struct ifreq ifrq;
     int s, new_flags;
 
-    Log(LG_IFACE2, ("[%s] IFACE: Change interface flags: -%d +%d",
-	b->name, clear, set)); 
+    Log(LG_IFACE2, ("[%s] IFACE: Change interface %s flags: -%d +%d",
+	b->name, b->iface.ifname, clear, set));
 
     if ((s = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {
 	Perror("[%s] IFACE: Can't get socket to change interface flags", b->name);
@@ -1601,9 +1795,8 @@
 
     memset(&ifrq, '\0', sizeof(ifrq));
     strlcpy(ifrq.ifr_name, b->iface.ifname, sizeof(ifrq.ifr_name));
-    ifrq.ifr_name[sizeof(ifrq.ifr_name) - 1] = '\0';
     if (ioctl(s, SIOCGIFFLAGS, &ifrq) < 0) {
-	Perror("[%s] IFACE: ioctl(%s, %s)", b->name, b->iface.ifname, "SIOCGIFFLAGS");
+	Perror("[%s] IFACE: ioctl(SIOCGIFFLAGS, %s)", b->name, b->iface.ifname);
 	close(s);
 	return;
     }
@@ -1616,7 +1809,7 @@
     ifrq.ifr_flagshigh = new_flags >> 16;
 
     if (ioctl(s, SIOCSIFFLAGS, &ifrq) < 0) {
-	Perror("[%s] IFACE: ioctl(%s, %s)", b->name, b->iface.ifname, "SIOCSIFFLAGS");
+	Perror("[%s] IFACE: ioctl(SIOCSIFFLAGS, %s)", b->name, b->iface.ifname);
 	close(s);
 	return;
     }
@@ -1708,8 +1901,14 @@
 
 	res = ioctl(s, add?SIOCAIFADDR_IN6:SIOCDIFADDR_IN6, &ifra6);
 	if (res == -1) {
-	    Perror("[%s] IFACE: %s IPv6 address %s %s failed", 
-		b->name, add?"Adding":"Removing", add?"to":"from", b->iface.ifname);
+		if (add && errno == EEXIST) {
+			/* this can happen if the kernel has already automatically added
+			   the same link-local address - ignore the error */
+			res = 0;
+		} else {
+			Perror("[%s] IFACE: %s IPv6 address %s %s failed", 
+				b->name, add?"Adding":"Removing", add?"to":"from", b->iface.ifname);
+		}
 	}
 	break;
 
@@ -1951,13 +2150,14 @@
 #endif
 
     /* Connect graph to the iface node. */
+    memset(&cn, 0, sizeof(cn));
     strcpy(cn.ourhook, hook);
     snprintf(cn.path, sizeof(cn.path), "%s:", b->iface.ngname);
     strcpy(cn.peerhook, NG_IFACE_HOOK_INET);
     if (NgSendMsg(gLinksCsock, path,
     	    NGM_GENERIC_COOKIE, NGM_CONNECT, &cn, sizeof(cn)) < 0) {
-	Log(LG_ERR, ("[%s] can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\": %s",
-    	    b->name, path, cn.ourhook, cn.path, cn.peerhook, strerror(errno)));
+	Perror("[%s] can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\"",
+	    b->name, path, cn.ourhook, cn.path, cn.peerhook);
 	goto fail;
     }
 
@@ -2076,8 +2276,8 @@
     strcpy(cn.peerhook, NG_IFACE_HOOK_INET6);
     if (NgSendMsg(gLinksCsock, path,
     	    NGM_GENERIC_COOKIE, NGM_CONNECT, &cn, sizeof(cn)) < 0) {
-	Log(LG_ERR, ("[%s] can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\": %s",
-    	    b->name, path, cn.ourhook, cn.path, cn.peerhook, strerror(errno)));
+	Perror("[%s] can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\"",
+	    b->name, path, cn.ourhook, cn.path, cn.peerhook);
 	goto fail;
     }
 
@@ -2126,8 +2326,8 @@
     strcpy(mp.peerhook, NG_NAT_HOOK_IN);
     if (NgSendMsg(gLinksCsock, path,
 	NGM_GENERIC_COOKIE, NGM_MKPEER, &mp, sizeof(mp)) < 0) {
-      Log(LG_ERR, ("[%s] can't create %s node at \"%s\"->\"%s\": %s",
-	b->name, NG_NAT_NODE_TYPE, path, mp.ourhook, strerror(errno)));
+      Perror("[%s] can't create %s node at \"%s\"->\"%s\"",
+	b->name, NG_NAT_NODE_TYPE, path, mp.ourhook);
       return(-1);
     }
     strlcat(path, ".", NG_PATHSIZ);
@@ -2135,8 +2335,7 @@
     snprintf(nm.name, sizeof(nm.name), "mpd%d-%s-nat", gPid, b->name);
     if (NgSendMsg(gLinksCsock, path,
 	NGM_GENERIC_COOKIE, NGM_NAME, &nm, sizeof(nm)) < 0) {
-      Log(LG_ERR, ("[%s] can't name %s node: %s",
-	b->name, NG_NAT_NODE_TYPE, strerror(errno)));
+      Perror("[%s] can't name %s node", b->name, NG_NAT_NODE_TYPE);
       return(-1);
     }
     strcpy(hook, NG_NAT_HOOK_OUT);
@@ -2148,10 +2347,8 @@
 	ip = nat->alias_addr.u.ip4;
     }
     if (NgSendMsg(gLinksCsock, path,
-	    NGM_NAT_COOKIE, NGM_NAT_SET_IPADDR, &ip, sizeof(ip)) < 0) {
-	Log(LG_ERR, ("[%s] can't set NAT ip: %s",
-    	    b->name, strerror(errno)));
-    }
+	    NGM_NAT_COOKIE, NGM_NAT_SET_IPADDR, &ip, sizeof(ip)) < 0)
+	Perror("[%s] can't set NAT ip", b->name);
 
 #ifdef NG_NAT_LOG
     /* Set NAT mode */
@@ -2168,18 +2365,15 @@
     mode.mask = NG_NAT_LOG | NG_NAT_DENY_INCOMING | 
 	NG_NAT_SAME_PORTS | NG_NAT_UNREGISTERED_ONLY;
     if (NgSendMsg(gLinksCsock, path,
-	    NGM_NAT_COOKIE, NGM_NAT_SET_MODE, &mode, sizeof(mode)) < 0) {
-	Log(LG_ERR, ("[%s] can't set NAT mode: %s",
-    	    b->name, strerror(errno)));
-    }
+	    NGM_NAT_COOKIE, NGM_NAT_SET_MODE, &mode, sizeof(mode)) < 0)
+	Perror("[%s] can't set NAT mode", b->name);
 
     /* Set NAT target IP */
     if (!u_addrempty(&nat->target_addr)) {
 	ip = nat->target_addr.u.ip4;
 	if (NgSendMsg(gLinksCsock, path,
 		NGM_NAT_COOKIE, NGM_NAT_SET_IPADDR, &ip, sizeof(ip)) < 0) {
-	    Log(LG_ERR, ("[%s] can't set NAT target IP: %s",
-    		b->name, strerror(errno)));
+	    Perror("[%s] can't set NAT target IP", b->name);
 	}
     }
 #endif
@@ -2200,8 +2394,7 @@
     		NGM_NAT_COOKIE, NGM_NAT_SET_IPADDR,
 		&b->iface.self_addr.addr.u.ip4,
 		sizeof(b->iface.self_addr.addr.u.ip4)) < 0) {
-	    Log(LG_ERR, ("[%s] can't set NAT ip: %s",
-    		b->name, strerror(errno)));
+	    Perror("[%s] can't set NAT ip", b->name);
 	    return (-1);
 	}
     }
@@ -2212,8 +2405,7 @@
 	if (NgSendMsg(gLinksCsock, path,
 		NGM_NAT_COOKIE, NGM_NAT_REDIRECT_PORT, &nat->nrpt[k],
 		sizeof(struct ng_nat_redirect_port)) < 0) {
-	    Log(LG_ERR, ("[%s] can't set NAT redirect-port: %s",
-		b->name, strerror(errno)));
+	    Perror("[%s] can't set NAT redirect-port", b->name);
 	}
       }
     }
@@ -2223,8 +2415,7 @@
 	if (NgSendMsg(gLinksCsock, path,
 		NGM_NAT_COOKIE, NGM_NAT_REDIRECT_ADDR, &nat->nrad[k],
 		sizeof(struct ng_nat_redirect_addr)) < 0) {
-	    Log(LG_ERR, ("[%s] can't set NAT redirect-addr: %s",
-		b->name, strerror(errno)));
+	    Perror("[%s] can't set NAT redirect-addr", b->name);
 	}
       }
     }
@@ -2234,8 +2425,7 @@
 	if (NgSendMsg(gLinksCsock, path,
 		NGM_NAT_COOKIE, NGM_NAT_REDIRECT_PROTO, &nat->nrpr[k],
 		sizeof(struct ng_nat_redirect_proto)) < 0) {
-	    Log(LG_ERR, ("[%s] can't set NAT redirect-proto: %s",
-		b->name, strerror(errno)));
+	    Perror("[%s] can't set NAT redirect-proto", b->name);
 	}
       }
     }
@@ -2266,8 +2456,8 @@
     strcpy(mp.peerhook, NG_TEE_HOOK_RIGHT);
     if (NgSendMsg(gLinksCsock, path,
 	NGM_GENERIC_COOKIE, NGM_MKPEER, &mp, sizeof(mp)) < 0) {
-      Log(LG_ERR, ("[%s] can't create %s node at \"%s\"->\"%s\": %s",
-	b->name, NG_TEE_NODE_TYPE, path, mp.ourhook, strerror(errno)));
+      Perror("[%s] can't create %s node at \"%s\"->\"%s\"",
+	b->name, NG_TEE_NODE_TYPE, path, mp.ourhook);
       return(-1);
     }
     strlcat(path, ".", NG_PATHSIZ);
@@ -2275,8 +2465,7 @@
     snprintf(nm.name, sizeof(nm.name), "%s-tee%s", b->iface.ifname, v6?"6":"");
     if (NgSendMsg(gLinksCsock, path,
 	NGM_GENERIC_COOKIE, NGM_NAME, &nm, sizeof(nm)) < 0) {
-      Log(LG_ERR, ("[%s] can't name %s node: %s",
-	b->name, NG_TEE_NODE_TYPE, strerror(errno)));
+      Perror("[%s] can't name %s node", b->name, NG_TEE_NODE_TYPE);
       return(-1);
     }
     strcpy(hook, NG_TEE_HOOK_LEFT);
@@ -2313,8 +2502,8 @@
     strcpy(mp.peerhook, NG_TEE_HOOK_RIGHT);
     if (NgSendMsg(gLinksCsock, path,
 	NGM_GENERIC_COOKIE, NGM_MKPEER, &mp, sizeof(mp)) < 0) {
-      Log(LG_ERR, ("[%s] can't create %s node at \"%s\"->\"%s\": %s",
-	b->name, NG_TEE_NODE_TYPE, path, mp.ourhook, strerror(errno)));
+      Perror("[%s] can't create %s node at \"%s\"->\"%s\"",
+	b->name, NG_TEE_NODE_TYPE, path, mp.ourhook);
       return(-1);
     }
     strlcat(path, ".", NG_PATHSIZ);
@@ -2322,8 +2511,7 @@
     snprintf(nm.name, sizeof(nm.name), "%s_acct_tee", b->iface.ifname);
     if (NgSendMsg(gLinksCsock, path,
 	NGM_GENERIC_COOKIE, NGM_NAME, &nm, sizeof(nm)) < 0) {
-      Log(LG_ERR, ("[%s] can't name %s node: %s",
-	b->name, NG_TEE_NODE_TYPE, strerror(errno)));
+      Perror("[%s] can't name %s node", b->name, NG_TEE_NODE_TYPE);
       return(-1);
     }
     strcpy(hook, NG_TEE_HOOK_LEFT);
@@ -2333,16 +2521,15 @@
     snprintf(mp.peerhook, sizeof(mp.peerhook), "%s_in", b->iface.ifname);
     if (NgSendMsg(gLinksCsock, path,
 	NGM_GENERIC_COOKIE, NGM_MKPEER, &mp, sizeof(mp)) < 0) {
-      Log(LG_ERR, ("[%s] can't create %s node at \"%s\"->\"%s\": %s",
-	b->name, NG_IPACCT_NODE_TYPE, path, mp.ourhook, strerror(errno)));
+      Perror("[%s] can't create %s node at \"%s\"->\"%s\"",
+	b->name, NG_IPACCT_NODE_TYPE, path, mp.ourhook);
       return(-1);
     }
     snprintf(path1, sizeof(path1), "%s.%s", path, NG_TEE_HOOK_RIGHT2LEFT);
     snprintf(nm.name, sizeof(nm.name), "%s_ip_acct", b->iface.ifname);
     if (NgSendMsg(gLinksCsock, path1,
 	NGM_GENERIC_COOKIE, NGM_NAME, &nm, sizeof(nm)) < 0) {
-      Log(LG_ERR, ("[%s] can't name %s node: %s",
-	b->name, NG_IPACCT_NODE_TYPE, strerror(errno)));
+      Perror("[%s] can't name %s node", b->name, NG_IPACCT_NODE_TYPE);
       return(-1);
     }
     strcpy(cn.ourhook, NG_TEE_HOOK_LEFT2RIGHT);
@@ -2350,8 +2537,8 @@
     snprintf(cn.peerhook, sizeof(cn.peerhook), "%s_out", b->iface.ifname);
     if (NgSendMsg(gLinksCsock, path, NGM_GENERIC_COOKIE, NGM_CONNECT, &cn,
 	sizeof(cn)) < 0) {
-      Log(LG_ERR, ("[%s] can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\": %s", 
-        b->name, path, cn.ourhook, cn.path, cn.peerhook, strerror(errno)));
+      Perror("[%s] can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\"",
+        b->name, path, cn.ourhook, cn.path, cn.peerhook);
       return (-1);
     }
     
@@ -2359,15 +2546,13 @@
     ipam.data = DLT_RAW;
     if (NgSendMsg(gLinksCsock, path1, NGM_IPACCT_COOKIE, NGM_IPACCT_SETDLT, 
 	&ipam, sizeof(ipam)) < 0) {
-      Log(LG_ERR, ("[%s] can't set DLT \"%s\"->\"%s\": %s", 
-        b->name, path, ipam.m.hname, strerror(errno)));
+      Perror("[%s] can't set DLT \"%s\"->\"%s\"", b->name, path, ipam.m.hname);
       return (-1);
     }
     ipam.data = 10000;
     if (NgSendMsg(gLinksCsock, path1, NGM_IPACCT_COOKIE, NGM_IPACCT_STHRS, 
 	&ipam, sizeof(ipam)) < 0) {
-      Log(LG_ERR, ("[%s] can't set DLT \"%s\"->\"%s\": %s", 
-        b->name, path, ipam.m.hname, strerror(errno)));
+      Perror("[%s] can't set DLT \"%s\"->\"%s\"", b->name, path, ipam.m.hname);
       return (-1);
     }
     
@@ -2375,15 +2560,13 @@
     ipam.data = DLT_RAW;
     if (NgSendMsg(gLinksCsock, path1, NGM_IPACCT_COOKIE, NGM_IPACCT_SETDLT, 
 	&ipam, sizeof(ipam)) < 0) {
-      Log(LG_ERR, ("[%s] can't set DLT \"%s\"->\"%s\": %s", 
-        b->name, path, ipam.m.hname, strerror(errno)));
+      Perror("[%s] can't set DLT \"%s\"->\"%s\"", b->name, path, ipam.m.hname);
       return (-1);
     }
     ipam.data = 10000;
     if (NgSendMsg(gLinksCsock, path1, NGM_IPACCT_COOKIE, NGM_IPACCT_STHRS, 
 	&ipam, sizeof(ipam)) < 0) {
-      Log(LG_ERR, ("[%s] can't set DLT \"%s\"->\"%s\": %s", 
-        b->name, path, ipam.m.hname, strerror(errno)));
+      Perror("[%s] can't set DLT \"%s\"->\"%s\"", b->name, path, ipam.m.hname);
       return (-1);
     }
 
@@ -2437,8 +2620,8 @@
 #endif
     if (NgSendMsg(gLinksCsock, path, NGM_GENERIC_COOKIE, NGM_CONNECT, &cn,
 	sizeof(cn)) < 0) {
-      Log(LG_ERR, ("[%s] can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\": %s", 
-        b->name, path, cn.ourhook, cn.path, cn.peerhook, strerror(errno)));
+      Perror("[%s] can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\"",
+        b->name, path, cn.ourhook, cn.path, cn.peerhook);
       return (-1);
     }
     strlcat(path, ".", NG_PATHSIZ);
@@ -2478,8 +2661,7 @@
     nf_setdlt.dlt = DLT_RAW;
     if (NgSendMsg(gLinksCsock, path, NGM_NETFLOW_COOKIE, NGM_NETFLOW_SETDLT,
 	&nf_setdlt, sizeof(nf_setdlt)) < 0) {
-      Log(LG_ERR, ("[%s] can't configure data link type on %s: %s", b->name,
-	path, strerror(errno)));
+      Perror("[%s] can't configure data link type on %s", b->name, path);
       goto fail;
     }
 #ifdef NG_NETFLOW_CONF_INGRESS
@@ -2490,8 +2672,7 @@
 	(Enabled(&b->iface.options, IFACE_CONF_NETFLOW_ONCE)?NG_NETFLOW_CONF_ONCE:0);
     if (NgSendMsg(gLinksCsock, path, NGM_NETFLOW_COOKIE, NGM_NETFLOW_SETCONFIG,
 	&nf_setconf, sizeof(nf_setconf)) < 0) {
-      Log(LG_ERR, ("[%s] can't set config on %s: %s", b->name,
-	path, strerror(errno)));
+      Perror("[%s] can't set config on %s", b->name, path);
       goto fail;
     }
 #endif
@@ -2502,8 +2683,7 @@
 	nf_setidx.index = if_nametoindex(b->iface.ifname);
 	if (NgSendMsg(gLinksCsock, path, NGM_NETFLOW_COOKIE, NGM_NETFLOW_SETIFINDEX,
 	    &nf_setidx, sizeof(nf_setidx)) < 0) {
-    	  Log(LG_ERR, ("[%s] can't configure interface index on %s: %s", b->name,
-	    path, strerror(errno)));
+    	  Perror("[%s] can't configure interface index on %s", b->name, path);
     	  goto fail;
 	}
 #ifndef NG_NETFLOW_CONF_INGRESS
@@ -2555,8 +2735,8 @@
 	strcpy(mp.peerhook, "in");
 	if (NgSendMsg(gLinksCsock, path,
     		NGM_GENERIC_COOKIE, NGM_MKPEER, &mp, sizeof(mp)) < 0) {
-    	    Log(LG_ERR, ("can't create %s node at \"%s\"->\"%s\": %s", 
-    		NG_TCPMSS_NODE_TYPE, path, mp.ourhook, strerror(errno)));
+    	    Perror("can't create %s node at \"%s\"->\"%s\"",
+    		NG_TCPMSS_NODE_TYPE, path, mp.ourhook);
 	    goto fail;
 	}
 
@@ -2568,8 +2748,7 @@
 	snprintf(nm.name, sizeof(nm.name), "mpd%d-%s-mss", gPid, b->name);
 	if (NgSendMsg(gLinksCsock, path,
     		NGM_GENERIC_COOKIE, NGM_NAME, &nm, sizeof(nm)) < 0) {
-    	    Log(LG_ERR, ("can't name %s node: %s", NG_TCPMSS_NODE_TYPE,
-    		strerror(errno)));
+    	    Perror("can't name %s node", NG_TCPMSS_NODE_TYPE);
 	    goto fail;
 	}
 
@@ -2580,8 +2759,8 @@
     strcpy(mp.peerhook, "ppp");
     if (NgSendMsg(gLinksCsock, path,
 	    NGM_GENERIC_COOKIE, NGM_MKPEER, &mp, sizeof(mp)) < 0) {
-    	Log(LG_ERR, ("can't create %s node at \"%s\"->\"%s\": %s", 
-    	    NG_BPF_NODE_TYPE, path, mp.ourhook, strerror(errno)));
+	Perror("can't create %s node at \"%s\"->\"%s\"",
+	    NG_BPF_NODE_TYPE, path, mp.ourhook);
 	goto fail;
     }
 
@@ -2593,8 +2772,7 @@
     snprintf(nm.name, sizeof(nm.name), "mpd%d-%s-mss", gPid, b->name);
     if (NgSendMsg(gLinksCsock, path,
 	    NGM_GENERIC_COOKIE, NGM_NAME, &nm, sizeof(nm)) < 0) {
-    	Log(LG_ERR, ("can't name tcpmssfix %s node: %s", NG_BPF_NODE_TYPE,
-    	    strerror(errno)));
+	Perror("can't name tcpmssfix %s node", NG_BPF_NODE_TYPE);
 	goto fail;
     }
 
@@ -2604,8 +2782,8 @@
     strcpy(cn.peerhook, MPD_HOOK_TCPMSS_IN);
     if (NgSendMsg(gLinksCsock, ".:", NGM_GENERIC_COOKIE, NGM_CONNECT, &cn,
     	    sizeof(cn)) < 0) {
-    	Log(LG_ERR, ("[%s] can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\": %s", 
-    	    b->name, path, cn.ourhook, cn.path, cn.peerhook, strerror(errno)));
+    	Perror("[%s] can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\"",
+    	    b->name, path, cn.ourhook, cn.path, cn.peerhook);
     	goto fail;
     }
 
@@ -2614,8 +2792,8 @@
     strcpy(cn.peerhook, MPD_HOOK_TCPMSS_OUT);
     if (NgSendMsg(gLinksCsock, ".:", NGM_GENERIC_COOKIE, NGM_CONNECT, &cn,
     	    sizeof(cn)) < 0) {
-    	Log(LG_ERR, ("[%s] can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\": %s", 
-    	    b->name, path, cn.ourhook, cn.path, cn.peerhook, strerror(errno)));
+    	Perror("[%s] can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\"",
+    	    b->name, path, cn.ourhook, cn.path, cn.peerhook);
     	goto fail;
     }
 #endif /* USE_NG_TCPMSS */
@@ -2648,15 +2826,13 @@
   snprintf(tcpmsscfg.outHook, sizeof(tcpmsscfg.outHook), "out");
   if (NgSendMsg(gLinksCsock, path, NGM_TCPMSS_COOKIE, NGM_TCPMSS_CONFIG,
       &tcpmsscfg, sizeof(tcpmsscfg)) < 0) {
-    Log(LG_ERR, ("[%s] can't configure %s node program: %s", b->name,
-      NG_TCPMSS_NODE_TYPE, strerror(errno)));
+    Perror("[%s] can't configure %s node program", b->name, NG_TCPMSS_NODE_TYPE);
   }
   snprintf(tcpmsscfg.inHook, sizeof(tcpmsscfg.inHook), "out");
   snprintf(tcpmsscfg.outHook, sizeof(tcpmsscfg.outHook), "in");
   if (NgSendMsg(gLinksCsock, path, NGM_TCPMSS_COOKIE, NGM_TCPMSS_CONFIG,
       &tcpmsscfg, sizeof(tcpmsscfg)) < 0) {
-    Log(LG_ERR, ("[%s] can't configure %s node program: %s", b->name,
-      NG_TCPMSS_NODE_TYPE, strerror(errno)));
+    Perror("[%s] can't configure %s node program", b->name, NG_TCPMSS_NODE_TYPE);
   }
 #else
     union {
@@ -2678,10 +2854,8 @@
     strcpy(hp->ifNotMatch, "iface");
 
     if (NgSendMsg(gLinksCsock, hook, NGM_BPF_COOKIE,
-	    NGM_BPF_SET_PROGRAM, hp, NG_BPF_HOOKPROG_SIZE(hp->bpf_prog_len)) < 0) {
-	Log(LG_ERR, ("[%s] can't set %s node program: %s",
-    	    b->name, NG_BPF_NODE_TYPE, strerror(errno)));
-    }
+	    NGM_BPF_SET_PROGRAM, hp, NG_BPF_HOOKPROG_SIZE(hp->bpf_prog_len)) < 0)
+	Perror("[%s] can't set %s node program", b->name, NG_BPF_NODE_TYPE);
 
     memset(&u, 0, sizeof(u));
     strcpy(hp->thisHook, MPD_HOOK_TCPMSS_IN);
@@ -2692,10 +2866,8 @@
     strcpy(hp->ifNotMatch, "ppp");
 
     if (NgSendMsg(gLinksCsock, hook, NGM_BPF_COOKIE,
-	    NGM_BPF_SET_PROGRAM, hp, NG_BPF_HOOKPROG_SIZE(hp->bpf_prog_len)) < 0) {
-	Log(LG_ERR, ("[%s] can't set %s node program: %s",
-    	    b->name, NG_BPF_NODE_TYPE, strerror(errno)));
-    }
+	    NGM_BPF_SET_PROGRAM, hp, NG_BPF_HOOKPROG_SIZE(hp->bpf_prog_len)) < 0)
+	Perror("[%s] can't set %s node program", b->name, NG_BPF_NODE_TYPE);
 
     snprintf(hook, sizeof(hook), "o%d", b->id);
     memset(&u, 0, sizeof(u));
@@ -2707,10 +2879,8 @@
     strcpy(hp->ifNotMatch, "ppp");
 
     if (NgSendMsg(gLinksCsock, hook, NGM_BPF_COOKIE,
-	    NGM_BPF_SET_PROGRAM, hp, NG_BPF_HOOKPROG_SIZE(hp->bpf_prog_len)) < 0) {
-	Log(LG_ERR, ("[%s] can't set %s node program: %s",
-    	    b->name, NG_BPF_NODE_TYPE, strerror(errno)));
-    }
+	    NGM_BPF_SET_PROGRAM, hp, NG_BPF_HOOKPROG_SIZE(hp->bpf_prog_len)) < 0)
+	Perror("[%s] can't set %s node program", b->name, NG_BPF_NODE_TYPE);
 
     memset(&u, 0, sizeof(u));
     strcpy(hp->thisHook, MPD_HOOK_TCPMSS_OUT);
@@ -2721,10 +2891,8 @@
     strcpy(hp->ifNotMatch, "iface");
 
     if (NgSendMsg(gLinksCsock, hook, NGM_BPF_COOKIE,
-	    NGM_BPF_SET_PROGRAM, hp, NG_BPF_HOOKPROG_SIZE(hp->bpf_prog_len)) < 0) {
-	Log(LG_ERR, ("[%s] can't set %s node program: %s",
-    	    b->name, NG_BPF_NODE_TYPE, strerror(errno)));
-    }
+	    NGM_BPF_SET_PROGRAM, hp, NG_BPF_HOOKPROG_SIZE(hp->bpf_prog_len)) < 0)
+	Perror("[%s] can't set %s node program", b->name, NG_BPF_NODE_TYPE);
 
 #endif /* USE_NG_TCPMSS */
 }
@@ -2761,8 +2929,8 @@
 	strcpy(mp.peerhook, "ppp");
 	if (NgSendMsg(gLinksCsock, path,
 		NGM_GENERIC_COOKIE, NGM_MKPEER, &mp, sizeof(mp)) < 0) {
-    	    Log(LG_ERR, ("can't create %s node at \"%s\"->\"%s\": %s", 
-    		NG_BPF_NODE_TYPE, path, mp.ourhook, strerror(errno)));
+	    Perror("can't create %s node at \"%s\"->\"%s\"",
+		NG_BPF_NODE_TYPE, path, mp.ourhook);
 	    goto fail;
 	}
 
@@ -2771,17 +2939,14 @@
 	strcpy(hook, "iface");
 
 	b->iface.limitID = NgGetNodeID(gLinksCsock, path);
-	if (b->iface.limitID == 0) {
-    	    Log(LG_ERR, ("can't get limits %s node ID: %s", NG_BPF_NODE_TYPE,
-    		strerror(errno)));
-	}
+	if (b->iface.limitID == 0)
+	    Perror("can't get limits %s node ID", NG_BPF_NODE_TYPE);
 
 	/* Set the new node's name. */
 	snprintf(nm.name, sizeof(nm.name), "mpd%d-%s-lim", gPid, b->name);
 	if (NgSendMsg(gLinksCsock, path,
 		NGM_GENERIC_COOKIE, NGM_NAME, &nm, sizeof(nm)) < 0) {
-    	    Log(LG_ERR, ("can't name limits %s node: %s", NG_BPF_NODE_TYPE,
-    		strerror(errno)));
+	    Perror("can't name limits %s node", NG_BPF_NODE_TYPE);
 	    goto fail;
 	}
 
@@ -2810,7 +2975,7 @@
     struct ngm_connect  cn;
     int			i;
     
-    hpu = Malloc(MB_IFACE, sizeof(*hpu));
+    hpu = Malloc(MB_ACL, sizeof(*hpu));
     hp = &hpu->hprog;
 
     if (b->params.acl_limits[0] || b->params.acl_limits[1]) {
@@ -2880,12 +3045,12 @@
 		    	int		bufbraces;
 
 #define ACL_BUF_SIZE	256*1024
-			buf = Malloc(MB_IFACE, ACL_BUF_SIZE);
+			buf = Malloc(MB_ACL, ACL_BUF_SIZE);
 			buf[0] = 0;
 			bufbraces = 0;
 			while (f) {
 			    char	*b1, *b2, *sbuf;
-			    sbuf = Mstrdup(MB_IFACE, f->rule);
+			    sbuf = Mstrdup(MB_ACL, f->rule);
 			    b2 = sbuf;
 			    b1 = strsep(&b2, " ");
 			    if (b2 != NULL) {
@@ -2966,8 +3131,8 @@
 			strcpy(cn.peerhook, inhookn[0]);
 			if (NgSendMsg(gLinksCsock, path,
 		        	NGM_GENERIC_COOKIE, NGM_CONNECT, &cn, sizeof(cn)) < 0) {
-		    	    Log(LG_ERR, ("[%s] IFACE: can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\": %s",
-			        b->name, path, cn.ourhook, cn.path, cn.peerhook, strerror(errno)));
+			    Perror("[%s] IFACE: can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\"",
+			        b->name, path, cn.ourhook, cn.path, cn.peerhook);
 			}
 			strcpy(stathook, inhookn[0]);
 		    }
@@ -2991,9 +3156,9 @@
 		    snprintf(mp.ourhook, sizeof(mp.ourhook), "%d-%d-m", dir, num);
 		    strcpy(mp.peerhook, ((dir == 0)?NG_CAR_HOOK_LOWER:NG_CAR_HOOK_UPPER));
 		    if (NgSendMsg(gLinksCsock, path,
-		    	    NGM_GENERIC_COOKIE, NGM_MKPEER, &mp, sizeof(mp)) < 0) {
-		    	Log(LG_ERR, ("[%s] IFACE: can't create %s node at \"%s\"->\"%s\": %s", 
-		    	    b->name, NG_CAR_NODE_TYPE, path, mp.ourhook, strerror(errno)));
+			    NGM_GENERIC_COOKIE, NGM_MKPEER, &mp, sizeof(mp)) < 0) {
+			Perror("[%s] IFACE: can't create %s node at \"%s\"->\"%s\"", 
+			    b->name, NG_CAR_NODE_TYPE, path, mp.ourhook);
 		    }
 
 		    snprintf(tmppath, sizeof(tmppath), "%s%d-%d-m", path, dir, num);
@@ -3004,8 +3169,8 @@
 		    strcpy(cn.peerhook, ((dir == 0)?NG_CAR_HOOK_UPPER:NG_CAR_HOOK_LOWER));
 		    if (NgSendMsg(gLinksCsock, path,
 		            NGM_GENERIC_COOKIE, NGM_CONNECT, &cn, sizeof(cn)) < 0) {
-		        Log(LG_ERR, ("[%s] IFACE: can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\": %s",
-			    b->name, path, cn.ourhook, cn.path, cn.peerhook, strerror(errno)));
+			Perror("[%s] IFACE: can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\"",
+			    b->name, path, cn.ourhook, cn.path, cn.peerhook);
 		    }
 			
 		    bzero(&car, sizeof(car));
@@ -3046,8 +3211,8 @@
 						
 		    if (NgSendMsg(gLinksCsock, tmppath,
 		            NGM_CAR_COOKIE, NGM_CAR_SET_CONF, &car, sizeof(car)) < 0) {
-		        Log(LG_ERR, ("[%s] IFACE: can't set %s configuration: %s",
-			    b->name, NG_CAR_NODE_TYPE, strerror(errno)));
+		        Perror("[%s] IFACE: can't set %s configuration",
+			    b->name, NG_CAR_NODE_TYPE);
 		    }
 			
 		    if (ac > p) {
@@ -3067,8 +3232,8 @@
 		    	    sprintf(hp1->thisHook, "%d-%d-mi", dir, num);
 			    if (NgSendMsg(gLinksCsock, path, NGM_BPF_COOKIE, NGM_BPF_SET_PROGRAM,
 			    	    hp1, NG_BPF_HOOKPROG_SIZE(hp1->bpf_prog_len)) < 0) {
-				Log(LG_ERR, ("[%s] IFACE: can't set %s node program: %s",
-	    			    b->name, NG_BPF_NODE_TYPE, strerror(errno)));
+				Perror("[%s] IFACE: can't set %s node program",
+	    			    b->name, NG_BPF_NODE_TYPE);
 			    }
 			    			    
 			    strcpy(stathook, hp1->thisHook);
@@ -3102,8 +3267,8 @@
 		    strcpy(cn.peerhook, inhookn[1]);
 		    if (NgSendMsg(gLinksCsock, path,
 		            NGM_GENERIC_COOKIE, NGM_CONNECT, &cn, sizeof(cn)) < 0) {
-		        Log(LG_ERR, ("[%s] IFACE: can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\": %s",
-			    b->name, path, cn.ourhook, cn.path, cn.peerhook, strerror(errno)));
+			Perror("[%s] IFACE: can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\"",
+			    b->name, path, cn.ourhook, cn.path, cn.peerhook);
 		    }
 		} else {
 		    /* There is no next limit, pass nomatch. */
@@ -3118,13 +3283,13 @@
 			    break;
 		    }
 		    if (ss == NULL) {
-			ss = Malloc(MB_IFACE, sizeof(*ss));
+			ss = Malloc(MB_ACL, sizeof(*ss));
 			strlcpy(ss->name, l->name, sizeof(ss->name));
 			SLIST_INIT(&ss->src);
 			SLIST_INSERT_HEAD(&b->iface.ss[dir], ss, next);
 		    }
 		    if (stathook[0]) {
-			sss = Malloc(MB_IFACE, sizeof(*sss));
+			sss = Malloc(MB_ACL, sizeof(*sss));
 			strlcpy(sss->hook, stathook, sizeof(sss->hook));
 			sss->type = SSSS_IN;
 			SLIST_INSERT_HEAD(&ss->src, sss, next);
@@ -3134,7 +3299,7 @@
 		for (i = 0; i < 2; i++) {
 		    if (inhook[i][0] != 0) {
 			if (l->name[0] && !stathook[0]) {
-			    sss = Malloc(MB_IFACE, sizeof(*sss));
+			    sss = Malloc(MB_ACL, sizeof(*sss));
 			    strlcpy(sss->hook, inhook[i], sizeof(sss->hook));
 			    sss->type = SSSS_MATCH;
 			    SLIST_INSERT_HEAD(&ss->src, sss, next);
@@ -3143,8 +3308,8 @@
 		        strcpy(hp->thisHook, inhook[i]);
 		        if (NgSendMsg(gLinksCsock, path, NGM_BPF_COOKIE, NGM_BPF_SET_PROGRAM,
 		    		hp, NG_BPF_HOOKPROG_SIZE(hp->bpf_prog_len)) < 0) {
-			    Log(LG_ERR, ("[%s] IFACE: can't set %s node program: %s",
-	    		        b->name, NG_BPF_NODE_TYPE, strerror(errno)));
+			    Perror("[%s] IFACE: can't set %s node program",
+	    		        b->name, NG_BPF_NODE_TYPE);
 			}
 		    }
 		    strcpy(inhook[i], inhookn[i]);
@@ -3165,8 +3330,8 @@
 		    strcpy(hp->ifNotMatch, outhook);
 		    if (NgSendMsg(gLinksCsock, path, NGM_BPF_COOKIE, NGM_BPF_SET_PROGRAM, 
 			    hp, NG_BPF_HOOKPROG_SIZE(hp->bpf_prog_len)) < 0) {
-			Log(LG_ERR, ("[%s] IFACE: can't set %s node %s %s program (2): %s",
-	    		    b->name, NG_BPF_NODE_TYPE, path, hp->thisHook, strerror(errno)));
+			Perror("[%s] IFACE: can't set %s node %s %s program (2)",
+			    b->name, NG_BPF_NODE_TYPE, path, hp->thisHook);
 		    }
 		}
 	    }
@@ -3232,7 +3397,7 @@
 		    break;
 	    }
 	    if (!ssr) {
-		ssr = Malloc(MB_IFACE, sizeof(*ssr));
+		ssr = Malloc(MB_ACL, sizeof(*ssr));
 		strlcpy(ssr->name, ss->name, sizeof(ssr->name));
 		SLIST_INSERT_HEAD(&stat->stat[dir], ssr, next);
 	    }
@@ -3280,7 +3445,7 @@
 		    break;
 	    }
 	    if (!ssr1) {
-		ssr1 = Malloc(MB_IFACE, sizeof(*ssr1));
+		ssr1 = Malloc(MB_ACL, sizeof(*ssr1));
 		strlcpy(ssr1->name, ssr2->name, sizeof(ssr1->name));
 		SLIST_INSERT_HEAD(&stat1->stat[dir], ssr1, next);
 	    }
@@ -3304,3 +3469,195 @@
     }
 }
 #endif /* USE_NG_BPF */
+
+/*
+ * IfaceSetName()
+ */
+
+int
+IfaceSetName(Bund b, const char * ifname)
+{
+    IfaceState	const iface = &b->iface;
+    struct ifreq ifr;
+    int s;
+
+    /* Do not rename interface on template */
+    if (b->tmpl)
+	return(0);
+
+    /* Do not wait ioctl error "file already exist" */
+    if (strncmp(iface->ifname, ifname, sizeof(iface->ifname)) == 0)
+	return(0);
+
+    /* Get socket */
+    if ((s = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {
+	Log(LG_ERR, ("[%s] IFACE: Can't get socket to set name", b->name));
+	return(-1);
+    }
+
+    /* Set name of interface */
+    memset(&ifr, 0, sizeof(ifr));
+    strlcpy(ifr.ifr_name, iface->ifname, sizeof(ifr.ifr_name));
+    ifr.ifr_data = (caddr_t)ifname;
+    Log(LG_IFACE2, ("[%s] IFACE: setting \"%s\" name to \"%s\"",
+	b->name, iface->ifname, ifname));
+
+    if (ioctl(s, SIOCSIFNAME, (caddr_t)&ifr) < 0) {
+	Perror("[%s] IFACE: ioctl(%s, SIOCSIFNAME)", b->name, iface->ifname);
+	close(s);
+	return(-1);
+    }
+
+    close(s);
+    /* Save name */
+    strlcpy(iface->ifname, ifname, sizeof(iface->ifname));
+    return(0);
+}
+
+#ifdef SIOCSIFDESCR
+/*
+ * IfaceSetDescr()
+ */
+
+int
+IfaceSetDescr(Bund b, const char * ifdescr)
+{
+    IfaceState	const iface = &b->iface;
+    struct	ifreq ifr;
+    int		s, ifdescr_maxlen;
+    char	*newdescr;
+    size_t	sz = sizeof(int);
+
+    if (b->tmpl) {
+	Log(LG_ERR, ("Impossible ioctl(SIOCSIFDESCR) on template"));
+	return(-1);
+    }
+
+    if (sysctlbyname("net.ifdescr_maxlen", &ifdescr_maxlen, &sz, NULL, 0) < 0) {
+	Perror("[%s] IFACE: sysctl net.ifdescr_maxlen  failed", b->name);
+	return(-1);
+    }
+
+    if (ifdescr_maxlen < strlen(ifdescr) + 1) {
+	Log(LG_ERR, ("[%s] IFACE: Description too long, >%d characters",
+	    b->name, ifdescr_maxlen-1));
+	return(-1);
+    }
+
+    /* Get socket */
+    if ((s = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {
+	Log(LG_ERR, ("[%s] IFACE: Can't get socket to set description", b->name));
+	return(-1);
+    }
+
+    /* Set description of interface */
+    memset(&ifr, 0, sizeof(ifr));
+    strlcpy(ifr.ifr_name, iface->ifname, sizeof(ifr.ifr_name));
+    ifr.ifr_buffer.length = strlen(ifdescr) + 1;
+    if (ifr.ifr_buffer.length == 1) {
+	ifr.ifr_buffer.buffer = newdescr = NULL;
+	ifr.ifr_buffer.length = 0;
+	Log(LG_IFACE2, ("[%s] IFACE: clearing \"%s\" description",
+	    b->name, iface->ifname));
+    } else {
+	newdescr = Mstrdup(MB_IFACE, ifdescr);
+	ifr.ifr_buffer.buffer = newdescr;
+	Log(LG_IFACE2, ("[%s] IFACE: setting \"%s\" description to \"%s\"",
+	    b->name, iface->ifname, ifdescr));
+    }
+
+    if (ioctl(s, SIOCSIFDESCR, (caddr_t)&ifr) < 0) {
+	Perror("[%s] IFACE: ioctl(%s, SIOCSIFDESCR)", b->name, iface->ifname);
+	Freee(newdescr);
+	close(s);
+	return(-1);
+    }
+    Freee(newdescr);
+    close(s);
+    return(0);
+}
+#endif /* SIOCSIFDESCR */
+#ifdef SIOCAIFGROUP
+/*
+ * IfaceAddGroup()
+ */
+
+int
+IfaceAddGroup(Bund b, const char * ifgroup)
+{
+    IfaceState	const iface = &b->iface;
+    struct ifgroupreq	ifgr;
+    int	s, i;
+
+    /* Do not add group on template */
+    if (b->tmpl)
+	return(0);
+
+    if (ifgroup[0] && isdigit(ifgroup[strlen(ifgroup) - 1])) {
+	Perror("[%s] IFACE: groupnames may not end in a digit", b->name);
+	return(-1);
+    }
+
+    /* Get socket */
+    if ((s = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {
+	Perror("[%s] IFACE: Can't get socket to add group", b->name);
+	return(-1);
+    }
+
+    /* Add interface group */
+    memset(&ifgr, 0, sizeof(ifgr));
+    strlcpy(ifgr.ifgr_name, iface->ifname, sizeof(ifgr.ifgr_name));
+    strlcpy(ifgr.ifgr_group, ifgroup, sizeof(ifgr.ifgr_group));
+
+    Log(LG_IFACE2, ("[%s] IFACE: adding interface %s to group %s",
+	b->name, iface->ifname, ifgroup));
+
+    i = ioctl(s, SIOCAIFGROUP, (caddr_t)&ifgr);
+    if (i < 0 && i != EEXIST) {
+	Perror("[%s] IFACE: ioctl(%s, SIOCAIFGROUP)", b->name, iface->ifname);
+        close(s);
+        return(-1);
+    }
+
+    close(s);
+    return(0);
+}
+
+/*
+ * IfaceDelGroup()
+ */
+int
+IfaceDelGroup(Bund b, const char * ifgroup)
+{
+    IfaceState	const iface = &b->iface;
+    struct ifgroupreq	ifgr;
+    int	s;
+
+    /* Get socket */
+    if ((s = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {
+	Perror("[%s] IFACE: Can't get socket to delete from group", b->name);
+	return(-1);
+    }
+
+    if (ifgroup[0] && isdigit(ifgroup[strlen(ifgroup) - 1])) {
+	Perror("[%s] IFACE: groupnames may not end in a digit", b->name);
+	return(-1);
+    }
+
+    /* Set interface group */
+    memset(&ifgr, 0, sizeof(ifgr));
+    strlcpy(ifgr.ifgr_name, iface->ifname, sizeof(ifgr.ifgr_name));
+    strlcpy(ifgr.ifgr_group, ifgroup, sizeof(ifgr.ifgr_group));
+
+    Log(LG_IFACE2, ("[%s] IFACE: remove interface %s from group %s",
+	b->name, iface->ifname, ifgroup));
+
+    if (ioctl(s, SIOCDIFGROUP, (caddr_t)&ifgr) == -1) {
+	Perror("[%s] IFACE: ioctl(%s, SIOCDIFGROUP)", b->name, iface->ifname);
+	close(s);
+	return(-1);
+    }
+    close(s);
+    return(0);
+}
+#endif
--- a/contrib/mpd/src/iface.h	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/iface.h	Fri Sep 14 02:13:58 2012 +0300
@@ -79,6 +79,13 @@
     u_char		peer_addr_force;
     u_char		self_ipv6_addr_force;
     u_char		peer_ipv6_addr_force;
+    char		ifname[IFNAMSIZ];	/* Name of my interface */
+#ifdef SIOCSIFDESCR
+    char		*ifdescr;		/* Interface description*/
+#endif
+#ifdef SIOCAIFGROUP
+    char		ifgroup[IFNAMSIZ];	/* Group of my interface */
+#endif
   };
 
   struct ifaceroute {
@@ -92,6 +99,9 @@
     char		ifname[IFNAMSIZ];	/* Name of my interface */
     char		ngname[IFNAMSIZ];	/* Name of my Netgraph node */
     uint		ifindex;		/* System interface index */
+#ifdef SIOCSIFDESCR
+    char		*ifdescr;		/* Interface description*/
+#endif
     struct ifaceconf	conf;
     u_char		traffic[IFACE_IDLE_SPLIT];	/* Mark any traffic */
     u_short		mtu;			/* Interface MTU */
@@ -173,6 +183,7 @@
 
   extern void	IfaceInit(Bund b);
   extern void	IfaceInst(Bund b, Bund bt);
+  extern void	IfaceDestroy(Bund b);
   extern void	IfaceOpen(Bund b);
   extern void	IfaceClose(Bund b);
   extern int	IfaceOpenCmd(Context ctx);
--- a/contrib/mpd/src/ipcp.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/ipcp.c	Fri Sep 14 02:13:58 2012 +0300
@@ -547,8 +547,7 @@
         snprintf(path, sizeof(path), "[%x]:%s", b->nodeID, NG_PPP_HOOK_VJC_IP);
 	if (NgSendMsg(gLinksCsock, path,
     		NGM_VJC_COOKIE, NGM_VJC_SET_CONFIG, &vjc, sizeof(vjc)) < 0) {
-	    Log(LG_ERR, ("[%s] can't config %s node: %s",
-    		b->name, NG_VJC_NODE_TYPE, strerror(errno)));
+	    Perror("[%s] can't config %s node", b->name, NG_VJC_NODE_TYPE);
 	}
     }
 #endif /* USE_NG_VJC */
@@ -913,8 +912,8 @@
   strcpy(mp.peerhook, NG_VJC_HOOK_IP);
   if (NgSendMsg(gLinksCsock, path,
       NGM_GENERIC_COOKIE, NGM_MKPEER, &mp, sizeof(mp)) < 0) {
-    Log(LG_ERR, ("[%s] can't create %s node at \"%s\"->\"%s\": %s",
-      b->name, NG_VJC_NODE_TYPE, path, mp.ourhook, strerror(errno)));
+    Perror("[%s] can't create %s node at \"%s\"->\"%s\"",
+      b->name, NG_VJC_NODE_TYPE, path, mp.ourhook);
     goto fail;
   }
 
@@ -923,8 +922,7 @@
   snprintf(nm.name, sizeof(nm.name), "mpd%d-%s-vjc", gPid, b->name);
   if (NgSendMsg(gLinksCsock, path,
       NGM_GENERIC_COOKIE, NGM_NAME, &nm, sizeof(nm)) < 0) {
-    Log(LG_ERR, ("[%s] can't name %s node: %s",
-      b->name, NG_VJC_NODE_TYPE, strerror(errno)));
+    Perror("[%s] can't name %s node", b->name, NG_VJC_NODE_TYPE);
     goto fail;
   }
 
@@ -935,24 +933,24 @@
   strcpy(cn.peerhook, NG_VJC_HOOK_VJCOMP);
   if (NgSendMsg(gLinksCsock, path,
       NGM_GENERIC_COOKIE, NGM_CONNECT, &cn, sizeof(cn)) < 0) {
-    Log(LG_ERR, ("[%s] can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\": %s",
-      b->name, path, cn.ourhook, cn.path, cn.peerhook, strerror(errno)));
+    Perror("[%s] can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\"",
+      b->name, path, cn.ourhook, cn.path, cn.peerhook);
     goto fail;
   }
   strcpy(cn.ourhook, NG_PPP_HOOK_VJC_UNCOMP);
   strcpy(cn.peerhook, NG_VJC_HOOK_VJUNCOMP);
   if (NgSendMsg(gLinksCsock, path,
       NGM_GENERIC_COOKIE, NGM_CONNECT, &cn, sizeof(cn)) < 0) {
-    Log(LG_ERR, ("[%s] can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\": %s", 
-      b->name, path, cn.ourhook, cn.path, cn.peerhook, strerror(errno)));
+    Perror("[%s] can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\"",
+      b->name, path, cn.ourhook, cn.path, cn.peerhook);
     goto fail;
   }
   strcpy(cn.ourhook, NG_PPP_HOOK_VJC_VJIP);
   strcpy(cn.peerhook, NG_VJC_HOOK_VJIP);
   if (NgSendMsg(gLinksCsock, path,
       NGM_GENERIC_COOKIE, NGM_CONNECT, &cn, sizeof(cn)) < 0) {
-    Log(LG_ERR, ("[%s] can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\": %s",
-      b->name, path, cn.ourhook, cn.path, cn.peerhook, strerror(errno)));
+    Perror("[%s] can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\"",
+      b->name, path, cn.ourhook, cn.path, cn.peerhook);
     goto fail;
   }
 
--- a/contrib/mpd/src/ippool.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/ippool.c	Fri Sep 14 02:13:58 2012 +0300
@@ -43,7 +43,7 @@
 void
 IPPoolInit(void)
 {
-    int ret = pthread_mutex_init (&gGiantMutex, NULL);
+    int ret = pthread_mutex_init (&gIPPoolMutex, NULL);
     if (ret != 0) {
 	Log(LG_ERR, ("Could not create IP pool mutex: %d", ret));
 	exit(EX_UNAVAILABLE);
--- a/contrib/mpd/src/l2tp.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/l2tp.c	Fri Sep 14 02:13:58 2012 +0300
@@ -312,9 +312,13 @@
 L2tpInst(Link l, Link lt)
 {
 	L2tpInfo pi;
-	l->info = Mdup(MB_PHYS, lt->info, sizeof(struct l2tpinfo));
-	pi = (L2tpInfo) l->info;
-    
+	L2tpInfo	const pit = (L2tpInfo) lt->info;
+
+	/* Initialize this link */
+	pi = (L2tpInfo) (l->info = Mdup(MB_PHYS, lt->info, sizeof(*pit)));
+	if (pit->conf.fqdn_peer_addr != NULL)
+	    pi->conf.fqdn_peer_addr =
+	        Mstrdup(MB_PHYS, pit->conf.fqdn_peer_addr);
 	if (pi->server)
 	    pi->server->refs++;
 	
@@ -344,7 +348,6 @@
 	} ugetsas;
 	struct sockaddr_storage	*const getsas = (struct sockaddr_storage *)(void *)ugetsas.reply.data;
 	struct ngm_mkpeer mkpeer;
-	struct sockaddr_storage peer_sas;
 	struct sockaddr_storage sas;
 	char hook[NG_HOOKSIZ];
 	char namebuf[64];
@@ -376,8 +379,8 @@
 			    }
 			    if (ppp_l2tp_avp_list_append(avps, 1, 0, AVP_FRAMING_TYPE,
 	        	        &fr, sizeof(fr)) == -1) {
-			    	    Log(LG_ERR, ("[%s] ppp_l2tp_avp_list_append: %s", 
-				        l->name, strerror(errno)));
+				    Perror("[%s] ppp_l2tp_avp_list_append",
+				        l->name);
 			    }
 			} else {
 			    avps = NULL;
@@ -427,15 +430,13 @@
 			if (pi->conf.callingnum[0]) {
 			  if (ppp_l2tp_avp_list_append(avps, 1, 0, AVP_CALLING_NUMBER,
 	        	    pi->conf.callingnum, strlen(pi->conf.callingnum)) == -1) {
-				Log(LG_ERR, ("[%s] ppp_l2tp_avp_list_append: %s", 
-				    l->name, strerror(errno)));
+				Perror("[%s] ppp_l2tp_avp_list_append", l->name);
 			  }
 			}
 			if (pi->conf.callednum[0]) {
 			  if (ppp_l2tp_avp_list_append(avps, 1, 0, AVP_CALLED_NUMBER,
 	        	    pi->conf.callednum, strlen(pi->conf.callednum)) == -1) {
-				Log(LG_ERR, ("[%s] ppp_l2tp_avp_list_append: %s", 
-				    l->name, strerror(errno)));
+				Perror("[%s] ppp_l2tp_avp_list_append", l->name);
 			  }
 			}
 			if ((sess = ppp_l2tp_initiate(tun->ctrl, 
@@ -443,8 +444,7 @@
 				Enabled(&pi->conf.options, L2TP_CONF_LENGTH)?1:0,
 				Enabled(&pi->conf.options, L2TP_CONF_DATASEQ)?1:0,
 				avps)) == NULL) {
-			    Log(LG_ERR, ("[%s] ppp_l2tp_initiate: %s", 
-				l->name, strerror(errno)));
+			    Perror("[%s] ppp_l2tp_initiate", l->name);
 			    ppp_l2tp_avp_list_destroy(&avps);
 			    pi->sess = NULL;
 			    pi->tun = NULL;
@@ -473,8 +473,8 @@
 				}
 				if (ppp_l2tp_avp_list_append(avps, 1, 0, AVP_FRAMING_TYPE,
 	        		    &fr, sizeof(fr)) == -1) {
-				        Log(LG_ERR, ("[%s] ppp_l2tp_avp_list_append: %s", 
-				    	    l->name, strerror(errno)));
+					Perror("[%s] ppp_l2tp_avp_list_append",
+					    l->name);
 				}
 			    } else {
 				avps = NULL;
@@ -490,7 +490,7 @@
 
 	/* There is no tun which we need. Create a new one. */
 	tun = Malloc(MB_PHYS, sizeof(*tun));
-	sockaddrtou_addr(&peer_sas,&tun->peer_addr,&tun->peer_port);
+	memset(tun, 0, sizeof(*tun));
 	u_addrcopy(&pi->conf.peer_addr.addr, &tun->peer_addr);
 	tun->peer_port = pi->conf.peer_port?pi->conf.peer_port:L2TP_PORT;
 	u_addrcopy(&pi->conf.self_addr, &tun->self_addr);
@@ -517,7 +517,7 @@
 	      &cap, sizeof(cap)) == -1) ||
 	    (ppp_l2tp_avp_list_append(avps, 1, 0, AVP_RECEIVE_WINDOW_SIZE,
 	      &win, sizeof(win)) == -1)) {
-		Log(LG_ERR, ("L2TP: ppp_l2tp_avp_list_append: %s", strerror(errno)));
+		Perror("L2TP: ppp_l2tp_avp_list_append");
 		goto fail;
 	}
 
@@ -527,8 +527,7 @@
 	    &node_id, hook, avps, 
 	    pi->conf.secret, strlen(pi->conf.secret),
 	    Enabled(&pi->conf.options, L2TP_CONF_HIDDEN))) == NULL) {
-		Log(LG_ERR, ("[%s] ppp_l2tp_ctrl_create: %s", 
-		    l->name, strerror(errno)));
+		Perror("[%s] ppp_l2tp_ctrl_create", l->name);
 		goto fail;
 	}
 	ppp_l2tp_ctrl_set_cookie(tun->ctrl, tun);
@@ -539,9 +538,8 @@
 
 	/* Get a temporary netgraph socket node */
 	if (NgMkSockNode(NULL, &csock, &dsock) == -1) {
-		Log(LG_ERR, ("[%s] NgMkSockNode: %s", 
-		    l->name, strerror(errno)));
-		goto fail;
+	    Perror("[%s] NgMkSockNode", l->name);
+	    goto fail;
 	}
 
 	/* Attach a new UDP socket to "lower" hook */
@@ -556,8 +554,7 @@
 	}
 	if (NgSendMsg(csock, namebuf, NGM_GENERIC_COOKIE,
 	    NGM_MKPEER, &mkpeer, sizeof(mkpeer)) == -1) {
-		Log(LG_ERR, ("[%s] mkpeer: %s", 
-		    l->name, strerror(errno)));
+		Perror("[%s] mkpeer", l->name);
 		goto fail;
 	}
 
@@ -571,15 +568,13 @@
 	memcpy(sockopt->value, &one, sizeof(int));
 	if (NgSendMsg(csock, namebuf, NGM_KSOCKET_COOKIE,
 	    NGM_KSOCKET_SETOPT, sockopt, sizeof(sockopt_buf)) == -1) {
-		Log(LG_ERR, ("[%s] setsockopt: %s", 
-		    l->name, strerror(errno)));
+		Perror("[%s] setsockopt", l->name);
 		goto fail;
 	}
 	sockopt->name = SO_REUSEPORT;
 	if (NgSendMsg(csock, namebuf, NGM_KSOCKET_COOKIE,
 	    NGM_KSOCKET_SETOPT, sockopt, sizeof(sockopt_buf)) == -1) {
-		Log(LG_ERR, ("[%s] setsockopt: %s", 
-		    l->name, strerror(errno)));
+		Perror("[%s] setsockopt", l->name);
 		goto fail;
 	}
 
@@ -588,8 +583,7 @@
 	    u_addrtosockaddr(&tun->self_addr,tun->self_port,&sas);
 	    if (NgSendMsg(csock, namebuf, NGM_KSOCKET_COOKIE,
 		NGM_KSOCKET_BIND, &sas, sas.ss_len) == -1) {
-		    Log(LG_ERR, ("[%s] bind: %s", 
-			l->name, strerror(errno)));
+		    Perror("[%s] bind", l->name);
 		    goto fail;
 	    }
 	}
@@ -598,27 +592,23 @@
 	if (NgSendMsg(csock, namebuf, NGM_KSOCKET_COOKIE,
 	      NGM_KSOCKET_CONNECT, &sas, sas.ss_len) == -1
 	    && errno != EINPROGRESS) {
-		Log(LG_ERR, ("[%s] connect: %s", 
-		    l->name, strerror(errno)));
+		Perror("[%s] connect", l->name);
 		goto fail;
 	}
 
 	if (NgSendMsg(csock, namebuf, NGM_KSOCKET_COOKIE,
 	    NGM_KSOCKET_GETNAME, NULL, 0) == -1) {
-		Log(LG_ERR, ("[%s] getname send: %s", 
-		    l->name, strerror(errno)));
+		Perror("[%s] getname send", l->name);
 	} else 
 	if (NgRecvMsg(csock, &ugetsas.reply, sizeof(ugetsas), NULL) == -1) {
-		Log(LG_ERR, ("[%s] getname recv: %s", 
-		    l->name, strerror(errno)));
+		Perror("[%s] getname recv", l->name);
 	} else {
 	    sockaddrtou_addr(getsas,&tun->self_addr,&tun->self_port);
 	}
 
 	/* Add peer to our hash table */
 	if (ghash_put(gL2tpTuns, tun) == -1) {
-		Log(LG_ERR, ("[%s] ghash_put: %s", 
-		    l->name, strerror(errno)));
+		Perror("[%s] ghash_put", l->name);
 		goto fail;
 	}
 	pi->tun = tun;
@@ -716,7 +706,7 @@
 
 	    /* Get a temporary netgraph socket node */
 	    if (NgMkSockNode(NULL, &csock, NULL) == -1) {
-		Log(LG_ERR, ("L2TP: NgMkSockNode: %s", strerror(errno)));
+		Perror("L2TP: NgMkSockNode");
 		return;
 	    }
 	
@@ -997,15 +987,13 @@
 		if (pi->conf.callingnum[0]) {
 		   if (ppp_l2tp_avp_list_append(avps, 1, 0, AVP_CALLING_NUMBER,
 	            pi->conf.callingnum, strlen(pi->conf.callingnum)) == -1) {
-			Log(LG_ERR, ("[%s] ppp_l2tp_avp_list_append: %s", 
-			    l->name, strerror(errno)));
+			Perror("[%s] ppp_l2tp_avp_list_append", l->name);
 		   }
 		}
 		if (pi->conf.callednum[0]) {
 		   if (ppp_l2tp_avp_list_append(avps, 1, 0, AVP_CALLED_NUMBER,
 	            pi->conf.callednum, strlen(pi->conf.callednum)) == -1) {
-			Log(LG_ERR, ("[%s] ppp_l2tp_avp_list_append: %s", 
-			    l->name, strerror(errno)));
+			Perror("[%s] ppp_l2tp_avp_list_append", l->name);
 		   }
 		}
 		if ((sess = ppp_l2tp_initiate(tun->ctrl,
@@ -1013,7 +1001,7 @@
 			    Enabled(&pi->conf.options, L2TP_CONF_LENGTH)?1:0,
 			    Enabled(&pi->conf.options, L2TP_CONF_DATASEQ)?1:0,
 			    avps)) == NULL) {
-			Log(LG_ERR, ("ppp_l2tp_initiate: %s", strerror(errno)));
+			Perror("ppp_l2tp_initiate");
 			pi->sess = NULL;
 			pi->tun = NULL;
 			tun->active_sessions--;
@@ -1041,8 +1029,7 @@
 			}
 			if (ppp_l2tp_avp_list_append(avps, 1, 0, AVP_FRAMING_TYPE,
 	        	    &fr, sizeof(fr)) == -1) {
-			        Log(LG_ERR, ("[%s] ppp_l2tp_avp_list_append: %s", 
-			    	    l->name, strerror(errno)));
+			        Perror("[%s] ppp_l2tp_avp_list_append", l->name);
 			}
 		    } else {
 			avps = NULL;
@@ -1128,7 +1115,7 @@
 
 	/* Convert AVP's to friendly form */
 	if ((ptrs = ppp_l2tp_avp_list2ptrs(avps)) == NULL) {
-		Log(LG_ERR, ("L2TP: error decoding AVP list: %s", strerror(errno)));
+		Perror("L2TP: error decoding AVP list");
 		ppp_l2tp_terminate(sess, L2TP_RESULT_ERROR,
 		    L2TP_ERROR_GENERIC, strerror(errno));
 		return;
@@ -1236,7 +1223,7 @@
 	if ((pi->incoming != pi->outcall) && avps != NULL) {
 		/* Convert AVP's to friendly form */
 		if ((ptrs = ppp_l2tp_avp_list2ptrs(avps)) == NULL) {
-			Log(LG_ERR, ("L2TP: error decoding AVP list: %s", strerror(errno)));
+			Perror("L2TP: error decoding AVP list");
 		} else {
 			if (ptrs->framing && ptrs->framing->sync) {
 				pi->sync = 1;
@@ -1320,13 +1307,16 @@
 
 	/* Get a temporary netgraph socket node */
 	if (NgMkSockNode(NULL, &csock, NULL) == -1) {
-		Log(LG_ERR, ("L2TP: NgMkSockNode: %s", strerror(errno)));
+		Perror("L2TP: NgMkSockNode");
 		goto fail;
 	}
 
 	/* Get this link's node and hook */
 	ppp_l2tp_sess_get_hook(pi->sess, &node_id, &hook);
 
+	/* Initialize cn */
+	memset(&cn, 0, sizeof(cn));
+
 	/* Connect our ng_ppp(4) node link hook and ng_l2tp(4) node. */
 	if (!PhysGetUpperHook(l, cn.path, cn.peerhook)) {
 	    Log(LG_PHYS, ("[%s] L2TP: can't get upper hook", l->name));
@@ -1336,8 +1326,8 @@
 	strlcpy(cn.ourhook, hook, sizeof(cn.ourhook));
 	if (NgSendMsg(csock, path, NGM_GENERIC_COOKIE, NGM_CONNECT, 
 	    &cn, sizeof(cn)) < 0) {
-		Log(LG_ERR, ("[%s] L2TP: can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\": %s",
-    		    l->name, path, cn.ourhook, cn.path, cn.peerhook, strerror(errno)));
+		Perror("[%s] L2TP: can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\"",
+    		    l->name, path, cn.ourhook, cn.path, cn.peerhook);
 		goto fail;
 	}
 	ppp_l2tp_sess_hooked(pi->sess);
@@ -1348,6 +1338,7 @@
 	/* Clean up after failure */
 	ppp_l2tp_terminate(pi->sess, L2TP_RESULT_ERROR,
 	    L2TP_ERROR_GENERIC, strerror(errno));
+	pi->sess = NULL;
 	if (csock != -1)
 		(void)close(csock);
 }
@@ -1395,7 +1386,7 @@
 	sas_len = sizeof(peer_sas);
 	if ((len = recvfrom(s->sock, buf, bufsize, 0,
 	    (struct sockaddr *)&peer_sas, &sas_len)) == -1) {
-		Log(LG_ERR, ("L2TP: recvfrom: %s", strerror(errno)));
+		Perror("L2TP: recvfrom");
 		goto fail;
 	}
 
@@ -1466,7 +1457,7 @@
 	      &cap, sizeof(cap)) == -1) ||
 	    (ppp_l2tp_avp_list_append(avps, 1, 0, AVP_RECEIVE_WINDOW_SIZE,
 	      &win, sizeof(win)) == -1)) {
-		Log(LG_ERR, ("L2TP: ppp_l2tp_avp_list_append: %s", strerror(errno)));
+		Perror("L2TP: ppp_l2tp_avp_list_append");
 		goto fail;
 	}
 
@@ -1476,14 +1467,14 @@
 	    &node_id, hook, avps, 
 	    pi->conf.secret, strlen(pi->conf.secret),
 	    Enabled(&pi->conf.options, L2TP_CONF_HIDDEN))) == NULL) {
-		Log(LG_ERR, ("L2TP: ppp_l2tp_ctrl_create: %s", strerror(errno)));
+		Perror("L2TP: ppp_l2tp_ctrl_create");
 		goto fail;
 	}
 	ppp_l2tp_ctrl_set_cookie(tun->ctrl, tun);
 
 	/* Get a temporary netgraph socket node */
 	if (NgMkSockNode(NULL, &csock, &dsock) == -1) {
-		Log(LG_ERR, ("L2TP: NgMkSockNode: %s", strerror(errno)));
+		Perror("L2TP: NgMkSockNode");
 		goto fail;
 	}
 
@@ -1495,13 +1486,13 @@
 	strlcpy(connect.peerhook, hook, sizeof(connect.peerhook));
 	if (NgSendMsg(csock, ".:", NGM_GENERIC_COOKIE,
 	    NGM_CONNECT, &connect, sizeof(connect)) == -1) {
-		Log(LG_ERR, ("L2TP: %s: %s", "connect", strerror(errno)));
+		Perror("L2TP: connect");
 		goto fail;
 	}
 
 	/* Write the received packet to the node */
 	if (NgSendData(dsock, hook, (u_char *)buf, len) == -1) {
-		Log(LG_ERR, ("L2TP: %s: %s", "NgSendData", strerror(errno)));
+		Perror("L2TP: NgSendData");
 		goto fail;
 	}
 
@@ -1510,7 +1501,7 @@
 	strlcpy(rmhook.ourhook, hook, sizeof(rmhook.ourhook));
 	if (NgSendMsg(csock, ".:", NGM_GENERIC_COOKIE,
 	    NGM_RMHOOK, &rmhook, sizeof(rmhook)) == -1) {
-		Log(LG_ERR, ("L2TP: %s: %s", "rmhook", strerror(errno)));
+		Perror("L2TP: rmhook");
 		goto fail;
 	}
 
@@ -1525,7 +1516,7 @@
 	}
 	if (NgSendMsg(csock, namebuf, NGM_GENERIC_COOKIE,
 	    NGM_MKPEER, &mkpeer, sizeof(mkpeer)) == -1) {
-		Log(LG_ERR, ("L2TP: %s: %s", "mkpeer", strerror(errno)));
+		Perror("L2TP: mkpeer");
 		goto fail;
 	}
 
@@ -1539,13 +1530,13 @@
 	memcpy(sockopt->value, &one, sizeof(int));
 	if (NgSendMsg(csock, namebuf, NGM_KSOCKET_COOKIE,
 	    NGM_KSOCKET_SETOPT, sockopt, sizeof(sockopt_buf)) == -1) {
-		Log(LG_ERR, ("L2TP: setsockopt: %s", strerror(errno)));
+		Perror("L2TP: setsockopt");
 		goto fail;
 	}
 	sockopt->name = SO_REUSEPORT;
 	if (NgSendMsg(csock, namebuf, NGM_KSOCKET_COOKIE,
 	    NGM_KSOCKET_SETOPT, sockopt, sizeof(sockopt_buf)) == -1) {
-		Log(LG_ERR, ("L2TP: setsockopt: %s", strerror(errno)));
+		Perror("L2TP: setsockopt");
 		goto fail;
 	}
 
@@ -1553,7 +1544,7 @@
 	u_addrtosockaddr(&s->self_addr,s->self_port,&sas);
 	if (NgSendMsg(csock, namebuf, NGM_KSOCKET_COOKIE,
 	    NGM_KSOCKET_BIND, &sas, sas.ss_len) == -1) {
-		Log(LG_ERR, ("L2TP: bind: %s", strerror(errno)));
+		Perror("L2TP: bind");
 		goto fail;
 	}
 
@@ -1561,13 +1552,13 @@
 	if (NgSendMsg(csock, namebuf, NGM_KSOCKET_COOKIE,
 	      NGM_KSOCKET_CONNECT, &peer_sas, peer_sas.ss_len) == -1
 	    && errno != EINPROGRESS) {
-		Log(LG_ERR, ("L2TP: connect: %s", strerror(errno)));
+		Perror("L2TP: connect");
 		goto fail;
 	}
 
 	/* Add peer to our hash table */
 	if (ghash_put(gL2tpTuns, tun) == -1) {
-		Log(LG_ERR, ("L2TP: %s: %s", "ghash_put", strerror(errno)));
+		Perror("L2TP: ghash_put");
 		goto fail;
 	}
 
@@ -1635,22 +1626,22 @@
 		s->sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
 	}
 	if (s->sock == -1) {
-		Log(LG_ERR, ("L2TP: socket: %s", strerror(errno)));
+		Perror("L2TP: socket");
 		goto fail;
 	}
 	if (setsockopt(s->sock, SOL_SOCKET,
 	    SO_REUSEADDR, &one, sizeof(one)) == -1) {
-		Log(LG_ERR, ("L2TP: setsockopt: %s", strerror(errno)));
+		Perror("L2TP: setsockopt");
 		goto fail;
 	}
 	if (setsockopt(s->sock, SOL_SOCKET,
 	    SO_REUSEPORT, &one, sizeof(one)) == -1) {
-		Log(LG_ERR, ("L2TP: setsockopt: %s", strerror(errno)));
+		Perror("L2TP: setsockopt");
 		goto fail;
 	}
 	u_addrtosockaddr(&s->self_addr, s->self_port, &sa);
 	if (bind(s->sock, (struct sockaddr *)&sa, sa.ss_len) == -1) {
-		Log(LG_ERR, ("L2TP: bind: %s", strerror(errno)));
+		Perror("L2TP: bind");
 		goto fail;
 	}
 
--- a/contrib/mpd/src/l2tp_ctrl.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/l2tp_ctrl.c	Fri Sep 14 02:13:58 2012 +0300
@@ -509,8 +509,7 @@
 
 	/* Get l2tp node ID */
 	if ((ctrl->node_id = NgGetNodeID(ctrl->csock, NG_L2TP_HOOK_CTRL)) == 0) {
-	    Log(LG_ERR, ("L2TP: Cannot get %s node id: %s",
-		NG_L2TP_NODE_TYPE, strerror(errno)));
+	    Perror("L2TP: Cannot get %s node id", NG_L2TP_NODE_TYPE);
 	    goto fail;
 	};
 	snprintf(ctrl->path, sizeof(ctrl->path),
@@ -1142,7 +1141,7 @@
 	if (pevent_register(ctrl->ctx, &ctrl->death_timer, 0,
 	    ctrl->mutex, ppp_l2tp_unused_timeout, ctrl,
 	    PEVENT_TIME, gL2TPto * 1000) == -1) {
-		Log(LOG_ERR, ("L2TP: error starting unused timer: %s", strerror(errno)));
+		Perror("L2TP: error starting unused timer");
 	}
 
 	/* Done */
@@ -1270,7 +1269,7 @@
 
 fail:
 	/* Close up shop */
-	Log(LOG_ERR, ("L2TP: error sending ctrl packet: %s", strerror(errno)));
+	Perror("L2TP: error sending ctrl packet");
 	ppp_l2tp_ctrl_close(ctrl, L2TP_RESULT_ERROR,
 	    L2TP_ERROR_GENERIC, strerror(errno));
 
@@ -1317,7 +1316,7 @@
 		value16 = htons(ctrl->config.tunnel_id);
 		if (ppp_l2tp_avp_list_append(avps, 1, 0,
 		    AVP_ASSIGNED_TUNNEL_ID, &value16, sizeof(value16)) == -1) {
-			Log(LOG_ERR, ("L2TP: %s: %s", "ppp_l2tp_avp_list_append", strerror(errno)));
+			Perror("L2TP: ppp_l2tp_avp_list_append");
 			goto notify_done;
 		}
 
@@ -1330,7 +1329,7 @@
 		memcpy(rbuf + 4, ctrl->errmsg, elen);
 		if (ppp_l2tp_avp_list_append(avps, 1, 0, AVP_RESULT_CODE,
 		    rbuf, 4 + elen) == -1) {
-			Log(LOG_ERR, ("L2TP: %s: %s", "ppp_l2tp_avp_list_append", strerror(errno)));
+			Perror("L2TP: ppp_l2tp_avp_list_append");
 			goto notify_done;
 		}
 
@@ -1357,7 +1356,7 @@
 	/* Start timer to call ppp_l2tp_ctrl_do_close() */
 	if (pevent_register(ctrl->ctx, &ctrl->close_timer, 0, ctrl->mutex,
 	    ppp_l2tp_ctrl_do_close, ctrl, PEVENT_TIME, 0) == -1)
-		Log(LOG_ERR, ("L2TP: error starting close timer: %s", strerror(errno)));
+		Perror("L2TP: error starting close timer");
 }
 
 /*
@@ -1435,7 +1434,7 @@
 	if (pevent_register(ctrl->ctx, &ctrl->death_timer, 0,
 	    ctrl->mutex, ppp_l2tp_ctrl_death_timeout, ctrl,
 	    PEVENT_TIME, L2TP_CTRL_DEATH_TIMEOUT * 1000) == -1)
-		Log(LOG_ERR, ("L2TP: error starting death timer: %s", strerror(errno)));
+		Perror("L2TP: error starting death timer");
 }
 
 /*
@@ -1453,7 +1452,7 @@
 	if (pevent_register(ctrl->ctx, &ctrl->idle_timer, 0,
 	    ctrl->mutex, ppp_l2tp_idle_timeout, ctrl, PEVENT_TIME,
 	    L2TP_IDLE_TIMEOUT * 1000) == -1)
-		Log(LOG_ERR, ("L2TP: error restarting idle timer: %s", strerror(errno)));
+		Perror("L2TP: error restarting idle timer");
 
 	/* Send a 'hello' packet */
 	ppp_l2tp_ctrl_send(ctrl, 0, HELLO, NULL);
@@ -1533,7 +1532,7 @@
 		pevent_unregister(&sess->notify_timer);
 		if (pevent_register(ctrl->ctx, &sess->notify_timer, 0,
 		    ctrl->mutex, ppp_l2tp_sess_notify, sess, PEVENT_TIME, 0) == -1) {
-			Log(LOG_ERR, ("L2TP: error starting notify timer: %s", strerror(errno)));
+			Perror("L2TP: error starting notify timer");
 			goto fail;
 		}
 	}
@@ -1545,15 +1544,14 @@
 	strlcpy(mkpeer.peerhook, NG_TEE_HOOK_LEFT, sizeof(mkpeer.peerhook));
 	if (NgSendMsg(ctrl->csock, NG_L2TP_HOOK_CTRL, NGM_GENERIC_COOKIE,
 	    NGM_MKPEER, &mkpeer, sizeof(mkpeer)) == -1) {
-		Log(LOG_ERR, ("L2TP: %s: %s", "mkpeer", strerror(errno)));
+		Perror("L2TP: mkpeer");
 		goto fail;
 	}
 
 	/* Get ng_tee node ID */
 	snprintf(path, sizeof(path), "%s.%s", NG_L2TP_HOOK_CTRL, sess->hook);
 	if ((sess->node_id = NgGetNodeID(ctrl->csock, path)) == 0) {
-	    Log(LG_ERR, ("L2TP: Cannot get %s node id: %s",
-		NG_TEE_NODE_TYPE, strerror(errno)));
+	    Perror("L2TP: Cannot get %s node id", NG_TEE_NODE_TYPE);
 	    goto fail;
 	};
 
@@ -1570,7 +1568,7 @@
 	if (NgSendMsg(ctrl->csock, NG_L2TP_HOOK_CTRL, NGM_L2TP_COOKIE,
 	    NGM_L2TP_SET_SESS_CONFIG, &sess->config,
 	    sizeof(sess->config)) == -1) {
-		Log(LOG_ERR, ("L2TP: error configuring session hook: %s", strerror(errno)));
+		Perror("L2TP: error configuring session hook");
 		goto fail;
 	}
 
@@ -1620,7 +1618,7 @@
 		value16 = htons(sess->config.session_id);
 		if (ppp_l2tp_avp_list_append(avps, 1, 0,
 		    AVP_ASSIGNED_SESSION_ID, &value16, sizeof(value16)) == -1) {
-			Log(LOG_ERR, ("L2TP: %s: %s", "ppp_l2tp_avp_list_append", strerror(errno)));
+			Perror("L2TP: ppp_l2tp_avp_list_append");
 			goto notify_done;
 		}
 
@@ -1633,7 +1631,7 @@
 		memcpy(rbuf + 4, sess->errmsg, elen);
 		if (ppp_l2tp_avp_list_append(avps, 1, 0, AVP_RESULT_CODE,
 		    rbuf, 4 + elen) == -1) {
-			Log(LOG_ERR, ("L2TP: %s: %s", "ppp_l2tp_avp_list_append", strerror(errno)));
+			Perror("L2TP: ppp_l2tp_avp_list_append");
 			goto notify_done;
 		}
 
@@ -1655,7 +1653,7 @@
 	/* Start timer to call ppp_l2tp_sess_do_close() */
 	if (pevent_register(ctrl->ctx, &sess->close_timer, 0,
 	    ctrl->mutex, ppp_l2tp_sess_do_close, sess, PEVENT_TIME, 0) == -1)
-		Log(LOG_ERR, ("L2TP: error starting close timer: %s", strerror(errno)));
+		Perror("L2TP: error starting close timer");
 }
 
 /*
@@ -1678,7 +1676,7 @@
 	if (pevent_register(ctrl->ctx, &sess->death_timer, 0,
 	    ctrl->mutex, ppp_l2tp_sess_death_timeout, sess, PEVENT_TIME,
 	    L2TP_SESS_DEATH_TIMEOUT * 1000) == -1)
-		Log(LOG_ERR, ("L2TP: error starting death timer: %s", strerror(errno)));
+		Perror("L2TP: error starting death timer");
 
 	/* Notify link side about session if necessary */
 	if (!sess->link_notified) {
@@ -1694,7 +1692,7 @@
 		} else if (pevent_register(ctrl->ctx, &ctrl->death_timer, 0,
 		    ctrl->mutex, ppp_l2tp_unused_timeout, ctrl,
 		    PEVENT_TIME, gL2TPto * 1000) == -1) {
-			Log(LOG_ERR, ("L2TP: error starting unused timer: %s", strerror(errno)));
+			Perror("L2TP: error starting unused timer");
 		}
 	}
 }
@@ -1755,13 +1753,13 @@
 	if (pevent_register(ctrl->ctx, &ctrl->idle_timer, 0,
 	    ctrl->mutex, ppp_l2tp_idle_timeout, ctrl, PEVENT_TIME,
 	    L2TP_IDLE_TIMEOUT * 1000) == -1) {
-		Log(LOG_ERR, ("L2TP: error restarting idle timer: %s", strerror(errno)));
+		Perror("L2TP: error restarting idle timer");
 		goto fail_errno;
 	}
 
 	/* Read packet */
 	if ((len = read(ctrl->dsock, buf, sizeof(buf))) == -1) {
-		Log(LOG_ERR, ("L2TP: error reading ctrl hook: %s", strerror(errno)));
+		Perror("L2TP: error reading ctrl hook");
 		goto fail_errno;
 	}
 
@@ -1790,7 +1788,7 @@
 			    L2TP_ERROR_MANDATORY, NULL);
 			goto done;
 		default:
-			Log(LOG_ERR, ("L2TP: error decoding control message: %s", strerror(errno)));
+			Perror("L2TP: error decoding control message");
 			goto fail_errno;
 		}
 	}
@@ -1847,7 +1845,7 @@
 
 	/* Convert AVP's to friendly form */
 	if ((ptrs = ppp_l2tp_avp_list2ptrs(avps)) == NULL) {
-		Log(LOG_ERR, ("L2TP: error decoding AVP list: %s", strerror(errno)));
+		Perror("L2TP: error decoding AVP list");
 		goto fail_errno;
 	}
 
@@ -1991,7 +1989,7 @@
 
 	/* Read netgraph control message */
 	if (NgRecvMsg(ctrl->csock, msg, sizeof(buf), raddr) < 0) {
-		Log(LOG_ERR, ("L2TP: error reading control message: %s", strerror(errno)));
+		Perror("L2TP: error reading control message");
 		ppp_l2tp_ctrl_close(ctrl, L2TP_RESULT_ERROR,
 		    L2TP_ERROR_GENERIC, strerror(errno));
 		return;
@@ -2322,7 +2320,7 @@
 		if (pevent_register(ctrl->ctx, &ctrl->reply_timer, 0,
 		    ctrl->mutex, ppp_l2tp_ctrl_reply_timeout, ctrl, PEVENT_TIME,
 		    L2TP_REPLY_TIMEOUT * 1000) == -1)
-			Log(LOG_ERR, ("L2TP: error starting reply timer: %s", strerror(errno)));
+			Perror("L2TP: error starting reply timer");
 		break;
 	default:
 		break;
@@ -2341,7 +2339,7 @@
 		if (pevent_register(ctrl->ctx, &sess->reply_timer, 0,
 		    ctrl->mutex, ppp_l2tp_sess_reply_timeout, sess, PEVENT_TIME,
 		    L2TP_REPLY_TIMEOUT * 1000) == -1)
-			Log(LOG_ERR, ("L2TP: error starting reply timer: %s", strerror(errno)));
+			Perror("L2TP: error starting reply timer");
 		break;
 	default:
 		break;
@@ -2450,7 +2448,7 @@
 			} else if (pevent_register(ctrl->ctx, &ctrl->death_timer, 0,
 			    ctrl->mutex, ppp_l2tp_unused_timeout, ctrl,
 			    PEVENT_TIME, gL2TPto * 1000) == -1) {
-				Log(LOG_ERR, ("L2TP: error starting unused timer: %s", strerror(errno)));
+				Perror("L2TP: error starting unused timer");
 			}
 		}
 	}
--- a/contrib/mpd/src/lcp.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/lcp.c	Fri Sep 14 02:13:58 2012 +0300
@@ -76,17 +76,17 @@
     { "AUTHPROTO", TY_AUTHPROTO, 2, 255, TRUE },
     { "QUALPROTO", TY_QUALPROTO, 0, 0, FALSE },
     { "MAGICNUM", TY_MAGICNUM, 4, 4, TRUE },
-    { "RESERVED", TY_RESERVED, 0, 0, FALSE },
+    { "RESERVED", TY_RESERVED, 0, 0, FALSE }, /* DEPRECATED */
     { "PROTOCOMP", TY_PROTOCOMP, 0, 0, TRUE },
     { "ACFCOMP", TY_ACFCOMP, 0, 0, TRUE },
     { "FCSALT", TY_FCSALT, 0, 0, FALSE },
     { "SDP", TY_SDP, 0, 0, FALSE },
     { "NUMMODE", TY_NUMMODE, 0, 0, FALSE },
-    { "MULTILINK", TY_MULTILINK, 0, 0, FALSE },
+    { "MULTILINK", TY_MULTILINK, 0, 0, FALSE }, /* DEPRECATED */
     { "CALLBACK", TY_CALLBACK, 1, 255, TRUE },
-    { "CONNECTTIME", TY_CONNECTTIME, 0, 0, FALSE },
-    { "COMPFRAME", TY_COMPFRAME, 0, 0, FALSE },
-    { "NDS", TY_NDS, 0, 0, FALSE },
+    { "CONNECTTIME", TY_CONNECTTIME, 0, 0, FALSE }, /* DEPRECATED */
+    { "COMPFRAME", TY_COMPFRAME, 0, 0, FALSE }, /* DEPRECATED */
+    { "NDS", TY_NDS, 0, 0, FALSE }, /* DEPRECATED */
     { "MP MRRU", TY_MRRU, 2, 2, TRUE },
     { "MP SHORTSEQ", TY_SHORTSEQNUM, 0, 0, TRUE },
     { "ENDPOINTDISC", TY_ENDPOINTDISC, 1, 255, TRUE },
--- a/contrib/mpd/src/link.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/link.c	Fri Sep 14 02:13:58 2012 +0300
@@ -160,8 +160,7 @@
     /* Create a netgraph socket node */
     snprintf(name, sizeof(name), "mpd%d-lso", gPid);
     if (NgMkSockNode(name, &gLinksCsock, &gLinksDsock) < 0) {
-	Log(LG_ERR, ("LinksInit(): can't create %s node: %s",
-    	    NG_SOCKET_NODE_TYPE, strerror(errno)));
+	Perror("LinksInit(): can't create %s node", NG_SOCKET_NODE_TYPE);
 	return(-1);
     }
     (void) fcntl(gLinksCsock, F_SETFD, 1);
@@ -540,7 +539,8 @@
     SLIST_INIT(&l->actions);
     SLIST_FOREACH(at, &lt->actions, next) {
 	a = Mdup(MB_AUTH, at, sizeof(*a));
-	regcomp(&a->regexp, a->regex, REG_EXTENDED);
+	if (a->regex[0])
+	    regcomp(&a->regexp, a->regex, REG_EXTENDED);
 	if (!ap)
 	    SLIST_INSERT_HEAD(&l->actions, a, next);
 	else
@@ -653,14 +653,18 @@
     struct ngm_mkpeer	mp;
     struct ngm_name	nm;
 
+    /* Initialize structures */
+    memset(&mp, 0, sizeof(mp));
+    memset(&nm, 0, sizeof(nm));
+
     /* Create TEE node */
     strcpy(mp.type, NG_TEE_NODE_TYPE);
     snprintf(mp.ourhook, sizeof(mp.ourhook), "l%d", l->id);
     strcpy(mp.peerhook, NG_TEE_HOOK_LEFT2RIGHT);
     if (NgSendMsg(gLinksCsock, ".:",
       NGM_GENERIC_COOKIE, NGM_MKPEER, &mp, sizeof(mp)) < 0) {
-	Log(LG_ERR, ("[%s] can't create %s node at \"%s\"->\"%s\": %s",
-    	    l->name, mp.type, ".:", mp.ourhook, strerror(errno)));
+	Perror("[%s] can't create %s node at \"%s\"->\"%s\"",
+	    l->name, mp.type, ".:", mp.ourhook);
 	goto fail;
     }
     strlcpy(l->hook, mp.ourhook, sizeof(l->hook));
@@ -669,15 +673,14 @@
     snprintf(nm.name, sizeof(nm.name), "mpd%d-%s-lt", gPid, l->name);
     if (NgSendMsg(gLinksCsock, l->hook,
       NGM_GENERIC_COOKIE, NGM_NAME, &nm, sizeof(nm)) < 0) {
-	Log(LG_ERR, ("[%s] can't name %s node \"%s\": %s",
-    	    l->name, NG_TEE_NODE_TYPE, l->hook, strerror(errno)));
+	Perror("[%s] can't name %s node \"%s\"",
+	    l->name, NG_TEE_NODE_TYPE, l->hook);
 	goto fail;
     }
 
     /* Get TEE node ID */
     if ((l->nodeID = NgGetNodeID(gLinksCsock, l->hook)) == 0) {
-	Log(LG_ERR, ("[%s] Cannot get %s node id: %s",
-	    l->name, NG_TEE_NODE_TYPE, strerror(errno)));
+	Perror("[%s] Cannot get %s node id", l->name, NG_TEE_NODE_TYPE);
 	goto fail;
     };
 
@@ -701,14 +704,15 @@
 
     snprintf(path, sizeof(path), "[%lx]:", (u_long)l->nodeID);
 
+    memset(&cn, 0, sizeof(cn));
     snprintf(cn.path, sizeof(cn.path), "[%lx]:", (u_long)l->bund->nodeID);
     strcpy(cn.ourhook, NG_TEE_HOOK_RIGHT);
     snprintf(cn.peerhook, sizeof(cn.peerhook), "%s%d", 
 	NG_PPP_HOOK_LINK_PREFIX, l->bundleIndex);
     if (NgSendMsg(gLinksCsock, path,
       NGM_GENERIC_COOKIE, NGM_CONNECT, &cn, sizeof(cn)) < 0) {
-	Log(LG_ERR, ("[%s] can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\": %s",
-    	    l->name, path, cn.ourhook, cn.path, cn.peerhook, strerror(errno)));
+	Perror("[%s] can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\"",
+	    l->name, path, cn.ourhook, cn.path, cn.peerhook);
 	return(-1);
     }
     
@@ -726,13 +730,14 @@
     char		path[NG_PATHSIZ];
     struct ngm_connect	cn;
 
+    memset(&cn, 0, sizeof(cn));
     snprintf(cn.path, sizeof(cn.path), "[%lx]:", (u_long)l->nodeID);
     strcpy(cn.ourhook, l->hook);
     strcpy(cn.peerhook, NG_TEE_HOOK_LEFT2RIGHT);
     if (NgSendMsg(gLinksCsock, ".:",
       NGM_GENERIC_COOKIE, NGM_CONNECT, &cn, sizeof(cn)) < 0) {
-	Log(LG_ERR, ("[%s] can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\": %s",
-    	    l->name, ".:", cn.ourhook, cn.path, cn.peerhook, strerror(errno)));
+	Perror("[%s] can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\"",
+	    l->name, ".:", cn.ourhook, cn.path, cn.peerhook);
 	return(-1);
     }
 
@@ -760,8 +765,8 @@
     }
     if (NgSendMsg(gLinksCsock, path,
       NGM_GENERIC_COOKIE, NGM_CONNECT, &cn, sizeof(cn)) < 0) {
-	Log(LG_ERR, ("[%s] can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\": %s",
-    	    l->name, path, cn.ourhook, cn.path, cn.peerhook, strerror(errno)));
+	Perror("[%s] can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\"",
+	    l->name, path, cn.ourhook, cn.path, cn.peerhook);
 	return(-1);
     }
 
@@ -1438,7 +1443,7 @@
 		        strlcpy(n->regex, av[1], sizeof(n->regex));
 		        if (regcomp(&n->regexp, n->regex, REG_EXTENDED)) {
 		    	    Freee(n);
-			    Error("regexp \"%s\" compilation error", av[0]);
+			    Error("regexp \"%s\" compilation error", av[1]);
 			}
 		    }
 		} else {
--- a/contrib/mpd/src/main.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/main.c	Fri Sep 14 02:13:58 2012 +0300
@@ -233,9 +233,8 @@
 #ifdef CCP_MPPC
     MppcTestCap();
 #endif
-    LinksInit();
-    CcpsInit();
-    EcpsInit();
+    if ((LinksInit() != 0) || (CcpsInit() != 0) || (EcpsInit() != 0))
+	exit(EX_UNAVAILABLE);
     
     /* Init device types. */
     for (k = 0; (pt = gPhysTypes[k]); k++) {
@@ -397,6 +396,7 @@
     LinksShutdown();
 
     /* Remove our PID file and exit */
+    ConsoleShutdown(&gConsole);
     Log(LG_ALWAYS, ("process %d terminated", gPid));
     LogClose();
     (void) unlink(gPidFile);
@@ -660,7 +660,7 @@
     char		buf[100];
     size_t		k;
 
-    fprintf(stderr, "Usage: mpd %s\n", UsageStr);
+    fprintf(stderr, "Usage: mpd5 %s\n", UsageStr);
     fprintf(stderr, "Options:\n");
     for (k = 0; k < OPTLIST_SIZE; k++) {
 	opt = OptList + k;
--- a/contrib/mpd/src/mbuf.h	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/mbuf.h	Fri Sep 14 02:13:58 2012 +0300
@@ -55,6 +55,8 @@
   #define MB_PPTP	"PPTP"
   #define MB_RADIUS	"RADIUS"
   #define MB_RADSRV	"RADSRV"
+  #define MB_ACL	"ACL_BPF"
+  #define MB_IPFW	"ACL_IPFW"
   #define MB_UTIL	"UTIL"
   #define MB_VJCOMP	"VJCOMP"
   #define MB_IPPOOL	"IPPOOL"
--- a/contrib/mpd/src/modem.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/modem.c	Fri Sep 14 02:13:58 2012 +0300
@@ -216,11 +216,14 @@
     m->opened = TRUE;
     if (m->fd >= 0) {			/* Device is already open.. */
 	if (m->answering) {			/* We just answered a call */
-    	    m->originated = FALSE;
-    	    m->answering = FALSE;
-    	    ModemChatConnectResult(l, TRUE, NULL);
-	} else
-    	    ModemDoClose(l, TRUE);		/* Stop idle script then dial back */
+	    m->originated = FALSE;
+	    m->answering = FALSE;
+	    ModemChatConnectResult(l, TRUE, NULL);
+	} else {
+	    Log(LG_PHYS2, ("[%s] MODEM: Stop idle script then dial back",
+	      l->name));
+	    ModemDoClose(l, TRUE);		/* Stop idle script then dial back */
+	}
     } else
 	ModemStart(l);			/* Open device and try to dial */
 }
@@ -249,17 +252,20 @@
     /* Avoid brief hang from kernel enforcing minimum DTR hold time */
     if (now - m->lastClosed < MODEM_MIN_CLOSE_TIME) {
 	TimerInit(&m->startTimer, "ModemStart",
-    	  (MODEM_MIN_CLOSE_TIME - (now - m->lastClosed)) * SECONDS, ModemStart, l);
+	  (MODEM_MIN_CLOSE_TIME - (now - m->lastClosed)) * SECONDS, ModemStart, l);
 	TimerStart(&m->startTimer);
 	return;
     }
 
     /* Open and configure serial port */
-    if ((m->fd = OpenSerialDevice(l->name, m->device, m->speed)) < 0)
-        goto fail;
-
+    if ((m->fd = OpenSerialDevice(l->name, m->device, m->speed)) < 0) {
+	Log(LG_ERR, ("[%s] MODEM: Fail to open serial port %s on speed %d",
+	  l->name, m->device, m->speed));
+	goto fail;
+    }
     /* If connecting, but no connect script, then skip chat altogether */
     if (m->opened && !*m->connScript) {
+	Log(LG_PHYS2, ("[%s] MODEM: No connect script present", l->name));
 	ModemChatConnectResult(l, TRUE, NULL);
 	return;
     }
@@ -283,8 +289,8 @@
     if (l->lcp.auth.conf.password[0] != 0) {
 	ChatPresetVar(m->chat, CHAT_VAR_PASSWORD, l->lcp.auth.conf.password);
     } else if (AuthGetData(l->lcp.auth.conf.authname,
-        password, sizeof(password), NULL, NULL) >= 0) {
-    	    ChatPresetVar(m->chat, CHAT_VAR_PASSWORD, password);
+	password, sizeof(password), NULL, NULL) >= 0) {
+	    ChatPresetVar(m->chat, CHAT_VAR_PASSWORD, password);
     }
 
     /* Run connect or idle script as appropriate */
@@ -323,10 +329,10 @@
 	return;		/* nothing needs to be done right now */
     if (m->fd >= 0 &&
       (!*m->idleScript || !Enabled(&l->conf.options, LINK_CONF_INCOMING)))
-        ModemDoClose(l, FALSE);
+	ModemDoClose(l, FALSE);
     else if (m->fd < 0 &&
       (*m->idleScript && Enabled(&l->conf.options, LINK_CONF_INCOMING)))
-        ModemStart(l);
+	ModemStart(l);
 }
 
 /*
@@ -374,17 +380,16 @@
 static int
 ModemSetAccm(Link l, u_int32_t xmit, u_int32_t recv)
 {
-    ModemInfo		const m = (ModemInfo) l->info;
-    char       		path[NG_PATHSIZ];
+    ModemInfo	const m = (ModemInfo) l->info;
+    char	path[NG_PATHSIZ];
 
     /* Update async config */
     m->acfg.accm = xmit|recv;
     snprintf(path, sizeof(path), "%s:%s", m->ttynode, NG_TTY_HOOK);
     if (NgSendMsg(m->csock, path, NGM_ASYNC_COOKIE,
       NGM_ASYNC_CMD_SET_CONFIG, &m->acfg, sizeof(m->acfg)) < 0) {
-	Log(LG_PHYS, ("[%s] MODEM: can't update config for %s: %s",
-    	    l->name, path, strerror(errno)));
-        return (-1);
+	Perror("[%s] MODEM: can't update config for %s", l->name, path);
+	return (-1);
     }
     return (0);
 }
@@ -416,9 +421,8 @@
 
     /* Set modem's reported connection speed (if any) as the link bandwidth */
     if ((cspeed = ChatGetVar(m->chat, CHAT_VAR_CONNECT_SPEED)) != NULL) {
-	if ((bw = (int) strtoul(cspeed, NULL, 10)) > 0) {
+	if ((bw = (int) strtoul(cspeed, NULL, 10)) > 0)
 	    l->bandwidth = bw;
-	}
 	Freee(cspeed);
     }
 
@@ -453,7 +457,7 @@
 static void
 ModemChatIdleResult(void *arg, int result, const char *msg)
 {
-    Link		const l = (Link) arg;
+    Link	const l = (Link) arg;
     ModemInfo	const m = (ModemInfo) l->info;
     char	*idleResult;
 
@@ -466,7 +470,7 @@
     /* See what script wants us to do now by checking variable $IdleResult */
     if ((idleResult = ChatGetVar(m->chat, CHAT_VAR_IDLE_RESULT)) == NULL) {
 	Log(LG_ERR, ("[%s] MODEM: idle script succeeded, but %s not defined",
-    	    l->name, CHAT_VAR_IDLE_RESULT));
+	    l->name, CHAT_VAR_IDLE_RESULT));
 	ModemDoClose(l, FALSE);
 	return;
     }
@@ -476,23 +480,23 @@
 	l->name, idleResult));
 
     if (gShutdownInProgress) {
-        Log(LG_PHYS, ("Shutdown sequence in progress, ignoring"));
+	Log(LG_PHYS, ("Shutdown sequence in progress, ignoring"));
 	ModemDoClose(l, FALSE);
     } else if (strcasecmp(idleResult, MODEM_IDLE_RESULT_ANSWER) == 0) {
-        Log(LG_PHYS, ("[%s] MODEM: opening link in %s mode", l->name, "answer"));
-        RecordLinkUpDownReason(NULL, l, 1, STR_INCOMING_CALL, msg ? "%s" : NULL, msg);
-        m->answering = TRUE;
-        l->state = PHYS_STATE_READY;
-        PhysIncoming(l);
+	Log(LG_PHYS, ("[%s] MODEM: opening link in %s mode", l->name, "answer"));
+	RecordLinkUpDownReason(NULL, l, 1, STR_INCOMING_CALL, msg ? "%s" : NULL, msg);
+	m->answering = TRUE;
+	l->state = PHYS_STATE_READY;
+	PhysIncoming(l);
     } else if (strcasecmp(idleResult, MODEM_IDLE_RESULT_RINGBACK) == 0) {
-        Log(LG_PHYS, ("[%s] MODEM: opening link in %s mode", l->name, "ringback"));
-        RecordLinkUpDownReason(NULL, l, 1, STR_RINGBACK, msg ? "%s" : NULL, msg);
-        m->answering = FALSE;
-        PhysIncoming(l);
+	Log(LG_PHYS, ("[%s] MODEM: opening link in %s mode", l->name, "ringback"));
+	RecordLinkUpDownReason(NULL, l, 1, STR_RINGBACK, msg ? "%s" : NULL, msg);
+	m->answering = FALSE;
+	PhysIncoming(l);
     } else {
-        Log(LG_ERR, ("[%s] MODEM: idle script succeeded, but action \"%s\" unknown",
-    	  l->name, idleResult));
-        ModemDoClose(l, FALSE);
+	Log(LG_ERR, ("[%s] MODEM: idle script succeeded, but action \"%s\" unknown",
+	  l->name, idleResult));
+	ModemDoClose(l, FALSE);
     }
     Freee(idleResult);
 }
@@ -524,9 +528,9 @@
 #endif
 
     /* Get a temporary netgraph socket node */
-    if (NgMkSockNode(NULL, &m->csock, NULL) == -1) {
-    	Log(LG_ERR, ("MODEM: NgMkSockNode: %s", strerror(errno)));
-    	return(-1);
+    if (NgMkSockNode(NULL, &m->csock, NULL) < 0) {
+	Perror("[%s] MODEM: NgMkSockNode failed", l->name);
+	return(-1);
     }
 
 #if NGM_TTY_COOKIE < 1226109660
@@ -534,24 +538,24 @@
     if (ioctl(m->fd, TIOCSETD, &ldisc) < 0) {
 
 	/* Installation of the tty node type should be automatic, but isn't yet.
-    	   The 'mkpeer' below will fail, because you can only create a ng_tty
+	   The 'mkpeer' below will fail, because you can only create a ng_tty
            node via TIOCSETD; however, this will force a load of the node type. */
 	if (errno == ENODEV) {
-    	    (void)NgSendAsciiMsg(m->csock, ".:",
+	    (void)NgSendAsciiMsg(m->csock, ".:",
 		"mkpeer { type=\"%s\" ourhook=\"dummy\" peerhook=\"%s\" }",
 		NG_TTY_NODE_TYPE, NG_TTY_HOOK);
 	}
 	if (ioctl(m->fd, TIOCSETD, &ldisc) < 0) {
-    	    Log(LG_ERR, ("[%s] ioctl(TIOCSETD, %d): %s",
-		l->name, ldisc, strerror(errno))); 
-    	    close(m->csock);
-    	    return(-1);
+	    Perror("[%s] ioctl(TIOCSETD, %d)", l->name, ldisc);
+	    close(m->csock);
+	    return(-1);
 	}
     }
 
     /* Get the name of the ng_tty node */
     if (ioctl(m->fd, NGIOCGINFO, &ngtty) < 0) {
-	Log(LG_ERR, ("[%s] MODEM: ioctl(NGIOCGINFO): %s", l->name, strerror(errno))); 
+	Perror("[%s] MODEM: ioctl(NGIOCGINFO)", l->name);
+	close(m->csock);
 	return(-1);
     }
     strlcpy(m->ttynode, ngtty.name, sizeof(m->ttynode));
@@ -561,18 +565,18 @@
     snprintf(ngm.ourhook, sizeof(ngm.ourhook), "%s", NG_TTY_HOOK);
     snprintf(ngm.peerhook, sizeof(ngm.peerhook), "%s", NG_TTY_HOOK);
     if (NgSendMsg(m->csock, ".", NGM_GENERIC_COOKIE,
-    	    NGM_MKPEER, &ngm, sizeof(ngm)) < 0) {
-        Log(LG_ERR, ("[%s] MODEM: can't connect %s node on %s", l->name,
-    	    NG_TTY_NODE_TYPE, "."));
-        close(m->csock);
+	    NGM_MKPEER, &ngm, sizeof(ngm)) < 0) {
+	Perror("[%s] MODEM: can't connect %s node on %s", l->name,
+	    NG_TTY_NODE_TYPE, ".");
+	close(m->csock);
 	return(-1);
     }
     snprintf(path, sizeof(path), ".:%s", NG_TTY_HOOK);
     if (NgSendMsg(m->csock, path,
 	    NGM_GENERIC_COOKIE, NGM_NODEINFO, NULL, 0) != -1) {
-        if (NgRecvMsg(m->csock, reply, sizeof(repbuf), NULL) < 0) {
-            Log(LG_ERR, ("[%s] MODEM: can't locate %s node on %s (%d)", l->name,
-        	NG_TTY_NODE_TYPE, path, errno));
+	if (NgRecvMsg(m->csock, reply, sizeof(repbuf), NULL) < 0) {
+	    Perror("[%s] MODEM: can't locate %s node on %s (%d)", l->name,
+	    NG_TTY_NODE_TYPE, path, errno);
 	    close(m->csock);
 	    return(-1);
 	}
@@ -583,18 +587,17 @@
     tty[1] = m->fd;
     if (NgSendMsg(m->csock, path, NGM_TTY_COOKIE,
           NGM_TTY_SET_TTY, &tty, sizeof(tty)) < 0) {
-        Log(LG_ERR, ("[%s] MODEM: can't hook tty to fd %d", l->name, m->fd));
-        close(m->csock);
+	Perror("[%s] MODEM: can't hook tty to fd %d", l->name, m->fd);
+	close(m->csock);
 	return(-1);
     }
     /* Disconnect temporary hook. */
     snprintf(rm.ourhook, sizeof(rm.ourhook), "%s", NG_TTY_HOOK);
     if (NgSendMsg(m->csock, ".",
-    	    NGM_GENERIC_COOKIE, NGM_RMHOOK, &rm, sizeof(rm)) < 0) {
-        Log(LG_ERR, ("[%s] MODEM: can't remove hook %s: %s", l->name,
-	    NG_TTY_HOOK, strerror(errno)));
-    	close(m->csock);
-    	return(-1);
+	    NGM_GENERIC_COOKIE, NGM_RMHOOK, &rm, sizeof(rm)) < 0) {
+	Perror("[%s] MODEM: can't remove hook %s", l->name, NG_TTY_HOOK);
+	close(m->csock);
+	return(-1);
     }
 #endif
 
@@ -602,7 +605,7 @@
     snprintf(path, sizeof(path), "%s:", m->ttynode);
     if (NgSendMsg(m->csock, path, NGM_TTY_COOKIE,
       NGM_TTY_SET_HOTCHAR, &hotchar, sizeof(hotchar)) < 0) {
-	Log(LG_ERR, ("[%s] MODEM: can't set hotchar", l->name));
+	Perror("[%s] MODEM: can't set hotchar", l->name);
 	close(m->csock);
 	return(-1);
     }
@@ -613,7 +616,7 @@
     strcpy(ngm.peerhook, NG_ASYNC_HOOK_ASYNC);
     if (NgSendMsg(m->csock, path, NGM_GENERIC_COOKIE,
       NGM_MKPEER, &ngm, sizeof(ngm)) < 0) {
-	Log(LG_ERR, ("[%s] MODEM: can't connect %s node", l->name, NG_ASYNC_NODE_TYPE));
+	Perror("[%s] MODEM: can't connect %s node", l->name, NG_ASYNC_NODE_TYPE);
 	close(m->csock);
 	return(-1);
     }
@@ -627,24 +630,24 @@
     m->acfg.smru = MODEM_MTU;
     if (NgSendMsg(m->csock, path, NGM_ASYNC_COOKIE,
       NGM_ASYNC_CMD_SET_CONFIG, &m->acfg, sizeof(m->acfg)) < 0) {
-	Log(LG_ERR, ("[%s] MODEM: can't config %s", l->name, path));
+	Perror("[%s] MODEM: can't config %s", l->name, path);
 	close(m->csock);
 	return(-1);
     }
 
     /* Attach async node to PPP node */
     if (!PhysGetUpperHook(l, cn.path, cn.peerhook)) {
-        Log(LG_PHYS, ("[%s] MODEM: can't get upper hook", l->name));
+	Log(LG_PHYS, ("[%s] MODEM: can't get upper hook", l->name));
 	close(m->csock);
 	return (-1);
     }
     snprintf(cn.ourhook, sizeof(cn.ourhook), NG_ASYNC_HOOK_SYNC);
     if (NgSendMsg(m->csock, path, NGM_GENERIC_COOKIE, NGM_CONNECT, 
         &cn, sizeof(cn)) < 0) {
-    	    Log(LG_ERR, ("[%s] MODEM: can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\": %s",
-	        l->name, path, cn.ourhook, cn.path, cn.peerhook, strerror(errno)));
-	    close(m->csock);
-	    return (-1);
+	Perror("[%s] MODEM: can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\"",
+	    l->name, path, cn.ourhook, cn.path, cn.peerhook);
+	close(m->csock);
+	return (-1);
     }
 
     return(0);
@@ -667,18 +670,15 @@
 
     /* Change baud rate */
     if (tcgetattr(m->fd, &attr) < 0) {
-	Log(LG_ERR, ("[%s] MODEM: can't tcgetattr \"%s\": %s",
-    	    l->name, m->device, strerror(errno)));
+	Perror("[%s] MODEM: can't tcgetattr \"%s\"", l->name, m->device);
 	return(-1);
     }
     if (cfsetspeed(&attr, (speed_t) baud) < 0) {
-	Log(LG_ERR, ("[%s] MODEM: can't set speed %d: %s",
-    	    l->name, baud, strerror(errno)));
+	Perror("[%s] MODEM: can't set speed %d", l->name, baud);
 	return(-1);
     }
     if (tcsetattr(m->fd, TCSANOW, &attr) < 0) {
-	Log(LG_ERR, ("[%s] MODEM: can't tcsetattr \"%s\": %s",
-    	    l->name, m->device, strerror(errno)));
+	Perror("[%s] MODEM: can't tcsetattr \"%s\"", l->name, m->device);
 	return(-1);
     }
     return(0);
@@ -708,8 +708,7 @@
     int		state;
 
     if (ioctl(m->fd, TIOCMGET, &state) < 0) {
-	Log(LG_ERR, ("[%s] MODEM: can't ioctl(%s) %s: %s",
-    	    l->name, "TIOCMGET", m->device, strerror(errno)));
+	Perror("[%s] MODEM: can't ioctl(TIOCMGET) %s", l->name, m->device);
 	l->state = PHYS_STATE_DOWN;
 	ModemDoClose(l, FALSE);
 	PhysDown(l, STR_ERROR, strerror(errno));
@@ -750,12 +749,11 @@
     snprintf(path, sizeof(path), "%s:%s", m->ttynode, NG_TTY_HOOK);
     if (ModemGetNgStats(l, &stats) >= 0
       && (stats.asyncBadCheckSums
-       || stats.asyncRunts || stats.asyncOverflows)) {
-	Log(LG_PHYS, ("[%s] NEW FRAME ERRS: FCS %u RUNT %u OVFL %u",
-        l->name, stats.asyncBadCheckSums,
-        stats.asyncRunts, stats.asyncOverflows));
+      || stats.asyncRunts || stats.asyncOverflows)) {
+	Log(LG_PHYS, ("[%s] NEW FRAME ERRS: FCS %u RUNT %u OVFL %u", l->name,
+          stats.asyncBadCheckSums, stats.asyncRunts, stats.asyncOverflows));
 	(void) NgSendMsg(m->csock, path,
-    	    NGM_ASYNC_COOKIE, NGM_ASYNC_CMD_CLR_STATS, NULL, 0);
+	    NGM_ASYNC_COOKIE, NGM_ASYNC_CMD_CLR_STATS, NULL, 0);
     }
 
     /* Restart timer */
@@ -770,7 +768,7 @@
 static int
 ModemGetNgStats(Link l, struct ng_async_stat *sp)
 {
-    ModemInfo           const m = (ModemInfo) l->info;
+    ModemInfo		const m = (ModemInfo) l->info;
     char		path[NG_PATHSIZ];
     union {
 	u_char		buf[sizeof(struct ng_mesg) + sizeof(*sp)];
@@ -781,7 +779,7 @@
     snprintf(path, sizeof(path), "%s:%s", m->ttynode, NG_TTY_HOOK);
     if (NgFuncSendQuery(path, NGM_ASYNC_COOKIE, NGM_ASYNC_CMD_GET_STATS,
       NULL, 0, &u.resp, sizeof(u), NULL) < 0) {
-	Log(LG_ERR, ("[%s] MODEM: can't get stats: %s", l->name, strerror(errno)));
+	Perror("[%s] MODEM: can't get stats", l->name);
 	return(-1);
     }
 
@@ -801,11 +799,11 @@
 
     switch ((intptr_t)arg) {
 	case SET_DEVICE:
-    	    if (ac == 1)
+	    if (ac == 1)
 		strlcpy(m->device, av[0], sizeof(m->device));
-    	    break;
+	    break;
 	case SET_SPEED:
-    	    {
+	    {
 		int	k, baud;
 
 		if (ac != 1)
@@ -821,46 +819,46 @@
 		    snprintf(buf, sizeof(buf), "%d", m->speed);
 		    ChatPresetVar(m->chat, CHAT_VAR_BAUDRATE, buf);
 		}
-    	    }
-    	    break;
+	    }
+	    break;
 	case SET_CSCRIPT:
-    	    if (ac != 1)
+	    if (ac != 1)
 		return(-1);
-    	    *m->connScript = 0;
-    	    strlcpy(m->connScript, av[0], sizeof(m->connScript));
-    	    break;
+	    *m->connScript = 0;
+	    strlcpy(m->connScript, av[0], sizeof(m->connScript));
+	    break;
 	case SET_ISCRIPT:
-    	    if (ac != 1)
+	    if (ac != 1)
 		return(-1);
-    	    *m->idleScript = 0;
-    	    strlcpy(m->idleScript, av[0], sizeof(m->idleScript));
-    	    if (m->opened || TimerRemain(&m->startTimer) >= 0)
+	    *m->idleScript = 0;
+	    strlcpy(m->idleScript, av[0], sizeof(m->idleScript));
+	    if (m->opened || TimerRemain(&m->startTimer) >= 0)
 		break;		/* nothing needs to be done right now */
-    	    if (m->fd >= 0 && !*m->idleScript)
-	        ModemDoClose(l, FALSE);
-    	    else if (m->fd < 0 && *m->idleScript)
-	        ModemStart(l);
-    	    break;
+	    if (m->fd >= 0 && !*m->idleScript)
+		ModemDoClose(l, FALSE);
+	    else if (m->fd < 0 && *m->idleScript)
+		ModemStart(l);
+	    break;
 	case SET_SCRIPT_VAR:
-    	    if (ac != 2)
+	    if (ac != 2)
 		return(-1);
-    	    ChatPresetVar(m->chat, av[0], av[1]);
-    	    break;
+	    ChatPresetVar(m->chat, av[0], av[1]);
+	    break;
 	case SET_WATCH:
-    	    {
+	    {
 		int	bit, add;
 
 		while (ac--) {
 		    switch (**av) {
 			case '+':
-	    		    (*av)++;
+			    (*av)++;
 			default:
-	    		    add = TRUE;
-	    		    break;
+			    add = TRUE;
+			    break;
 			case '-':
-	    		    add = FALSE;
-	    		    (*av)++;
-	    		    break;
+			    add = FALSE;
+			    (*av)++;
+			    break;
 		    }
 		    if (!strcasecmp(*av, "cd"))
 			bit = TIOCM_CAR;
@@ -876,10 +874,10 @@
 			m->watch &= ~bit;
 		    av++;
 		}
-    	    }
-    	    break;
+	    }
+	    break;
 	default:
-    	    assert(0);
+	    assert(0);
     }
     return(0);
 }
@@ -995,17 +993,16 @@
 	}
 
 	if (ctx->lnk->state == PHYS_STATE_UP && 
-    		ModemGetNgStats(ctx->lnk, &stats) >= 0) {
-    	    Printf("Async stats:\r\n");
-    	    Printf("\t       syncOctets: %8u\r\n", stats.syncOctets);
-    	    Printf("\t       syncFrames: %8u\r\n", stats.syncFrames);
-    	    Printf("\t    syncOverflows: %8u\r\n", stats.syncOverflows);
+		ModemGetNgStats(ctx->lnk, &stats) >= 0) {
+	    Printf("Async stats:\r\n");
+	    Printf("\t       syncOctets: %8u\r\n", stats.syncOctets);
+	    Printf("\t       syncFrames: %8u\r\n", stats.syncFrames);
+	    Printf("\t    syncOverflows: %8u\r\n", stats.syncOverflows);
 	    Printf("\t      asyncOctets: %8u\r\n", stats.asyncOctets);
-    	    Printf("\t      asyncFrames: %8u\r\n", stats.asyncFrames);
-    	    Printf("\t       asyncRunts: %8u\r\n", stats.asyncRunts);
-    	    Printf("\t   asyncOverflows: %8u\r\n", stats.asyncOverflows);
-    	    Printf("\tasyncBadCheckSums: %8u\r\n", stats.asyncBadCheckSums);
-        }
+	    Printf("\t      asyncFrames: %8u\r\n", stats.asyncFrames);
+	    Printf("\t       asyncRunts: %8u\r\n", stats.asyncRunts);
+	    Printf("\t   asyncOverflows: %8u\r\n", stats.asyncOverflows);
+	    Printf("\tasyncBadCheckSums: %8u\r\n", stats.asyncBadCheckSums);
+	}
     }
 }
-
--- a/contrib/mpd/src/msg.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/msg.c	Fri Sep 14 02:13:58 2012 +0300
@@ -138,7 +138,7 @@
     SETOVERLOAD(QUEUELEN());
 
     if (!msgpipesent) {
-	char	buf[1];
+	char	buf[1] = { 0x2a };
 	if (write(msgpipe[PIPE_WRITE], buf, 1) > 0)
 	    msgpipesent = 1;
     }
--- a/contrib/mpd/src/nat.h	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/nat.h	Fri Sep 14 02:13:58 2012 +0300
@@ -11,8 +11,11 @@
 #include <netgraph/ng_nat.h>
 
 #ifdef NG_NAT_DESC_LENGTH
+/* max. number of red-port rules */
 #define NM_PORT		16
+/* max. number of red-addr rules */
 #define NM_ADDR		8
+/* max. number of red-proto rules */
 #define NM_PROTO	8
 #endif
 
--- a/contrib/mpd/src/ng.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/ng.c	Fri Sep 14 02:13:58 2012 +0300
@@ -117,16 +117,15 @@
     
     /* Get a temporary netgraph socket node */
     if (NgMkSockNode(NULL, &csock, NULL) == -1) {
-	Log(LG_ERR, ("[%s] NG: NgMkSockNode: %s", 
-	    l->name, strerror(errno)));
+	Perror("[%s] NG: NgMkSockNode", l->name);
 	goto fail;
     }
 
     strlcpy(cn.path, ng->path, sizeof(cn.path));
     strlcpy(cn.peerhook, ng->hook, sizeof(cn.peerhook));
     if (NgSendMsg(csock, path, NGM_GENERIC_COOKIE, NGM_CONNECT, &cn, sizeof(cn)) < 0) {
-	Log(LG_ERR, ("[%s] NG: can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\": %s",
-    	    l->name, path, cn.ourhook, cn.path, cn.peerhook, strerror(errno)));
+	Perror("[%s] NG: can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\"",
+	    l->name, path, cn.ourhook, cn.path, cn.peerhook);
 	goto fail;
     }
     
@@ -156,8 +155,7 @@
 
     /* Get a temporary netgraph socket node */
     if (NgMkSockNode(NULL, &csock, NULL) == -1) {
-	Log(LG_ERR, ("[%s] NG: NgMkSockNode: %s", 
-	    l->name, strerror(errno)));
+	Perror("[%s] NG: NgMkSockNode", l->name);
 	goto fail;
     }
 
--- a/contrib/mpd/src/ngfunc.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/ngfunc.c	Fri Sep 14 02:13:58 2012 +0300
@@ -44,6 +44,10 @@
 #endif
 #ifdef USE_NG_NETFLOW
 #include <netgraph/netflow/ng_netflow.h>
+#if NGM_NETFLOW_COOKIE >= 1309868867
+#include <netgraph/netflow/netflow.h>
+#include <netgraph/netflow/netflow_v9.h>
+#endif
 #endif
 #ifdef USE_NG_PRED1
 #include <netgraph/ng_pred1.h>
@@ -64,6 +68,11 @@
     SET_PEER,
     SET_SELF,
     SET_TIMEOUTS,
+#if NGM_NETFLOW_COOKIE >= 1309868867
+    SET_TEMPLATE,
+    SET_MTU,
+    SET_VERSION,
+#endif
     SET_NODE,
     SET_HOOK
   };
@@ -88,6 +97,14 @@
         NetflowSetCommand, NULL, 2, (void *) SET_SELF },
     { "timeouts {inactive} {active}", "Set NetFlow timeouts" ,
         NetflowSetCommand, NULL, 2, (void *) SET_TIMEOUTS },
+#if NGM_NETFLOW_COOKIE >= 1309868867
+    { "template {time} {packets}", "Set NetFlow v9 template" ,
+        NetflowSetCommand, NULL, 2, (void *) SET_TEMPLATE },
+    { "mtu {mtu}", "Set NetFlow v9 MTU" ,
+        NetflowSetCommand, NULL, 2, (void *) SET_MTU },
+    { "version {version}", "Set version to export" ,
+        NetflowSetCommand, NULL, 2, (void *) SET_VERSION },
+#endif
     { "node {name}", "Set node name to use" ,
         NetflowSetCommand, NULL, 2, (void *) SET_NODE },
     { "hook {number}", "Set initial hook number" ,
@@ -113,6 +130,12 @@
   struct sockaddr_storage gNetflowSource;
   uint32_t gNetflowInactive = 0;
   uint32_t gNetflowActive = 0;
+#if NGM_NETFLOW_COOKIE >= 1309868867
+  uint16_t gNetflowTime = 0;
+  uint16_t gNetflowPackets = 0;
+  uint16_t gNetflowMTU = 0;
+  u_int gNetflowVer = 5;
+#endif
 #endif
   
   static int	gNgStatSock=0;
@@ -130,8 +153,7 @@
 
     /* Create a netgraph socket node */
     if (NgMkSockNode(NULL, &csock, NULL) < 0) {
-	Log(LG_ERR, ("NETFLOW: Can't create %s node: %s",
-    	    NG_SOCKET_NODE_TYPE, strerror(errno)));
+	Perror("NETFLOW: Can't create %s node", NG_SOCKET_NODE_TYPE);
         return (-1);
     }
 
@@ -151,8 +173,8 @@
     strcpy(mp.peerhook, NG_NETFLOW_HOOK_DATA "0");
     if (NgSendMsg(csock, ".:",
       NGM_GENERIC_COOKIE, NGM_MKPEER, &mp, sizeof(mp)) < 0) {
-	Log(LG_ERR, ("NETFLOW: Can't create %s node at \"%s\"->\"%s\": %s", 
-	    mp.type, ".:", mp.ourhook, strerror(errno)));
+	Perror("NETFLOW: Can't create %s node at \"%s\"->\"%s\"", 
+	    mp.type, ".:", mp.ourhook);
 	goto fail;
     }
     
@@ -163,14 +185,21 @@
     strcpy(nm.name, gNetflowNodeName);
     if (NgSendMsg(csock, TEMPHOOK,
       NGM_GENERIC_COOKIE, NGM_NAME, &nm, sizeof(nm)) < 0) {
-	Log(LG_ERR, ("NETFLOW: Can't name %s node: %s", NG_NETFLOW_NODE_TYPE,
-            strerror(errno)));
+	Perror("NETFLOW: Can't name %s node", NG_NETFLOW_NODE_TYPE);
 	goto fail;
     }
 
     /* Connect ng_ksocket(4) node for export. */
     strcpy(mp.type, NG_KSOCKET_NODE_TYPE);
-    strcpy(mp.ourhook, NG_NETFLOW_HOOK_EXPORT);
+#if NGM_NETFLOW_COOKIE >= 1309868867
+    if (gNetflowVer == 5) {
+#endif
+	strcpy(mp.ourhook, NG_NETFLOW_HOOK_EXPORT);
+#if NGM_NETFLOW_COOKIE >= 1309868867
+    } else {
+	strcpy(mp.ourhook, NG_NETFLOW_HOOK_EXPORT9);
+    }
+#endif
     if (gNetflowExport.ss_family==AF_INET6) {
 	snprintf(mp.peerhook, sizeof(mp.peerhook), "%d/%d/%d", PF_INET6, SOCK_DGRAM, IPPROTO_UDP);
     } else {
@@ -179,8 +208,8 @@
     snprintf(path, sizeof(path), "[%x]:", gNetflowNodeID);
     if (NgSendMsg(csock, path,
       NGM_GENERIC_COOKIE, NGM_MKPEER, &mp, sizeof(mp)) < 0) {
-	Log(LG_ERR, ("NETFLOW: Can't create %s node at \"%s\"->\"%s\": %s", 
-	    mp.type, path, mp.ourhook, strerror(errno)));
+	Perror("NETFLOW: Can't create %s node at \"%s\"->\"%s\"",
+	    mp.type, path, mp.ourhook);
 	goto fail;
     }
 
@@ -193,27 +222,60 @@
 
 	if (NgSendMsg(csock, path, NGM_NETFLOW_COOKIE,
 	  NGM_NETFLOW_SETTIMEOUTS, &nf_settime, sizeof(nf_settime)) < 0) {
-	    Log(LG_ERR, ("NETFLOW: Can't set timeouts on netflow %s node: %s",
-		NG_NETFLOW_NODE_TYPE, strerror(errno)));
+	    Perror("NETFLOW: Can't set timeouts on netflow %s node",
+		NG_NETFLOW_NODE_TYPE);
+	    goto fail2;
+	}
+    }
+
+#if NGM_NETFLOW_COOKIE >= 1309868867
+    if (gNetflowTime != 0 && gNetflowPackets != 0) {
+	struct ng_netflow_settemplate nf_settempl;
+
+	nf_settempl.time = gNetflowTime;
+	nf_settempl.packets = gNetflowPackets;
+	if (NgSendMsg(csock, path, NGM_NETFLOW_COOKIE,
+	  NGM_NETFLOW_SETTEMPLATE, &nf_settempl, sizeof(nf_settempl)) < 0) {
+	    Perror("NETFLOW: Can't set NetFlow v9 template on netflow %s node",
+		NG_NETFLOW_NODE_TYPE);
 	    goto fail2;
 	}
     }
 
+    if (gNetflowMTU != 0) {
+	struct ng_netflow_setmtu nf_setmtu;
+
+	nf_setmtu.mtu = gNetflowMTU;
+	if (NgSendMsg(csock, path, NGM_NETFLOW_COOKIE,
+	  NGM_NETFLOW_SETMTU, &nf_setmtu, sizeof(nf_setmtu)) < 0) {
+	    Perror("NETFLOW: Can't set NetFlow v9 MTU on netflow %s node",
+		NG_NETFLOW_NODE_TYPE);
+	  goto fail2;
+	}
+    }
+#endif
+
     /* Configure export destination and source on ng_ksocket(4). */
-    strlcat(path, NG_NETFLOW_HOOK_EXPORT, sizeof(path));
+#if NGM_NETFLOW_COOKIE >= 1309868867
+    if (gNetflowVer == 5) {
+#endif
+	strlcat(path, NG_NETFLOW_HOOK_EXPORT, sizeof(path));
+#if NGM_NETFLOW_COOKIE >= 1309868867
+    } else {
+	strlcat(path, NG_NETFLOW_HOOK_EXPORT9, sizeof(path));
+    }
+#endif
     if (gNetflowSource.ss_len != 0) {
 	if (NgSendMsg(csock, path, NGM_KSOCKET_COOKIE,
 	  NGM_KSOCKET_BIND, &gNetflowSource, sizeof(gNetflowSource)) < 0) {
-	    Log(LG_ERR, ("NETFLOW: Can't bind export %s node: %s",
-		NG_KSOCKET_NODE_TYPE, strerror(errno)));
+	    Perror("NETFLOW: Can't bind export %s node", NG_KSOCKET_NODE_TYPE);
 	    goto fail2;
 	}
     }
     if (gNetflowExport.ss_len != 0) {
 	if (NgSendMsg(csock, path, NGM_KSOCKET_COOKIE,
 	  NGM_KSOCKET_CONNECT, &gNetflowExport, sizeof(gNetflowExport)) < 0) {
-	    Log(LG_ERR, ("NETFLOW: Can't connect export %s node: %s",
-		NG_KSOCKET_NODE_TYPE, strerror(errno)));
+	    Perror("NETFLOW: Can't connect export %s node", NG_KSOCKET_NODE_TYPE);
 	    goto fail2;
 	}
     }
@@ -222,16 +284,16 @@
     snprintf(nm.name, sizeof(nm.name), "mpd%d-nfso", gPid);
     if (NgSendMsg(csock, path,
       NGM_GENERIC_COOKIE, NGM_NAME, &nm, sizeof(nm)) < 0) {
-	Log(LG_ERR, ("NETFLOW: Can't name %s node: %s", NG_KSOCKET_NODE_TYPE,
-            strerror(errno)));
+	Perror("NETFLOW: Can't name %s node", NG_KSOCKET_NODE_TYPE);
 	goto fail2;
     }
 
     /* Disconnect temporary hook. */
-    strcpy(rm.ourhook, TEMPHOOK);
+    memset(&rm, 0, sizeof(rm));
+    strncpy(rm.ourhook, TEMPHOOK, sizeof(rm.ourhook));
     if (NgSendMsg(csock, ".:",
       NGM_GENERIC_COOKIE, NGM_RMHOOK, &rm, sizeof(rm)) < 0) {
-	Log(LG_ERR, ("can't remove hook %s: %s", TEMPHOOK, strerror(errno)));
+	Perror("can't remove hook %s", TEMPHOOK);
 	goto fail2;
     }
     gNetflowNode = TRUE;
@@ -280,13 +342,12 @@
     /* Get the new node's name */
     if (NgSendMsg(gLinksCsock, TEMPHOOK,
       NGM_GENERIC_COOKIE, NGM_NODEINFO, NULL, 0) < 0) {
-	Log(LG_ERR, ("[%s] %s: %s", b->name, "NGM_NODEINFO", strerror(errno)));
+	Perror("[%s] %s", b->name, "NGM_NODEINFO");
 	rtn = -1;
 	goto done;
     }
     if (NgRecvMsg(gLinksCsock, &u.reply, sizeof(u), NULL) < 0) {
-	Log(LG_ERR, ("[%s] reply from %s: %s",
-    	    b->name, NG_IFACE_NODE_TYPE, strerror(errno)));
+	Perror("[%s] reply from %s", b->name, NG_IFACE_NODE_TYPE);
 	rtn = -1;
 	goto done;
     }
@@ -297,8 +358,7 @@
     strcpy(rm.ourhook, TEMPHOOK);
     if (NgSendMsg(gLinksCsock, ".:",
       NGM_GENERIC_COOKIE, NGM_RMHOOK, &rm, sizeof(rm)) < 0) {
-	Log(LG_ERR, ("[%s] can't remove hook %s: %s",
-    	    b->name, TEMPHOOK, strerror(errno)));
+	Perror("[%s] can't remove hook %s", b->name, TEMPHOOK);
 	rtn = -1;
     }
 
@@ -324,9 +384,8 @@
 
     /* Create a netgraph socket node */
     if (NgMkSockNode(NULL, &csock, NULL) < 0) {
-	Log(LG_ERR, ("NgFuncShutdownGlobal: can't create %s node: %s",
-    	    NG_SOCKET_NODE_TYPE, strerror(errno)));
-        return;
+	Perror("NgFuncShutdownGlobal: can't create %s node", NG_SOCKET_NODE_TYPE);
+	return;
     }
 
     snprintf(path, sizeof(path), "[%x]:", gNetflowNodeID);
@@ -357,8 +416,7 @@
 	    goto retry;
 	}
 	if (errno != ENOENT) {
-    	    Log(LG_ERR, ("[%s] can't shutdown \"%s\": %s",
-	      label, path, strerror(errno)));
+	    Perror("[%s] can't shutdown \"%s\"", label, path);
 	}
     }
     return(rtn);
@@ -375,8 +433,7 @@
     snprintf(path, sizeof(path), "[%x]:", b->nodeID);
     if (NgSendMsg(gLinksCsock, path, NGM_PPP_COOKIE,
     	    NGM_PPP_SET_CONFIG, &b->pppConfig, sizeof(b->pppConfig)) < 0) {
-	Log(LG_ERR, ("[%s] can't config %s: %s",
-    	    b->name, path, strerror(errno)));
+	Perror("[%s] can't config %s", b->name, path);
 	DoExit(EX_ERRDEAD);
     }
 }
@@ -396,9 +453,8 @@
 	/* Create a netgraph socket node */
 	snprintf(name, sizeof(name), "mpd%d-stats", gPid);
 	if (NgMkSockNode(name, &gNgStatSock, NULL) < 0) {
-    	    Log(LG_ERR, ("NgFuncSendQuery: can't create %s node: %s",
-    		NG_SOCKET_NODE_TYPE, strerror(errno)));
-    	    return(-1);
+	    Perror("NgFuncSendQuery: can't create %s node", NG_SOCKET_NODE_TYPE);
+	    return(-1);
 	}
 	(void) fcntl(gNgStatSock, F_SETFD, 1);
     }
@@ -409,8 +465,7 @@
 
     /* Read message */
     if (NgRecvMsg(gNgStatSock, rbuf, replen, raddr) < 0) {
-	Log(LG_ERR, ("NgFuncSendQuery: can't read unexpected message: %s",
-    	    strerror(errno)));
+	Perror("NgFuncSendQuery: can't read unexpected message");
 	return (-1);
     }
 
@@ -432,8 +487,8 @@
     strlcpy(cn.peerhook, hook2, sizeof(cn.peerhook));
     if (NgSendMsg(csock, path,
       NGM_GENERIC_COOKIE, NGM_CONNECT, &cn, sizeof(cn)) < 0) {
-        Log(LG_ERR, ("[%s] can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\": %s",
-    	    label, path, hook, path2, hook2, strerror(errno)));
+	Perror("[%s] can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\"",
+	    label, path, hook, path2, hook2);
 	return(-1);
     }
     return(0);
@@ -450,6 +505,7 @@
     int		retry = 10, delay = 1000;
 
     /* Disconnect hook */
+    memset(&rm, 0, sizeof(rm));
     strlcpy(rm.ourhook, hook, sizeof(rm.ourhook));
 retry:
     if (NgSendMsg(csock, path,
@@ -462,8 +518,7 @@
 	    delay *= 2;
 	    goto retry;
 	}
-	Log(LG_ERR, ("[%s] can't remove hook %s from node \"%s\": %s",
-    	  label, hook, path, strerror(errno)));
+	Perror("[%s] can't remove hook %s from node \"%s\"", label, hook, path);
 	return(-1);
     }
     return(0);
@@ -571,8 +626,8 @@
 
     /* ENOBUFS can be expected on some links, e.g., ng_pptpgre(4) */
     if (rtn < 0 && errno != ENOBUFS) {
-	Log(LG_ERR, ("[%s] error writing len %d frame to %s: %s",
-    	    label, MBLEN(bp), hookname, strerror(errno)));
+	Perror("[%s] error writing len %d frame to %s",
+	    label, MBLEN(bp), hookname);
     }
     mbfree(bp);
     return (rtn);
@@ -593,8 +648,7 @@
     snprintf(path, sizeof(path), "[%x]:", b->nodeID);
     if (NgSendMsg(gLinksCsock, path, 
 	NGM_PPP_COOKIE, NGM_PPP_CLR_LINK_STATS, &linkNum, sizeof(linkNum)) < 0) {
-	    Log(LG_ERR, ("[%s] can't clear stats, link=%d: %s",
-    		b->name, linkNum, strerror(errno)));
+	    Perror("[%s] can't clear stats, link=%d", b->name, linkNum);
 	    return (-1);
     }
     return(0);
@@ -620,8 +674,7 @@
     snprintf(path, sizeof(path), "[%x]:", b->nodeID);
     if (NgFuncSendQuery(path, NGM_PPP_COOKIE, NGM_PPP_GET_LINK_STATS,
       &linkNum, sizeof(linkNum), &u.reply, sizeof(u), NULL) < 0) {
-	Log(LG_ERR, ("[%s] can't get stats, link=%d: %s",
-    	    b->name, linkNum, strerror(errno)));
+	Perror("[%s] can't get stats, link=%d", b->name, linkNum);
 	return -1;
     }
     if (statp != NULL)
@@ -650,8 +703,7 @@
     snprintf(path, sizeof(path), "[%x]:", b->nodeID);
     if (NgFuncSendQuery(path, NGM_PPP_COOKIE, NGM_PPP_GET_LINK_STATS64,
       &linkNum, sizeof(linkNum), &u.reply, sizeof(u), NULL) < 0) {
-	Log(LG_ERR, ("[%s] can't get stats, link=%d: %s",
-    	    b->name, linkNum, strerror(errno)));
+	Perror("[%s] can't get stats, link=%d", b->name, linkNum);
 	return -1;
     }
     if (statp != NULL)
@@ -689,7 +741,7 @@
     va_start(args, fmt);
     vsnprintf(buf, sizeof(buf), fmt, args);
     va_end(args);
-    Log(LG_ERR, ("netgraph: %s: %s", buf, strerror(errno)));
+    Perror("netgraph: %s", buf);
 }
 
 #ifdef USE_NG_NETFLOW
@@ -723,6 +775,34 @@
     	    gNetflowInactive = atoi(av[0]);
     	    gNetflowActive = atoi(av[1]);
     	    break;
+#if NGM_NETFLOW_COOKIE >= 1309868867
+	case SET_TEMPLATE:
+    	    if (ac != 2)
+		return (-1);
+	    /*
+	     * RFC 3954 clause 7.3
+	     * "Both options MUST be configurable by the user on the Exporter."
+	     */
+    	    if (atoi(av[0]) <= 0 || atoi(av[1]) <= 0)
+		Error("Bad netflow v9 template values \"%s %s\"", av[0], av[1]);
+    	    gNetflowTime = atoi(av[0]);		/* Default 600 */
+    	    gNetflowPackets = atoi(av[1]);	/* Default 500 */
+    	    break;
+	case SET_MTU:
+    	    if (ac != 1)
+		return (-1);
+    	    if (atoi(av[0]) < MIN_MTU || atoi(av[0]) > MAX_MTU)
+		Error("Bad netflow v9 MTU \"%s\"", av[0]);
+    	    gNetflowMTU = atoi(av[0]);		/* Default 1500 */
+    	    break;
+	case SET_VERSION:
+    	    if (ac != 1)
+		return (-1);
+    	    if (atoi(av[0]) != 5 && atoi(av[0]) != 9)
+		Error("Bad netflow export version \"%s\"", av[0]);
+    	    gNetflowVer = atoi(av[0]);		/* Default 5 */
+    	    break;
+#endif
 	case SET_NODE:
     	    if (ac != 1)
 		return (-1);
@@ -764,8 +844,7 @@
 	    /* Create a netgraph socket node */
 	    snprintf(name, sizeof(name), "mpd%d-stats", gPid);
 	    if (NgMkSockNode(name, &gNgStatSock, NULL) < 0) {
-    		Log(LG_ERR, ("NgFuncSendQuery: can't create %s node: %s",
-    	    	    NG_SOCKET_NODE_TYPE, strerror(errno)));
+    		Perror("NgFuncSendQuery: can't create %s node", NG_SOCKET_NODE_TYPE);
     		return(-1);
 	    }
 	    (void) fcntl(gNgStatSock, F_SETFD, 1);
--- a/contrib/mpd/src/phys.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/phys.c	Fri Sep 14 02:13:58 2012 +0300
@@ -296,7 +296,7 @@
 }
 
 /*
- * PhysGetSelfAddr()
+ * PhysGetSelfName()
  */
 
 int
@@ -313,7 +313,7 @@
 }
 
 /*
- * PhysGetPeerAddr()
+ * PhysGetPeerName()
  */
 
 int
--- a/contrib/mpd/src/pppoe.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/pppoe.c	Fri Sep 14 02:13:58 2012 +0300
@@ -263,8 +263,9 @@
 		/* Path to the ng_tee node */
 		snprintf(path, sizeof(path), "[%x]:%s", 
 		    pe->PIf->node_id, session_hook);
-		    
+
 		/* Connect ng_tee(4) node to the ng_ppp(4) node. */
+		memset(&cn, 0, sizeof(cn));
 		if (!PhysGetUpperHook(l, cn.path, cn.peerhook)) {
 		    Log(LG_PHYS, ("[%s] PPPoE: can't get upper hook", l->name));
 		    goto fail3;
@@ -272,15 +273,15 @@
 		snprintf(cn.ourhook, sizeof(cn.ourhook), "right");
 		if (NgSendMsg(pe->PIf->csock, path, NGM_GENERIC_COOKIE, NGM_CONNECT, 
 		    &cn, sizeof(cn)) < 0) {
-			Log(LG_ERR, ("[%s] PPPoE: can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\": %s",
-	    		    l->name, path, cn.ourhook, cn.path, cn.peerhook, strerror(errno)));
+			Perror("[%s] PPPoE: can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\"",
+	    		    l->name, path, cn.ourhook, cn.path, cn.peerhook);
 			goto fail3;
 		}
 
 		/* Shutdown ng_tee node */
 		if (NgFuncShutdownNode(pe->PIf->csock, l->name, path) < 0) {
-			Log(LG_ERR, ("[%s] PPPoE: Shutdown ng_tee node %s error: %s",
-			    l->name, path, strerror(errno)));
+			Perror("[%s] PPPoE: Shutdown ng_tee node %s error",
+			    l->name, path);
 		}
 
 		if (l->state==PHYS_STATE_READY) {
@@ -317,8 +318,8 @@
 	
 	if (NgSendMsg(pe->PIf->csock, path, NGM_GENERIC_COOKIE, NGM_CONNECT, 
 	    &cn, sizeof(cn)) < 0) {
-		Log(LG_ERR, ("[%s] PPPoE: can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\": %s",
-    		    l->name, path, cn.ourhook, cn.path, cn.peerhook, strerror(errno)));
+		Perror("[%s] PPPoE: can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\"",
+    		    l->name, path, cn.ourhook, cn.path, cn.peerhook);
 		goto fail2;
 	}
 
@@ -331,8 +332,7 @@
 	strncpy(idata->data, pe->session, MAX_SESSION);
 	if (NgSendMsg(pe->PIf->csock, path, NGM_PPPOE_COOKIE, NGM_PPPOE_CONNECT,
 	    idata, sizeof(*idata) + idata->data_len) < 0) {
-		Log(LG_ERR, ("[%s] PPPoE can't request connection to server: "
-		    "%s", l->name, strerror(errno)));
+		Perror("[%s] PPPoE can't request connection to server", l->name);
 		goto fail2;
 	}
 
@@ -450,8 +450,7 @@
 	
 	/* Read control message. */
 	if (NgRecvMsg(PIf->csock, &u.resp, sizeof(u), path) < 0) {
-		Log(LG_ERR, ("PPPoE: error reading message from \"%s\": %s",
-		    path, strerror(errno)));
+		Perror("PPPoE: error reading message from \"%s\"", path);
 		return;
 	}
 	if (u.resp.header.typecookie != NGM_PPPOE_COOKIE) {
@@ -686,8 +685,7 @@
 
 	/* Create a new netgraph node */
 	if (NgMkSockNode(NULL, &PIf->csock, &PIf->dsock) < 0) {
-		Log(LG_ERR, ("[%s] PPPoE: can't create ctrl socket: %s",
-		    iface, strerror(errno)));
+		Perror("[%s] PPPoE: can't create ctrl socket", iface);
 		return(0);
 	}
 	(void)fcntl(PIf->csock, F_SETFD, 1);
@@ -700,8 +698,8 @@
 		/* Ask for a list of available node types. */
 		if (NgSendMsg(PIf->csock, "", NGM_GENERIC_COOKIE, NGM_LISTTYPES,
 		    NULL, 0) < 0) {
-			Log(LG_ERR, ("[%s] PPPoE: Cannot send a netgraph message: %s",
-			    iface, strerror(errno)));
+			Perror("[%s] PPPoE: Cannot send a netgraph message",
+			    iface);
 			close(PIf->csock);
 			close(PIf->dsock);
 			return (0);
@@ -710,8 +708,8 @@
 		/* Get response. */
 		resp = &u.reply;
 		if (NgRecvMsg(PIf->csock, resp, sizeof(u.buf), NULL) <= 0) {
-			Log(LG_ERR, ("[%s] PPPoE: Cannot get netgraph response: %s",
-			    iface, strerror(errno)));
+			Perror("[%s] PPPoE: Cannot get netgraph response",
+			    iface);
 			close(PIf->csock);
 			close(PIf->dsock);
 			return (0);
@@ -727,8 +725,7 @@
 
 		/* If not found try to load ng_ether and repeat the check. */
 		if (gNgEtherLoaded == FALSE && (kldload("ng_ether") < 0)) {
-			Log(LG_ERR, ("PPPoE: Cannot load ng_ether: %s",
-			    strerror(errno)));
+			Perror("PPPoE: Cannot load ng_ether");
 			close(PIf->csock);
 			close(PIf->dsock);
 			assert (0);
@@ -743,8 +740,7 @@
 	 */
 	if (NgSendMsg(PIf->csock, path, NGM_GENERIC_COOKIE, NGM_LISTHOOKS,
 	    NULL, 0) < 0) {
-		Log(LG_ERR, ("[%s] Cannot send a netgraph message: %s:%s",
-                    iface, path, strerror(errno)));
+		Perror("[%s] Cannot send a netgraph message: %s", iface, path);
 		close(PIf->csock);
 		close(PIf->dsock);
 		return (0);
@@ -753,8 +749,7 @@
 	/* Get our list back. */
 	resp = &u.reply;
 	if (NgRecvMsg(PIf->csock, resp, sizeof(u.buf), NULL) <= 0) {
-		Log(LG_ERR, ("[%s] Cannot get netgraph response: %s",
-		    iface, strerror(errno)));
+		Perror("[%s] Cannot get netgraph response", iface);
 		close(PIf->csock);
 		close(PIf->dsock);
 		return (0);
@@ -805,24 +800,23 @@
 		char	path2[NG_PATHSIZ];
 
 		/* Create new PPPoE node. */
+		memset(&mp, 0, sizeof(mp));
 		strcpy(mp.type, NG_PPPOE_NODE_TYPE);
 		strlcpy(mp.ourhook, hook, sizeof(mp.ourhook));
 		strcpy(mp.peerhook, NG_PPPOE_HOOK_ETHERNET);
 		if (NgSendMsg(PIf->csock, path, NGM_GENERIC_COOKIE, NGM_MKPEER, &mp,
 		    sizeof(mp)) < 0) {
-			Log(LG_ERR, ("[%s] can't create %s peer to %s,%s: %s",
-			    iface, NG_PPPOE_NODE_TYPE,
-			    path, hook, strerror(errno)));
-			    close(PIf->csock);
-			    close(PIf->dsock);
-			    return (0);
+			Perror("[%s] can't create %s peer to %s,%s",
+			    iface, NG_PPPOE_NODE_TYPE, path, hook);
+			close(PIf->csock);
+			close(PIf->dsock);
+			return (0);
 		}
 
 		snprintf(path2, sizeof(path2), "%s%s", path, hook);
 		/* Get pppoe node ID */
 		if ((PIf->node_id = NgGetNodeID(PIf->csock, path2)) == 0) {
-			Log(LG_ERR, ("[%s] Cannot get pppoe node id: %s",
-			    iface, strerror(errno)));
+			Perror("[%s] Cannot get pppoe node id", iface);
 			close(PIf->csock);
 			close(PIf->dsock);
 			return (0);
@@ -1037,14 +1031,14 @@
 	    gPid, l->id);
 		
 	/* Create ng_tee(4) node and connect it to ng_pppoe(4). */
+	memset(&mp, 0, sizeof(mp));
 	strcpy(mp.type, NG_TEE_NODE_TYPE);
 	strlcpy(mp.ourhook, session_hook, sizeof(mp.ourhook));
 	snprintf(mp.peerhook, sizeof(mp.peerhook), "left");
 	if (NgSendMsg(pi->PIf->csock, path, NGM_GENERIC_COOKIE, NGM_MKPEER,
 	    &mp, sizeof(mp)) < 0) {
-		Log(LG_ERR, ("[%s] PPPoE: can't create %s peer to %s,%s: %s",
-		    l->name, NG_TEE_NODE_TYPE,
-		    path, "left", strerror(errno)));
+		Perror("[%s] PPPoE: can't create %s peer to %s,%s",
+		    l->name, NG_TEE_NODE_TYPE, path, "left");
 		goto close_socket;
 	}
 
@@ -1052,19 +1046,19 @@
 	snprintf(path1, sizeof(path), "%s%s", path, session_hook);
 
 	/* Connect our socket node link hook to the ng_tee(4) node. */
+	memset(&cn, 0, sizeof(cn));
 	strlcpy(cn.ourhook, l->name, sizeof(cn.ourhook));
 	strlcpy(cn.path, path1, sizeof(cn.path));
 	strcpy(cn.peerhook, "left2right");
 	if (NgSendMsg(pi->PIf->csock, ".:", NGM_GENERIC_COOKIE, NGM_CONNECT,
 	    &cn, sizeof(cn)) < 0) {
-		Log(LG_ERR, ("[%s] PPPoE: can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\": %s",
-		    l->name, ".:", cn.ourhook, cn.path,
-		    cn.peerhook, strerror(errno)));
+		Perror("[%s] PPPoE: can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\"",
+		    l->name, ".:", cn.ourhook, cn.path, cn.peerhook);
 		goto shutdown_tee;
 	}
 
 	/* Put the PPPoE node into OFFER mode. */
-	memset(idata, 0, sizeof(idata));
+	memset(idata, 0, sizeof(*idata));
 	strlcpy(idata->hook, session_hook, sizeof(idata->hook));
 	if (pi->acname[0] != 0) {
 		strlcpy(idata->data, pi->acname, MAX_SESSION);
@@ -1081,13 +1075,12 @@
 
 	if (NgSendMsg(pi->PIf->csock, path, NGM_PPPOE_COOKIE, NGM_PPPOE_OFFER,
 	    idata, sizeof(*idata) + idata->data_len) < 0) {
-		Log(LG_ERR, ("[%s] PPPoE: can't send NGM_PPPOE_OFFER to %s,%s "
-		    ": %s",
-		    l->name, path, idata->hook, strerror(errno)));
+		Perror("[%s] PPPoE: can't send NGM_PPPOE_OFFER to %s,%s ",
+		    l->name, path, idata->hook);
 		goto shutdown_tee;
 	}
 
-	memset(idata, 0, sizeof(idata));
+	memset(idata, 0, sizeof(*idata));
 	strlcpy(idata->hook, session_hook, sizeof(idata->hook));
 	idata->data_len = strlen(pi->session);
 	strncpy(idata->data, pi->session, MAX_SESSION);
@@ -1095,22 +1088,19 @@
 	if (NgSendMsg(pi->PIf->csock, path, NGM_PPPOE_COOKIE,
 	    NGM_PPPOE_SERVICE, idata,
 	    sizeof(*idata) + idata->data_len) < 0) {
-		Log(LG_ERR, ("[%s] PPPoE: can't send NGM_PPPOE_SERVICE to %s,"
-		    "%s : %s",
-		    l->name, path, idata->hook, strerror(errno)));
+		Perror("[%s] PPPoE: can't send NGM_PPPOE_SERVICE to %s,%s",
+		    l->name, path, idata->hook);
 		goto shutdown_tee;
 	}
 
 	/* And send our request data to the waiting node. */
 	if (NgSendData(pi->PIf->dsock, l->name, response, sz) == -1) {
-		Log(LG_ERR, ("[%s] PPPoE: Cannot send original request: %s",
-		    l->name, strerror(errno)));
+		Perror("[%s] PPPoE: Cannot send original request", l->name);
 		goto shutdown_tee;
 	}
 		
 	if (NgFuncDisconnect(pi->PIf->csock, l->name, ".:", l->name) < 0) {
-		Log(LG_ERR, ("[%s] PPPoE: can't remove hook %s: %s", 
-	    	    l->name, l->name, strerror(errno)));
+		Perror("[%s] PPPoE: can't remove hook %s", l->name, l->name);
 		goto shutdown_tee;
     	}
 	l->state = PHYS_STATE_CONNECTING;
@@ -1133,8 +1123,7 @@
 
 shutdown_tee:
 	if (NgFuncShutdownNode(pi->PIf->csock, l->name, path1) < 0) {
-		Log(LG_ERR, ("[%s] Shutdown ng_tee node %s error: %s",
-		    l->name, path1, strerror(errno)));
+	    Perror("[%s] Shutdown ng_tee node %s error", l->name, path1);
 	};
 
 close_socket:
@@ -1259,6 +1248,7 @@
 	snprintf(path, sizeof(path), "[%x]:", PIf->node_id);
 	
 	/* Connect our socket node link hook to the ng_pppoe(4) node. */
+	memset(&cn, 0, sizeof(cn));
 	strcpy(cn.path, path);
 	snprintf(cn.ourhook, sizeof(cn.peerhook), "listen-%s", pi->session);
 	strcpy(cn.peerhook, cn.ourhook);
@@ -1272,15 +1262,15 @@
 	}
 
 	/* Tell the PPPoE node to be a server. */
-	memset(idata, 0, sizeof(idata));
+	memset(idata, 0, sizeof(*idata));
 	snprintf(idata->hook, sizeof(idata->hook), "listen-%s", pi->session);
 	idata->data_len = strlen(pi->session);
 	strncpy(idata->data, pi->session, MAX_SESSION);
 
 	if (NgSendMsg(PIf->csock, path, NGM_PPPOE_COOKIE, NGM_PPPOE_LISTEN,
 	    idata, sizeof(*idata) + idata->data_len) < 0) {
-		Log(LG_ERR, ("PPPoE: Can't send NGM_PPPOE_LISTEN to %s hook "
-		    "%s : %s", path, idata->hook, strerror(errno)));
+		Perror("PPPoE: Can't send NGM_PPPOE_LISTEN to %s hook %s",
+		     path, idata->hook);
 		return (0);
 	}
 
--- a/contrib/mpd/src/pptp.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/pptp.c	Fri Sep 14 02:13:58 2012 +0300
@@ -268,9 +268,13 @@
 PptpInst(Link l, Link lt)
 {
     PptpInfo	pptp;
+    PptpInfo	const pptpt = (PptpInfo) lt->info;
 
     /* Initialize this link */
     pptp = (PptpInfo) (l->info = Mdup(MB_PHYS, lt->info, sizeof(*pptp)));
+    if (pptpt->conf.fqdn_peer_addr != NULL)
+        pptp->conf.fqdn_peer_addr =
+            Mstrdup(MB_PHYS, pptpt->conf.fqdn_peer_addr);
     pptp->listener = NULL;
 
     return(0);
@@ -448,7 +452,7 @@
 
 	/* Get a temporary netgraph socket node */
 	if (NgMkSockNode(NULL, &csock, NULL) == -1) {
-		Log(LG_ERR, ("PPTP: NgMkSockNode: %s", strerror(errno)));
+		Perror("PPTP: NgMkSockNode");
 		return;
 	}
 	
@@ -840,7 +844,7 @@
     
     /* Get a temporary netgraph socket node */
     if (NgMkSockNode(NULL, &csock, NULL) == -1) {
-	Log(LG_ERR, ("PPTP: NgMkSockNode: %s", strerror(errno)));
+	Perror("PPTP: NgMkSockNode");
 	return(-1);
     }
 
@@ -859,7 +863,7 @@
 	tun->self_addr = u_self_addr;
 	tun->peer_addr = u_peer_addr;
 	if (ghash_put(gPptpTuns, tun) == -1) {
-	    Log(LG_ERR, ("[%s] PPTP: ghash_put: %s", l->name, strerror(errno)));
+	    Perror("[%s] PPTP: ghash_put", l->name);
 	    Freee(tun);
 	    close(csock);
 	    return(-1);
@@ -875,8 +879,7 @@
 #endif
 	if (NgSendMsg(csock, path, NGM_GENERIC_COOKIE,
           NGM_MKPEER, &mkp, sizeof(mkp)) < 0) {
-	    Log(LG_ERR, ("[%s] PPTP: can't attach %s node: %s",
-    		l->name, NG_PPTPGRE_NODE_TYPE, strerror(errno)));
+	    Perror("[%s] PPTP: can't attach %s node", l->name, NG_PPTPGRE_NODE_TYPE);
 	    ghash_remove(gPptpTuns, tun);
 	    Freee(tun);
 	    close(csock);
@@ -885,8 +888,7 @@
 
 	/* Get pptpgre node ID */
 	if ((tun->node_id = NgGetNodeID(csock, pptppath)) == 0) {
-	    Log(LG_ERR, ("[%s] Cannot get %s node id: %s",
-		l->name, NG_PPTPGRE_NODE_TYPE, strerror(errno)));
+	    Perror("[%s] Cannot get %s node id", l->name, NG_PPTPGRE_NODE_TYPE);
 	    ghash_remove(gPptpTuns, tun);
 	    Freee(tun);
 	    close(csock);
@@ -906,8 +908,7 @@
 	}
 	if (NgSendMsg(csock, pptppath, NGM_GENERIC_COOKIE,
 	  NGM_MKPEER, &mkp, sizeof(mkp)) < 0) {
-	    Log(LG_ERR, ("[%s] PPTP: can't attach %s node: %s",
-    		l->name, NG_KSOCKET_NODE_TYPE, strerror(errno)));
+	    Perror("[%s] PPTP: can't attach %s node", l->name, NG_KSOCKET_NODE_TYPE);
 	    close(csock);
 	    return(-1);
 	}
@@ -920,15 +921,14 @@
 	((int *)(ksso->value))[0]=48*1024;
 	if (NgSendMsg(csock, ksockpath, NGM_KSOCKET_COOKIE,
 	    NGM_KSOCKET_SETOPT, &u, sizeof(u)) < 0) {
-		Log(LG_ERR, ("[%s] PPTP: can't setsockopt %s node: %s",
-		    l->name, NG_KSOCKET_NODE_TYPE, strerror(errno)));
+		Perror("[%s] PPTP: can't setsockopt %s node",
+		    l->name, NG_KSOCKET_NODE_TYPE);
 	}
 
 	/* Bind ksocket socket to local IP address */
 	if (NgSendMsg(csock, ksockpath, NGM_KSOCKET_COOKIE,
           NGM_KSOCKET_BIND, &self_addr, self_addr.ss_len) < 0) {
-	    Log(LG_ERR, ("[%s] PPTP: can't bind() %s node: %s",
-    		l->name, NG_KSOCKET_NODE_TYPE, strerror(errno)));
+	    Perror("[%s] PPTP: can't bind() %s node", l->name, NG_KSOCKET_NODE_TYPE);
 	    close(csock);
 	    return(-1);
 	}
@@ -937,8 +937,8 @@
 	if (NgSendMsg(csock, ksockpath, NGM_KSOCKET_COOKIE,
     	  NGM_KSOCKET_CONNECT, &peer_addr, peer_addr.ss_len) < 0 &&
     	  errno != EINPROGRESS) {	/* happens in -current (weird) */
-	    Log(LG_ERR, ("[%s] PPTP: can't connect() %s node: %s",
-    	        l->name, NG_KSOCKET_NODE_TYPE, strerror(errno)));
+	    Perror("[%s] PPTP: can't connect() %s node",
+    	        l->name, NG_KSOCKET_NODE_TYPE);
 	    close(csock);
     	    return(-1);
         }
@@ -950,8 +950,8 @@
 	snprintf(cn.peerhook, sizeof(mkp.peerhook), NG_PPTPGRE_HOOK_SESSION_F, pi->cid);
 	if (NgSendMsg(csock, path, NGM_GENERIC_COOKIE,
           NGM_CONNECT, &cn, sizeof(cn)) < 0) {
-	    Log(LG_ERR, ("[%s] PPTP: can't connect to %s node: %s",
-    		l->name, NG_PPTPGRE_NODE_TYPE, strerror(errno)));
+	    Perror("[%s] PPTP: can't connect to %s node",
+    		l->name, NG_PPTPGRE_NODE_TYPE);
 	    close(csock);
 	    return(-1);
 	}
@@ -970,8 +970,7 @@
 
     if (NgSendMsg(csock, pptppath, NGM_PPTPGRE_COOKIE,
       NGM_PPTPGRE_SET_CONFIG, &gc, sizeof(gc)) < 0) {
-	Log(LG_ERR, ("[%s] PPTP: can't config %s node: %s",
-    	    l->name, NG_PPTPGRE_NODE_TYPE, strerror(errno)));
+	Perror("[%s] PPTP: can't config %s node", l->name, NG_PPTPGRE_NODE_TYPE);
 	close(csock);
 	return(-1);
     }
--- a/contrib/mpd/src/pptp_ctrl.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/pptp_ctrl.c	Fri Sep 14 02:13:58 2012 +0300
@@ -813,7 +813,7 @@
     /* Get local IP address */
     addrLen = sizeof(selfst);
     if (getsockname(sock, (struct sockaddr *) &selfst, &addrLen) < 0) {
-	Log(LG_ERR, ("PPTP: %s getsockname(): %s", __func__, strerror(errno)));
+	Perror("PPTP: %s getsockname()", __func__);
 	u_addrclear(&self_addr);
 	self_port = 0;
     } else {
--- a/contrib/mpd/src/pptp_ctrl.h	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/pptp_ctrl.h	Fri Sep 14 02:13:58 2012 +0300
@@ -193,8 +193,8 @@
     u_int16_t		serno;		/* call serial # */
     u_int32_t		minBps;		/* minimum BPS */
     u_int32_t		maxBps;		/* maximum BPS */
+    u_int32_t		bearType;	/* bearer type */
     u_int32_t		frameType;	/* framing type */
-    u_int32_t		bearType;	/* bearer type */
     u_int16_t		recvWin;	/* pkt receive window size */
     u_int16_t		ppd;		/* pkt processing delay */
     u_int16_t		numLen;		/* phone number length */
@@ -205,7 +205,7 @@
 
 #else
   { { "cid", 2 }, { "serno", 2 }, { "minBPS", 4 }, { "maxBPS", 4 },
-    { "frameType", 4 }, { "bearType", 4 }, { "recvWin", 2 }, { "ppd", 2 },
+    { "bearType", 4 }, { "frameType", 4 },{ "recvWin", 2 }, { "ppd", 2 },
     { "numLen", 2 }, { PPTP_RESV_PREF "0", 2 },
     { "phone", PPTP_PHONE_LEN }, { "subaddr", PPTP_SUBADDR_LEN },
     { NULL, 0 } },
--- a/contrib/mpd/src/proto.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/proto.c	Fri Sep 14 02:13:58 2012 +0300
@@ -58,6 +58,8 @@
 
   static const struct protoname protoNames[] = {
 #ifdef PROTO_NAME_LIST
+
+/* Network layer protocols */
     { 0x0001,	"Padding Protocol" },
     { 0x0021,	"Internet Protocol" },
     { 0x0023,	"OSI Network Layer" },
@@ -89,16 +91,18 @@
     { 0x0057,	"IPv6 over PPP" },
     { 0x0059,	"PPP Multiplexing (RFC 3153)" },
     { 0x005b,	"Vendor-Specific Network Protocol" },
+    { 0x005d,	"TRILL Network Protocol (TNP)" },
     { 0x0061,	"RTP IPHC Full Header" },
     { 0x0063,	"RTP IPHC Compressed TCP" },
     { 0x0065,	"RTP IPHC Compressed Non TCP" },
     { 0x0067,	"RTP IPHC Compressed UDP 8" },
-    { 0x0067,	"RTP IPHC Compressed RTP 8" },
+    { 0x0069,	"RTP IPHC Compressed RTP 8" },
     { 0x006f,	"Stampede Bridging" },
     { 0x0071,	"BAP Bandwidth Allocation Protocol" },
     { 0x0073,	"MP+ Protocol" },
-    { 0x007d,	"reserved (Control Escape)" },
+    { 0x007d,	"reserved (Control Escape) (RFC 1661)" },
     { 0x007f,	"reserved (compression inefficient) (RFC 1662)" },
+    { 0x00c1,	"NTCITS IPI" },
     { 0x00cf,	"reserved (PPP NLPID)" },
     { 0x00fb,	"compression on single link in multilink group" },
     { 0x00fd,	"1st choice compression (RFC 1962)" },
@@ -108,14 +112,29 @@
     { 0x0203,	"IBM Source Routing BPDU" },
     { 0x0205,	"DEC LANBridge100 Spanning Tree" },
     { 0x0207,	"Cisco Discovery Protocol" },
+    { 0x0209,	"Netcs Twin Routing" },
+    { 0x0211,	"Optical Supervisory Channel Protocol (OSCP)" },
+    { 0x0213,	"Optical Supervisory Channel Protocol (OSCP)" },
     { 0x0231,	"Luxcom" },
     { 0x0233,	"Sigma Network Systems" },
     { 0x0235,	"Apple Client Server Protocol" },
+    { 0x0281,	"MPLS Unicast" },
+    { 0x0283,	"MPLS Multicast" },
+    { 0x0285,	"IEEE p1284.4 standard - data packets" },
+    { 0x0287,	"ETSI TETRA Network Protocol Type 1" },
+    { 0x0289,	"Multichannel Flow Treatment Protocol" },
+
+    { 0x2063,	"RTP IPHC Compressed TCP No Delta" },
+    { 0x2065,	"RTP IPHC Context State" },
+    { 0x2067,	"RTP IPHC Compressed UDP 16" },
+    { 0x2069,	"RTP IPHC Compressed RTP 16" },
 
     { 0x4001,	"Cray Communications Control Protocol" },
     { 0x4003,	"CDPD Mobile Network Registration Protocol" },
     { 0x4021,	"Stacker LZS" },
 
+/* Network layer control protocols */
+
     { 0x8021,	"Internet Protocol Control Protocol" },
     { 0x8023,	"OSI Network Layer Control Protocol" },
     { 0x8025,	"Xerox NS IDP Control Protocol" },
@@ -148,6 +167,7 @@
     { 0x8071,	"BACP Bandwidth Allocation Control Protocol" },
     { 0x8073,	"MP+ Control Protocol" },
     { 0x807d,	"Not Used - reserved" },
+    { 0x80c1,	"NTCITS IPI Control Protocol" },
     { 0x80cf,	"Not Used - reserved" },
     { 0x80fb,	"compression on single link in multilink group control" },
     { 0x80fd,	"Compression Control Protocol" },
@@ -155,6 +175,8 @@
 
     { 0x8207,	"Cisco Discovery Protocol Control" },
     { 0x8209,	"Netcs Twin Routing" },
+    { 0x820b,	"STP - Control Protocol" },
+    { 0x820d,	"EDPCP - Extreme Discovery Protocol Ctrl Prtcl" },
     { 0x8235,	"Apple Client Server Protocol Control" },
     { 0x8281,	"MPLS Control Protocol (RFC 3032)" },
     { 0x8283,	"Tag Switching - Multicast" },
@@ -162,6 +184,8 @@
     { 0x8287,	"ETSI TETRA NSP1 Control Protocol" },
     { 0x8289,	"Multichannel Flow Treatment Protocol" },
 
+/* Link layer control protocols */
+
     { 0xc021,	"Link Control Protocol" },
     { 0xc023,	"Password Authentication Protocol" },
     { 0xc025,	"Link Quality Report" },
--- a/contrib/mpd/src/radius.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/radius.c	Fri Sep 14 02:13:58 2012 +0300
@@ -1,7 +1,7 @@
 /*
  * See ``COPYRIGHT.mpd''
  *
- * $Id: radius.c,v 1.155 2011/07/01 06:51:48 dmitryluhtionov Exp $
+ * $Id: radius.c,v 1.159 2012/03/19 08:30:45 amotin Exp $
  *
  */
 
@@ -49,6 +49,7 @@
 /* Set menu options */
 
   enum {
+	UNSET_SERVER,
     SET_SERVER,
     SET_ME,
     SET_MEV6,
@@ -63,7 +64,12 @@
 /*
  * GLOBAL VARIABLES
  */
-
+  const struct cmdtab RadiusUnSetCmds[] = {
+	  { "server {name} [{auth port}] [{acct port}]", "Unset (remove) radius server" ,
+		  RadiusSetCommand, NULL, 2, (void *) UNSET_SERVER },
+	  { NULL },
+  };
+  
   const struct cmdtab RadiusSetCmds[] = {
     { "server {name} {secret} [{auth port}] [{acct port}]", "Set radius server parameters" ,
 	RadiusSetCommand, NULL, 2, (void *) SET_SERVER },
@@ -344,6 +350,7 @@
   RadConf	const conf = &ctx->lnk->lcp.auth.conf.radius;
   RadServe_Conf	server;
   RadServe_Conf	t_server;
+  RadServe_Conf	next, prev;
   int		val, count;
   struct u_addr t;
   int 		auth_port = 1812;
@@ -354,6 +361,37 @@
 
     switch ((intptr_t)arg) {
 
+      case UNSET_SERVER:
+	
+	if (ac > 3 || ac < 1) {
+		return(-1);
+	}
+	for ( prev = NULL, t_server = conf->server ;
+	    t_server != NULL && (next = t_server->next, 1) ;
+	    prev = t_server, t_server = next) {
+		
+		if (strcmp(t_server->hostname, av[0]) != 0)
+			continue;
+		if (ac > 1 && t_server->auth_port != atoi(av[1]))
+			continue;
+		if (ac > 2 && t_server->acct_port != atoi(av[2]))
+			continue;
+		
+		if (t_server == conf->server) {
+			conf->server = t_server->next;
+		} else {
+			prev->next = t_server->next;
+			t_server->next = NULL;
+		}
+		
+		Freee(t_server->hostname);
+		Freee(t_server->sharedsecret);
+		Freee(t_server);
+		t_server = prev;
+	}
+	
+	break;
+
       case SET_SERVER:
 	if (ac > 4 || ac < 2) {
 	  return(-1);
@@ -681,6 +719,15 @@
     	return (RAD_NACK);
     }
 
+    Log(LG_RADIUS2, ("[%s] RADIUS: Put RAD_MPD_PEER_IDENT: %s",
+	auth->info.lnkname, auth->info.peer_ident));
+    if (rad_put_vendor_string(auth->radius.handle, RAD_VENDOR_MPD,
+      RAD_MPD_PEER_IDENT, auth->info.peer_ident) != 0) {
+	Log(LG_RADIUS, ("[%s] RADIUS: Put RAD_MPD_PEER_IDENT failed %s",
+	    auth->info.lnkname, rad_strerror(auth->radius.handle)));
+	return (RAD_NACK);
+    }
+
 #ifdef PHYSTYPE_PPTP
     if (auth->info.phys_type == &gPptpPhysType) {
 	porttype = 1;
@@ -1038,6 +1085,14 @@
 	return (RAD_NACK);
     }
 
+    Log(LG_RADIUS2, ("[%s] RADIUS: Put RAD_MPD_PEER_IDENT: %s",
+	auth->info.lnkname, auth->info.peer_ident));
+    if (rad_put_vendor_string(auth->radius.handle, RAD_VENDOR_MPD, RAD_MPD_PEER_IDENT, auth->info.peer_ident) != 0) {
+	Log(LG_RADIUS, ("[%s] RADIUS: Put RAD_MPD_PEER_IDENT failed %s",
+	    auth->info.lnkname, rad_strerror(auth->radius.handle)));
+	return (RAD_NACK);
+    }
+
     Log(LG_RADIUS2, ("[%s] RADIUS: Put RAD_ACCT_LINK_COUNT: %d", 
 	auth->info.lnkname, auth->info.n_links));
     if (rad_put_int(auth->radius.handle, RAD_ACCT_LINK_COUNT, auth->info.n_links) != 0) {
@@ -1761,7 +1816,37 @@
 		    sizeof(auth->params.action));
 		free(tmpval);
 		break;
+	    } else if (res == RAD_MPD_IFACE_NAME) {
+		tmpval = rad_cvt_string(data, len);
+	        Log(LG_RADIUS2, ("[%s] RADIUS: Get RAD_MPD_IFACE_NAME: %s",
+	    	    auth->info.lnkname, tmpval));
+		strlcpy(auth->params.ifname, tmpval,
+		    sizeof(auth->params.ifname));
+		free(tmpval);
+		break;
 	    } else
+#ifdef SIOCSIFDESCR
+	    if (res == RAD_MPD_IFACE_DESCR) {
+		tmpval = rad_cvt_string(data, len);
+	        Log(LG_RADIUS2, ("[%s] RADIUS: Get RAD_MPD_IFACE_DESCR: %s",
+	    	    auth->info.lnkname, tmpval));
+		Freee(auth->params.ifdescr);
+		auth->params.ifdescr = Mdup(MB_AUTH, tmpval, len + 1);
+		free(tmpval);
+		break;
+	    } else
+#endif /* SIOCSIFDESCR */
+#ifdef SIOCAIFGROUP
+	    if (res == RAD_MPD_IFACE_GROUP) {
+		tmpval = rad_cvt_string(data, len);
+	        Log(LG_RADIUS2, ("[%s] RADIUS: Get RAD_MPD_IFACE_GROUP: %s",
+	    	    auth->info.lnkname, tmpval));
+		strlcpy(auth->params.ifgroup, tmpval,
+		    sizeof(auth->params.ifgroup));
+		free(tmpval);
+		break;
+	    } else
+#endif /* SIOCAIFGROUP */
 #ifdef USE_IPFW
 	    if (res == RAD_MPD_RULE) {
 	      acl1 = acl = rad_cvt_string(data, len);
--- a/contrib/mpd/src/radius.h	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/radius.h	Fri Sep 14 02:13:58 2012 +0300
@@ -1,7 +1,7 @@
 /*
  * See ``COPYRIGHT.mpd''
  *
- * $Id: radius.h,v 1.41 2008/10/23 22:14:37 amotin Exp $
+ * $Id: radius.h,v 1.45 2012/03/19 08:30:45 amotin Exp $
  *
  */
 
@@ -113,6 +113,10 @@
   #define RAD_MPD_INPUT_ACCT	16
   #define RAD_MPD_OUTPUT_ACCT	17
   #define RAD_MPD_ACTION	18
+  #define RAD_MPD_PEER_IDENT	19
+  #define RAD_MPD_IFACE_NAME	20
+  #define RAD_MPD_IFACE_DESCR	21
+  #define RAD_MPD_IFACE_GROUP	22
   #define RAD_MPD_DROP_USER	154
 
   /* Configuration options */
@@ -121,6 +125,7 @@
   };
 
   extern const	struct cmdtab RadiusSetCmds[];
+  extern const	struct cmdtab RadiusUnSetCmds[];
 
   /* Configuration for a radius server */
   struct radiusserver_conf {
--- a/contrib/mpd/src/radsrv.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/radsrv.c	Fri Sep 14 02:13:58 2012 +0300
@@ -628,7 +628,7 @@
     }
 
     if ((w->fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) {
-	Log(LG_ERR, ("%s: Cannot create socket: %s", __FUNCTION__, strerror(errno)));
+	Perror("%s: Cannot create socket", __FUNCTION__);
 	return (-1);
     }
     memset(&sin, 0, sizeof sin);
--- a/contrib/mpd/src/rep.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/rep.c	Fri Sep 14 02:13:58 2012 +0300
@@ -40,8 +40,7 @@
     if (r->csock <= 0) {
 	/* Create a new netgraph node to control TCP ksocket node. */
 	if (NgMkSockNode(NULL, &r->csock, NULL) < 0) {
-    	    Log(LG_ERR, ("[%s] Rep: can't create control socket: %s",
-    		r->name, strerror(errno)));
+    	    Perror("[%s] Rep: can't create control socket", r->name);
     	    PhysClose(l);
 	    return;
 	}
@@ -53,8 +52,8 @@
     snprintf(mkp.peerhook, sizeof(mkp.peerhook), NG_TEE_HOOK_LEFT2RIGHT);
     if (NgSendMsg(r->csock, ".:", NGM_GENERIC_COOKIE,
         NGM_MKPEER, &mkp, sizeof(mkp)) < 0) {
-    	Log(LG_ERR, ("[%s] Rep: can't attach %s %s node: %s",
-    	    l->name, NG_TEE_NODE_TYPE, mkp.ourhook, strerror(errno)));
+    	Perror("[%s] Rep: can't attach %s %s node",
+    	    l->name, NG_TEE_NODE_TYPE, mkp.ourhook);
 	close(r->csock);
     	PhysClose(l);
 	return;
@@ -62,8 +61,7 @@
 
     /* Get tee node ID */
     if ((r->node_id = NgGetNodeID(r->csock, ".:tee")) == 0) {
-	Log(LG_ERR, ("[%s] Rep: Cannot get %s node id: %s",
-	    l->name, NG_TEE_NODE_TYPE, strerror(errno)));
+	Perror("[%s] Rep: Cannot get %s node id", l->name, NG_TEE_NODE_TYPE);
 	close(r->csock);
     	PhysClose(l);
 	return;
--- a/contrib/mpd/src/tcp.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/tcp.c	Fri Sep 14 02:13:58 2012 +0300
@@ -184,8 +184,13 @@
 TcpInst(Link l, Link lt)
 {
 	TcpInfo pi;
-	l->info = Mdup(MB_PHYS, lt->info, sizeof(struct tcpinfo));
-	pi = (TcpInfo) l->info;
+	TcpInfo const pit = (TcpInfo) lt->info;
+
+	/* Initialize this link */
+	pi = (TcpInfo) (l->info = Mdup(MB_PHYS, lt->info, sizeof(*pi)));
+	if (pit->conf.fqdn_peer_addr != NULL)
+	    pi->conf.fqdn_peer_addr =
+		Mstrdup(MB_PHYS, pit->conf.fqdn_peer_addr);
     
 	if (pi->If)
 	    pi->If->refs++;
@@ -213,8 +218,7 @@
 
 	/* Create a new netgraph node to control TCP ksocket node. */
 	if (NgMkSockNode(NULL, &pi->csock, NULL) < 0) {
-		Log(LG_ERR, ("[%s] TCP can't create control socket: %s",
-		    l->name, strerror(errno)));
+		Perror("[%s] TCP can't create control socket", l->name);
 		goto fail;
 	}
 	(void)fcntl(pi->csock, F_SETFD, 1);
@@ -229,8 +233,8 @@
 	strcpy(mkp.peerhook, NG_ASYNC_HOOK_SYNC);
 	if (NgSendMsg(pi->csock, path, NGM_GENERIC_COOKIE,
 	    NGM_MKPEER, &mkp, sizeof(mkp)) < 0) {
-		Log(LG_ERR, ("[%s] can't attach %s %s node: %s",
-		    l->name, NG_ASYNC_NODE_TYPE, mkp.ourhook, strerror(errno)));
+		Perror("[%s] can't attach %s %s node",
+		    l->name, NG_ASYNC_NODE_TYPE, mkp.ourhook);
 		goto fail;
 	}
 	
@@ -241,14 +245,12 @@
 	snprintf(nm.name, sizeof(nm.name), "mpd%d-%s-as", gPid, l->name);
 	if (NgSendMsg(pi->csock, path,
 	    NGM_GENERIC_COOKIE, NGM_NAME, &nm, sizeof(nm)) < 0) {
-		Log(LG_ERR, ("[%s] can't name %s node: %s",
-		    l->name, NG_ASYNC_NODE_TYPE, strerror(errno)));
+		Perror("[%s] can't name %s node", l->name, NG_ASYNC_NODE_TYPE);
 	}
 
 	/* Get async node ID */
 	if ((pi->async_node_id = NgGetNodeID(pi->csock, path)) == 0) {
-	    Log(LG_ERR, ("[%s] Cannot get %s node id: %s",
-		l->name, NG_ASYNC_NODE_TYPE, strerror(errno)));
+	    Perror("[%s] Cannot get %s node id", l->name, NG_ASYNC_NODE_TYPE);
 	    goto fail;
 	};
 
@@ -274,8 +276,7 @@
 		snprintf(cn.peerhook, sizeof(cn.peerhook), "data");
 		if (NgSendMsg(pi->csock, path, NGM_GENERIC_COOKIE, NGM_CONNECT,
 		    &cn, sizeof(cn)) < 0) {
-			Log(LG_ERR, ("[%s] can't connect new born ksocket: %s",
-			    l->name, strerror(errno)));
+			Perror("[%s] can't connect new born ksocket", l->name);
 			goto fail;
 	  	}
 
@@ -306,8 +307,7 @@
 	}
 	if (NgSendMsg(pi->csock, path, NGM_GENERIC_COOKIE, NGM_MKPEER, &mkp,
 	    sizeof(mkp)) < 0) {
-		Log(LG_ERR, ("[%s] can't attach %s node: %s", l->name,
-		    NG_KSOCKET_NODE_TYPE, strerror(errno)));
+		Perror("[%s] can't attach %s node", l->name, NG_KSOCKET_NODE_TYPE);
 		goto fail;
 	}
 
@@ -318,8 +318,7 @@
 	snprintf(nm.name, sizeof(nm.name), "mpd%d-%s-kso", gPid, l->name);
 	if (NgSendMsg(pi->csock, path,
 	    NGM_GENERIC_COOKIE, NGM_NAME, &nm, sizeof(nm)) < 0) {
-		Log(LG_ERR, ("[%s] can't name %s node: %s",
-		    l->name, NG_KSOCKET_NODE_TYPE, strerror(errno)));
+		Perror("[%s] can't name %s node", l->name, NG_KSOCKET_NODE_TYPE);
 	}
 
 	/* Start connecting to peer. */
@@ -327,8 +326,8 @@
 	rval = NgSendMsg(pi->csock, path, NGM_KSOCKET_COOKIE,
 	    NGM_KSOCKET_CONNECT, &addr, addr.ss_len);
 	if (rval < 0 && errno != EINPROGRESS) {
-		Log(LG_ERR, ("[%s] can't connect() %s node: %s", l->name,
-		    NG_KSOCKET_NODE_TYPE, strerror(errno))); 
+		Perror("[%s] can't connect() %s node", l->name,
+		    NG_KSOCKET_NODE_TYPE);
 		goto fail;
 	}
 
@@ -374,8 +373,7 @@
 
 	/* Check whether the connection was successful or not. */
 	if (NgRecvMsg(pi->csock, &cn.resp, sizeof(cn), path) < 0) {
-		Log(LG_ERR, ("[%s] error reading message from \"%s\": %s",
-		    l->name, path, strerror(errno)));
+		Perror("[%s] error reading message from \"%s\"", l->name, path);
 		goto failed;
 	}
 
@@ -427,8 +425,7 @@
 
 	/* Accept cloned ng_ksocket(4). */
 	if (NgRecvMsg(If->csock, &ac.resp, sizeof(ac), NULL) < 0) {
-		Log(LG_ERR, ("TCP: error reading message from \"%s\": %s",
-		    path, strerror(errno)));
+		Perror("TCP: error reading message from \"%s\"", path);
 		goto failed;
 	}
 	sockaddrtou_addr(&ac.sin, &addr, &port);
@@ -489,8 +486,8 @@
 		snprintf(path, sizeof(path), "[%x]:", ac.id);
 		if (NgSendMsg(If->csock, path,
 		    NGM_GENERIC_COOKIE, NGM_NAME, &nm, sizeof(nm)) < 0) {
-			Log(LG_ERR, ("[%s] can't name %s node: %s",
-			    l->name, NG_KSOCKET_NODE_TYPE, strerror(errno)));
+			Perror("[%s] can't name %s node",
+			    l->name, NG_KSOCKET_NODE_TYPE);
 		}
 
 		pi->incoming=1;
@@ -508,8 +505,7 @@
 	/* Tell that we are willing to receive accept message. */
 	if (NgSendMsg(If->csock, LISTENHOOK, NGM_KSOCKET_COOKIE,
 	    NGM_KSOCKET_ACCEPT, NULL, 0) < 0) {
-		Log(LG_ERR, ("TCP: can't accept on %s node: %s",
-		    NG_KSOCKET_NODE_TYPE, strerror(errno)));
+		Perror("TCP: can't accept on %s node", NG_KSOCKET_NODE_TYPE);
 	}
 	EventRegister(&If->ctrlEvent, EVENT_READ, If->csock,
 	    0, TcpAcceptEvent, If);
@@ -756,8 +752,7 @@
 	
 	/* Create a new netgraph node */
 	if (NgMkSockNode(NULL, &pi->If->csock, NULL) < 0) {
-	    Log(LG_ERR, ("TCP: can't create ctrl socket: %s",
-	        strerror(errno)));
+	    Perror("TCP: can't create ctrl socket");
 	    return(0);
 	}
 	(void)fcntl(pi->If->csock, F_SETFD, 1);
@@ -772,8 +767,7 @@
 	}
 	if (NgSendMsg(pi->If->csock, ".:", NGM_GENERIC_COOKIE, NGM_MKPEER,
 	    &mkp, sizeof(mkp)) < 0) {
-		Log(LG_ERR, ("TCP: can't attach %s node: %s",
-		    NG_KSOCKET_NODE_TYPE, strerror(errno)));
+		Perror("TCP: can't attach %s node", NG_KSOCKET_NODE_TYPE);
 		goto fail2;
 	}
 
@@ -783,8 +777,7 @@
 	((int *)(ksso->value))[0]=1;
 	if (NgSendMsg(pi->If->csock, LISTENHOOK, NGM_KSOCKET_COOKIE,
 	    NGM_KSOCKET_SETOPT, &u, sizeof(u)) < 0) {
-		Log(LG_ERR, ("TCP: can't setsockopt() %s node: %s",
-		    NG_KSOCKET_NODE_TYPE, strerror(errno)));
+		Perror("TCP: can't setsockopt() %s node", NG_KSOCKET_NODE_TYPE);
 		goto fail2;
 	}
 
@@ -792,24 +785,21 @@
 	u_addrtosockaddr(&pi->If->self_addr, pi->If->self_port, &addr);
 	if (NgSendMsg(pi->If->csock, LISTENHOOK, NGM_KSOCKET_COOKIE,
 	    NGM_KSOCKET_BIND, &addr, addr.ss_len) < 0) {
-		Log(LG_ERR, ("TCP: can't bind() %s node: %s",
-		    NG_KSOCKET_NODE_TYPE, strerror(errno)));
+		Perror("TCP: can't bind() %s node", NG_KSOCKET_NODE_TYPE);
 		goto fail2;
 	}
 
 	/* Listen. */
 	if (NgSendMsg(pi->If->csock, LISTENHOOK, NGM_KSOCKET_COOKIE,
 	    NGM_KSOCKET_LISTEN, &backlog, sizeof(backlog)) < 0) {
-		Log(LG_ERR, ("TCP: can't listen() on %s node: %s",
-		    NG_KSOCKET_NODE_TYPE, strerror(errno)));
+		Perror("TCP: can't listen() on %s node", NG_KSOCKET_NODE_TYPE);
 		goto fail2;
 	}
 
 	/* Tell that we are willing to receive accept message. */
 	if (NgSendMsg(pi->If->csock, LISTENHOOK, NGM_KSOCKET_COOKIE,
 	    NGM_KSOCKET_ACCEPT, NULL, 0) < 0) {
-		Log(LG_ERR, ("TCP: can't accept() on %s node: %s",
-		    NG_KSOCKET_NODE_TYPE, strerror(errno)));
+		Perror("TCP: can't accept() on %s node", NG_KSOCKET_NODE_TYPE);
 		goto fail2;
 	}
 
--- a/contrib/mpd/src/udp.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/udp.c	Fri Sep 14 02:13:58 2012 +0300
@@ -185,8 +185,13 @@
 UdpInst(Link l, Link lt)
 {
     UdpInfo	pi;
-    l->info = Mdup(MB_PHYS, lt->info, sizeof(struct udpinfo));
-    pi = (UdpInfo) l->info;
+    UdpInfo const pit = (UdpInfo) lt->info;
+
+    /* Initialize this link */
+    pi = (UdpInfo) (l->info = Mdup(MB_PHYS, lt->info, sizeof(*pi)));
+    if (pit->conf.fqdn_peer_addr != NULL)
+        pi->conf.fqdn_peer_addr =
+            Mstrdup(MB_PHYS, pit->conf.fqdn_peer_addr);
     
     if (pi->If)
 	pi->If->refs++;
@@ -216,8 +221,7 @@
 
 	/* Create a new netgraph node to control TCP ksocket node. */
 	if (NgMkSockNode(NULL, &csock, NULL) < 0) {
-		Log(LG_ERR, ("[%s] TCP can't create control socket: %s",
-		    l->name, strerror(errno)));
+		Perror("[%s] TCP can't create control socket", l->name);
 		goto fail;
 	}
 	(void)fcntl(csock, F_SETFD, 1);
@@ -228,6 +232,7 @@
         }
 
 	/* Attach ksocket node to PPP node */
+	memset(&mkp, 0, sizeof(mkp));
 	strcpy(mkp.type, NG_KSOCKET_NODE_TYPE);
 	strlcpy(mkp.ourhook, hook, sizeof(mkp.ourhook));
 	if ((pi->conf.self_addr.family==AF_INET6) || 
@@ -238,8 +243,8 @@
 	}
 	if (NgSendMsg(csock, path, NGM_GENERIC_COOKIE,
 	    NGM_MKPEER, &mkp, sizeof(mkp)) < 0) {
-	        Log(LG_ERR, ("[%s] can't attach %s node: %s",
-	    	    l->name, NG_KSOCKET_NODE_TYPE, strerror(errno)));
+	        Perror("[%s] can't attach %s node",
+	    	    l->name, NG_KSOCKET_NODE_TYPE);
 		goto fail;
 	}
 
@@ -247,16 +252,15 @@
 	strlcat(path, hook, sizeof(path));
 
 	/* Give it a name */
+	memset(&nm, 0, sizeof(nm));
 	snprintf(nm.name, sizeof(nm.name), "mpd%d-%s-kso", gPid, l->name);
 	if (NgSendMsg(csock, path,
 	    NGM_GENERIC_COOKIE, NGM_NAME, &nm, sizeof(nm)) < 0) {
-		Log(LG_ERR, ("[%s] can't name %s node: %s",
-		    l->name, NG_KSOCKET_NODE_TYPE, strerror(errno)));
+		Perror("[%s] can't name %s node", l->name, NG_KSOCKET_NODE_TYPE);
 	}
 
 	if ((pi->node_id = NgGetNodeID(csock, path)) == 0) {
-	    Log(LG_ERR, ("[%s] Cannot get %s node id: %s",
-		l->name, NG_KSOCKET_NODE_TYPE, strerror(errno)));
+	    Perror("[%s] Cannot get %s node id", l->name, NG_KSOCKET_NODE_TYPE);
 	    goto fail;
 	};
 
@@ -267,8 +271,8 @@
 	((int *)(ksso->value))[0]=1;
 	if (NgSendMsg(csock, path, NGM_KSOCKET_COOKIE,
     	    NGM_KSOCKET_SETOPT, &u, sizeof(u)) < 0) {
-    	    Log(LG_ERR, ("[%s] can't setsockopt() %s node: %s",
-    		l->name, NG_KSOCKET_NODE_TYPE, strerror(errno)));
+    	    Perror("[%s] can't setsockopt() %s node",
+    		l->name, NG_KSOCKET_NODE_TYPE);
 	    goto fail;
 	}
 
@@ -283,8 +287,7 @@
 	u_addrtosockaddr(&pi->conf.self_addr, pi->conf.self_port, &addr);
 	if (NgSendMsg(csock, path, NGM_KSOCKET_COOKIE,
 	  NGM_KSOCKET_BIND, &addr, addr.ss_len) < 0) {
-	    Log(LG_ERR, ("[%s] can't bind() %s node: %s",
-    		l->name, NG_KSOCKET_NODE_TYPE, strerror(errno)));
+	    Perror("[%s] can't bind() %s node", l->name, NG_KSOCKET_NODE_TYPE);
 	    goto fail;
 	}
     }
@@ -303,8 +306,7 @@
     /* Connect socket if peer address and port is specified */
     if (NgSendMsg(csock, path, NGM_KSOCKET_COOKIE,
       NGM_KSOCKET_CONNECT, &addr, addr.ss_len) < 0) {
-	Log(LG_ERR, ("[%s] can't connect() %s node: %s",
-	    l->name, NG_KSOCKET_NODE_TYPE, strerror(errno)));
+	Perror("[%s] can't connect() %s node", l->name, NG_KSOCKET_NODE_TYPE);
 	goto fail;
     }
   
@@ -378,7 +380,7 @@
 
 	/* Get a temporary netgraph socket node */
 	if (NgMkSockNode(NULL, &csock, NULL) == -1) {
-		Log(LG_ERR, ("UDP: NgMkSockNode: %s", strerror(errno)));
+		Perror("UDP: NgMkSockNode");
 		return;
 	}
 	
@@ -657,16 +659,14 @@
 	/* Setsockopt socket. */
 	opt = 1;
 	if (setsockopt(pi->If->csock, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt))) {
-		Log(LG_ERR, ("UDP: can't setsockopt socket: %s",
-		    strerror(errno)));
+		Perror("UDP: can't setsockopt socket");
 		goto fail2;
 	};
 
 	/* Bind socket. */
 	u_addrtosockaddr(&pi->If->self_addr, pi->If->self_port, &addr);
 	if (bind(pi->If->csock, (struct sockaddr *)(&addr), addr.ss_len)) {
-		Log(LG_ERR, ("UDP: can't bind socket: %s",
-		    strerror(errno)));
+		Perror("UDP: can't bind socket");
 		goto fail2;
 	}
 
--- a/contrib/mpd/src/util.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/util.c	Fri Sep 14 02:13:58 2012 +0300
@@ -688,8 +688,7 @@
 
   if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0)
   {
-    Log(LG_ERR, ("[%s] can't set \"%s\" to non-blocking: %s",
-      label, path, strerror(errno)));
+    Perror("[%s] can't set \"%s\" to non-blocking", label, path);
     goto failed;
   }
 
@@ -697,8 +696,7 @@
 
   if (tcgetattr(fd, &attr) < 0)
   {
-    Log(LG_ERR, ("[%s] can't tcgetattr \"%s\": %s",
-      label, path, strerror(errno)));
+    Perror("[%s] can't tcgetattr \"%s\"", label, path);
     goto failed;
   }
 
@@ -715,8 +713,7 @@
 
   if (tcsetattr(fd, TCSANOW, &attr) < 0)
   {
-    Log(LG_ERR, ("[%s] can't tcsetattr \"%s\": %s",
-      label, path, strerror(errno)));
+    Perror("[%s] can't tcsetattr \"%s\"", label, path);
 failed:
     ExclusiveCloseDevice(label, fd, path);
     return(-1);
@@ -758,8 +755,7 @@
       && time(NULL) < startTime + MAX_OPEN_DELAY; )
     if (errno != EINTR)
     {
-      Log(LG_ERR, ("[%s] can't open %s: %s",
-	label, pathname, strerror(errno)));
+      Perror("[%s] can't open %s", label, pathname);
       if (locked)
 	UuUnlock(ttyname);
       return(-1);
@@ -799,8 +795,7 @@
       time(NULL) < startTime + MAX_OPEN_DELAY && (rtn = close(fd)) < 0; )
     if (errno != EINTR)
     {
-      Log(LG_ERR, ("[%s] can't close %s: %s",
-	label, pathname, strerror(errno)));
+      Perror("[%s] can't close %s", label, pathname);
       break;
     }
 
@@ -819,8 +814,7 @@
   {
     ttyname = pathname + 5;
     if (UuUnlock(ttyname) < 0)
-      Log(LG_ERR, ("[%s] can't unlock %s: %s",
-	label, ttyname, strerror(errno)));
+      Perror("[%s] can't unlock %s", label, ttyname);
   }
 }
 
@@ -1192,12 +1186,19 @@
   size_t	i, j;
   char		*buf;
   
-  buf = Malloc(MB_UTIL, len * 2 + 1);
-  for (i = j = 0; i < len; i++) {
-    buf[j++] = hexconvtab[bin[i] >> 4];
-    buf[j++] = hexconvtab[bin[i] & 15];
+  if (len > 0) {
+    buf = Malloc(MB_UTIL, len * 2 + 1);
+    for (i = j = 0; i < len; i++) {
+      buf[j++] = hexconvtab[bin[i] >> 4];
+      buf[j++] = hexconvtab[bin[i] & 15];
+    }
+    buf[j] = 0;
+  } else {
+    buf = Malloc(MB_UTIL, 3);
+    buf[0] = '0';
+    buf[1] = '0';
+    buf[2] = 0;
   }
-  buf[j] = 0;
   return buf;
 }
 
--- a/contrib/mpd/src/web.c	Fri Sep 14 01:49:53 2012 +0300
+++ b/contrib/mpd/src/web.c	Fri Sep 14 02:13:58 2012 +0300
@@ -241,8 +241,8 @@
   fprintf(f, "<H2>Current status summary</H2>\n");
   fprintf(f, "<table>\n");
   fprintf(f, "<TR><TH>Bund</TH><TH colspan=2>Iface</TH><TH>IPCP</TH><TH>IPV6CP</TH><TH>CCP</TH><TH>ECP</TH>"
-	     "<TH>Link</TH><TH>LCP</TH><TH>User</TH><TH colspan=2>Device</TH><TH>Peer</TH><TH colspan=3></TH>%s</TR>",
-	     priv?"<TH></TH>":"");
+	     "<TH>Link</TH><TH>LCP</TH><TH>User</TH><TH colspan=2>Device</TH><TH>Peer</TH><TH>IP</TH><TH colspan=3></TH>%s</TR>",
+	     priv?"<TH>State</TH>":"");
 #define FSM_COLOR(s) (((s)==ST_OPENED)?"g":(((s)==ST_INITIAL)?"r":"y"))
 #define PHYS_COLOR(s) (((s)==PHYS_STATE_UP)?"g":(((s)==PHYS_STATE_DOWN)?"r":"y"))
     for (b = 0; b<gNumLinks; b++) {
@@ -262,6 +262,7 @@
 	    if (L->state != PHYS_STATE_DOWN) {
 		PhysGetPeerAddr(L, buf, sizeof(buf));
 		fprintf(f, "<TD>%s</TD>\n", buf);
+		fprintf(f, "<TD></TD>\n");
 		PhysGetCallingNum(L, buf, sizeof(buf));
 		PhysGetCalledNum(L, buf2, sizeof(buf2));
 		if (PhysGetOriginate(L) == LINK_ORIGINATE_REMOTE) {
@@ -273,12 +274,24 @@
 		}
 	    } else {
 	    	fprintf(f, "<TD></TD>\n");
+	    	fprintf(f, "<TD></TD>\n");
 	    	fprintf(f, "<TD colspan=3></TD>\n");
 	    }
 	    if (priv) {
 		if (!L->tmpl) {
-		    fprintf(f, "<TD><A href=\"/cmd?link%%20%s&amp;open\">[Open]</a>&nbsp;<A href=\"/cmd?link%%20%s&amp;close\">[Close]</a></TD>\n", 
-	    		L->name, L->name);
+		    switch (L->state) {
+			case PHYS_STATE_DOWN:
+			    fprintf(f, "<TD><A href=\"/cmd?link%%20%s&amp;open\">[Open]</A></TD>\n",
+				L->name);
+			    break;
+			case PHYS_STATE_UP:
+			    fprintf(f, "<TD><A href=\"/cmd?link%%20%s&amp;close\">[Close]</A></TD>\n",
+				L->name);
+			    break;
+			default:
+			    fprintf(f, "<TD><A href=\"/cmd?link%%20%s&amp;open\">[Open]</a>&nbsp;<A href=\"/cmd?link%%20%s&amp;close\">[Close]</a></TD>\n", 
+				L->name, L->name);
+		    }
 		} else {
 		    fprintf(f, "<TD></TD>\n");
 		}
@@ -306,7 +319,7 @@
 	fprintf(f, "<TD rowspan=\"%d\" class=\"%s\"><A href=\"/cmd?bund%%20%s&amp;show%%20ecp\">%s</a></TD>\n", 
 	    rows, B->tmpl?"d":FSM_COLOR(B->ecp.fsm.state), B->name,FsmStateName(B->ecp.fsm.state));
 	if (B->n_links == 0) {
-	    fprintf(f, "<TD colspan=\"10\">&nbsp;</a></TD>\n</TR>\n");
+	    fprintf(f, "<TD colspan=\"11\">&nbsp;</a></TD>\n</TR>\n");
 	}
 	for (l = 0; l < NG_PPP_MAX_LINKS; l++) {
 	    if ((L=B->links[l]) != NULL) {
@@ -327,6 +340,10 @@
 		if (L->state != PHYS_STATE_DOWN) {
 		    PhysGetPeerAddr(L, buf, sizeof(buf));
 		    fprintf(f, "<TD>%s</TD>\n", buf);
+		    if (L->bund != NULL)
+			fprintf(f, "<TD>%s</TD>\n", inet_ntoa(L->bund->ipcp.peer_addr));
+		    else
+			fprintf(f, "<TD></TD>\n");
 		    PhysGetCallingNum(L, buf, sizeof(buf));
 		    PhysGetCalledNum(L, buf2, sizeof(buf2));
 		    if (PhysGetOriginate(L) == LINK_ORIGINATE_REMOTE) {
@@ -338,11 +355,23 @@
 		    }
 		} else {
 			fprintf(f, "<TD></TD>\n");
+			fprintf(f, "<TD></TD>\n");
 			fprintf(f, "<TD colspan=3></TD>\n");
 		}
 		if (priv) {
-		    fprintf(f, "<TD><A href=\"/cmd?link%%20%s&amp;open\">[Open]</a><A href=\"/cmd?link%%20%s&amp;close\">[Close]</a></TD>\n", 
-		    	L->name, L->name);
+		    switch (L->state) {
+			case PHYS_STATE_DOWN:
+			    fprintf(f, "<TD><A href=\"/cmd?link%%20%s&amp;open\">[Open]</A></TD>\n",
+				L->name);
+			    break;
+			case PHYS_STATE_UP:
+			    fprintf(f, "<TD><A href=\"/cmd?link%%20%s&amp;close\">[Close]</A></TD>\n",
+				L->name);
+			    break;
+			default:
+			    fprintf(f, "<TD><A href=\"/cmd?link%%20%s&amp;open\">[Open]</a>&nbsp;<A href=\"/cmd?link%%20%s&amp;close\">[Close]</a></TD>\n", 
+				L->name, L->name);
+		    }
 		}
 		fprintf(f, "</TR>\n");
 	    }
@@ -375,6 +404,10 @@
 		if (L->state != PHYS_STATE_DOWN) {
 		    PhysGetPeerAddr(L, buf, sizeof(buf));
 		    fprintf(f, "<TD>%s</TD>\n", buf);
+		    if (L->bund != NULL)
+			fprintf(f, "<TD>%s</TD>\n", inet_ntoa(L->bund->ipcp.peer_addr));
+		    else
+			fprintf(f, "<TD></TD>\n");
 		    PhysGetCallingNum(L, buf, sizeof(buf));
 		    PhysGetCalledNum(L, buf2, sizeof(buf2));
 		    if (PhysGetOriginate(L) == LINK_ORIGINATE_REMOTE) {
@@ -386,6 +419,7 @@
 		    }
 		} else {
 			fprintf(f, "<TD></TD>\n");
+			fprintf(f, "<TD></TD>\n");
 			fprintf(f, "<TD colspan=3></TD>\n");
 		}
 		fprintf(f, "<TD></TD>\n");
@@ -395,7 +429,7 @@
 	    }
 	}
 	if (!shown) {
-	    fprintf(f, "<TD colspan = \"10\"></TD>\n");
+	    fprintf(f, "<TD colspan = \"11\"></TD>\n");
 	    fprintf(f, "</TR>\n");
 	}
     }