diff -urN mpd/src/bund.c mpd-patched/src/bund.c --- mpd/src/bund.c 2008-06-18 00:09:24.000000000 +0600 +++ mpd-patched/src/bund.c 2008-06-18 00:28:12.000000000 +0600 @@ -864,6 +864,7 @@ u_char netflow_in = 0; u_char netflow_out = 0; u_char nat = 0; + u_char retain = 0; int k; /* Args */ @@ -873,7 +874,7 @@ if (ac > 0 && av[0][0] == '-') { optreset = 1; optind = 0; - while ((k = getopt(ac, av, "nNati:")) != -1) { + while ((k = getopt(ac, av, "rnNati:")) != -1) { switch (k) { case 'i': reqIface = optarg; @@ -881,6 +882,9 @@ case 't': tee = 1; break; + case 'r': + retain = 1; + break; case 'n': #ifdef USE_NG_NETFLOW netflow_in = 1; @@ -977,6 +981,8 @@ Enable(&b->iface.options, IFACE_CONF_NETFLOW_IN); if (netflow_out) Enable(&b->iface.options, IFACE_CONF_NETFLOW_OUT); + if (retain) + Enable(&b->iface.options, IFACE_CONF_RETAIN); /* Get message channel */ b->msgs = MsgRegister(BundMsg); @@ -1549,7 +1555,10 @@ char path[NG_PATHLEN + 1]; if (iface) { - snprintf(path, sizeof(path), "%s:", b->iface.ifname); + if (Enabled(&b->iface.options, IFACE_CONF_RETAIN)) + snprintf(path, sizeof(path), "%s:inet", b->iface.ifname); + else + snprintf(path, sizeof(path), "%s:", b->iface.ifname); NgFuncShutdownNode(b->csock, b->name, path); } if (ppp) { diff -urN mpd/src/iface.c mpd-patched/src/iface.c --- mpd/src/iface.c 2008-06-18 00:09:24.000000000 +0600 +++ mpd-patched/src/iface.c 2008-06-17 23:58:45.000000000 +0600 @@ -173,6 +173,7 @@ { 0, IFACE_CONF_NETFLOW_IN, "netflow-in" }, { 0, IFACE_CONF_NETFLOW_OUT, "netflow-out" }, { 0, IFACE_CONF_IPACCT, "ipacct" }, + { 0, IFACE_CONF_RETAIN, "retain" }, { 0, 0, NULL }, }; diff -urN mpd/src/iface.h mpd-patched/src/iface.h --- mpd/src/iface.h 2008-06-18 00:09:24.000000000 +0600 +++ mpd-patched/src/iface.h 2008-06-17 23:51:13.000000000 +0600 @@ -59,6 +59,7 @@ IFACE_CONF_NETFLOW_IN, IFACE_CONF_NETFLOW_OUT, IFACE_CONF_IPACCT, + IFACE_CONF_RETAIN, }; /* Dial-on-demand packet cache */