Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/lib/npf/ext_log auto-create the log interface and bring it up.



details:   https://anonhg.NetBSD.org/src/rev/0876decefa91
branches:  trunk
changeset: 785371:0876decefa91
user:      christos <christos%NetBSD.org@localhost>
date:      Mon Mar 11 00:03:18 2013 +0000

description:
auto-create the log interface and bring it up.

diffstat:

 lib/npf/ext_log/npfext_log.c |  45 +++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 42 insertions(+), 3 deletions(-)

diffs (73 lines):

diff -r bc54d9e17dd8 -r 0876decefa91 lib/npf/ext_log/npfext_log.c
--- a/lib/npf/ext_log/npfext_log.c      Sun Mar 10 23:59:00 2013 +0000
+++ b/lib/npf/ext_log/npfext_log.c      Mon Mar 11 00:03:18 2013 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: npfext_log.c,v 1.1 2012/09/16 13:47:42 rmind Exp $     */
+/*     $NetBSD: npfext_log.c,v 1.2 2013/03/11 00:03:18 christos Exp $  */
 
 /*-
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -30,14 +30,18 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: npfext_log.c,v 1.1 2012/09/16 13:47:42 rmind Exp $");
+__RCSID("$NetBSD: npfext_log.c,v 1.2 2013/03/11 00:03:18 christos Exp $");
 
 #include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
 #include <net/if.h>
 
 #include <string.h>
 #include <assert.h>
 #include <errno.h>
+#include <err.h>
+#include <unistd.h>
 
 #include <npf.h>
 
@@ -68,7 +72,42 @@
 
        if_idx = if_nametoindex(param);
        if (if_idx == 0) {
-               return EINVAL;
+               int s;
+               struct ifreq ifr;
+               struct ifconf ifc;
+
+               if ((s = socket(PF_INET, SOCK_DGRAM, 0)) == -1) {
+                       warn("Can't create datagram socket for `%s'", param);
+                       return errno;
+               }
+
+               memset(&ifr, 0, sizeof(ifr));
+               strlcpy(ifr.ifr_name, param, sizeof(ifr.ifr_name));
+               if (ioctl(s, SIOCIFCREATE, &ifr) == -1) {
+                       warn("Can't SIOCIFCREATE `%s'", param);
+                       close(s);
+                       return errno;
+               }
+
+               memset(&ifc, 0, sizeof(ifc));
+               strlcpy(ifr.ifr_name, param, sizeof(ifr.ifr_name));
+               if (ioctl(s, SIOCGIFFLAGS, &ifr) == -1) {
+                       warn("Can't SIOCGIFFLAGS `%s'", param);
+                       close(s);
+                       return errno;
+               }
+
+               ifr.ifr_flags |= IFF_UP;
+               if (ioctl(s, SIOCSIFFLAGS, &ifr) == -1) {
+                       warn("Can't SIOSGIFFLAGS `%s'", param);
+                       close(s);
+                       return errno;
+               }
+               close(s);
+
+               if_idx = if_nametoindex(param);
+               if (if_idx == 0)
+                       return EINVAL;
        }
        npf_ext_param_u32(ext, "log-interface", if_idx);
        return 0;



Home | Main Index | Thread Index | Old Index