summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArtem Bityutskiy <artem.bityutskiy@linux.intel.com>2012-09-05 17:52:45 +0300
committerPatrik Flykt <patrik.flykt@linux.intel.com>2012-09-07 08:44:23 +0300
commit4fe07dfed4f720136ee142e56a9d43242c8c78dc (patch)
treedcbb8375d6b860e7b00cf2b5827b40b62ca5996d
parent1c2f7a9c8d7fdd9b68d19df1098b27909add2257 (diff)
downloadconnman-4fe07dfed4f720136ee142e56a9d43242c8c78dc.tar.gz
connman-4fe07dfed4f720136ee142e56a9d43242c8c78dc.tar.bz2
connman-4fe07dfed4f720136ee142e56a9d43242c8c78dc.zip
tethering: Fix bridge module loading problem
Connman tries to check if bridging is supported by the kernel by checking whether "/proc/sys/net/bridge" is present. If the bridge is a kernel module which is not already loaded, then tethering cannot be enabled. Instead of checking for the file we invoke the "get bridge version" socket ioctl and the kernel will handle module loading issues - if the bridge module is not loaded, it will first load it, and then check the version.
-rw-r--r--src/tethering.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/src/tethering.c b/src/tethering.c
index decb1122..b7343032 100644
--- a/src/tethering.c
+++ b/src/tethering.c
@@ -35,6 +35,7 @@
#include <string.h>
#include <fcntl.h>
#include <linux/if_tun.h>
+#include <linux/if_bridge.h>
#include "connman.h"
@@ -46,8 +47,6 @@
#define DBUS_TYPE_UNIX_FD -1
#endif
-#define BRIDGE_PROC_DIR "/proc/sys/net/bridge"
-
#define BRIDGE_NAME "tether"
#define BRIDGE_DNS "8.8.8.8"
@@ -79,12 +78,19 @@ struct connman_private_network {
const char *__connman_tethering_get_bridge(void)
{
- struct stat st;
+ int sk, err;
+ unsigned long args[3];
- if (stat(BRIDGE_PROC_DIR, &st) < 0) {
- connman_error("Missing support for 802.1d ethernet bridging");
+ sk = socket(AF_INET, SOCK_STREAM, 0);
+ if (sk < 0)
+ return NULL;
+
+ args[0] = BRCTL_GET_VERSION;
+ args[1] = args[2] = 0;
+ err = ioctl(sk, SIOCGIFBR, &args);
+ close(sk);
+ if (err == -1)
return NULL;
- }
return BRIDGE_NAME;
}