diff options
-rw-r--r-- | fastd.c | 156 | ||||
-rw-r--r-- | fastd.h | 57 |
2 files changed, 156 insertions, 57 deletions
@@ -1,31 +1,43 @@ /* - Copyright (c) 2012-2013, Matthias Schiffer <mschiffer@universe-factory.net> - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ + * fastd.c - driver for the "Fast and Secure Tunneling Daemon" + * + * Copyright (c) 2012-2013, Matthias Schiffer <mschiffer@universe-factory.net> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Alternatively, provided that this notice is retained in full, this + * software may be distributed under the terms of the GNU General + * Public License ("GPL") version 2, in which case the provisions of the + * GPL apply INSTEAD OF those given above. + * + * The provided data structures and external interfaces from this code + * are not restricted to be used by modules with a GPL compatible license. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ #define DRV_NAME "fastd" -#define DRV_VERSION "1" +#define DRV_VERSION "0.1" #define DRV_DESCRIPTION "fastd tunnel driver" #define DRV_COPYRIGHT "(C) 2013 Matthias Schiffer <mschiffer@universe-factory.net>" @@ -34,51 +46,81 @@ #include <linux/errno.h> #include <linux/init.h> #include <linux/kernel.h> -#include <linux/miscdevice.h> -#include <linux/poll.h> - - -static const struct file_operations fastd_fops = { - .owner = THIS_MODULE, - .llseek = no_llseek, - .read = do_sync_read, -// .aio_read = fastd_chr_aio_read, - .write = do_sync_write, -// .aio_write = fastd_chr_aio_write, -// .poll = fastd_chr_poll, -// .unlocked_ioctl = fastd_chr_ioctl, -//#ifdef CONFIG_COMPAT -// .compat_ioctl = fastd_chr_compat_ioctl, -//#endif -// .open = fastd_chr_open, -// .release = fastd_chr_close, -// .fasync = fastd_chr_fasync +#include <net/genetlink.h> + +#include "fastd.h" + + +static struct genl_family fastd_nl_family = { + .id = GENL_ID_GENERATE, + .name = DRV_NAME, + .version = 1, + .hdrsize = 0, + .maxattr = FASTD_A_MAX, }; -static struct miscdevice fastd_miscdev = { - .minor = MISC_DYNAMIC_MINOR, - .name = "fastd", - .nodename = "net/fastd", - .fops = &fastd_fops, + +static int fastd_nl_event(struct notifier_block *this, + unsigned long event, void *ptr) +{ + struct netlink_notify *n = ptr; + + if (event != NETLINK_URELEASE || n->protocol != NETLINK_GENERIC) + return NOTIFY_DONE; + + return NOTIFY_DONE; +} + +static struct notifier_block nl_notifier = { + .notifier_call = fastd_nl_event, +}; + + +static int fastd_cmd_create(struct sk_buff *skb, struct genl_info *info) +{ + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + return -EINVAL; +} + + +static struct nla_policy fastd_nl_policy[__FASTD_A_MAX] = { +}; + +static struct genl_ops fastd_nl_ops[] = { + { + .cmd = FASTD_CMD_CREATE, + .doit = fastd_cmd_create, + .policy = fastd_nl_policy, + }, }; static int __init fastd_init(void) { - int ret; + int ret = 0; + + netlink_register_notifier(&nl_notifier); + + ret = genl_register_family_with_ops(&fastd_nl_family, fastd_nl_ops, ARRAY_SIZE(fastd_nl_ops)); + if (ret) + goto unregister_notifier; + + pr_info("%s %s\n", DRV_DESCRIPTION, DRV_VERSION); + + return 0; - ret = misc_register(&fastd_miscdev); - if (ret) { - pr_err("Can't register misc device\n"); - return ret; - } + unregister_notifier: + netlink_unregister_notifier(&nl_notifier); - return 0; + return ret; } static void fastd_cleanup(void) { - misc_deregister(&fastd_miscdev); + genl_unregister_family(&fastd_nl_family); + netlink_unregister_notifier(&nl_notifier); } @@ -87,4 +129,4 @@ module_exit(fastd_cleanup); MODULE_DESCRIPTION(DRV_DESCRIPTION); MODULE_AUTHOR(DRV_COPYRIGHT); MODULE_LICENSE("Dual BSD/GPL"); -MODULE_ALIAS("devname:net/fastd"); +MODULE_ALIAS_GENL_FAMILY("fastd"); @@ -0,0 +1,57 @@ +/* + * fastd.h - userspace interface for the "Fast and Secure Tunneling Daemon" + * + * Copyright (c) 2012-2013, Matthias Schiffer <mschiffer@universe-factory.net> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Alternatively, provided that this notice is retained in full, this + * software may be distributed under the terms of the GNU General + * Public License ("GPL") version 2, in which case the provisions of the + * GPL apply INSTEAD OF those given above. + * + * The provided data structures and external interfaces from this code + * are not restricted to be used by modules with a GPL compatible license. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ + + +#ifndef __LINUX_FASTD_H +#define __LINUX_FASTD_H + +enum { + FASTD_CMD_UNSPEC, + FASTD_CMD_CREATE, + __FASTD_CMD_MAX +}; + +enum { + FASTD_A_UNSPEC, + __FASTD_A_MAX +}; + + +#define FASTD_CMD_MAX (__FASTD_CMD_MAX - 1) +#define FASTD_A_MAX (__FASTD_A_MAX - 1) + +#endif /* __LINUX_FASTD_H */ |