diff options
-rw-r--r-- | network/bridge.c | 35 | ||||
-rw-r--r-- | network/bridge.h | 9 | ||||
-rw-r--r-- | network/common.c | 24 | ||||
-rw-r--r-- | network/common.h | 5 | ||||
-rw-r--r-- | network/connection.c | 15 | ||||
-rw-r--r-- | network/connection.h | 9 | ||||
-rw-r--r-- | network/main.c | 75 | ||||
-rw-r--r-- | network/manager.c | 22 | ||||
-rw-r--r-- | network/manager.h | 8 | ||||
-rw-r--r-- | network/network.conf | 29 | ||||
-rw-r--r-- | network/server.c | 31 | ||||
-rw-r--r-- | network/server.h | 10 |
12 files changed, 136 insertions, 136 deletions
diff --git a/network/bridge.c b/network/bridge.c index 8ef06190..24f1bcc4 100644 --- a/network/bridge.c +++ b/network/bridge.c @@ -31,15 +31,20 @@ #include <sys/ioctl.h> #include <sys/stat.h> #include <sys/types.h> - #include <net/if.h> #include <linux/sockios.h> +#include <bluetooth/bluetooth.h> +#include <bluetooth/l2cap.h> +#include <bluetooth/bnep.h> + #include "bridge.h" static int bridge_socket = -1; +static const char *gn_bridge; +static const char *nap_bridge; -int bridge_init(void) +int bridge_init(const char *gn_iface, const char *nap_iface) { #if 0 struct stat st; @@ -52,6 +57,8 @@ int bridge_init(void) if (bridge_socket < 0) return -errno; + gn_bridge = gn_iface; + nap_bridge = nap_iface; return 0; } @@ -62,9 +69,10 @@ void bridge_cleanup(void) bridge_socket = -1; } -int bridge_create(const char *name) +int bridge_create(int id) { int err; + const char *name = bridge_get_name(id); err = ioctl(bridge_socket, SIOCBRADDBR, name); if (err < 0) @@ -73,9 +81,10 @@ int bridge_create(const char *name) return 0; } -int bridge_remove(const char *name) +int bridge_remove(int id) { int err; + const char *name = bridge_get_name(id); err = ioctl(bridge_socket, SIOCBRDELBR, name); if (err < 0) @@ -84,15 +93,16 @@ int bridge_remove(const char *name) return 0; } -int bridge_add_interface(const char *bridge, const char *dev) +int bridge_add_interface(int id, const char *dev) { struct ifreq ifr; int ifindex = if_nametoindex(dev); + const char *name = bridge_get_name(id); - if (ifindex == 0) + if (ifindex == 0) return -ENODEV; - strncpy(ifr.ifr_name, bridge, IFNAMSIZ); + strncpy(ifr.ifr_name, name, IFNAMSIZ); ifr.ifr_ifindex = ifindex; if (ioctl(bridge_socket, SIOCBRADDIF, &ifr) < 0) @@ -100,3 +110,14 @@ int bridge_add_interface(const char *bridge, const char *dev) return 0; } + +const char *bridge_get_name(int id) +{ + if (id == BNEP_SVC_GN) + return gn_bridge; + + if (id == BNEP_SVC_NAP) + return nap_bridge; + + return NULL; +} diff --git a/network/bridge.h b/network/bridge.h index 2630b892..0861cfb7 100644 --- a/network/bridge.h +++ b/network/bridge.h @@ -21,9 +21,10 @@ * */ -int bridge_init(void); +int bridge_init(const char *gn_iface, const char *nap_iface); void bridge_cleanup(void); -int bridge_create(const char *name); -int bridge_remove(const char *name); -int bridge_add_interface(const char *bridge, const char *dev); +int bridge_create(int id); +int bridge_remove(int id); +int bridge_add_interface(int id, const char *dev); +const char *bridge_get_name(int id); diff --git a/network/common.c b/network/common.c index dce12415..991073ec 100644 --- a/network/common.c +++ b/network/common.c @@ -63,6 +63,10 @@ static struct { { NULL } }; +static const char *panu = NULL; +static const char *gn = NULL; +static const char *nap = NULL; + struct bnep_data { char *devname; int pid; @@ -129,7 +133,8 @@ const char *bnep_name(uint16_t id) return NULL; } -int bnep_init(void) +int bnep_init(const char *panu_script, const char *gn_script, + const char *nap_script) { ctl = socket(PF_BLUETOOTH, SOCK_RAW, BTPROTO_BNEP); @@ -140,6 +145,9 @@ int bnep_init(void) return -err; } + panu = panu_script; + gn = gn_script; + nap = nap_script; return 0; } @@ -212,11 +220,11 @@ static void bnep_setup(gpointer data) { } -int bnep_if_up(const char *devname, const char *script) +int bnep_if_up(const char *devname, uint16_t id) { int sd, err, pid; struct ifreq ifr; - const char *argv[3]; + const char *argv[3], *script; struct bnep_data *bnep; sd = socket(AF_INET6, SOCK_DGRAM, 0); @@ -232,6 +240,16 @@ int bnep_if_up(const char *devname, const char *script) return -err; } + if (!id) + return 0; + + if (id == BNEP_SVC_PANU) + script = panu; + else if (id == BNEP_SVC_GN) + script = gn; + else + script = nap; + if (!script) return 0; diff --git a/network/common.h b/network/common.h index de9d753d..2b475864 100644 --- a/network/common.h +++ b/network/common.h @@ -24,7 +24,8 @@ #define MAX_PATH_LENGTH 64 /* D-Bus path */ #define NETWORK_PATH "/org/bluez/network" -int bnep_init(void); +int bnep_init(const char *panu_script, const char *gn_script, + const char *nap_script); int bnep_cleanup(void); uint16_t bnep_service_id(const char *svc); @@ -35,7 +36,7 @@ int bnep_kill_connection(bdaddr_t *dst); int bnep_kill_all_connections(void); int bnep_connadd(int sk, uint16_t role, char *dev); -int bnep_if_up(const char *devname, const char *script); +int bnep_if_up(const char *devname, uint16_t id); int bnep_if_down(const char *devname); int read_remote_name(bdaddr_t *src, bdaddr_t *dst, char *buf, size_t size); diff --git a/network/connection.c b/network/connection.c index fb1b2cdf..6157e377 100644 --- a/network/connection.c +++ b/network/connection.c @@ -62,7 +62,6 @@ struct network_conn { char dev[16]; /* Interface name */ char *name; /* Service Name */ char *desc; /* Service Description*/ - char *script; /* Interface up script*/ uint16_t id; /* Role: Service Class Identifier */ conn_state state; int sk; @@ -74,7 +73,6 @@ struct __service_16 { } __attribute__ ((packed)); static DBusConnection *connection = NULL; -static struct connection_conf *conf = NULL; static const char *prefix = NULL; static gboolean bnep_watchdog_cb(GIOChannel *chan, GIOCondition cond, @@ -157,7 +155,7 @@ static gboolean bnep_connect_cb(GIOChannel *chan, GIOCondition cond, goto failed; } - bnep_if_up(nc->dev, nc->script); + bnep_if_up(nc->dev, nc->id); dbus_connection_emit_signal(connection, nc->path, NETWORK_CONNECTION_INTERFACE, "Connected", @@ -666,12 +664,6 @@ int connection_register(const char *path, bdaddr_t *src, bdaddr_t *dst, nc->desc = g_strdup(desc); memset(nc->dev, 0, 16); strncpy(nc->dev, prefix, strlen(prefix)); - if (id == BNEP_SVC_PANU) - nc->script = conf->panu_script; - else if (id == BNEP_SVC_GN) - nc->script = conf->gn_script; - else - nc->script = conf->nap_script; nc->state = DISCONNECTED; info("Registered connection path:%s", path); @@ -795,11 +787,9 @@ gboolean connection_is_connected(const char *path) return (nc->state == CONNECTED); } -int connection_init(DBusConnection *conn, const char *iface_prefix, - struct connection_conf *conn_conf) +int connection_init(DBusConnection *conn, const char *iface_prefix) { connection = dbus_connection_ref(conn); - conf = conn_conf; prefix = iface_prefix; return 0; @@ -809,6 +799,5 @@ void connection_exit() { dbus_connection_unref(connection); connection = NULL; - conf = NULL; prefix = NULL; } diff --git a/network/connection.h b/network/connection.h index 7cafa122..5e560811 100644 --- a/network/connection.h +++ b/network/connection.h @@ -21,14 +21,7 @@ * */ -struct connection_conf { - char *panu_script; - char *gn_script; - char *nap_script; -}; - -int connection_init(DBusConnection *conn, const char *iface_prefix, - struct connection_conf *conn_conf); +int connection_init(DBusConnection *conn, const char *iface_prefix); void connection_exit(); int connection_register(const char *path, bdaddr_t *src, bdaddr_t *dst, uint16_t id, const char *name, const char *desc); diff --git a/network/main.c b/network/main.c index 6260ac4e..3ede75fe 100644 --- a/network/main.c +++ b/network/main.c @@ -52,13 +52,12 @@ static struct network_conf conf = { .connection_enabled = TRUE, .server_enabled = TRUE, .iface_prefix = NULL, - .conn.panu_script = NULL, - .conn.gn_script = NULL, - .conn.nap_script = NULL, - .server.panu_iface = NULL, - .server.gn_iface = NULL, - .server.nap_iface = NULL, - .server.disable_security = FALSE + .panu_script = NULL, + .gn_script = NULL, + .nap_script = NULL, + .gn_iface = NULL, + .nap_iface = NULL, + .security = TRUE }; static void sig_term(int sig) @@ -70,6 +69,7 @@ static void read_config(const char *file) { GKeyFile *keyfile; GError *err = NULL; + const char *disabled; keyfile = g_key_file_new(); @@ -80,72 +80,75 @@ static void read_config(const char *file) return; } - conf.iface_prefix = g_key_file_get_string(keyfile, "Connection", - "InterfacePrefix", &err); - if (!conf.iface_prefix) - conf.iface_prefix = g_strdup(IFACE_PREFIX); + disabled = g_key_file_get_string(keyfile, "General", + "Disable", &err); if (err) { debug("%s: %s", file, err->message); g_error_free(err); err = NULL; + } else { + if (strstr(disabled, "Connection")) + conf.connection_enabled = FALSE; + if (strstr(disabled, "Server")) + conf.server_enabled = FALSE; } - conf.conn.panu_script = g_key_file_get_string(keyfile, "Connection", - "PANUScript", &err); + conf.iface_prefix = g_key_file_get_string(keyfile, "General", + "InterfacePrefix", &err); + if (!conf.iface_prefix) + conf.iface_prefix = g_strdup(IFACE_PREFIX); if (err) { debug("%s: %s", file, err->message); g_error_free(err); err = NULL; } - conf.conn.gn_script = g_key_file_get_string(keyfile, "Connection", - "GNScript", &err); + conf.security = g_key_file_get_boolean(keyfile, "General", + "DisableSecurity", &err); if (err) { debug("%s: %s", file, err->message); g_error_free(err); err = NULL; } - conf.conn.nap_script = g_key_file_get_string(keyfile, "Connection", - "NAPScript", &err); + conf.panu_script = g_key_file_get_string(keyfile, "PANU Role", + "Script", &err); if (err) { debug("%s: %s", file, err->message); g_error_free(err); err = NULL; } - conf.server.panu_iface = g_key_file_get_string(keyfile, "Server", - "PANUInterface", &err); - if (!conf.server.panu_iface) - conf.server.panu_iface = g_strdup(PANU_IFACE); + conf.gn_script = g_key_file_get_string(keyfile, "GN Role", + "Script", &err); if (err) { debug("%s: %s", file, err->message); g_error_free(err); err = NULL; } - conf.server.gn_iface = g_key_file_get_string(keyfile, "Server", - "GNInterface", &err); - if (!conf.server.gn_iface) - conf.server.gn_iface = g_strdup(GN_IFACE); + conf.nap_script = g_key_file_get_string(keyfile, "NAP Role", + "Script", &err); if (err) { debug("%s: %s", file, err->message); g_error_free(err); err = NULL; } - conf.server.nap_iface = g_key_file_get_string(keyfile, "Server", - "NAPInterface", &err); - if (!conf.server.nap_iface) - conf.server.nap_iface = g_strdup(NAP_IFACE); + conf.gn_iface = g_key_file_get_string(keyfile, "GN Role", + "Interface", &err); + if (!conf.gn_iface) + conf.gn_iface = g_strdup(GN_IFACE); if (err) { debug("%s: %s", file, err->message); g_error_free(err); err = NULL; } - conf.server.disable_security = g_key_file_get_boolean(keyfile, "Server", - "DisableSecurity", &err); + conf.nap_iface = g_key_file_get_string(keyfile, "NAP Role", + "Interface", &err); + if (!conf.nap_iface) + conf.nap_iface = g_strdup(NAP_IFACE); if (err) { debug("%s: %s", file, err->message); g_error_free(err); @@ -153,12 +156,10 @@ static void read_config(const char *file) } debug("Config options: InterfacePrefix=%s, PANUScript=%s, GNScript=%s, " - "NAPScript=%s, PANUInterface=%s, GNInterface=%s, " - "NAPInterface=%s, DisableSecurity=%s", conf.iface_prefix, - conf.conn.panu_script, conf.conn.gn_script, conf.conn.nap_script, - conf.server.panu_iface, conf.server.gn_iface, - conf.server.nap_iface, - conf.server.disable_security ? "true" : "false"); + "NAPScript=%s, GNInterface=%s, NAPInterface=%s, Security=%s", + conf.iface_prefix, conf.panu_script, conf.gn_script, + conf.nap_script, conf.gn_iface, conf.nap_iface, + conf.security ? "true" : "false"); g_key_file_free(keyfile); } diff --git a/network/manager.c b/network/manager.c index 5e1ab2f0..c82d1c03 100644 --- a/network/manager.c +++ b/network/manager.c @@ -923,21 +923,18 @@ int network_init(DBusConnection *conn, struct network_conf *service_conf) { conf = service_conf; - if (bridge_init() < 0) { + if (bridge_init(conf->gn_iface, conf->nap_iface) < 0) { error("Can't init bridge module"); return -1; } - if (bridge_create(conf->server.panu_iface) < 0) - error("Can't create PANU bridge"); - - if (bridge_create(conf->server.gn_iface) < 0) + if (bridge_create(BNEP_SVC_GN) < 0) error("Can't create GN bridge"); - if (bridge_create(conf->server.nap_iface) < 0) + if (bridge_create(BNEP_SVC_NAP) < 0) error("Can't create NAP bridge"); - if (bnep_init()) { + if (bnep_init(conf->panu_script, conf->gn_script, conf->nap_script)) { error("Can't init bnep module"); return -1; } @@ -948,10 +945,10 @@ int network_init(DBusConnection *conn, struct network_conf *service_conf) * (setup connection request) contains the destination service * field that defines which service the source is connecting to. */ - if (server_init(conn, conf->iface_prefix, &conf->server) < 0) + if (server_init(conn, conf->iface_prefix) < 0) return -1; - if (connection_init(conn, conf->iface_prefix, &conf->conn) < 0) + if (connection_init(conn, conf->iface_prefix) < 0) return -1; if (!dbus_connection_create_object_path(conn, NETWORK_PATH, @@ -993,13 +990,10 @@ void network_exit(void) connection = NULL; - if (bridge_remove(conf->server.panu_iface) < 0) - error("Can't remove PANU bridge"); - - if (bridge_remove(conf->server.gn_iface) < 0) + if (bridge_remove(BNEP_SVC_GN) < 0) error("Can't remove GN bridge"); - if (bridge_remove(conf->server.nap_iface) < 0) + if (bridge_remove(BNEP_SVC_NAP) < 0) error("Can't remove NAP bridge"); bnep_cleanup(); diff --git a/network/manager.h b/network/manager.h index 0efacc14..622665e8 100644 --- a/network/manager.h +++ b/network/manager.h @@ -30,9 +30,13 @@ struct network_conf { gboolean connection_enabled; gboolean server_enabled; + gboolean security; char *iface_prefix; - struct connection_conf conn; - struct server_conf server; + char *panu_script; + char *gn_script; + char *nap_script; + char *gn_iface; + char *nap_iface; }; int network_init(DBusConnection *conn, struct network_conf *service_conf); diff --git a/network/network.conf b/network/network.conf index 66136002..29e77fff 100644 --- a/network/network.conf +++ b/network/network.conf @@ -12,27 +12,26 @@ # (up to 16 characters) InterfacePrefix=bnep%d -[Connection] +# Disable link encryption: default=false +DisableSecurity=false -# PAN user connection interface up script. default: -PANUScript=/usr/sbin/avahi-autoipd +[PANU Role] -# Group Network connection interface up script. default: -GNScript=/usr/sbin/avahi-autoipd +# PAN user connection interface up script. default:none +Script=avahi-autoipd -# Network Access Point connection interface up script. default: -NAPScript=/sbin/dhclient +[GN Role] -[Server] +# Network Interface name for Group Network server. default:pan1 +Interface=pan0 -# Network Interface name for PAN user server. default:pan0 -PANUInterface=pan0 +# Group Network connection interface up script. default:none +Script=avahi-autoipd -# Network Interface name for Group Network server. default:pan1 -GNInterface=pan1 +[NAP Role] # Network Interface name for Network Access Point server. default:pan2 -NAPInterface=pan2 +Interface=pan1 -# Disable link encryption: default=false -DisableSecurity=false +# Network Access Point connection interface up script. default:none +Script=/sbin/dhclient diff --git a/network/server.c b/network/server.c index b1257760..80ab49a1 100644 --- a/network/server.c +++ b/network/server.c @@ -74,7 +74,6 @@ struct setup_session { /* Main server structure */ struct network_server { bdaddr_t src; /* Bluetooth Local Address */ - char *bridge; /* Bridge interface */ char *iface; /* Routing interface */ char *name; /* Server service name */ char *range; /* IP Address range */ @@ -86,7 +85,6 @@ struct network_server { GSList *clients; /* Active connections */ }; -static struct server_conf *conf = NULL; static GIOChannel *bnep_io = NULL; static DBusConnection *connection = NULL; static GSList *setup_sessions = NULL; @@ -304,6 +302,7 @@ static void authorization_callback(DBusPendingCall *pcall, void *data) char path[MAX_PATH_LENGTH], devname[16]; uint16_t response = BNEP_CONN_NOT_ALLOWED; DBusError derr; + const char *bridge; if (!g_slist_find(setup_sessions, s)) { dbus_message_unref(reply); @@ -337,14 +336,18 @@ static void authorization_callback(DBusPendingCall *pcall, void *data) info("Authorization succedded. New connection: %s", devname); response = BNEP_SUCCESS; - if (bridge_add_interface(ns->bridge, devname) < 0) { + if (bridge_add_interface(ns->id, devname) < 0) { error("Can't add %s to the bridge: %s(%d)", devname, strerror(errno), errno); goto failed; } - bnep_if_up(devname, NULL); - bnep_if_up(ns->bridge, NULL); + bridge = bridge_get_name(ns->id); + if (bridge) { + bnep_if_up(devname, 0); + bnep_if_up(bridge, ns->id); + } else + bnep_if_up(devname, ns->id); ns->clients = g_slist_append(ns->clients, g_strdup(s->address)); @@ -594,8 +597,7 @@ static gboolean connect_event(GIOChannel *chan, return TRUE; } -int server_init(DBusConnection *conn, const char *iface_prefix, - struct server_conf *server_conf) +int server_init(DBusConnection *conn, const char *iface_prefix) { struct l2cap_options l2o; struct sockaddr_l2 l2a; @@ -656,7 +658,6 @@ int server_init(DBusConnection *conn, const char *iface_prefix, } connection = dbus_connection_ref(conn); - conf = server_conf; prefix = iface_prefix; bnep_io = g_io_channel_unix_new(sk); @@ -687,7 +688,6 @@ void server_exit() dbus_connection_unref(connection); connection = NULL; - conf = NULL; } static uint32_t add_server_record(struct network_server *ns) @@ -1195,13 +1195,6 @@ int server_register(const char *path, bdaddr_t *src, uint16_t id) ns->name = g_strdup("BlueZ PANU service"); ns->path = g_strdup(path); - ns->id = id; - if (id == BNEP_SVC_NAP) - ns->bridge = conf->nap_iface; - else if (id == BNEP_SVC_GN) - ns->bridge = conf->gn_iface; - else - ns->bridge = conf->panu_iface; bacpy(&ns->src, src); info("Registered server path:%s", path); @@ -1220,12 +1213,6 @@ int server_register_from_file(const char *path, const bdaddr_t *src, bacpy(&ns->src, src); ns->path = g_strdup(path); ns->id = id; - if (id == BNEP_SVC_NAP) - ns->bridge = conf->nap_iface; - else if (id == BNEP_SVC_GN) - ns->bridge = conf->gn_iface; - else - ns->bridge = conf->panu_iface; ns->name = textfile_get(filename, "name"); if (!ns->name) { /* Name is mandatory */ diff --git a/network/server.h b/network/server.h index 233c7837..9f49cad7 100644 --- a/network/server.h +++ b/network/server.h @@ -21,15 +21,7 @@ * */ -struct server_conf { - char *panu_iface; - char *gn_iface; - char *nap_iface; - gboolean disable_security; -}; - -int server_init(DBusConnection *conn, const char *iface_prefix, - struct server_conf *server_conf); +int server_init(DBusConnection *conn, const char *iface_prefix); void server_exit(); int server_register(const char *path, bdaddr_t *src, uint16_t id); int server_register_from_file(const char *path, const bdaddr_t *src, |