From: Marcus Folkesson <***@gmail.com>
Support for multiple VLANs binded to the same interface.
VLAN services appear as:
vlan_<MAC to bounded IF>_<VLAN IFNAME>
For example:
vlan_5c260a4bf6a3_vlan3
Signed-off-by: Marcus Folkesson <***@gmail.com>
---
Makefile.plugins | 5 +
README | 8 ++
configure.ac | 5 +
include/device.h | 1 +
include/network.h | 1 +
include/service.h | 3 +-
plugins/vlan.c | 369 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/config.c | 1 +
src/detect.c | 1 +
src/device.c | 10 ++
src/network.c | 7 ++
src/notifier.c | 2 +
src/rfkill.c | 1 +
src/rtnl.c | 3 +
src/service.c | 27 +++-
src/session.c | 2 +
src/technology.c | 4 +
src/wispr.c | 1 +
18 files changed, 448 insertions(+), 3 deletions(-)
create mode 100644 plugins/vlan.c
diff --git a/Makefile.plugins b/Makefile.plugins
index e90ad19..590f89e 100644
--- a/Makefile.plugins
+++ b/Makefile.plugins
@@ -13,6 +13,11 @@ builtin_modules += ethernet
builtin_sources += plugins/ethernet.c
endif
+if VLAN
+builtin_modules += vlan
+builtin_sources += plugins/vlan.c
+endif
+
if GADGET
builtin_modules += gadget
builtin_sources += plugins/gadget.c
diff --git a/README b/README
index 531f396..c505fd9 100644
--- a/README
+++ b/README
@@ -71,6 +71,14 @@ For a working system, certain configuration options need to be enabled:
enabled. This option can be used to build a small daemon
for a specific system if Ethernet support is not required.
+ --disable-vlan
+
+ Disable support for VLAN on Ethernet and/or WiFi interfaces
+
+ By default VLAN technology support is built-in and
+ enabled. This option can be used to build a small daemon
+ for a specific system if VLAN support is not required.
+
--disable-gadget
Disable support for USB Ethernet Gadget devices
diff --git a/configure.ac b/configure.ac
index dd4b271..80655ef 100644
--- a/configure.ac
+++ b/configure.ac
@@ -291,6 +291,11 @@ AC_ARG_ENABLE(gadget, AC_HELP_STRING([--disable-gadget],
[enable_gadget=${enableval}])
AM_CONDITIONAL(GADGET, test "${enable_gadget}" != "no")
+AC_ARG_ENABLE(vlan, AC_HELP_STRING([--disable-vlan],
+ [disable VLAN support]),
+ [enable_vlan=${enableval}])
+AM_CONDITIONAL(VLAN, test "${enable_vlan}" != "no")
+
AC_ARG_ENABLE(wifi, AC_HELP_STRING([--disable-wifi],
[disable WiFi support]),
[enable_wifi=${enableval}])
diff --git a/include/device.h b/include/device.h
index 57b925c..cd734b3 100644
--- a/include/device.h
+++ b/include/device.h
@@ -43,6 +43,7 @@ enum connman_device_type {
CONNMAN_DEVICE_TYPE_CELLULAR = 4,
CONNMAN_DEVICE_TYPE_GPS = 5,
CONNMAN_DEVICE_TYPE_GADGET = 6,
+ CONNMAN_DEVICE_TYPE_VLAN = 7,
CONNMAN_DEVICE_TYPE_VENDOR = 10000,
};
diff --git a/include/network.h b/include/network.h
index d772699..5212b6f 100644
--- a/include/network.h
+++ b/include/network.h
@@ -46,6 +46,7 @@ enum connman_network_type {
CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN = 9,
CONNMAN_NETWORK_TYPE_CELLULAR = 10,
CONNMAN_NETWORK_TYPE_GADGET = 11,
+ CONNMAN_NETWORK_TYPE_VLAN = 12,
CONNMAN_NETWORK_TYPE_VENDOR = 10000,
};
diff --git a/include/service.h b/include/service.h
index 31dfce7..36786e6 100644
--- a/include/service.h
+++ b/include/service.h
@@ -45,8 +45,9 @@ enum connman_service_type {
CONNMAN_SERVICE_TYPE_VPN = 7,
CONNMAN_SERVICE_TYPE_GADGET = 8,
CONNMAN_SERVICE_TYPE_P2P = 9,
+ CONNMAN_SERVICE_TYPE_VLAN = 10,
};
-#define MAX_CONNMAN_SERVICE_TYPES 10
+#define MAX_CONNMAN_SERVICE_TYPES 11
enum connman_service_security {
diff --git a/plugins/vlan.c b/plugins/vlan.c
new file mode 100644
index 0000000..679f92d
--- /dev/null
+++ b/plugins/vlan.c
@@ -0,0 +1,369 @@
+/*
+ *
+* Connection Manager
+ *
+ * Copyright (C) 2015 Marcus Folkesson <***@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <errno.h>
+#include <net/if.h>
+
+#ifndef IFF_LOWER_UP
+#define IFF_LOWER_UP 0x10000
+#endif
+
+#include <glib.h>
+
+#define CONNMAN_API_SUBJECT_TO_CHANGE
+#include <connman/technology.h>
+#include <connman/plugin.h>
+#include <connman/device.h>
+#include <connman/inet.h>
+#include <connman/rtnl.h>
+#include <connman/log.h>
+#include <connman/setting.h>
+
+static bool vlan_tethering = false;
+
+struct ethernet_data {
+ int index;
+ unsigned flags;
+ unsigned int watch;
+ struct connman_network *network;
+};
+
+static int vlan_network_probe(struct connman_network *network)
+{
+ DBG("network %p", network);
+
+ return 0;
+}
+
+static void vlan_network_remove(struct connman_network *network)
+{
+ DBG("network %p", network);
+}
+
+static int vlan_network_connect(struct connman_network *network)
+{
+ DBG("network %p", network);
+
+ connman_network_set_connected(network, true);
+
+ return 0;
+}
+
+static int vlan_network_disconnect(struct connman_network *network)
+{
+ DBG("network %p", network);
+
+ connman_network_set_connected(network, false);
+
+ return 0;
+}
+
+static struct connman_network_driver vlan_network_driver = {
+ .name = "vlan",
+ .type = CONNMAN_NETWORK_TYPE_VLAN,
+ .probe = vlan_network_probe,
+ .remove = vlan_network_remove,
+ .connect = vlan_network_connect,
+ .disconnect = vlan_network_disconnect,
+};
+
+static void add_network(struct connman_device *device,
+ struct ethernet_data *ethernet)
+{
+ struct connman_network *network;
+ int index;
+
+ network = connman_network_create("vlan",
+ CONNMAN_NETWORK_TYPE_VLAN);
+ if (!network)
+ return;
+
+ index = connman_device_get_index(device);
+ connman_network_set_index(network, index);
+
+ connman_network_set_name(network, "VLAN");
+
+ if (connman_device_add_network(device, network) < 0) {
+ connman_network_unref(network);
+ return;
+ }
+
+ if (!vlan_tethering)
+ /*
+ * Prevent service from starting the reconnect
+ * procedure as we do not want the DHCP client
+ * to run when tethering.
+ */
+ connman_network_set_group(network, connman_device_get_string(device, "Interface"));
+
+ ethernet->network = network;
+}
+
+static void remove_network(struct connman_device *device,
+ struct ethernet_data *ethernet)
+{
+ if (!ethernet->network)
+ return;
+
+ connman_device_remove_network(device, ethernet->network);
+ connman_network_unref(ethernet->network);
+
+ ethernet->network = NULL;
+}
+
+static void ethernet_newlink(unsigned flags, unsigned change, void *user_data)
+{
+ struct connman_device *device = user_data;
+ struct ethernet_data *ethernet = connman_device_get_data(device);
+
+ DBG("index %d flags %d change %d", ethernet->index, flags, change);
+
+ if ((ethernet->flags & IFF_UP) != (flags & IFF_UP)) {
+ if (flags & IFF_UP) {
+ DBG("power on");
+ connman_device_set_powered(device, true);
+ } else {
+ DBG("power off");
+ connman_device_set_powered(device, false);
+ }
+ }
+
+ if ((ethernet->flags & IFF_LOWER_UP) != (flags & IFF_LOWER_UP)) {
+ if (flags & IFF_LOWER_UP) {
+ DBG("carrier on");
+ add_network(device, ethernet);
+ } else {
+ DBG("carrier off");
+ remove_network(device, ethernet);
+ }
+ }
+
+ ethernet->flags = flags;
+}
+
+static int vlan_dev_probe(struct connman_device *device)
+{
+ struct ethernet_data *ethernet;
+
+ DBG("device %p", device);
+
+ ethernet = g_try_new0(struct ethernet_data, 1);
+ if (!ethernet)
+ return -ENOMEM;
+
+ connman_device_set_data(device, ethernet);
+
+ ethernet->index = connman_device_get_index(device);
+ ethernet->flags = 0;
+
+ ethernet->watch = connman_rtnl_add_newlink_watch(ethernet->index,
+ ethernet_newlink, device);
+
+ return 0;
+}
+
+static void vlan_dev_remove(struct connman_device *device)
+{
+ struct ethernet_data *ethernet = connman_device_get_data(device);
+
+ DBG("device %p", device);
+
+ connman_device_set_data(device, NULL);
+
+ connman_rtnl_remove_watch(ethernet->watch);
+
+ remove_network(device, ethernet);
+
+ g_free(ethernet);
+}
+
+static int vlan_dev_enable(struct connman_device *device)
+{
+ struct ethernet_data *ethernet = connman_device_get_data(device);
+
+ DBG("device %p", device);
+
+ return connman_inet_ifup(ethernet->index);
+}
+
+static int vlan_dev_disable(struct connman_device *device)
+{
+ struct ethernet_data *ethernet = connman_device_get_data(device);
+
+ DBG("device %p", device);
+
+ return connman_inet_ifdown(ethernet->index);
+}
+
+static struct connman_device_driver vlan_dev_driver = {
+ .name = "vlan",
+ .type = CONNMAN_DEVICE_TYPE_VLAN,
+ .probe = vlan_dev_probe,
+ .remove = vlan_dev_remove,
+ .enable = vlan_dev_enable,
+ .disable = vlan_dev_disable,
+};
+
+static int vlan_tech_probe(struct connman_technology *technology)
+{
+ return 0;
+}
+
+static void vlan_tech_remove(struct connman_technology *technology)
+{
+ DBG("");
+}
+
+static GList *vlan_interface_list = NULL;
+
+static void vlan_tech_add_interface(struct connman_technology *technology,
+ int index, const char *name, const char *ident)
+{
+ DBG("index %d name %s ident %s", index, name, ident);
+
+ if (g_list_find(vlan_interface_list, GINT_TO_POINTER((int)index)))
+ return;
+
+ vlan_interface_list = g_list_prepend(vlan_interface_list,
+ (GINT_TO_POINTER((int) index)));
+}
+
+static void vlan_tech_remove_interface(struct connman_technology *technology,
+ int index)
+{
+ DBG("index %d", index);
+
+ vlan_interface_list = g_list_remove(vlan_interface_list,
+ GINT_TO_POINTER((int) index));
+}
+
+static void vlan_tech_enable_tethering(struct connman_technology *technology,
+ const char *bridge)
+{
+ GList *list;
+ struct ethernet_data *ethernet;
+
+ for (list = vlan_interface_list; list; list = list->next) {
+ int index = GPOINTER_TO_INT(list->data);
+ struct connman_device *device =
+ connman_device_find_by_index(index);
+
+ if (device) {
+ ethernet = connman_device_get_data(device);
+ if (ethernet)
+ remove_network(device, ethernet);
+ }
+
+ connman_technology_tethering_notify(technology, true);
+
+ connman_inet_ifup(index);
+
+ connman_inet_add_to_bridge(index, bridge);
+
+ vlan_tethering = true;
+ }
+}
+
+static void vlan_tech_disable_tethering(struct connman_technology *technology,
+ const char *bridge)
+{
+ GList *list;
+
+ for (list = vlan_interface_list; list; list = list->next) {
+ int index = GPOINTER_TO_INT(list->data);
+ struct connman_device *device =
+ connman_device_find_by_index(index);
+
+ connman_inet_remove_from_bridge(index, bridge);
+
+ connman_technology_tethering_notify(technology, false);
+
+ if (device)
+ connman_device_reconnect_service(device);
+
+ vlan_tethering = false;
+ }
+}
+
+static int vlan_tech_set_tethering(struct connman_technology *technology,
+ const char *identifier, const char *passphrase,
+ const char *bridge, bool enabled)
+{
+ if (!connman_technology_is_tethering_allowed(
+ CONNMAN_SERVICE_TYPE_VLAN))
+ return 0;
+
+ DBG("bridge %s enabled %d", bridge, enabled);
+
+ if (enabled)
+ vlan_tech_enable_tethering(technology, bridge);
+ else
+ vlan_tech_disable_tethering(technology, bridge);
+
+ return 0;
+}
+
+static struct connman_technology_driver vlan_tech_driver = {
+ .name = "vlan",
+ .type = CONNMAN_SERVICE_TYPE_VLAN,
+ .probe = vlan_tech_probe,
+ .remove = vlan_tech_remove,
+ .add_interface = vlan_tech_add_interface,
+ .remove_interface = vlan_tech_remove_interface,
+ .set_tethering = vlan_tech_set_tethering,
+};
+
+static int vlan_init(void)
+{
+ int err;
+
+ err = connman_technology_driver_register(&vlan_tech_driver);
+ if (err < 0)
+ return err;
+
+ err = connman_network_driver_register(&vlan_network_driver);
+ if (err < 0)
+ return err;
+
+ err = connman_device_driver_register(&vlan_dev_driver);
+ if (err < 0) {
+ connman_network_driver_unregister(&vlan_network_driver);
+ return err;
+ }
+
+ return 0;
+}
+
+static void vlan_exit(void)
+{
+ connman_technology_driver_unregister(&vlan_tech_driver);
+
+ connman_network_driver_unregister(&vlan_network_driver);
+
+ connman_device_driver_unregister(&vlan_dev_driver);
+}
+
+CONNMAN_PLUGIN_DEFINE(vlan, "VLAN interface plugin", VERSION,
+ CONNMAN_PLUGIN_PRIORITY_DEFAULT, vlan_init, vlan_exit)
diff --git a/src/config.c b/src/config.c
index a4c117e..9c47a97 100644
--- a/src/config.c
+++ b/src/config.c
@@ -1137,6 +1137,7 @@ static int try_provision_service(struct connman_config_service *config,
case CONNMAN_SERVICE_TYPE_ETHERNET:
case CONNMAN_SERVICE_TYPE_GADGET:
+ case CONNMAN_SERVICE_TYPE_VLAN:
if (__connman_service_string2type(config->type) != type)
return -ENOENT;
diff --git a/src/detect.c b/src/detect.c
index 6c03920..0de05f9 100644
--- a/src/detect.c
+++ b/src/detect.c
@@ -63,6 +63,7 @@ static void detect_newlink(unsigned short type, int index,
case CONNMAN_DEVICE_TYPE_ETHERNET:
case CONNMAN_DEVICE_TYPE_WIFI:
case CONNMAN_DEVICE_TYPE_GADGET:
+ case CONNMAN_DEVICE_TYPE_VLAN:
break;
}
diff --git a/src/device.c b/src/device.c
index c0683ab..c7248ab 100644
--- a/src/device.c
+++ b/src/device.c
@@ -97,6 +97,8 @@ static const char *type2description(enum connman_device_type type)
return "Cellular";
case CONNMAN_DEVICE_TYPE_GADGET:
return "Gadget";
+ case CONNMAN_DEVICE_TYPE_VLAN:
+ return "VLAN";
}
@@ -121,6 +123,8 @@ static const char *type2string(enum connman_device_type type)
return "cellular";
case CONNMAN_DEVICE_TYPE_GADGET:
return "gadget";
+ case CONNMAN_DEVICE_TYPE_VLAN:
+ return "vlan";
}
@@ -147,6 +151,8 @@ enum connman_service_type __connman_device_get_service_type(
return CONNMAN_SERVICE_TYPE_CELLULAR;
case CONNMAN_DEVICE_TYPE_GADGET:
return CONNMAN_SERVICE_TYPE_GADGET;
+ case CONNMAN_DEVICE_TYPE_VLAN:
+ return CONNMAN_SERVICE_TYPE_VLAN;
}
@@ -852,6 +858,7 @@ int connman_device_add_network(struct connman_device *device,
const char *identifier = connman_network_get_identifier(network);
DBG("device %p network %p", device, network);
+ DBG("IDENTIFIER: %s\n", identifier);
if (!identifier)
return -EINVAL;
@@ -1093,6 +1100,7 @@ int __connman_device_request_scan(enum connman_service_type type)
case CONNMAN_SERVICE_TYPE_GPS:
case CONNMAN_SERVICE_TYPE_VPN:
case CONNMAN_SERVICE_TYPE_GADGET:
+ case CONNMAN_SERVICE_TYPE_VLAN:
return -EOPNOTSUPP;
case CONNMAN_SERVICE_TYPE_WIFI:
case CONNMAN_SERVICE_TYPE_P2P:
@@ -1261,6 +1269,7 @@ struct connman_device *connman_device_create_from_index(int index)
return NULL;
case CONNMAN_DEVICE_TYPE_ETHERNET:
case CONNMAN_DEVICE_TYPE_GADGET:
+ case CONNMAN_DEVICE_TYPE_VLAN:
case CONNMAN_DEVICE_TYPE_WIFI:
name = index2ident(index, "");
addr = index2addr(index);
@@ -1284,6 +1293,7 @@ struct connman_device *connman_device_create_from_index(int index)
break;
case CONNMAN_DEVICE_TYPE_ETHERNET:
case CONNMAN_DEVICE_TYPE_GADGET:
+ case CONNMAN_DEVICE_TYPE_VLAN:
ident = index2ident(index, NULL);
break;
case CONNMAN_DEVICE_TYPE_WIFI:
diff --git a/src/network.c b/src/network.c
index f61f698..9b7d544 100644
--- a/src/network.c
+++ b/src/network.c
@@ -101,6 +101,8 @@ static const char *type2string(enum connman_network_type type)
return "ethernet";
case CONNMAN_NETWORK_TYPE_GADGET:
return "gadget";
+ case CONNMAN_NETWORK_TYPE_VLAN:
+ return "vlan";
case CONNMAN_NETWORK_TYPE_WIFI:
return "wifi";
case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
@@ -749,6 +751,7 @@ static int network_probe(struct connman_network *network)
return 0;
case CONNMAN_NETWORK_TYPE_ETHERNET:
case CONNMAN_NETWORK_TYPE_GADGET:
+ case CONNMAN_NETWORK_TYPE_VLAN:
case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
case CONNMAN_NETWORK_TYPE_CELLULAR:
@@ -779,6 +782,7 @@ static void network_remove(struct connman_network *network)
break;
case CONNMAN_NETWORK_TYPE_ETHERNET:
case CONNMAN_NETWORK_TYPE_GADGET:
+ case CONNMAN_NETWORK_TYPE_VLAN:
case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
case CONNMAN_NETWORK_TYPE_CELLULAR:
@@ -1091,6 +1095,7 @@ void connman_network_set_group(struct connman_network *network,
return;
case CONNMAN_NETWORK_TYPE_ETHERNET:
case CONNMAN_NETWORK_TYPE_GADGET:
+ case CONNMAN_NETWORK_TYPE_VLAN:
case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
case CONNMAN_NETWORK_TYPE_CELLULAR:
@@ -1142,6 +1147,7 @@ bool __connman_network_get_weakness(struct connman_network *network)
case CONNMAN_NETWORK_TYPE_VENDOR:
case CONNMAN_NETWORK_TYPE_ETHERNET:
case CONNMAN_NETWORK_TYPE_GADGET:
+ case CONNMAN_NETWORK_TYPE_VLAN:
case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
case CONNMAN_NETWORK_TYPE_CELLULAR:
@@ -2041,6 +2047,7 @@ void connman_network_update(struct connman_network *network)
return;
case CONNMAN_NETWORK_TYPE_ETHERNET:
case CONNMAN_NETWORK_TYPE_GADGET:
+ case CONNMAN_NETWORK_TYPE_VLAN:
case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
case CONNMAN_NETWORK_TYPE_CELLULAR:
diff --git a/src/notifier.c b/src/notifier.c
index 5ba5324..8517190 100644
--- a/src/notifier.c
+++ b/src/notifier.c
@@ -149,6 +149,7 @@ void __connman_notifier_connect(enum connman_service_type type)
return;
case CONNMAN_SERVICE_TYPE_ETHERNET:
case CONNMAN_SERVICE_TYPE_GADGET:
+ case CONNMAN_SERVICE_TYPE_VLAN:
case CONNMAN_SERVICE_TYPE_WIFI:
case CONNMAN_SERVICE_TYPE_BLUETOOTH:
case CONNMAN_SERVICE_TYPE_CELLULAR:
@@ -196,6 +197,7 @@ void __connman_notifier_disconnect(enum connman_service_type type)
return;
case CONNMAN_SERVICE_TYPE_ETHERNET:
case CONNMAN_SERVICE_TYPE_GADGET:
+ case CONNMAN_SERVICE_TYPE_VLAN:
case CONNMAN_SERVICE_TYPE_WIFI:
case CONNMAN_SERVICE_TYPE_BLUETOOTH:
case CONNMAN_SERVICE_TYPE_CELLULAR:
diff --git a/src/rfkill.c b/src/rfkill.c
index 2bfb092..2480c70 100644
--- a/src/rfkill.c
+++ b/src/rfkill.c
@@ -88,6 +88,7 @@ static enum rfkill_type convert_service_type(enum connman_service_type type)
case CONNMAN_SERVICE_TYPE_ETHERNET:
case CONNMAN_SERVICE_TYPE_VPN:
case CONNMAN_SERVICE_TYPE_GADGET:
+ case CONNMAN_SERVICE_TYPE_VLAN:
case CONNMAN_SERVICE_TYPE_P2P:
case CONNMAN_SERVICE_TYPE_UNKNOWN:
return NUM_RFKILL_TYPES;
diff --git a/src/rtnl.c b/src/rtnl.c
index b8b02c4..15827ab 100644
--- a/src/rtnl.c
+++ b/src/rtnl.c
@@ -170,6 +170,9 @@ static void read_uevent(struct interface_data *interface)
} else if (strcmp(line + 8, "gadget") == 0) {
interface->service_type = CONNMAN_SERVICE_TYPE_GADGET;
interface->device_type = CONNMAN_DEVICE_TYPE_GADGET;
+ } else if (strcmp(line + 8, "vlan") == 0) {
+ interface->service_type = CONNMAN_SERVICE_TYPE_VLAN;
+ interface->device_type = CONNMAN_DEVICE_TYPE_VLAN;
} else {
interface->service_type = CONNMAN_SERVICE_TYPE_UNKNOWN;
diff --git a/src/service.c b/src/service.c
index 7538bdd..fa355ec 100644
--- a/src/service.c
+++ b/src/service.c
@@ -200,6 +200,8 @@ const char *__connman_service_type2string(enum connman_service_type type)
return "vpn";
case CONNMAN_SERVICE_TYPE_GADGET:
return "gadget";
+ case CONNMAN_SERVICE_TYPE_VLAN:
+ return "vlan";
case CONNMAN_SERVICE_TYPE_P2P:
return "p2p";
}
@@ -216,6 +218,8 @@ enum connman_service_type __connman_service_string2type(const char *str)
return CONNMAN_SERVICE_TYPE_ETHERNET;
if (strcmp(str, "gadget") == 0)
return CONNMAN_SERVICE_TYPE_GADGET;
+ if (strcmp(str, "vlan") == 0)
+ return CONNMAN_SERVICE_TYPE_VLAN;
if (strcmp(str, "wifi") == 0)
return CONNMAN_SERVICE_TYPE_WIFI;
if (strcmp(str, "cellular") == 0)
@@ -372,6 +376,7 @@ int __connman_service_load_modifiable(struct connman_service *service)
/* fall through */
case CONNMAN_SERVICE_TYPE_WIFI:
case CONNMAN_SERVICE_TYPE_GADGET:
+ case CONNMAN_SERVICE_TYPE_VLAN:
case CONNMAN_SERVICE_TYPE_BLUETOOTH:
case CONNMAN_SERVICE_TYPE_CELLULAR:
case CONNMAN_SERVICE_TYPE_ETHERNET:
@@ -488,6 +493,7 @@ static int service_load(struct connman_service *service)
/* fall through */
case CONNMAN_SERVICE_TYPE_ETHERNET:
+ case CONNMAN_SERVICE_TYPE_VLAN:
autoconnect = g_key_file_get_boolean(keyfile,
service->identifier, "AutoConnect", &error);
if (!error)
@@ -657,6 +663,7 @@ static int service_save(struct connman_service *service)
/* fall through */
case CONNMAN_SERVICE_TYPE_ETHERNET:
+ case CONNMAN_SERVICE_TYPE_VLAN:
if (service->favorite)
g_key_file_set_boolean(keyfile, service->identifier,
"AutoConnect", service->autoconnect);
@@ -2324,6 +2331,7 @@ static void append_properties(DBusMessageIter *dict, dbus_bool_t limited,
case CONNMAN_SERVICE_TYPE_ETHERNET:
case CONNMAN_SERVICE_TYPE_BLUETOOTH:
case CONNMAN_SERVICE_TYPE_GADGET:
+ case CONNMAN_SERVICE_TYPE_VLAN:
connman_dbus_dict_append_dict(dict, "Ethernet",
append_ethernet, service);
break;
@@ -3562,6 +3570,7 @@ void __connman_service_set_active_session(bool enable, GSList *list)
case CONNMAN_SERVICE_TYPE_BLUETOOTH:
case CONNMAN_SERVICE_TYPE_CELLULAR:
case CONNMAN_SERVICE_TYPE_GADGET:
+ case CONNMAN_SERVICE_TYPE_VLAN:
if (enable)
active_sessions[type]++;
else
@@ -3582,12 +3591,13 @@ void __connman_service_set_active_session(bool enable, GSList *list)
list = g_slist_next(list);
}
- DBG("eth %d wifi %d bt %d cellular %d gadget %d sessions %d",
+ DBG("eth %d wifi %d bt %d cellular %d gadget %d vlan %d sessions %d",
active_sessions[CONNMAN_SERVICE_TYPE_ETHERNET],
active_sessions[CONNMAN_SERVICE_TYPE_WIFI],
active_sessions[CONNMAN_SERVICE_TYPE_BLUETOOTH],
active_sessions[CONNMAN_SERVICE_TYPE_CELLULAR],
active_sessions[CONNMAN_SERVICE_TYPE_GADGET],
+ active_sessions[CONNMAN_SERVICE_TYPE_VLAN],
active_count);
}
@@ -4009,7 +4019,8 @@ static DBusMessage *disconnect_service(DBusConnection *conn,
bool __connman_service_remove(struct connman_service *service)
{
if (service->type == CONNMAN_SERVICE_TYPE_ETHERNET ||
- service->type == CONNMAN_SERVICE_TYPE_GADGET)
+ service->type == CONNMAN_SERVICE_TYPE_GADGET ||
+ service->type == CONNMAN_SERVICE_TYPE_VLAN)
return false;
if (service->immutable || service->hidden ||
@@ -4708,6 +4719,11 @@ static gint service_compare(gconstpointer a, gconstpointer b)
return -1;
if (service_b->type == CONNMAN_SERVICE_TYPE_GADGET)
return 1;
+
+ if (service_a->type == CONNMAN_SERVICE_TYPE_VLAN)
+ return -1;
+ if (service_b->type == CONNMAN_SERVICE_TYPE_VLAN)
+ return 1;
}
strength = (gint) service_b->strength - (gint) service_a->strength;
@@ -5787,6 +5803,7 @@ static bool prepare_network(struct connman_service *service)
break;
case CONNMAN_NETWORK_TYPE_ETHERNET:
case CONNMAN_NETWORK_TYPE_GADGET:
+ case CONNMAN_NETWORK_TYPE_VLAN:
case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
case CONNMAN_NETWORK_TYPE_CELLULAR:
@@ -5845,6 +5862,7 @@ static int service_connect(struct connman_service *service)
return -EINVAL;
case CONNMAN_SERVICE_TYPE_ETHERNET:
case CONNMAN_SERVICE_TYPE_GADGET:
+ case CONNMAN_SERVICE_TYPE_VLAN:
case CONNMAN_SERVICE_TYPE_BLUETOOTH:
case CONNMAN_SERVICE_TYPE_CELLULAR:
case CONNMAN_SERVICE_TYPE_VPN:
@@ -5970,6 +5988,7 @@ int __connman_service_connect(struct connman_service *service,
case CONNMAN_SERVICE_TYPE_ETHERNET:
case CONNMAN_SERVICE_TYPE_GADGET:
+ case CONNMAN_SERVICE_TYPE_VLAN:
case CONNMAN_SERVICE_TYPE_BLUETOOTH:
case CONNMAN_SERVICE_TYPE_CELLULAR:
case CONNMAN_SERVICE_TYPE_VPN:
@@ -6580,6 +6599,8 @@ static enum connman_service_type convert_network_type(struct connman_network *ne
return CONNMAN_SERVICE_TYPE_CELLULAR;
case CONNMAN_NETWORK_TYPE_GADGET:
return CONNMAN_SERVICE_TYPE_GADGET;
+ case CONNMAN_NETWORK_TYPE_VLAN:
+ return CONNMAN_SERVICE_TYPE_VLAN;
}
return CONNMAN_SERVICE_TYPE_UNKNOWN;
@@ -6724,6 +6745,7 @@ struct connman_service * __connman_service_create_from_network(struct connman_ne
case CONNMAN_SERVICE_TYPE_GPS:
case CONNMAN_SERVICE_TYPE_VPN:
case CONNMAN_SERVICE_TYPE_GADGET:
+ case CONNMAN_SERVICE_TYPE_VLAN:
case CONNMAN_SERVICE_TYPE_WIFI:
case CONNMAN_SERVICE_TYPE_CELLULAR:
case CONNMAN_SERVICE_TYPE_P2P:
@@ -6760,6 +6782,7 @@ struct connman_service * __connman_service_create_from_network(struct connman_ne
break;
case CONNMAN_SERVICE_TYPE_GADGET:
+ case CONNMAN_SERVICE_TYPE_VLAN:
case CONNMAN_SERVICE_TYPE_ETHERNET:
if (service->autoconnect) {
__connman_service_connect(service,
diff --git a/src/session.c b/src/session.c
index 08facc1..03e824b 100644
--- a/src/session.c
+++ b/src/session.c
@@ -178,6 +178,8 @@ static char *service2bearer(enum connman_service_type type)
return "ethernet";
case CONNMAN_SERVICE_TYPE_GADGET:
return "gadget";
+ case CONNMAN_SERVICE_TYPE_VLAN:
+ return "vlan";
case CONNMAN_SERVICE_TYPE_WIFI:
return "wifi";
case CONNMAN_SERVICE_TYPE_BLUETOOTH:
diff --git a/src/technology.c b/src/technology.c
index 55303a0..bbd2621 100644
--- a/src/technology.c
+++ b/src/technology.c
@@ -140,6 +140,8 @@ static const char *get_name(enum connman_service_type type)
break;
case CONNMAN_SERVICE_TYPE_GADGET:
return "Gadget";
+ case CONNMAN_SERVICE_TYPE_VLAN:
+ return "VLAN";
case CONNMAN_SERVICE_TYPE_ETHERNET:
return "Wired";
case CONNMAN_SERVICE_TYPE_WIFI:
@@ -1334,6 +1336,7 @@ void __connman_technology_add_interface(enum connman_service_type type,
case CONNMAN_SERVICE_TYPE_GPS:
case CONNMAN_SERVICE_TYPE_VPN:
case CONNMAN_SERVICE_TYPE_GADGET:
+ case CONNMAN_SERVICE_TYPE_VLAN:
case CONNMAN_SERVICE_TYPE_P2P:
break;
}
@@ -1385,6 +1388,7 @@ void __connman_technology_remove_interface(enum connman_service_type type,
case CONNMAN_SERVICE_TYPE_GPS:
case CONNMAN_SERVICE_TYPE_VPN:
case CONNMAN_SERVICE_TYPE_GADGET:
+ case CONNMAN_SERVICE_TYPE_VLAN:
case CONNMAN_SERVICE_TYPE_P2P:
break;
}
diff --git a/src/wispr.c b/src/wispr.c
index ef4bdab..80c669d 100644
--- a/src/wispr.c
+++ b/src/wispr.c
@@ -839,6 +839,7 @@ static int wispr_portal_detect(struct connman_wispr_portal_context *wp_context)
switch (service_type) {
case CONNMAN_SERVICE_TYPE_ETHERNET:
+ case CONNMAN_SERVICE_TYPE_VLAN:
case CONNMAN_SERVICE_TYPE_WIFI:
case CONNMAN_SERVICE_TYPE_BLUETOOTH:
case CONNMAN_SERVICE_TYPE_CELLULAR:
--
1.9.1