[PATCH] WiFi Direct: WiFi Direct(WiFi P2P) RFC

2014-02-12 Thread martin . xu . comms
From: Martin Xu martin...@linux.intel.com

We have worked on Tizen P2P to support Mirrocast for a period of time,
and do feel that ConnMan is the right place to implement WiFi Direct(P2P)
support, so we want to start work on enabling WiFi Direct function in ConnMan.

We'd like to give out the RFC patch about the Dbus WiFi Direct API definition.

After the API is decided we will work out the patches.

Any comments are welcome.

The API define references the BlueZ Adapter and Device API, WiFi Direct device
like BlueZ Adapter represents the local WiFi Direct device. WiFi Direct peer 
like
BlueZ Device represents the remote WiFi Direct peer.

Dbus object Manager will be used.

WiFi Direct device object /net/connman/p2p0(WiFi Direct device interface)

WiFi Direct peer Objects scaned by the /net/connman/p2p0 is
/net/connman/p2p0/peer_xx_xx_xx_xx_xx_xx
---
 doc/wifi-direct-api.txt |  150 +++
 1 file changed, 150 insertions(+)
 create mode 100644 doc/wifi-direct-api.txt

diff --git a/doc/wifi-direct-api.txt b/doc/wifi-direct-api.txt
new file mode 100644
index 000..2105af4
--- /dev/null
+++ b/doc/wifi-direct-api.txt
@@ -0,0 +1,150 @@
+WiFiDirectDevice hierarchy
+
+
+Servicenet.connman
+Interface  net.connman.WiFiDirectDevice
+Object path[variable prefix]/{p2p0, p2p1,...}
+
+Methodsvoid Scan()
+
+   Scan WiFi Direct groups and devices.
+
+   void Disconnect()
+
+   Disconnect group client from the WiFi Direct group.
+   Valid only when WiFi Direct device is group client.
+
+   void DeactivateGroup()
+
+   Disconnect all the group clients and terminate
+   the group session.
+   Valid only when WiFi Direct device is group owner.
+
+void CreateTempGroup()
+
+   Create temporary group, and activate the group by
+   starting the group session. The WiFi Direct device
+   works as the group owner.
+
+void CreateGroup(string name)
+
+   Create persistant group, and activate the group by
+   starting the group session. The WiFi Direct device
+   works as the group owner.
+
+void LoadGroup(string name)
+   Load the persistand group created before, and activeate
+   the group by starting the group session.
+
+void RemoveGroup(string name)
+
+Remove a persistant group. And the group can't be 
loaded
+any more.
+
+   array{string} GetGroupList()
+Get the persistant group list.
+
+
+Properties boolean Powered [readwrite]
+
+   The power state of WiFi Direct device.
+
+   string Name [readwrite]
+
+   WiFi Direct device name
+
+   uint16 Type [readwrite]
+
+   WiFi Direct device type
+
+   string WPSmode[readwrite]
+
+   WPS configure mode (for example pbc, pin etc.)
+
+   uint8 Intent[readwrite]
+
+   Group owner intent value, valid value is [0-15]
+
+boolean Connected [readonly]
+
+   Indicates whether the WiFi Direct device is connected.
+
+string GroupName[readonly]
+
+   Group name the WiFi Direct device belongs to.
+
+   string GroupState [readonly]
+
+   Persistant
+   Temporary
+   Client
+   Deactive
+
+   array{object} GroupMembers [readonly]
+
+   Group memeber list
+
+   string Passphrase[readonly]
+
+   Passphrase to join the WiFi Direct group.
+   Only valid for group owner.
+
+   string GroupInterface[readonly]
+
+   the network interface of group.
+   for example p2p-wlan0-1
+
+   string IPaddress [readonly]
+
+   the IP address of group interface.
+
+WiFiDirectPeer hierarchy
+=
+
+Servicenet.connman
+Interface  net.connman.WiFiDirectPeer
+Object path[variable prefix]/{p2p0,p2p1,...}/peer_xx_xx_xx_xx_xx_xx
+
+Methodsvoid Connect(boolean persistant)
+
+   If WiFi Direct device is in a group and WiFi Direct 
peer is
+   not in any group. WiFi Direct device will invite the 
+   WiFi Direct peer to join the group.
+
+   If WiFi Direct device is not in any group and WiFi 
Direct
+   peer is a group owner, WiFi Direct device will join

[PATCH] WiFi Direct: WiFi Direct(WiFi P2P) RFC

2014-02-12 Thread martin . xu . comms
From: Martin Xu martin...@linux.intel.com

We have worked on Tizen P2P to support Mirrocast for a period of time,
and do feel that ConnMan is the right place to implement WiFi Direct(P2P)
support, so we want to start work on enabling WiFi Direct function in ConnMan.

We'd like to give out the RFC patch about the Dbus WiFi Direct API definition.

After the API is decided we will work out the patches.

Any comments are welcome.

The API define references the BlueZ Adapter and Device API, WiFi Direct device
like BlueZ Adapter represents the local WiFi Direct device. WiFi Direct peer 
like
BlueZ Device represents the remote WiFi Direct peer.

Dbus object Manager will be used.

WiFi Direct device object /net/connman/p2p0(WiFi Direct device interface)

WiFi Direct peer Objects scaned by the /net/connman/p2p0 is
/net/connman/p2p0/peer_xx_xx_xx_xx_xx_xx
---
 doc/wifi-direct-api.txt |  150 +++
 1 file changed, 150 insertions(+)
 create mode 100644 doc/wifi-direct-api.txt

diff --git a/doc/wifi-direct-api.txt b/doc/wifi-direct-api.txt
new file mode 100644
index 000..2105af4
--- /dev/null
+++ b/doc/wifi-direct-api.txt
@@ -0,0 +1,150 @@
+WiFiDirectDevice hierarchy
+
+
+Servicenet.connman
+Interface  net.connman.WiFiDirectDevice
+Object path[variable prefix]/{p2p0, p2p1,...}
+
+Methodsvoid Scan()
+
+   Scan WiFi Direct groups and devices.
+
+   void Disconnect()
+
+   Disconnect group client from the WiFi Direct group.
+   Valid only when WiFi Direct device is group client.
+
+   void DeactivateGroup()
+
+   Disconnect all the group clients and terminate
+   the group session.
+   Valid only when WiFi Direct device is group owner.
+
+void CreateTempGroup()
+
+   Create temporary group, and activate the group by
+   starting the group session. The WiFi Direct device
+   works as the group owner.
+
+void CreateGroup(string name)
+
+   Create persistant group, and activate the group by
+   starting the group session. The WiFi Direct device
+   works as the group owner.
+
+void LoadGroup(string name)
+   Load the persistand group created before, and activeate
+   the group by starting the group session.
+
+void RemoveGroup(string name)
+
+Remove a persistant group. And the group can't be 
loaded
+any more.
+
+   array{string} GetGroupList()
+Get the persistant group list.
+
+
+Properties boolean Powered [readwrite]
+
+   The power state of WiFi Direct device.
+
+   string Name [readwrite]
+
+   WiFi Direct device name
+
+   uint16 Type [readwrite]
+
+   WiFi Direct device type
+
+   string WPSmode[readwrite]
+
+   WPS configure mode (for example pbc, pin etc.)
+
+   uint8 Intent[readwrite]
+
+   Group owner intent value, valid value is [0-15]
+
+boolean Connected [readonly]
+
+   Indicates whether the WiFi Direct device is connected.
+
+string GroupName[readonly]
+
+   Group name the WiFi Direct device belongs to.
+
+   string GroupState [readonly]
+
+   Persistant
+   Temporary
+   Client
+   Deactive
+
+   array{object} GroupMembers [readonly]
+
+   Group memeber list
+
+   string Passphrase[readonly]
+
+   Passphrase to join the WiFi Direct group.
+   Only valid for group owner.
+
+   string GroupInterface[readonly]
+
+   the network interface of group.
+   for example p2p-wlan0-1
+
+   string IPaddress [readonly]
+
+   the IP address of group interface.
+
+WiFiDirectPeer hierarchy
+=
+
+Servicenet.connman
+Interface  net.connman.WiFiDirectPeer
+Object path[variable prefix]/{p2p0,p2p1,...}/peer_xx_xx_xx_xx_xx_xx
+
+Methodsvoid Connect(boolean persistant)
+
+   If WiFi Direct device is in a group and WiFi Direct 
peer is
+   not in any group. WiFi Direct device will invite the 
+   WiFi Direct peer to join the group.
+
+   If WiFi Direct device is not in any group and WiFi 
Direct
+   peer is a group owner, WiFi Direct device will join

[PATCH 1/2] tethering: Add wifi interface to bridge after carrier on

2011-03-09 Thread martin . xu
From: Martin Xu martin...@intel.com

When changing wifi from STA to AP the interface needs to be closed
and then opened. Only after the interface is opened and detected
carrier, the interface can be added to bridge.
---
 plugins/wifi.c |   42 +-
 1 files changed, 33 insertions(+), 9 deletions(-)

diff --git a/plugins/wifi.c b/plugins/wifi.c
index 8374506..93ae901 100644
--- a/plugins/wifi.c
+++ b/plugins/wifi.c
@@ -66,6 +66,8 @@ struct wifi_data {
connman_bool_t connected;
connman_bool_t disconnecting;
connman_bool_t tethering;
+   connman_bool_t bridged;
+   const char *bridge;
int index;
unsigned flags;
unsigned int watch;
@@ -73,6 +75,25 @@ struct wifi_data {
 
 static GList *iface_list = NULL;
 
+static void handle_tethering(struct wifi_data *wifi)
+{
+   if (wifi-tethering == FALSE)
+   return;
+
+   if (wifi-bridge == NULL)
+   return;
+
+   if (wifi-bridged == TRUE)
+   return;
+
+   DBG(index %d bridge %s, wifi-index, wifi-bridge);
+
+   if (connman_inet_add_to_bridge(wifi-index, wifi-bridge)  0)
+   return;
+
+   wifi-bridged = TRUE;
+}
+
 static void wifi_newlink(unsigned flags, unsigned change, void *user_data)
 {
struct connman_device *device = user_data;
@@ -91,9 +112,11 @@ static void wifi_newlink(unsigned flags, unsigned change, 
void *user_data)
}
 
if ((wifi-flags  IFF_LOWER_UP) != (flags  IFF_LOWER_UP)) {
-   if (flags  IFF_LOWER_UP)
+   if (flags  IFF_LOWER_UP) {
DBG(carrier on);
-   else
+
+   handle_tethering(wifi);
+   } else
DBG(carrier off);
}
 
@@ -113,6 +136,8 @@ static int wifi_probe(struct connman_device *device)
wifi-connected = FALSE;
wifi-disconnecting = FALSE;
wifi-tethering = FALSE;
+   wifi-bridged = FALSE;
+   wifi-bridge = NULL;
wifi-state = G_SUPPLICANT_STATE_INACTIVE;
 
connman_device_set_data(device, wifi);
@@ -837,7 +862,6 @@ struct wifi_tethering_info {
struct wifi_data *wifi;
struct connman_technology *technology;
char *ifname;
-   const char *bridge;
GSupplicantSSID *ssid;
 };
 
@@ -875,11 +899,11 @@ static void ap_start_callback(int result, 
GSupplicantInterface *interface,
struct wifi_tethering_info *info = user_data;
 
DBG(result %d index %d bridge %s,
-   result, info-wifi-index, info-bridge);
+   result, info-wifi-index, info-wifi-bridge);
 
if (result  0) {
connman_inet_remove_from_bridge(info-wifi-index,
-   info-bridge);
+   info-wifi-bridge);
connman_technology_tethering_notify(info-technology, FALSE);
}
 
@@ -899,7 +923,7 @@ static void ap_create_callback(int result,
 
if (result  0) {
connman_inet_remove_from_bridge(info-wifi-index,
-   info-bridge);
+   info-wifi-bridge);
connman_technology_tethering_notify(info-technology, FALSE);
 
g_free(info-ifname);
@@ -938,9 +962,8 @@ static void sta_remove_callback(int result,
info-wifi-interface = NULL;
 
connman_technology_tethering_notify(info-technology, TRUE);
-   connman_inet_add_to_bridge(info-wifi-index, info-bridge);
 
-   g_supplicant_interface_create(info-ifname, driver, info-bridge,
+   g_supplicant_interface_create(info-ifname, driver, info-wifi-bridge,
ap_create_callback,
info);
 }
@@ -968,6 +991,7 @@ static int tech_set_tethering(struct connman_technology 
*technology,
 
connman_inet_remove_from_bridge(wifi-index,
bridge);
+   wifi-bridged = FALSE;
}
}
 
@@ -998,7 +1022,7 @@ static int tech_set_tethering(struct connman_technology 
*technology,
 
info-wifi = wifi;
info-technology = technology;
-   info-bridge = bridge;
+   info-wifi-bridge = bridge;
info-ssid = ssid_ap_init(identifier, passphrase);
if (info-ssid == NULL) {
g_free(info);
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 2/2] tethering: Using /proc/sys/net/bridge to detect the support of bridge

2011-03-09 Thread martin . xu
From: Martin Xu martin...@intel.com

If bridge is built in kernel, /sys/module/bridge can not be used to detect
the support of bridge.
---
 src/tethering.c |4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/tethering.c b/src/tethering.c
index 705f5ee..27f4b0d 100644
--- a/src/tethering.c
+++ b/src/tethering.c
@@ -35,7 +35,7 @@
 
 #include gdhcp/gdhcp.h
 
-#define BRIDGE_SYSFS_DIR /sys/module/bridge
+#define BRIDGE_PROC_DIR /proc/sys/net/bridge
 
 #define BRIDGE_NAME tether
 #define BRIDGE_IP 192.168.218.1
@@ -53,7 +53,7 @@ const char *__connman_tethering_get_bridge(void)
 {
struct stat st;
 
-   if (stat(BRIDGE_SYSFS_DIR, st)  0) {
+   if (stat(BRIDGE_PROC_DIR, st)  0) {
connman_error(Missing support for 802.1d ethernet bridging);
return NULL;
}
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH] log: Print backtrace once GLib fatal error happen

2011-02-22 Thread martin . xu
From: Martin Xu martin...@intel.com

---
 src/log.c |   18 ++
 1 files changed, 18 insertions(+), 0 deletions(-)

diff --git a/src/log.c b/src/log.c
index eb480b4..8b4fbe7 100644
--- a/src/log.c
+++ b/src/log.c
@@ -195,6 +195,18 @@ static connman_bool_t is_enabled(struct connman_debug_desc 
*desc)
return FALSE;
 }
 
+static void glib_fatal_handler(const gchar *log_domain,
+   GLogLevelFlags log_level, const gchar *message,
+   gpointer user_data)
+
+{
+   connman_info(%s-CRITICAL **, log_domain);
+
+   signal_handler(0);
+}
+
+static int log_handler_id;
+
 int __connman_log_init(const char *debug, connman_bool_t detach)
 {
int option = LOG_NDELAY | LOG_PID;
@@ -228,6 +240,10 @@ int __connman_log_init(const char *debug, connman_bool_t 
detach)
 
signal_setup(signal_handler);
 
+   log_handler_id = g_log_set_handler (GLib, G_LOG_LEVEL_MASK |
+   G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION,
+   glib_fatal_handler, NULL);
+
openlog(connmand, option, LOG_DAEMON);
 
syslog(LOG_INFO, Connection Manager version %s, VERSION);
@@ -239,6 +255,8 @@ void __connman_log_cleanup(void)
 {
syslog(LOG_INFO, Exit);
 
+   g_log_remove_handler(GLib, log_handler_id);
+
closelog();
 
signal_setup(SIG_DFL);
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/2] tethering: Add wifi interface to bridge after carrier on

2011-02-18 Thread martin . xu
From: Martin Xu martin...@intel.com

When changing wifi from STA to AP the interface needs to be closed
and then opened. Only after the interface is opened and detected
carrier, the interface can be added to bridge.
---
 plugins/wifi.c |   38 ++
 1 files changed, 34 insertions(+), 4 deletions(-)

diff --git a/plugins/wifi.c b/plugins/wifi.c
index 78da6ac..33ce0f9 100644
--- a/plugins/wifi.c
+++ b/plugins/wifi.c
@@ -66,6 +66,8 @@ struct wifi_data {
connman_bool_t connected;
connman_bool_t disconnecting;
connman_bool_t tethering;
+   connman_bool_t propose_add_bridge;
+   char *bridge;
int index;
unsigned flags;
unsigned int watch;
@@ -112,6 +114,24 @@ static int get_bssid(struct connman_device *device,
return 0;
 }
 
+static void handle_tethering(struct wifi_data *wifi)
+{
+   if (wifi-tethering == FALSE)
+   return;
+
+   if (wifi-bridge == NULL)
+   return;
+
+   if (wifi-propose_add_bridge == FALSE)
+   return;
+
+   DBG(index %d bridge %s, wifi-index, wifi-bridge);
+
+   connman_inet_add_to_bridge(wifi-index, wifi-bridge);
+
+   wifi-propose_add_bridge = FALSE;
+}
+
 static void wifi_newlink(unsigned flags, unsigned change, void *user_data)
 {
struct connman_device *device = user_data;
@@ -130,9 +150,11 @@ static void wifi_newlink(unsigned flags, unsigned change, 
void *user_data)
}
 
if ((wifi-flags  IFF_LOWER_UP) != (flags  IFF_LOWER_UP)) {
-   if (flags  IFF_LOWER_UP)
+   if (flags  IFF_LOWER_UP) {
DBG(carrier on);
-   else
+
+   handle_tethering(wifi);
+   } else
DBG(carrier off);
}
 
@@ -152,6 +174,8 @@ static int wifi_probe(struct connman_device *device)
wifi-connected = FALSE;
wifi-disconnecting = FALSE;
wifi-tethering = FALSE;
+   wifi-propose_add_bridge = FALSE;
+   wifi-bridge = NULL;
wifi-state = G_SUPPLICANT_STATE_INACTIVE;
 
connman_device_set_data(device, wifi);
@@ -982,7 +1006,8 @@ static void sta_remove_callback(int result,
info-wifi-interface = NULL;
 
connman_technology_tethering_notify(info-technology, TRUE);
-   connman_inet_add_to_bridge(info-wifi-index, info-bridge);
+
+   info-wifi-propose_add_bridge = TRUE;
 
g_supplicant_interface_create(info-ifname, driver, info-bridge,
ap_create_callback,
@@ -1007,8 +1032,11 @@ static int tech_set_tethering(struct connman_technology 
*technology,
for (list = iface_list; list; list = list-next) {
wifi = list-data;
 
-   if (wifi-tethering == TRUE)
+   if (wifi-tethering == TRUE) {
wifi-tethering = FALSE;
+   wifi-propose_add_bridge = FALSE;
+   g_free(wifi-bridge);
+   }
}
 
connman_technology_tethering_notify(technology, FALSE);
@@ -1051,6 +1079,8 @@ static int tech_set_tethering(struct connman_technology 
*technology,
}
 
info-wifi-tethering = TRUE;
+   g_free(info-wifi-bridge);
+   info-wifi-bridge = g_strdup(bridge);
 
err = g_supplicant_interface_remove(interface,
sta_remove_callback,
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 2/2] tethering: Using /proc/sys/net/bridge to detect the support of bridge

2011-02-18 Thread martin . xu
From: Martin Xu martin...@intel.com

If bridge is built in knerl, /sys/module/bridge can not be used to detect
the support of bridge in kernel.
---
 src/tethering.c |2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/src/tethering.c b/src/tethering.c
index 705f5ee..15e1ed9 100644
--- a/src/tethering.c
+++ b/src/tethering.c
@@ -35,7 +35,7 @@
 
 #include gdhcp/gdhcp.h
 
-#define BRIDGE_SYSFS_DIR /sys/module/bridge
+#define BRIDGE_SYSFS_DIR /proc/sys/net/bridge
 
 #define BRIDGE_NAME tether
 #define BRIDGE_IP 192.168.218.1
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/1] Call __connman_technology_add_interface() after rtnl-newlink()

2011-01-27 Thread martin . xu
From: Martin Xu martin...@intel.com

Device is created and attached technology at rtnl-newlink(), so
__connman_technology_add_interface() needs to be called after
rtnl-newlink()
---
 src/rtnl.c |6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/rtnl.c b/src/rtnl.c
index 3d42043..d9da1fa 100644
--- a/src/rtnl.c
+++ b/src/rtnl.c
@@ -462,9 +462,6 @@ static void process_newlink(unsigned short type, int index, 
unsigned flags,
 
if (type == ARPHRD_ETHER)
read_uevent(interface);
-
-   __connman_technology_add_interface(interface-service_type,
-   interface-index, interface-name, interface-ident);
}
 
for (list = rtnl_list; list; list = list-next) {
@@ -474,6 +471,9 @@ static void process_newlink(unsigned short type, int index, 
unsigned flags,
rtnl-newlink(type, index, flags, change);
}
 
+   __connman_technology_add_interface(interface-service_type,
+   interface-index, interface-name, interface-ident);
+
for (list = watch_list; list; list = list-next) {
struct watch_data *watch = list-data;
 
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH] call __connman_technology_add_interface() after rtnl-newlink()

2010-12-09 Thread martin . xu
From: Martin Xu martin...@intel.com

The device is created and attach technology at rtnl-newlink(), so
__connman_technology_add_interface() nees to be called after rtnl-newlink()
---
 src/rtnl.c |   15 +++
 1 files changed, 7 insertions(+), 8 deletions(-)

diff --git a/src/rtnl.c b/src/rtnl.c
index 8fea094..4029b40 100644
--- a/src/rtnl.c
+++ b/src/rtnl.c
@@ -406,6 +406,7 @@ static void process_newlink(unsigned short type, int index, 
unsigned flags,
struct ether_addr compare = {{ 0, 0, 0, 0, 0, 0 }};
struct rtnl_link_stats stats;
unsigned char operstate = 0xff;
+   struct interface_data *interface;
const char *ifname = NULL;
unsigned int mtu = 0;
char ident[13], str[18];
@@ -449,10 +450,9 @@ static void process_newlink(unsigned short type, int 
index, unsigned flags,
ifname, index, operstate,
operstate2str(operstate));
 
-   if (g_hash_table_lookup(interface_list,
-   GINT_TO_POINTER(index)) == NULL) {
-   struct interface_data *interface;
-
+   interface = g_hash_table_lookup(interface_list,
+   GINT_TO_POINTER(index));
+   if (interface == NULL) {
interface = g_new0(struct interface_data, 1);
interface-index = index;
interface-name = g_strdup(ifname);
@@ -460,12 +460,8 @@ static void process_newlink(unsigned short type, int 
index, unsigned flags,
 
g_hash_table_insert(interface_list,
GINT_TO_POINTER(index), interface);
-
if (type == ARPHRD_ETHER)
read_uevent(interface);
-
-   __connman_technology_add_interface(interface-service_type,
-   interface-index, interface-name, interface-ident);
}
 
for (list = rtnl_list; list; list = list-next) {
@@ -475,6 +471,9 @@ static void process_newlink(unsigned short type, int index, 
unsigned flags,
rtnl-newlink(type, index, flags, change);
}
 
+   __connman_technology_add_interface(interface-service_type,
+   interface-index, interface-name, interface-ident);
+
for (list = watch_list; list; list = list-next) {
struct watch_data *watch = list-data;
 
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[V2 PATCH 1/3] Add connman_inet_remove_from_bridge() and connman_inet_add_to_bridge()

2010-12-08 Thread martin . xu
From: Martin Xu martin...@intel.com

---
 include/inet.h |2 +
 src/inet.c |   59 
 2 files changed, 61 insertions(+), 0 deletions(-)

diff --git a/include/inet.h b/include/inet.h
index d7af826..7b34900 100644
--- a/include/inet.h
+++ b/include/inet.h
@@ -65,6 +65,8 @@ int connman_inet_clear_ipv6_gateway_address(int index, const 
char *gateway);
 
 void connman_ipaddress_set_ipv4(struct connman_ipaddress *ipaddress,
const char *address, const char *netmask, const char *gateway);
+int connman_inet_add_to_bridge(int index, const char *bridge);
+int connman_inet_remove_from_bridge(int index, const char *bridge);
 
 #ifdef __cplusplus
 }
diff --git a/src/inet.c b/src/inet.c
index f6b8019..005011e 100644
--- a/src/inet.c
+++ b/src/inet.c
@@ -31,6 +31,7 @@
 #include sys/stat.h
 #include sys/ioctl.h
 #include sys/socket.h
+#include linux/sockios.h
 #include arpa/inet.h
 #include net/route.h
 #include net/ethernet.h
@@ -1100,3 +1101,61 @@ connman_bool_t connman_inet_compare_subnet(int index, 
const char *host)
 
return ((if_addr  netmask_addr) == (host_addr  netmask_addr));
 }
+
+int connman_inet_remove_from_bridge(int index, const char *bridge)
+{
+   struct ifreq ifr;
+   int sk, err;
+
+   if (bridge == NULL)
+   return -EINVAL;
+
+   sk = socket(AF_INET, SOCK_STREAM, 0);
+   if (sk  0)
+   return sk;
+
+   memset(ifr, 0, sizeof(ifr));
+   strncpy(ifr.ifr_name, bridge, IFNAMSIZ - 1);
+   ifr.ifr_ifindex = index;
+
+   err = ioctl(sk, SIOCBRDELIF, ifr);
+
+   close(sk);
+
+   if (err  0) {
+   connman_error(Remove interface from bridge error: %s,
+   strerror(errno));
+   return err;
+   }
+
+   return 0;
+}
+
+int connman_inet_add_to_bridge(int index, const char *bridge)
+{
+   struct ifreq ifr;
+   int sk, err;
+
+   if (bridge == NULL)
+   return -EINVAL;
+
+   sk = socket(AF_INET, SOCK_STREAM, 0);
+   if (sk  0)
+   return sk;
+
+   memset(ifr, 0, sizeof(ifr));
+   strncpy(ifr.ifr_name, bridge, IFNAMSIZ - 1);
+   ifr.ifr_ifindex = index;
+
+   err = ioctl(sk, SIOCBRADDIF, ifr);
+
+   close(sk);
+
+   if (err  0) {
+   connman_error(Add interface to bridge error: %s,
+   strerror(errno));
+   return err;
+   }
+
+   return 0;
+}
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[V2 PATCH 2/3] Add CONNMAN_DEVICE_TYPE_GADGET and CONNMAN_SERVICE_TYPE_GADGET

2010-12-08 Thread martin . xu
From: Martin Xu martin...@intel.com

---
 include/device.h  |1 +
 include/service.h |1 +
 plugins/iospm.c   |1 +
 plugins/portal.c  |1 +
 src/detect.c  |1 +
 src/device.c  |   12 
 src/element.c |4 
 src/inet.c|2 ++
 src/notifier.c|7 +++
 src/rtnl.c|4 
 src/service.c |   10 ++
 src/session.c |1 +
 src/technology.c  |3 +++
 13 files changed, 48 insertions(+), 0 deletions(-)

diff --git a/include/device.h b/include/device.h
index 31aa92b..c5e005d 100644
--- a/include/device.h
+++ b/include/device.h
@@ -43,6 +43,7 @@ enum connman_device_type {
CONNMAN_DEVICE_TYPE_BLUETOOTH = 4,
CONNMAN_DEVICE_TYPE_CELLULAR  = 5,
CONNMAN_DEVICE_TYPE_GPS   = 6,
+   CONNMAN_DEVICE_TYPE_GADGET= 7,
CONNMAN_DEVICE_TYPE_VENDOR= 1,
 };
 
diff --git a/include/service.h b/include/service.h
index 16d10f2..e67dd42 100644
--- a/include/service.h
+++ b/include/service.h
@@ -44,6 +44,7 @@ enum connman_service_type {
CONNMAN_SERVICE_TYPE_CELLULAR  = 6,
CONNMAN_SERVICE_TYPE_GPS   = 7,
CONNMAN_SERVICE_TYPE_VPN   = 8,
+   CONNMAN_SERVICE_TYPE_GADGET= 9,
 };
 
 enum connman_service_mode {
diff --git a/plugins/iospm.c b/plugins/iospm.c
index 20c9b46..a36e4aa 100644
--- a/plugins/iospm.c
+++ b/plugins/iospm.c
@@ -73,6 +73,7 @@ static void iospm_service_enabled(enum connman_service_type 
type,
case CONNMAN_SERVICE_TYPE_CELLULAR:
case CONNMAN_SERVICE_TYPE_GPS:
case CONNMAN_SERVICE_TYPE_VPN:
+   case CONNMAN_SERVICE_TYPE_GADGET:
break;
case CONNMAN_SERVICE_TYPE_BLUETOOTH:
send_indication(IOSPM_BLUETOOTH, enabled);
diff --git a/plugins/portal.c b/plugins/portal.c
index f1d5ce3..d4456f5 100644
--- a/plugins/portal.c
+++ b/plugins/portal.c
@@ -123,6 +123,7 @@ static int location_detect(struct connman_location 
*location)
case CONNMAN_SERVICE_TYPE_SYSTEM:
case CONNMAN_SERVICE_TYPE_GPS:
case CONNMAN_SERVICE_TYPE_VPN:
+   case CONNMAN_SERVICE_TYPE_GADGET:
return -EOPNOTSUPP;
}
 
diff --git a/src/detect.c b/src/detect.c
index c27d2cc..39ab06a 100644
--- a/src/detect.c
+++ b/src/detect.c
@@ -63,6 +63,7 @@ static void detect_newlink(unsigned short type, int index,
return;
case CONNMAN_DEVICE_TYPE_ETHERNET:
case CONNMAN_DEVICE_TYPE_WIFI:
+   case CONNMAN_DEVICE_TYPE_GADGET:
break;
}
 
diff --git a/src/device.c b/src/device.c
index 7f2b54f..b8110c4 100644
--- a/src/device.c
+++ b/src/device.c
@@ -124,6 +124,9 @@ static const char *type2description(enum 
connman_device_type type)
return GPS;
case CONNMAN_DEVICE_TYPE_CELLULAR:
return Cellular;
+   case CONNMAN_DEVICE_TYPE_GADGET:
+   return Gadget;
+
}
 
return NULL;
@@ -147,6 +150,9 @@ static const char *type2string(enum connman_device_type 
type)
return gps;
case CONNMAN_DEVICE_TYPE_CELLULAR:
return cellular;
+   case CONNMAN_DEVICE_TYPE_GADGET:
+   return gadget;
+
}
 
return NULL;
@@ -171,6 +177,9 @@ enum connman_service_type 
__connman_device_get_service_type(struct connman_devic
return CONNMAN_SERVICE_TYPE_BLUETOOTH;
case CONNMAN_DEVICE_TYPE_CELLULAR:
return CONNMAN_SERVICE_TYPE_CELLULAR;
+   case CONNMAN_DEVICE_TYPE_GADGET:
+   return CONNMAN_SERVICE_TYPE_GADGET;
+
}
 
return CONNMAN_SERVICE_TYPE_UNKNOWN;
@@ -482,6 +491,9 @@ struct connman_device *connman_device_create(const char 
*node,
case CONNMAN_DEVICE_TYPE_CELLULAR:
device-scan_interval = 0;
break;
+   case CONNMAN_DEVICE_TYPE_GADGET:
+   device-scan_interval = 0;
+   break;
}
 
device-networks = g_hash_table_new_full(g_str_hash, g_str_equal,
diff --git a/src/element.c b/src/element.c
index 5d74bda..a4230b7 100644
--- a/src/element.c
+++ b/src/element.c
@@ -205,6 +205,7 @@ struct connman_service 
*__connman_element_get_service(struct connman_element *el
case CONNMAN_DEVICE_TYPE_UNKNOWN:
case CONNMAN_DEVICE_TYPE_VENDOR:
case CONNMAN_DEVICE_TYPE_GPS:
+   case CONNMAN_DEVICE_TYPE_GADGET:
break;
case CONNMAN_DEVICE_TYPE_ETHERNET:
case CONNMAN_DEVICE_TYPE_WIFI:
@@ -290,6 +291,7 @@ static gboolean request_scan(GNode *node, gpointer 
user_data)
case CONNMAN_SERVICE_TYPE_CELLULAR:
case CONNMAN_SERVICE_TYPE_GPS:
case CONNMAN_SERVICE_TYPE_VPN:
+   case CONNMAN_SERVICE_TYPE_GADGET:
return FALSE;
case CONNMAN_SERVICE_TYPE_WIFI:
case CONNMAN_SERVICE_TYPE_WIMAX:
@@ -334,6 +336,7 @@ static gboolean enable_technology(GNode *node, gpointer 
user_data)
case

[V2 PATCH 3/3] Add tethering over usb support

2010-12-08 Thread martin . xu
From: Martin Xu martin...@intel.com

---
 plugins/ethernet.c |  102 
 1 files changed, 102 insertions(+), 0 deletions(-)

diff --git a/plugins/ethernet.c b/plugins/ethernet.c
index 797fc7c..6484bca 100644
--- a/plugins/ethernet.c
+++ b/plugins/ethernet.c
@@ -33,6 +33,7 @@
 #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
@@ -201,6 +202,98 @@ static struct connman_device_driver ethernet_driver = {
.disable= ethernet_disable,
 };
 
+static GList *cdc_interface_list = NULL;
+
+static void 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(cdc_interface_list,
+   GINT_TO_POINTER((int) index)) != NULL)
+   return;
+
+   cdc_interface_list = g_list_prepend(
+   cdc_interface_list,
+   (GINT_TO_POINTER((int) index)));
+}
+
+static void tech_remove_interface(struct connman_technology *technology,
+   int index)
+{
+   DBG(index %d, index);
+
+   cdc_interface_list = g_list_remove(cdc_interface_list,
+   GINT_TO_POINTER((int) index));
+}
+
+static void enable_tethering(struct connman_technology *technology,
+   const char *bridge)
+{
+   GList *list;
+
+   for (list = cdc_interface_list; list; list = list-next) {
+   int index = GPOINTER_TO_INT(list-data);
+
+   connman_inet_ifup(index);
+
+   connman_inet_add_to_bridge(index, bridge);
+
+   connman_technology_tethering_notify(technology, TRUE);
+   }
+}
+
+static void disable_tethering(struct connman_technology *technology,
+   const char *bridge)
+{
+   GList *list;
+
+   for (list = cdc_interface_list; list; list = list-next) {
+   int index = GPOINTER_TO_INT(list-data);
+
+   connman_inet_remove_from_bridge(index, bridge);
+
+   connman_inet_ifdown(index);
+
+   connman_technology_tethering_notify(technology, FALSE);
+   }
+}
+
+static int tech_set_tethering(struct connman_technology *technology,
+   const char *bridge, connman_bool_t enabled)
+{
+   DBG(bridge %s enabled %d, bridge, enabled);
+
+   if (enabled)
+   enable_tethering(technology, bridge);
+   else
+   disable_tethering(technology, bridge);
+
+   return 0;
+}
+
+static int tech_probe(struct connman_technology *technology)
+{
+   return 0;
+}
+
+static void tech_remove(struct connman_technology *technology)
+{
+   g_list_free(cdc_interface_list);
+
+   cdc_interface_list = NULL;
+}
+
+static struct connman_technology_driver tech_driver = {
+   .name   = cdc_ethernet,
+   .type   = CONNMAN_SERVICE_TYPE_GADGET,
+   .probe  = tech_probe,
+   .remove = tech_remove,
+   .add_interface  = tech_add_interface,
+   .remove_interface   = tech_remove_interface,
+   .set_tethering  = tech_set_tethering,
+};
+
 static int ethernet_init(void)
 {
int err;
@@ -215,11 +308,20 @@ static int ethernet_init(void)
return err;
}
 
+   err = connman_technology_driver_register(tech_driver);
+   if (err  0) {
+   connman_device_driver_unregister(ethernet_driver);
+   connman_network_driver_unregister(cable_driver);
+   return err;
+   }
+
return 0;
 }
 
 static void ethernet_exit(void)
 {
+   connman_technology_driver_unregister(tech_driver);
+
connman_network_driver_unregister(cable_driver);
 
connman_device_driver_unregister(ethernet_driver);
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 2/4] Add connman_inet_remove_from_bridge() and connman_inet_add_to_bridge()

2010-12-03 Thread martin . xu
From: Martin Xu martin...@intel.com

---
 include/inet.h |2 +
 src/inet.c |   57 
 2 files changed, 59 insertions(+), 0 deletions(-)

diff --git a/include/inet.h b/include/inet.h
index d7af826..7b34900 100644
--- a/include/inet.h
+++ b/include/inet.h
@@ -65,6 +65,8 @@ int connman_inet_clear_ipv6_gateway_address(int index, const 
char *gateway);
 
 void connman_ipaddress_set_ipv4(struct connman_ipaddress *ipaddress,
const char *address, const char *netmask, const char *gateway);
+int connman_inet_add_to_bridge(int index, const char *bridge);
+int connman_inet_remove_from_bridge(int index, const char *bridge);
 
 #ifdef __cplusplus
 }
diff --git a/src/inet.c b/src/inet.c
index f6b8019..82e3a82 100644
--- a/src/inet.c
+++ b/src/inet.c
@@ -31,6 +31,7 @@
 #include sys/stat.h
 #include sys/ioctl.h
 #include sys/socket.h
+#include linux/sockios.h
 #include arpa/inet.h
 #include net/route.h
 #include net/ethernet.h
@@ -1100,3 +1101,59 @@ connman_bool_t connman_inet_compare_subnet(int index, 
const char *host)
 
return ((if_addr  netmask_addr) == (host_addr  netmask_addr));
 }
+
+int connman_inet_remove_from_bridge(int index, const char *bridge)
+{
+   struct ifreq ifr;
+   int sk, err;
+
+   if (bridge == NULL)
+   return -EINVAL;
+
+   sk = socket(AF_INET, SOCK_STREAM, 0);
+   if (sk  0)
+   return sk;
+
+   memset(ifr, 0, sizeof(ifr));
+   strncpy(ifr.ifr_name, bridge, IFNAMSIZ - 1);
+   ifr.ifr_ifindex = index;
+
+   err = ioctl(sk, SIOCBRDELIF, ifr);
+
+   close(sk);
+
+   if (err  0) {
+   perror(Remove interface from bridge error);
+   return err;
+   }
+
+   return 0;
+}
+
+int connman_inet_add_to_bridge(int index, const char *bridge)
+{
+   struct ifreq ifr;
+   int sk, err;
+
+   if (bridge == NULL)
+   return -EINVAL;
+
+   sk = socket(AF_INET, SOCK_STREAM, 0);
+   if (sk  0)
+   return sk;
+
+   memset(ifr, 0, sizeof(ifr));
+   strncpy(ifr.ifr_name, bridge, IFNAMSIZ - 1);
+   ifr.ifr_ifindex = index;
+
+   err = ioctl(sk, SIOCBRADDIF, ifr);
+
+   close(sk);
+
+   if (err  0) {
+   perror(Add interface to bridge error);
+   return err;
+   }
+
+   return 0;
+}
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 4/4] Add tethering over USB support

2010-12-03 Thread martin . xu
From: Martin Xu martin...@intel.com

---
 include/device.h   |1 +
 include/service.h  |1 +
 plugins/ethernet.c |  129 
 plugins/iospm.c|1 +
 plugins/portal.c   |1 +
 src/detect.c   |1 +
 src/device.c   |   12 +
 src/element.c  |4 ++
 src/inet.c |2 +
 src/notifier.c |7 +++
 src/rtnl.c |4 ++
 src/service.c  |   10 
 src/session.c  |1 +
 src/technology.c   |3 +
 14 files changed, 177 insertions(+), 0 deletions(-)

diff --git a/include/device.h b/include/device.h
index 31aa92b..c5e005d 100644
--- a/include/device.h
+++ b/include/device.h
@@ -43,6 +43,7 @@ enum connman_device_type {
CONNMAN_DEVICE_TYPE_BLUETOOTH = 4,
CONNMAN_DEVICE_TYPE_CELLULAR  = 5,
CONNMAN_DEVICE_TYPE_GPS   = 6,
+   CONNMAN_DEVICE_TYPE_GADGET= 7,
CONNMAN_DEVICE_TYPE_VENDOR= 1,
 };
 
diff --git a/include/service.h b/include/service.h
index 16d10f2..e67dd42 100644
--- a/include/service.h
+++ b/include/service.h
@@ -44,6 +44,7 @@ enum connman_service_type {
CONNMAN_SERVICE_TYPE_CELLULAR  = 6,
CONNMAN_SERVICE_TYPE_GPS   = 7,
CONNMAN_SERVICE_TYPE_VPN   = 8,
+   CONNMAN_SERVICE_TYPE_GADGET= 9,
 };
 
 enum connman_service_mode {
diff --git a/plugins/ethernet.c b/plugins/ethernet.c
index 797fc7c..eaf1167 100644
--- a/plugins/ethernet.c
+++ b/plugins/ethernet.c
@@ -33,6 +33,7 @@
 #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
@@ -201,6 +202,127 @@ static struct connman_device_driver ethernet_driver = {
.disable= ethernet_disable,
 };
 
+static GHashTable *interface_hash = NULL;
+
+struct cdc_interface {
+   int index;
+   char *name;
+   char *ident;
+};
+
+static void free_interface(gpointer data)
+{
+   struct cdc_interface *interface = data;
+
+   g_free(interface-ident);
+   g_free(interface-name);
+   g_free(interface);
+}
+
+static void 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_hash_table_lookup(interface_hash,
+   GINT_TO_POINTER(index)) == NULL) {
+   struct cdc_interface *interface;
+
+   interface = g_try_new0(struct cdc_interface, 1);
+   if (interface == NULL)
+   return;
+   interface-index = index;
+   interface-name = g_strdup(name);
+   interface-ident = g_strdup(ident);
+   g_hash_table_insert(interface_hash,
+   GINT_TO_POINTER(index), interface);
+   }
+}
+
+static void tech_remove_interface(struct connman_technology *technology,
+   int index)
+{
+   DBG(index %d, index);
+
+   g_hash_table_remove(interface_hash, GINT_TO_POINTER(index));
+}
+
+struct tethering_info {
+   struct connman_technology *technology;
+   const char *bridge;
+};
+
+static void enable_tethering(gpointer key, gpointer value, gpointer user_data)
+{
+   struct tethering_info *info = user_data;
+   struct cdc_interface *interface = value;
+
+   DBG();
+
+   connman_inet_ifup(interface-index);
+
+   connman_technology_tethering_notify(info-technology, TRUE);
+
+   connman_inet_add_to_bridge(interface-index, info-bridge);
+}
+
+static void disable_tethering(gpointer key, gpointer value, gpointer user_data)
+{
+   struct tethering_info *info = user_data;
+   struct cdc_interface *interface = value;
+
+   DBG();
+
+   connman_inet_remove_from_bridge(interface-index, info-bridge);
+
+   connman_inet_ifdown(interface-index);
+
+   connman_technology_tethering_notify(info-technology, FALSE);
+}
+
+static int tech_set_tethering(struct connman_technology *technology,
+   const char *bridge, connman_bool_t enabled)
+{
+   struct tethering_info info = {
+   .technology = technology,
+   .bridge = bridge,
+   };
+
+   DBG(bridge %s, bridge);
+
+   if (enabled)
+   g_hash_table_foreach(interface_hash, enable_tethering, info);
+   else
+   g_hash_table_foreach(interface_hash, disable_tethering, info);
+
+   return 0;
+}
+
+static int tech_probe(struct connman_technology *technology)
+{
+   if (interface_hash == NULL)
+   interface_hash = g_hash_table_new_full(g_direct_hash,
+   g_direct_equal, NULL, free_interface);
+
+   return 0;
+}
+
+static void tech_remove(struct connman_technology

[PATCH 3/4] call __connman_technology_add_interface() after rtnl-newlink()

2010-12-03 Thread martin . xu
From: Martin Xu martin...@intel.com

The device is created and attach technology at rtnl-newlink(), so
__connman_technology_add_interface() nees to be called after rtnl-newlink()
---
 src/rtnl.c |   11 +++
 1 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/src/rtnl.c b/src/rtnl.c
index 1993493..ceb98fc 100644
--- a/src/rtnl.c
+++ b/src/rtnl.c
@@ -401,6 +401,7 @@ static void process_newlink(unsigned short type, int index, 
unsigned flags,
struct ether_addr compare = {{ 0, 0, 0, 0, 0, 0 }};
struct rtnl_link_stats stats;
unsigned char operstate = 0xff;
+   struct interface_data *interface;
const char *ifname = NULL;
unsigned int mtu = 0;
char ident[13], str[18];
@@ -446,7 +447,6 @@ static void process_newlink(unsigned short type, int index, 
unsigned flags,
 
if (g_hash_table_lookup(interface_list,
GINT_TO_POINTER(index)) == NULL) {
-   struct interface_data *interface;
 
interface = g_new0(struct interface_data, 1);
interface-index = index;
@@ -458,9 +458,6 @@ static void process_newlink(unsigned short type, int index, 
unsigned flags,
 
if (type == ARPHRD_ETHER)
read_uevent(interface);
-
-   __connman_technology_add_interface(interface-service_type,
-   interface-index, interface-name, interface-ident);
}
 
for (list = rtnl_list; list; list = list-next) {
@@ -470,6 +467,12 @@ static void process_newlink(unsigned short type, int 
index, unsigned flags,
rtnl-newlink(type, index, flags, change);
}
 
+   interface = g_hash_table_lookup(interface_list,
+   GINT_TO_POINTER(index));
+   if (interface != NULL)
+   __connman_technology_add_interface(interface-service_type,
+   interface-index, interface-name, interface-ident);
+
for (list = watch_list; list; list = list-next) {
struct watch_data *watch = list-data;
 
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[V2 DHCP SERVER: PATCH 4/4] add compile parameters to Makefile.am to compile dhcp-server lib

2010-11-11 Thread martin . xu
From: Martin Xu martin...@intel.com

---
 Makefile.am |   10 +++---
 1 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index 651eede..8e70b38 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -26,7 +26,8 @@ local_headers = $(foreach file,$(include_HEADERS) 
$(nodist_include_HEADERS) \
 gdbus_sources = gdbus/gdbus.h gdbus/mainloop.c gdbus/watch.c \
gdbus/object.c gdbus/polkit.c
 
-gdhcp_sources = gdhcp/gdhcp.h gdhcp/common.h gdhcp/common.c gdhcp/client.c
+gdhcp_sources = gdhcp/gdhcp.h gdhcp/common.h gdhcp/common.c gdhcp/client.c \
+   gdhcp/server.c
 
 gweb_sources = gweb/gweb.h gweb/gweb.c gweb/gresolv.h gweb/gresolv.c \
gweb/giognutls.h gweb/giognutls.c
@@ -127,8 +128,8 @@ endif
 
 if TOOLS
 noinst_PROGRAMS += tools/wispr tools/wifi-scan tools/supplicant-test \
-   tools/dhcp-test tools/addr-test \
-   tools/web-test tools/resolv-test \
+   tools/dhcp-test tools/dhcp-server-test \
+   tools/addr-test tools/web-test tools/resolv-test \
tools/dbus-test tools/polkit-test \
tools/iptables-test tools/tap-test tools/wpad-test \
tools/stats-ringbuffer-dump
@@ -155,6 +156,9 @@ tools_wpad_test_LDADD = @GLIB_LIBS@ -lresolv
 tools_dhcp_test_SOURCES = $(gdhcp_sources) tools/dhcp-test.c
 tools_dhcp_test_LDADD = @GLIB_LIBS@
 
+tools_dhcp_server_test_SOURCES = $(gdhcp_sources) tools/dhcp-server-test.c
+tools_dhcp_server_test_LDADD = @GLIB_LIBS@
+
 tools_dbus_test_SOURCES = $(gdbus_sources) tools/dbus-test.c
 tools_dbus_test_LDADD = @GLIB_LIBS@ @DBUS_LIBS@
 
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH] Add vpn.h into Makefile.plugin

2010-10-26 Thread martin . xu
From: Martin Xu martin...@intel.com

So the file can be included into dist tarball, otherwise, the file
can not be found, and will block the building.
---
 Makefile.plugins |2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/Makefile.plugins b/Makefile.plugins
index 261417e..f0d81d4 100644
--- a/Makefile.plugins
+++ b/Makefile.plugins
@@ -109,7 +109,7 @@ endif
 if OPENCONNECT
 if OPENCONNECT_BUILTIN
 builtin_modules += openconnect
-builtin_sources += plugins/vpn.c plugins/openconnect.c
+builtin_sources += plugins/vpn.c plugins/openconnect.c plugins/vpn.h
 builtin_cflags += -DOPENCONNECT=\@openconn...@\
 else
 plugin_LTLIBRARIES += plugins/openconnect.la
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[V1 DHCP SERVER: PATCH 1/4] move get_interface_name() interface_is_up() to common.c

2010-10-25 Thread martin . xu
From: Martin Xu martin...@intel.com

---
 gdhcp/client.c |   63 
 gdhcp/common.c |   73 
 gdhcp/common.h |6 
 3 files changed, 79 insertions(+), 63 deletions(-)

diff --git a/gdhcp/client.c b/gdhcp/client.c
index b9a0e7f..60aba00 100644
--- a/gdhcp/client.c
+++ b/gdhcp/client.c
@@ -268,70 +268,7 @@ static int send_release(GDHCPClient *dhcp_client,
server, SERVER_PORT);
 }
 
-static gboolean interface_is_up(int index)
-{
-   int sk, err;
-   struct ifreq ifr;
-   gboolean ret = FALSE;
-
-   sk = socket(PF_INET, SOCK_DGRAM, 0);
-   if (sk  0) {
-   perror(Open socket error);
-   return FALSE;
-   }
 
-   memset(ifr, 0, sizeof(ifr));
-   ifr.ifr_ifindex = index;
-
-   err = ioctl(sk, SIOCGIFNAME, ifr);
-   if (err  0) {
-   perror(Get interface name error);
-   goto done;
-   }
-
-   err = ioctl(sk, SIOCGIFFLAGS, ifr);
-   if (err  0) {
-   perror(Get interface flags error);
-   goto done;
-   }
-
-   if (ifr.ifr_flags  IFF_UP)
-   ret = TRUE;
-
-done:
-   close(sk);
-
-   return ret;
-}
-
-static char *get_interface_name(int index)
-{
-   struct ifreq ifr;
-   int sk, err;
-
-   if (index  0)
-   return NULL;
-
-   sk = socket(PF_INET, SOCK_DGRAM, 0);
-   if (sk  0) {
-   perror(Open socket error);
-   return NULL;
-   }
-
-   memset(ifr, 0, sizeof(ifr));
-   ifr.ifr_ifindex = index;
-
-   err = ioctl(sk, SIOCGIFNAME, ifr);
-   if (err  0) {
-   perror(Get interface name error);
-   close(sk);
-   return NULL;
-   }
-
-   close(sk);
-
-   return g_strdup(ifr.ifr_name);
-}
 
 static void get_interface_mac_address(int index, uint8_t *mac_address)
 {
diff --git a/gdhcp/common.c b/gdhcp/common.c
index fc95881..ccf40f3 100644
--- a/gdhcp/common.c
+++ b/gdhcp/common.c
@@ -22,11 +22,19 @@
 #include config.h
 #endif
 
+#include stdio.h
 #include errno.h
 #include unistd.h
+#include sys/ioctl.h
 #include stdint.h
+#include stdlib.h
 #include string.h
 #include endian.h
+#include arpa/inet.h
+#include netpacket/packet.h
+#include net/ethernet.h
+#include net/if_arp.h
+#include linux/if.h
 #include netpacket/packet.h
 #include net/ethernet.h
 
@@ -417,3 +425,68 @@ int dhcp_l3_socket(int port, const char *interface)
 
return fd;
 }
+
+char *get_interface_name(int index)
+{
+   struct ifreq ifr;
+   int sk, err;
+
+   if (index  0)
+   return NULL;
+
+   sk = socket(PF_INET, SOCK_DGRAM, 0);
+   if (sk  0) {
+   perror(Open socket error);
+   return NULL;
+   }
+
+   memset(ifr, 0, sizeof(ifr));
+   ifr.ifr_ifindex = index;
+
+   err = ioctl(sk, SIOCGIFNAME, ifr);
+   if (err  0) {
+   perror(Get interface name error);
+   close(sk);
+   return NULL;
+   }
+
+   close(sk);
+
+   return g_strdup(ifr.ifr_name);
+}
+
+gboolean interface_is_up(int index)
+{
+   int sk, err;
+   struct ifreq ifr;
+   gboolean ret = FALSE;
+
+   sk = socket(PF_INET, SOCK_DGRAM, 0);
+   if (sk  0) {
+   perror(Open socket error);
+   return FALSE;
+   }
+
+   memset(ifr, 0, sizeof(ifr));
+   ifr.ifr_ifindex = index;
+
+   err = ioctl(sk, SIOCGIFNAME, ifr);
+   if (err  0) {
+   perror(Get interface name error);
+   goto done;
+   }
+
+   err = ioctl(sk, SIOCGIFFLAGS, ifr);
+   if (err  0) {
+   perror(Get interface flags error);
+   goto done;
+   }
+
+   if (ifr.ifr_flags  IFF_UP)
+   ret = TRUE;
+
+done:
+   close(sk);
+
+   return ret;
+}
diff --git a/gdhcp/common.h b/gdhcp/common.h
index 5b6fe58..3927c9a 100644
--- a/gdhcp/common.h
+++ b/gdhcp/common.h
@@ -51,6 +51,10 @@ static const uint8_t MAC_BCAST_ADDR[6] 
__attribute__((aligned(2))) = {
0xff, 0xff, 0xff, 0xff, 0xff, 0xff
 };
 
+static const uint8_t MAC_ANY_ADDR[6] __attribute__((aligned(2))) = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
 /* DHCP packet */
 #define DHCP_MAGIC  0x63825363
 #define DHCP_OPTIONS_BUFSIZE308
@@ -171,3 +175,5 @@ int dhcp_send_kernel_packet(struct dhcp_packet *dhcp_pkt,
uint32_t dest_ip, int dest_port);
 int dhcp_l3_socket(int port, const char *interface);
 int dhcp_recv_l3_packet(struct dhcp_packet *packet, int fd);
+char *get_interface_name(int index);
+gboolean interface_is_up(int index);
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[V1 DHCP SERVER: PATCH 2/4] add dhcp-server-lib support

2010-10-25 Thread martin . xu
From: Martin Xu martin...@intel.com

---
 gdhcp/gdhcp.h  |   39 +++-
 gdhcp/server.c |  892 
 2 files changed, 930 insertions(+), 1 deletions(-)
 create mode 100644 gdhcp/server.c

diff --git a/gdhcp/gdhcp.h b/gdhcp/gdhcp.h
index 59b07ea..8625b49 100644
--- a/gdhcp/gdhcp.h
+++ b/gdhcp/gdhcp.h
@@ -1,6 +1,6 @@
 /*
  *
- *  DHCP client library with GLib integration
+ *  DHCP library with GLib integration
  *
  *  Copyright (C) 2009-2010  Intel Corporation. All rights reserved.
  *
@@ -28,6 +28,7 @@
 extern C {
 #endif
 
+/* DHCP Client part*/
 struct _GDHCPClient;
 
 typedef struct _GDHCPClient GDHCPClient;
@@ -94,6 +95,42 @@ int g_dhcp_client_get_index(GDHCPClient *client);
 void g_dhcp_client_set_debug(GDHCPClient *client,
GDHCPDebugFunc func, gpointer user_data);
 
+/* DHCP Server */
+typedef enum {
+   G_DHCP_SERVER_ERROR_NONE,
+   G_DHCP_SERVER_ERROR_INTERFACE_UNAVAILABLE,
+   G_DHCP_SERVER_ERROR_INTERFACE_IN_USE,
+   G_DHCP_SERVER_ERROR_INTERFACE_DOWN,
+   G_DHCP_SERVER_ERROR_NOMEM,
+   G_DHCP_SERVER_ERROR_INVALID_INDEX,
+   G_DHCP_SERVER_ERROR_INVALID_OPTION,
+   G_DHCP_SERVER_ERROR_IP_ADDRESS_INVALID
+} GDHCPServerError;
+
+typedef void (*GDHCPSaveLeaseFunc) (unsigned char *mac,
+   unsigned int nip, unsigned int expire);
+struct _GDHCPServer;
+
+typedef struct _GDHCPServer GDHCPServer;
+
+GDHCPServer *g_dhcp_server_new(GDHCPType type,
+   int ifindex, GDHCPServerError *error);
+int g_dhcp_server_start(GDHCPServer *server);
+void g_dhcp_server_stop(GDHCPServer *server);
+
+GDHCPServer *g_dhcp_server_ref(GDHCPServer *server);
+void g_dhcp_server_unref(GDHCPServer *server);
+
+int g_dhcp_server_set_option(GDHCPServer *server,
+   unsigned char option_code, const char *option_value);
+int g_dhcp_server_set_ip_area(GDHCPServer *server,
+   const char *start_ip, const char *end_ip);
+void g_dhcp_server_load_lease(GDHCPServer *dhcp_server, unsigned int expire,
+   unsigned char *mac, unsigned int lease_ip);
+void g_dhcp_server_set_debug(GDHCPServer *server,
+   GDHCPDebugFunc func, gpointer user_data);
+void g_dhcp_server_set_save_lease(GDHCPServer *dhcp_server,
+   GDHCPSaveLeaseFunc func, gpointer user_data);
 #ifdef __cplusplus
 }
 #endif
diff --git a/gdhcp/server.c b/gdhcp/server.c
new file mode 100644
index 000..aa4934b
--- /dev/null
+++ b/gdhcp/server.c
@@ -0,0 +1,892 @@
+/*
+ *
+ *  DHCP Server library with GLib integration
+ *
+ *  Copyright (C) 2009-2010  Intel Corporation. All rights reserved.
+ *
+ *  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 stdio.h
+#include errno.h
+#include unistd.h
+#include stdlib.h
+#include string.h
+#include sys/ioctl.h
+#include arpa/inet.h
+
+#include netpacket/packet.h
+#include net/ethernet.h
+#include net/if_arp.h
+
+#include linux/if.h
+#include linux/filter.h
+
+#include glib.h
+
+#include common.h
+
+/* 8 hours */
+#define DHCP_LEASE_SEC (8*60*60)
+
+struct _GDHCPServer {
+   gint ref_count;
+   GDHCPType type;
+   gboolean started;
+   int ifindex;
+   char *interface;
+   uint32_t start_ip;
+   uint32_t end_ip;
+   uint32_t server_nip;
+   uint32_t lease_seconds;
+   int listener_sockfd;
+   guint listener_watch;
+   GIOChannel *listener_channel;
+   GList *lease_list;
+   GHashTable *nip_lease_hash;
+   GHashTable *option_hash; /* Options send to client */
+   GDHCPSaveLeaseFunc save_lease_func;
+   GDHCPDebugFunc debug_func;
+   gpointer debug_data;
+};
+
+struct dhcp_lease {
+   uint32_t expire;
+   uint32_t lease_nip;
+   uint8_t lease_mac[6];
+   uint8_t pad[2];
+   /* total size is a multiply of 4 */
+}  __attribute__((packed));
+
+static inline void debug(GDHCPServer *server, const char *format, ...)
+{
+   char str[256];
+   va_list ap;
+
+   if (server-debug_func == NULL)
+   return;
+
+   va_start(ap, format);
+
+   if (vsnprintf(str, sizeof(str), format, ap)  0)
+   server-debug_func(str, server-debug_data);
+
+   va_end(ap);
+}
+
+static struct dhcp_lease

[V1 DHCP SERVER: PATCH 3/4] add tools/dhcp-server-test.c to test dhcp-server-lib module

2010-10-25 Thread martin . xu
From: Martin Xu martin...@intel.com

---
 tools/dhcp-server-test.c |  121 ++
 1 files changed, 121 insertions(+), 0 deletions(-)
 create mode 100644 tools/dhcp-server-test.c

diff --git a/tools/dhcp-server-test.c b/tools/dhcp-server-test.c
new file mode 100644
index 000..27ad8e2
--- /dev/null
+++ b/tools/dhcp-server-test.c
@@ -0,0 +1,121 @@
+/*
+ *
+ *  Connection Manager
+ *
+ *  Copyright (C) 2007-2010  Intel Corporation. All rights reserved.
+ *
+ *  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 stdio.h
+#include stdlib.h
+#include string.h
+
+#include gdhcp/gdhcp.h
+
+static GMainLoop *main_loop;
+
+static void sig_term(int sig)
+{
+   g_main_loop_quit(main_loop);
+}
+
+static void handle_error(GDHCPServerError error)
+{
+   switch (error) {
+   case G_DHCP_SERVER_ERROR_NONE:
+   printf(dhcp server ok\n);
+   break;
+   case G_DHCP_SERVER_ERROR_INTERFACE_UNAVAILABLE:
+   printf(Interface unavailable\n);
+   break;
+   case G_DHCP_SERVER_ERROR_INTERFACE_IN_USE:
+   printf(Interface in use\n);
+   break;
+   case G_DHCP_SERVER_ERROR_INTERFACE_DOWN:
+   printf(Interface down\n);
+   break;
+   case G_DHCP_SERVER_ERROR_NOMEM:
+   printf(No memory\n);
+   break;
+   case G_DHCP_SERVER_ERROR_INVALID_INDEX:
+   printf(Invalid index\n);
+   break;
+   case G_DHCP_SERVER_ERROR_INVALID_OPTION:
+   printf(Invalid option\n);
+   break;
+   case G_DHCP_SERVER_ERROR_IP_ADDRESS_INVALID:
+   printf(Invalid address\n);
+   break;
+   }
+}
+
+static void dhcp_debug(const char *str, void *data)
+{
+   printf(%s: %s\n, (const char *) data, str);
+}
+
+
+int main(int argc, char *argv[])
+{
+   struct sigaction sa;
+   GDHCPServerError error;
+   GDHCPServer *dhcp_server;
+   int index;
+
+   if (argc  2) {
+   printf(Usage: dhcp-server-test interface index\n);
+   exit(0);
+   }
+
+   index = atoi(argv[1]);
+
+   printf(Create DHCP server for interface %d\n, index);
+
+   dhcp_server = g_dhcp_server_new(G_DHCP_IPV4, index, error);
+   if (dhcp_server == NULL) {
+   handle_error(error);
+   exit(0);
+   }
+
+   g_dhcp_server_set_debug(dhcp_server, dhcp_debug, DHCP);
+
+   g_dhcp_server_set_option(dhcp_server, G_DHCP_SUBNET, 255.255.0.0);
+   g_dhcp_server_set_option(dhcp_server, G_DHCP_ROUTER, 192.168.0.2);
+   g_dhcp_server_set_ip_area(dhcp_server, 192.168.0.101, 
192.168.0.102);
+
+   main_loop = g_main_loop_new(NULL, FALSE);
+
+   printf(Start DHCP Server operation\n);
+
+   g_dhcp_server_start(dhcp_server);
+
+   memset(sa, 0, sizeof(sa));
+   sa.sa_handler = sig_term;
+   sigaction(SIGINT, sa, NULL);
+   sigaction(SIGTERM, sa, NULL);
+
+   g_main_loop_run(main_loop);
+
+   g_dhcp_server_unref(dhcp_server);
+
+   g_main_loop_unref(main_loop);
+
+   return 0;
+}
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[V1 DHCP SERVER: PATCH 4/4] add compile parameters to Makefile.am to compile dhcp-server-lib module

2010-10-25 Thread martin . xu
From: Martin Xu martin...@intel.com

---
 Makefile.am |   16 ++--
 1 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index cffebd0..14adec6 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -26,7 +26,8 @@ local_headers = $(foreach file,$(include_HEADERS) 
$(nodist_include_HEADERS) \
 gdbus_sources = gdbus/gdbus.h gdbus/mainloop.c gdbus/watch.c \
gdbus/object.c gdbus/polkit.c
 
-gdhcp_sources = gdhcp/gdhcp.h gdhcp/common.h gdhcp/common.c gdhcp/client.c
+gdhcp_sources = gdhcp/gdhcp.h gdhcp/common.h gdhcp/common.c gdhcp/client.c \
+   gdhcp/server.c
 
 gweb_sources = gweb/gweb.h gweb/gweb.c gweb/gresolv.h gweb/gresolv.c
 
@@ -128,11 +129,11 @@ client_cm_LDADD = @DBUS_LIBS@
 endif
 
 if TOOLS
-noinst_PROGRAMS += tools/wifi-scan tools/supplicant-test tools/dhcp-test \
-   tools/addr-test tools/web-test tools/resolv-test \
-   tools/dbus-test tools/polkit-test tools/portal-test \
-   tools/iptables-test tools/tap-test tools/wpad-test \
-   tools/stats-ringbuffer-dump
+noinst_PROGRAMS += tools/wifi-scan tools/supplicant-test 
tools/dhcp-server-test \
+   tools/dhcp-test tools/addr-test tools/web-test \
+   tools/resolv-test tools/dbus-test tools/polkit-test \
+   tools/portal-test tools/iptables-test tools/tap-test \
+   tools/wpad-test tools/stats-ringbuffer-dump
 
 tools_wifi_scan_LDADD = @GLIB_LIBS@ @NETLINK_LIBS@
 
@@ -153,6 +154,9 @@ tools_wpad_test_LDADD = @GLIB_LIBS@ -lresolv
 tools_dhcp_test_SOURCES = $(gdhcp_sources) tools/dhcp-test.c
 tools_dhcp_test_LDADD = @GLIB_LIBS@
 
+tools_dhcp_server_test_SOURCES = $(gdhcp_sources) tools/dhcp-server-test.c
+tools_dhcp_server_test_LDADD = @GLIB_LIBS@
+
 tools_dbus_test_SOURCES = $(gdbus_sources) tools/dbus-test.c
 tools_dbus_test_LDADD = @GLIB_LIBS@ @DBUS_LIBS@
 
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


diff --git a/gdhcp/client.c b/gdhcp/client.c

2010-10-18 Thread martin . xu
-/* Initialize the packet with the proper defaults */
 static void init_packet(GDHCPClient *dhcp_client,
struct dhcp_packet *packet, char type)
 {
@@ -268,70 +267,7 @@ static int send_release(GDHCPClient *dhcp_client,
server, SERVER_PORT);
 }
 
-static gboolean interface_is_up(int index)
-{
-   int sk, err;
-   struct ifreq ifr;
-   gboolean ret = FALSE;
-
-   sk = socket(PF_INET, SOCK_DGRAM, 0);
-   if (sk  0) {
-   perror(Open socket error);
-   return FALSE;
-   }
-
-   memset(ifr, 0, sizeof(ifr));
-   ifr.ifr_ifindex = index;
-
-   err = ioctl(sk, SIOCGIFNAME, ifr);
-   if (err  0) {
-   perror(Get interface name error);
-   goto done;
-   }
-
-   err = ioctl(sk, SIOCGIFFLAGS, ifr);
-   if (err  0) {
-   perror(Get interface flags error);
-   goto done;
-   }
-
-   if (ifr.ifr_flags  IFF_UP)
-   ret = TRUE;
-
-done:
-   close(sk);
-
-   return ret;
-}
 
-static char *get_interface_name(int index)
-{
-   struct ifreq ifr;
-   int sk, err;
-
-   if (index  0)
-   return NULL;
-
-   sk = socket(PF_INET, SOCK_DGRAM, 0);
-   if (sk  0) {
-   perror(Open socket error);
-   return NULL;
-   }
-
-   memset(ifr, 0, sizeof(ifr));
-   ifr.ifr_ifindex = index;
-
-   err = ioctl(sk, SIOCGIFNAME, ifr);
-   if (err  0) {
-   perror(Get interface name error);
-   close(sk);
-   return NULL;
-   }
-
-   close(sk);
-
-   return g_strdup(ifr.ifr_name);
-}
 
 static void get_interface_mac_address(int index, uint8_t *mac_address)
 {
@@ -1201,19 +1137,6 @@ GDHCPClientError g_dhcp_client_set_request(GDHCPClient 
*dhcp_client,
return G_DHCP_CLIENT_ERROR_NONE;
 }
 
-static uint8_t *alloc_dhcp_option(int code, const char *str, int extra)
-{
-   uint8_t *storage;
-   int len = strnlen(str, 255);
-
-   storage = malloc(len + extra + OPT_DATA);
-   storage[OPT_CODE] = code;
-   storage[OPT_LEN] = len + extra;
-   memcpy(storage + extra + OPT_DATA, str, len);
-
-   return storage;
-}
-
 /* Now only support send hostname */
 GDHCPClientError g_dhcp_client_set_send(GDHCPClient *dhcp_client,
unsigned char option_code, const char *option_value)
diff --git a/gdhcp/common.c b/gdhcp/common.c
index fc95881..ede91a4 100644
--- a/gdhcp/common.c
+++ b/gdhcp/common.c
@@ -22,11 +22,22 @@
 #include config.h
 #endif
 
+#include stdio.h
 #include errno.h
 #include unistd.h
+#include sys/ioctl.h
 #include stdint.h
+#include stdlib.h
 #include string.h
 #include endian.h
+
+#include arpa/inet.h
+#include netpacket/packet.h
+#include net/ethernet.h
+#include net/if_arp.h
+
+
+#include linux/if.h
 #include netpacket/packet.h
 #include net/ethernet.h
 
@@ -417,3 +428,81 @@ int dhcp_l3_socket(int port, const char *interface)
 
return fd;
 }
+
+char *get_interface_name(int index)
+{
+   struct ifreq ifr;
+   int sk, err;
+
+   if (index  0)
+   return NULL;
+
+   sk = socket(PF_INET, SOCK_DGRAM, 0);
+   if (sk  0) {
+   perror(Open socket error);
+   return NULL;
+   }
+
+   memset(ifr, 0, sizeof(ifr));
+   ifr.ifr_ifindex = index;
+
+   err = ioctl(sk, SIOCGIFNAME, ifr);
+   if (err  0) {
+   perror(Get interface name error);
+   close(sk);
+   return NULL;
+   }
+
+   close(sk);
+
+   return g_strdup(ifr.ifr_name);
+}
+
+gboolean interface_is_up(int index)
+{
+   int sk, err;
+   struct ifreq ifr;
+   gboolean ret = FALSE;
+
+   sk = socket(PF_INET, SOCK_DGRAM, 0);
+   if (sk  0) {
+   perror(Open socket error);
+   return FALSE;
+   }
+
+   memset(ifr, 0, sizeof(ifr));
+   ifr.ifr_ifindex = index;
+
+   err = ioctl(sk, SIOCGIFNAME, ifr);
+   if (err  0) {
+   perror(Get interface name error);
+   goto done;
+   }
+
+   err = ioctl(sk, SIOCGIFFLAGS, ifr);
+   if (err  0) {
+   perror(Get interface flags error);
+   goto done;
+   }
+
+   if (ifr.ifr_flags  IFF_UP)
+   ret = TRUE;
+
+done:
+   close(sk);
+
+   return ret;
+}
+
+uint8_t *alloc_dhcp_option(int code, const char *str, int extra)
+{
+   uint8_t *storage;
+   int len = strnlen(str, 255);
+
+   storage = malloc(len + extra + OPT_DATA);
+   storage[OPT_CODE] = code;
+   storage[OPT_LEN] = len + extra;
+   memcpy(storage + extra + OPT_DATA, str, len);
+
+   return storage;
+}
diff --git a/gdhcp/common.h b/gdhcp/common.h
index 5b6fe58..b565f98 100644
--- a/gdhcp/common.h
+++ b/gdhcp/common.h
@@ -51,6 +51,10 @@ static const uint8_t MAC_BCAST_ADDR[6] 
__attribute__((aligned(2))) = {
0xff, 0xff, 

[PATCH] Ignore the adapter if its address is 00:00:00:00:00:00

2010-09-19 Thread martin . xu
From: Martin Xu martin...@intel.com

---
 plugins/bluetooth.c |3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/plugins/bluetooth.c b/plugins/bluetooth.c
index 62c14c8..5b818f6 100644
--- a/plugins/bluetooth.c
+++ b/plugins/bluetooth.c
@@ -616,6 +616,9 @@ static void adapter_properties_reply(DBusPendingCall *call, 
void *user_data)
if (address == NULL)
goto done;
 
+   if (g_strcmp0(address, 00:00:00:00:00:00) == 0)
+   goto done;
+
device = g_hash_table_lookup(bluetooth_devices, path);
if (device != NULL)
goto update;
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH] Set default IPv6 method as off

2010-07-28 Thread martin . xu
From: Martin Xu martin...@intel.com

---
 src/ipconfig.c |1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/src/ipconfig.c b/src/ipconfig.c
index 6ffcd88..e6e63b2 100644
--- a/src/ipconfig.c
+++ b/src/ipconfig.c
@@ -849,6 +849,7 @@ static struct connman_ipconfig *create_ipv6config(int index)
 
ipv6config-index = index;
ipv6config-type = CONNMAN_IPCONFIG_TYPE_IPV6;
+   ipv6config-method = CONNMAN_IPCONFIG_METHOD_OFF;
 
ipv6config-address = connman_ipaddress_alloc(AF_INET6);
if (ipv6config-address == NULL) {
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/2] v3-init-commit of static ipv6 support

2010-07-27 Thread martin . xu
From: Martin Xu martin...@intel.com

---
 doc/service-api.txt |   36 +++
 include/element.h   |8 ++
 include/inet.h  |   12 +++
 include/ipconfig.h  |7 +-
 include/property.h  |5 +
 src/connection.c|   24 -
 src/connman.h   |   13 ++-
 src/element.c   |7 ++
 src/inet.c  |  229 +
 src/ipconfig.c  |  259 ---
 src/ipv4.c  |   13 ++-
 src/network.c   |   75 +++-
 src/service.c   |  122 ++--
 13 files changed, 773 insertions(+), 37 deletions(-)

diff --git a/doc/service-api.txt b/doc/service-api.txt
index 9bf0907..332823e 100644
--- a/doc/service-api.txt
+++ b/doc/service-api.txt
@@ -359,6 +359,42 @@ Properties string State [readonly]
until the new configuration has been successfully
installed.
 
+   dict IPv6 [readonly]
+
+   string Method [readonly]
+
+   Possible values are dhcp, manual
+   and off.
+
+   The value fixed indicates an IP address
+   that can not be modified. For example
+   cellular networks return fixed information.
+
+   dhcp is not supported currently.
+
+   string Address [readonly]
+
+   The current configured IPv6 address.
+
+   string PrefixLength [readonly]
+
+   The prefix length of the IPv6 address.
+
+   string Gateway [readonly]
+
+   The current configured IPv6 gateway.
+
+   dict IPv6.Configuration [readwrite]
+
+   Same values as IPv6 property. The IPv6 represents
+   the actual system configuration while this allows
+   user configuration.
+
+   Changing these settings will cause a state change
+   of the service. The service will become unavailable
+   until the new configuration has been successfully
+   installed.
+
dict Proxy [readonly]
 
string Method [readonly]
diff --git a/include/element.h b/include/element.h
index eab567e..4161d7e 100644
--- a/include/element.h
+++ b/include/element.h
@@ -109,6 +109,14 @@ struct connman_element {
gchar *timeserver;
gchar *pac;
} ipv4;
+
+   struct {
+   enum connman_ipconfig_method method;
+   gchar *address;
+   int prefix_len;
+   gchar *gateway;
+   gchar *network;
+   } ipv6;
 };
 
 struct connman_element *connman_element_create(const char *name);
diff --git a/include/inet.h b/include/inet.h
index 389a584..ce0a0b2 100644
--- a/include/inet.h
+++ b/include/inet.h
@@ -51,6 +51,18 @@ int connman_inet_clear_gateway_address(int index, const char 
*gateway);
 int connman_inet_set_gateway_interface(int index);
 int connman_inet_clear_gateway_interface(int index);
 connman_bool_t connman_inet_compare_subnet(int index, const char *host);
+int connman_inet_set_ipv6_address(int index,
+   struct connman_ipaddress *ipaddress);
+int connman_inet_clear_ipv6_address(int index,
+   const char *address, int prefix_len);
+int connman_inet_add_ipv6_host_route(int index, const char *host,
+   const char *gateway);
+int connman_inet_del_ipv6_host_route(int index, const char *host);
+int connman_inet_set_ipv6_gateway_address(int index, const char *gateway);
+int connman_inet_clear_ipv6_gateway_address(int index, const char *gateway);
+
+void connman_ipaddress_set_ipv4(struct connman_ipaddress *ipaddress,
+   const char *address, const char *netmask, const char *gateway);
 
 #ifdef __cplusplus
 }
diff --git a/include/ipconfig.h b/include/ipconfig.h
index 0b70252..ecfe13b 100644
--- a/include/ipconfig.h
+++ b/include/ipconfig.h
@@ -86,10 +86,13 @@ const char *connman_ipconfig_get_ifname(struct 
connman_ipconfig *ipconfig);
 
 void connman_ipconfig_set_ops(struct connman_ipconfig *ipconfig,
const struct connman_ipconfig_ops *ops);
-
+int connman_ipaddress_set_ipv6(struct connman_ipaddress *ipaddress,
+   const char *address, const char *gateway,
+   const char *prefix_length);
+struct connman_ipconfig *connman_ipconfig_get_ipv6config(
+   struct connman_ipconfig *ipconfig);
 int connman_ipconfig_set_method(struct connman_ipconfig *ipconfig,
enum connman_ipconfig_method method);
-
 void connman_ipconfig_bind(struct connman_ipconfig *ipconfig

[PATCH] v2 initial commit of static ipv6 support

2010-07-12 Thread martin . xu
From: Martin Xu martin...@intel.com

---
 doc/service-api.txt   |   36 ++
 include/element.h |7 ++
 include/ipconfig.h|   12 ++-
 include/property.h|4 +
 src/connection.c  |   63 +++
 src/connman.h |   13 ++-
 src/element.c |7 ++
 src/inet.c|  273 +++
 src/ipconfig.c|  283 ++---
 src/ipv4.c|   13 ++-
 src/network.c |   75 +-
 src/service.c |  120 +++--
 test/set-ipv6-address |   29 +
 13 files changed, 880 insertions(+), 55 deletions(-)
 create mode 100755 test/set-ipv6-address

diff --git a/doc/service-api.txt b/doc/service-api.txt
index a3e3c10..774c72b 100644
--- a/doc/service-api.txt
+++ b/doc/service-api.txt
@@ -353,6 +353,42 @@ Properties string State [readonly]
until the new configuration has been successfully
installed.
 
+   dict IPv6 [readonly]
+
+   string Method [readonly]
+
+   Possible values are dhcp, manual
+   and off.
+
+   The value fixed indicates an IP address
+   that can not be modified. For example
+   cellular networks return fixed information.
+
+   dhcp is not supported currently.
+
+   string Address [readonly]
+
+   The current configured IPv6 address.
+
+   string PrefixLength [readonly]
+
+   The prefix length of the IPv6 address.
+
+   string Gateway [readonly]
+
+   The current configured IPv6 gateway.
+
+   dict IPv6.Configuration [readwrite]
+
+   Same values as IPv6 property. The IPv6 represents
+   the actual system configuration while this allows
+   user configuration.
+
+   Changing these settings will cause a state change
+   of the service. The service will become unavailable
+   until the new configuration has been successfully
+   installed.
+
dict Proxy [readonly]
 
string Method [readonly]
diff --git a/include/element.h b/include/element.h
index eab567e..e6a7608 100644
--- a/include/element.h
+++ b/include/element.h
@@ -109,6 +109,13 @@ struct connman_element {
gchar *timeserver;
gchar *pac;
} ipv4;
+
+   struct {
+   enum connman_ipconfig_method method;
+   gchar *address;
+   gchar *gateway;
+   gchar *network;
+   } ipv6;
 };
 
 struct connman_element *connman_element_create(const char *name);
diff --git a/include/ipconfig.h b/include/ipconfig.h
index 0b70252..aa157b8 100644
--- a/include/ipconfig.h
+++ b/include/ipconfig.h
@@ -86,9 +86,19 @@ const char *connman_ipconfig_get_ifname(struct 
connman_ipconfig *ipconfig);
 
 void connman_ipconfig_set_ops(struct connman_ipconfig *ipconfig,
const struct connman_ipconfig_ops *ops);
-
+struct connman_ipconfig *connman_ipconfig_get_ipv6config(
+   struct connman_ipconfig *ipconfig);
 int connman_ipconfig_set_method(struct connman_ipconfig *ipconfig,
enum connman_ipconfig_method method);
+int connman_inet_set_ipv6_address(int index,
+   struct connman_ipaddress *ipaddress);
+int connman_inet_clear_ipv6_address(int index,
+   const char *address, int prefix_len);
+int connman_inet_add_ipv6_host_route(int index, const char *host);
+int connman_inet_del_ipv6_host_route(int index, const char *host);
+
+int connman_inet_set_ipv6_gateway_address(int index, const char *gateway);
+int connman_inet_clear_ipv6_gateway_address(int index, const char *gateway);
 
 void connman_ipconfig_bind(struct connman_ipconfig *ipconfig,
struct connman_ipaddress *ipaddress);
diff --git a/include/property.h b/include/property.h
index c7f2a7b..faf9462 100644
--- a/include/property.h
+++ b/include/property.h
@@ -48,6 +48,10 @@ enum connman_property_id {
CONNMAN_PROPERTY_ID_IPV4_NAMESERVER,
CONNMAN_PROPERTY_ID_IPV4_TIMESERVER,
CONNMAN_PROPERTY_ID_IPV4_PAC,
+
+   CONNMAN_PROPERTY_ID_IPV6_METHOD,
+   CONNMAN_PROPERTY_ID_IPV6_ADDRESS,
+   CONNMAN_PROPERTY_ID_IPV6_GATEWAY,
 };
 
 enum connman_property_type {
diff --git a/src/connection.c b/src/connection.c
index 154076b..151bdf3 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -31,7 +31,8 @@
 
 struct gateway_data {
int index;
-   char *gateway;
+   char *ipv4_gateway;
+   char *ipv6_gateway

[PATCH 1/1] Export Gateway from service properties ipv4

2010-05-07 Thread martin . xu
From: Martin Xu martin...@intel.com

---
 src/ipconfig.c |3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/src/ipconfig.c b/src/ipconfig.c
index 4e4e095..5b51ef0 100644
--- a/src/ipconfig.c
+++ b/src/ipconfig.c
@@ -1148,6 +1148,9 @@ void __connman_ipconfig_append_ipv4config(struct 
connman_ipconfig *ipconfig,
mask = inet_ntoa(netmask);
connman_dbus_dict_append_basic(iter, Netmask,
DBUS_TYPE_STRING, mask);
+
+   connman_dbus_dict_append_basic(iter, Gateway,
+   DBUS_TYPE_STRING, ipconfig-address-gateway);
}
 }
 
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/1] Set network associating as FALSE at function pan_disconnect()

2010-04-28 Thread martin . xu
From: Martin Xu martin...@intel.com

Otherwise, connman_network_set_connected() takes normal service
disconnect as connecting failure.
---
 plugins/bluetooth.c |2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/plugins/bluetooth.c b/plugins/bluetooth.c
index fabc75f..4533d7a 100644
--- a/plugins/bluetooth.c
+++ b/plugins/bluetooth.c
@@ -237,6 +237,8 @@ static int pan_disconnect(struct connman_network *network)
 
connman_network_ref(network);
 
+   connman_network_set_associating(network, FALSE);
+
dbus_pending_call_set_notify(call, disconnect_reply, network, NULL);
 
dbus_message_unref(message);
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/1] Check error before call dbus_message_get_args to acquire arguments.

2010-04-27 Thread martin . xu
From: Martin Xu martin...@intel.com

Function dbus_message_get_args just checks the signature which may
happens to be s(string), then it will just return TRUE, and the error
message is treated as return value.
So dbus_set_error_from_message is used to check the error, before
call dbus_message_get_args.
---
 plugins/bluetooth.c |   30 +-
 1 files changed, 29 insertions(+), 1 deletions(-)

diff --git a/plugins/bluetooth.c b/plugins/bluetooth.c
index 1c0fa96..fabc75f 100644
--- a/plugins/bluetooth.c
+++ b/plugins/bluetooth.c
@@ -89,6 +89,12 @@ static void connect_reply(DBusPendingCall *call, void 
*user_data)
 
dbus_error_init(error);
 
+   if (dbus_set_error_from_message(error, reply) == TRUE) {
+   connman_error(%s, error.message);
+   dbus_error_free(error);
+   goto done;
+   }
+
if (dbus_message_get_args(reply, error,
DBUS_TYPE_STRING, interface,
DBUS_TYPE_INVALID) == FALSE) {
@@ -171,6 +177,12 @@ static void disconnect_reply(DBusPendingCall *call, void 
*user_data)
 
dbus_error_init(error);
 
+   if (dbus_set_error_from_message(error, reply) == TRUE) {
+   connman_error(%s, error.message);
+   dbus_error_free(error);
+   goto done;
+   }
+
if (dbus_message_get_args(reply, error, DBUS_TYPE_INVALID) == FALSE) {
if (dbus_error_is_set(error) == TRUE) {
connman_error(%s, error.message);
@@ -625,6 +637,12 @@ static void list_adapters_reply(DBusPendingCall *call, 
void *user_data)
 
dbus_error_init(error);
 
+   if (dbus_set_error_from_message(error, reply) == TRUE) {
+   connman_error(%s, error.message);
+   dbus_error_free(error);
+   goto done;
+   }
+
if (dbus_message_get_args(reply, error,
DBUS_TYPE_ARRAY, DBUS_TYPE_OBJECT_PATH,
adapters, num_adapters,
@@ -717,14 +735,24 @@ static void bluetooth_remove(struct connman_device 
*device)
 
 static void powered_reply(DBusPendingCall *call, void *user_data)
 {
+   DBusError error;
DBusMessage *reply;
 
DBG();
 
reply = dbus_pending_call_steal_reply(call);
 
-   dbus_message_unref(reply);
+   dbus_error_init(error);
 
+   if (dbus_set_error_from_message(error, reply) == TRUE) {
+   connman_error(%s, error.message);
+   dbus_error_free(error);
+   dbus_message_unref(reply);
+   dbus_pending_call_unref(call);
+   return;
+   }
+
+   dbus_message_unref(reply);
dbus_pending_call_unref(call);
 
add_adapter(connection, user_data);
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/1] Check error before call dbus_message_get_args to acquire arguments.

2010-04-26 Thread martin . xu
From: Martin Xu martin...@intel.com

Function dbus_message_get_args just checks the signature which may
happens to be s(string), then it will just return TRUE, and the error
message is treated as return value.
So dbus_set_error_from_message is used to check the error, before
call dbus_message_get_args.
---
 plugins/bluetooth.c |   35 ++-
 1 files changed, 34 insertions(+), 1 deletions(-)

diff --git a/plugins/bluetooth.c b/plugins/bluetooth.c
index 1c0fa96..4c5fd6d 100644
--- a/plugins/bluetooth.c
+++ b/plugins/bluetooth.c
@@ -89,6 +89,13 @@ static void connect_reply(DBusPendingCall *call, void 
*user_data)
 
dbus_error_init(error);
 
+   if (dbus_set_error_from_message(error, reply) == TRUE) {
+   connman_error(%s, error.message);
+   dbus_error_free(error);
+
+   goto done;
+   }
+
if (dbus_message_get_args(reply, error,
DBUS_TYPE_STRING, interface,
DBUS_TYPE_INVALID) == FALSE) {
@@ -171,6 +178,13 @@ static void disconnect_reply(DBusPendingCall *call, void 
*user_data)
 
dbus_error_init(error);
 
+   if (dbus_set_error_from_message(error, reply) == TRUE) {
+   connman_error(%s, error.message);
+   dbus_error_free(error);
+
+   goto done;
+   }
+
if (dbus_message_get_args(reply, error, DBUS_TYPE_INVALID) == FALSE) {
if (dbus_error_is_set(error) == TRUE) {
connman_error(%s, error.message);
@@ -625,6 +639,13 @@ static void list_adapters_reply(DBusPendingCall *call, 
void *user_data)
 
dbus_error_init(error);
 
+   if (dbus_set_error_from_message(error, reply) == TRUE) {
+   connman_error(%s, error.message);
+   dbus_error_free(error);
+
+   goto done;
+   }
+
if (dbus_message_get_args(reply, error,
DBUS_TYPE_ARRAY, DBUS_TYPE_OBJECT_PATH,
adapters, num_adapters,
@@ -717,14 +738,26 @@ static void bluetooth_remove(struct connman_device 
*device)
 
 static void powered_reply(DBusPendingCall *call, void *user_data)
 {
+   DBusError error;
DBusMessage *reply;
 
DBG();
 
reply = dbus_pending_call_steal_reply(call);
 
-   dbus_message_unref(reply);
+   dbus_error_init(error);
+
+   if (dbus_set_error_from_message(error, reply) == TRUE) {
+   connman_error(%s, error.message);
+   dbus_error_free(error);
 
+   dbus_message_unref(reply);
+   dbus_pending_call_unref(call);
+
+   return;
+   }
+
+   dbus_message_unref(reply);
dbus_pending_call_unref(call);
 
add_adapter(connection, user_data);
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/1] Remove the access of status property of DataConnectionManager from oFono

2010-04-13 Thread martin . xu
From: Martin Xu martin...@intel.com

The status property has been removed from oFono post oFono 0.20
---
 plugins/ofono.c |   12 
 1 files changed, 0 insertions(+), 12 deletions(-)

diff --git a/plugins/ofono.c b/plugins/ofono.c
index 2ad01f2..2e47ce6 100644
--- a/plugins/ofono.c
+++ b/plugins/ofono.c
@@ -777,11 +777,6 @@ static void check_networks_reply(DBusPendingCall *call, 
void *user_data)
contexts = value;
add_default_context(contexts, path,
CONTEXT_NAME, CONTEXT_TYPE);
-   } else if (g_str_equal(key, Status) == TRUE) {
-   const char *status;
-
-   dbus_message_iter_get_basic(value, status);
-   /* FIXME: add roaming support */
} else if (g_str_equal(key, Powered) == TRUE) {
dbus_bool_t powered;
 
@@ -1377,13 +1372,6 @@ static gboolean gprs_changed(DBusConnection *connection, 
DBusMessage *message,
else if (modem-device != NULL)
connman_device_remove_all_networks(modem-device);
 
-   } else if (g_str_equal(key, Status) == TRUE) {
-   const char *status;
-   dbus_message_iter_get_basic(value, status);
-
-   DBG(status %s, status);
-
-   /* FIXME: add roaming support */
} else if (g_str_equal(key, PrimaryContexts) == TRUE) {
check_networks(modem);
} else if (g_str_equal(key, Powered) == TRUE) {
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/4] Add help function __connman_ipconfig_set_index()

2010-04-12 Thread martin . xu
From: Martin Xu martin...@intel.com

---
 src/connman.h  |1 +
 src/ipconfig.c |5 +
 2 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/src/connman.h b/src/connman.h
index d2de80a..16ded2d 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -215,6 +215,7 @@ void __connman_ipconfig_foreach(void (*function) (int 
index, void *user_data),
 unsigned short __connman_ipconfig_get_type(int index);
 unsigned int __connman_ipconfig_get_flags(int index);
 const char *__connman_ipconfig_get_gateway(int index);
+void __connman_ipconfig_set_index(struct connman_ipconfig *ipconfig, int 
index);
 
 int __connman_ipconfig_enable(struct connman_ipconfig *ipconfig);
 int __connman_ipconfig_disable(struct connman_ipconfig *ipconfig);
diff --git a/src/ipconfig.c b/src/ipconfig.c
index 9529846..4e4e095 100644
--- a/src/ipconfig.c
+++ b/src/ipconfig.c
@@ -715,6 +715,11 @@ const char *__connman_ipconfig_get_gateway(int index)
return ipdevice-gateway;
 }
 
+void __connman_ipconfig_set_index(struct connman_ipconfig *ipconfig, int index)
+{
+   ipconfig-index = index;
+}
+
 /**
  * connman_ipconfig_create:
  *
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 2/4] Reset the index of ipconfig in function connman_network_set_index()

2010-04-12 Thread martin . xu
From: Martin Xu martin...@intel.com

Otherwise, the following operation of ipconfig will be wrong.
The issue was found when setting static ip of panu, the index of bnep
device may change, while the index was not be reset, conquently the
invalid index was used to set static ip and leaded to error.
---
 src/network.c |   19 ++-
 1 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/src/network.c b/src/network.c
index fc4cd01..6ee9af8 100644
--- a/src/network.c
+++ b/src/network.c
@@ -446,19 +446,28 @@ const char *connman_network_get_path(struct 
connman_network *network)
  */
 void connman_network_set_index(struct connman_network *network, int index)
 {
-   if (network-element.index  0) {
-   struct connman_service *service;
+   struct connman_service *service;
 
+   service = __connman_service_lookup_from_network(network);
+   if (service == NULL)
+   goto done;
+
+   if (network-element.index  0)
/*
 * This is needed for plugins that havent set their ipconfig
 * layer yet, due to not being able to get a network index
 * prior to creating a service.
 */
-   service = __connman_service_lookup_from_network(network);
-   if (service != NULL)
-   __connman_service_create_ipconfig(service, index);
+   __connman_service_create_ipconfig(service, index);
+   else {
+   struct connman_ipconfig *ipconfig;
+
+   /* If index changed, the index of ipconfig must be reset. */
+   ipconfig = __connman_service_get_ipconfig(service);
+   __connman_ipconfig_set_index(ipconfig, index);
}
 
+done:
network-element.index = index;
 }
 
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 4/4] Remove the setting of method from connect_reply()

2010-04-12 Thread martin . xu
From: Martin Xu martin...@intel.com

The method has been set at connman_network_set_index(), where the default
DHCP method will be used if it is not be set to other method before.
---
 plugins/bluetooth.c |2 --
 1 files changed, 0 insertions(+), 2 deletions(-)

diff --git a/plugins/bluetooth.c b/plugins/bluetooth.c
index ee91b7f..1c0fa96 100644
--- a/plugins/bluetooth.c
+++ b/plugins/bluetooth.c
@@ -109,8 +109,6 @@ static void connect_reply(DBusPendingCall *call, void 
*user_data)
 
connman_network_set_index(network, index);
 
-   connman_network_set_method(network, CONNMAN_IPCONFIG_METHOD_DHCP);
-
connman_network_set_connected(network, TRUE);
 
 done:
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 2/3] Add static gateway support

2010-03-24 Thread martin . xu
From: Martin Xu martin...@intel.com

---
 src/connection.c |5 +-
 src/connman.h|  108 +++--
 src/ipconfig.c   |   18 +
 src/network.c|2 +
 4 files changed, 78 insertions(+), 55 deletions(-)

diff --git a/src/connection.c b/src/connection.c
index a46c372..6dfb6d9 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -249,8 +249,9 @@ static int connection_probe(struct connman_element *element)
if (element-parent == NULL)
return -ENODEV;
 
-   if (element-parent-type != CONNMAN_ELEMENT_TYPE_IPV4)
-   return -ENODEV;
+   /* FIXME: Remove temporarily for the static gateway support */
+   /* if (element-parent-type != CONNMAN_ELEMENT_TYPE_IPV4)
+   return -ENODEV; */
 
connman_element_get_value(element,
CONNMAN_PROPERTY_ID_IPV4_GATEWAY, gateway);
diff --git a/src/connman.h b/src/connman.h
index f754a6b..af53a68 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -108,59 +108,6 @@ void __connman_task_cleanup(void);
 int __connman_security_check_privilege(DBusMessage *message,
enum connman_security_privilege privilege);
 
-#include connman/ipconfig.h
-
-int __connman_ipconfig_init(void);
-void __connman_ipconfig_cleanup(void);
-
-struct rtnl_link_stats;
-
-void __connman_ipconfig_newlink(int index, unsigned short type,
-   unsigned int flags, const char *address,
-   unsigned short mtu,
-   struct rtnl_link_stats *stats);
-void __connman_ipconfig_dellink(int index, struct rtnl_link_stats *stats);
-void __connman_ipconfig_newaddr(int index, const char *label,
-   unsigned char prefixlen, const char *address);
-void __connman_ipconfig_deladdr(int index, const char *label,
-   unsigned char prefixlen, const char *address);
-void __connman_ipconfig_newroute(int index, unsigned char scope,
-   const char *dst, const char *gateway);
-void __connman_ipconfig_delroute(int index, unsigned char scope,
-   const char *dst, const char *gateway);
-
-void __connman_ipconfig_foreach(void (*function) (int index, void *user_data),
-   void *user_data);
-unsigned short __connman_ipconfig_get_type(int index);
-unsigned int __connman_ipconfig_get_flags(int index);
-const char *__connman_ipconfig_get_gateway(int index);
-
-int __connman_ipconfig_enable(struct connman_ipconfig *ipconfig);
-int __connman_ipconfig_disable(struct connman_ipconfig *ipconfig);
-
-const char *__connman_ipconfig_method2string(enum connman_ipconfig_method 
method);
-enum connman_ipconfig_method __connman_ipconfig_string2method(const char 
*method);
-
-void __connman_ipconfig_append_ipv4(struct connman_ipconfig *ipconfig,
-   DBusMessageIter *iter);
-void __connman_ipconfig_append_ipv4config(struct connman_ipconfig *ipconfig,
-   DBusMessageIter *iter);
-int __connman_ipconfig_set_ipv4config(struct connman_ipconfig *ipconfig,
-   DBusMessageIter *value);
-void __connman_ipconfig_append_proxy(struct connman_ipconfig *ipconfig,
-   DBusMessageIter *iter);
-void __connman_ipconfig_append_ethernet(struct connman_ipconfig *ipconfig,
-   DBusMessageIter *iter);
-enum connman_ipconfig_method __connman_ipconfig_get_method(
-   struct connman_ipconfig *ipconfig);
-int __connman_ipconfig_set_address(struct connman_ipconfig *ipconfig);
-int __connman_ipconfig_clear_address(struct connman_ipconfig *ipconfig);
-
-int __connman_ipconfig_load(struct connman_ipconfig *ipconfig,
-   GKeyFile *keyfile, const char *identifier, const char *prefix);
-int __connman_ipconfig_save(struct connman_ipconfig *ipconfig,
-   GKeyFile *keyfile, const char *identifier, const char *prefix);
-
 #include connman/inet.h
 
 enum connman_device_type __connman_inet_get_device_type(int index);
@@ -242,6 +189,61 @@ int __connman_element_disable_technology(enum 
connman_service_type type);
 
 gboolean __connman_element_device_isfiltered(const char *devname);
 
+#include connman/ipconfig.h
+
+int __connman_ipconfig_init(void);
+void __connman_ipconfig_cleanup(void);
+
+struct rtnl_link_stats;
+
+void __connman_ipconfig_newlink(int index, unsigned short type,
+   unsigned int flags, const char *address,
+   unsigned short mtu,
+   struct rtnl_link_stats *stats);
+void

[PATCH 1/3] Add gateway to connman_ipaddress

2010-03-24 Thread martin . xu
From: Martin Xu martin...@intel.com

---
 include/ipconfig.h |3 ++-
 src/ipconfig.c |   39 +--
 2 files changed, 35 insertions(+), 7 deletions(-)

diff --git a/include/ipconfig.h b/include/ipconfig.h
index 8e99c6d..0b70252 100644
--- a/include/ipconfig.h
+++ b/include/ipconfig.h
@@ -37,12 +37,13 @@ struct connman_ipaddress {
char *local;
char *peer;
char *broadcast;
+   char *gateway;
 };
 
 struct connman_ipaddress *connman_ipaddress_alloc(void);
 void connman_ipaddress_free(struct connman_ipaddress *ipaddress);
 void connman_ipaddress_set(struct connman_ipaddress *ipaddress,
-   const char *address, const char *netmask);
+   const char *address, const char *netmask, const char *gateway);
 void connman_ipaddress_clear(struct connman_ipaddress *ipaddress);
 void connman_ipaddress_copy(struct connman_ipaddress *ipaddress,
struct connman_ipaddress *source);
diff --git a/src/ipconfig.c b/src/ipconfig.c
index 87f7c41..26380d8 100644
--- a/src/ipconfig.c
+++ b/src/ipconfig.c
@@ -90,6 +90,7 @@ void connman_ipaddress_free(struct connman_ipaddress 
*ipaddress)
g_free(ipaddress-broadcast);
g_free(ipaddress-peer);
g_free(ipaddress-local);
+   g_free(ipaddress-gateway);
g_free(ipaddress);
 }
 
@@ -110,7 +111,7 @@ static unsigned char netmask2prefixlen(const char *netmask)
 }
 
 void connman_ipaddress_set(struct connman_ipaddress *ipaddress,
-   const char *address, const char *netmask)
+   const char *address, const char *netmask, const char *gateway)
 {
if (ipaddress == NULL)
return;
@@ -122,6 +123,9 @@ void connman_ipaddress_set(struct connman_ipaddress 
*ipaddress,
 
g_free(ipaddress-local);
ipaddress-local = g_strdup(address);
+
+   g_free(ipaddress-gateway);
+   ipaddress-gateway = g_strdup(gateway);
 }
 
 void connman_ipaddress_clear(struct connman_ipaddress *ipaddress)
@@ -139,6 +143,9 @@ void connman_ipaddress_clear(struct connman_ipaddress 
*ipaddress)
 
g_free(ipaddress-broadcast);
ipaddress-broadcast = NULL;
+
+   g_free(ipaddress-gateway);
+   ipaddress-gateway = NULL;
 }
 
 void connman_ipaddress_copy(struct connman_ipaddress *ipaddress,
@@ -157,6 +164,9 @@ void connman_ipaddress_copy(struct connman_ipaddress 
*ipaddress,
 
g_free(ipaddress-broadcast);
ipaddress-broadcast = g_strdup(source-broadcast);
+
+   g_free(ipaddress-gateway);
+   ipaddress-gateway = g_strdup(source-gateway);
 }
 
 static void free_address_list(struct connman_ipdevice *ipdevice)
@@ -1122,7 +1132,7 @@ int __connman_ipconfig_set_ipv4config(struct 
connman_ipconfig *ipconfig,
DBusMessageIter *array)
 {
enum connman_ipconfig_method method = CONNMAN_IPCONFIG_METHOD_UNKNOWN;
-   const char *address = NULL, *netmask = NULL;
+   const char *address = NULL, *netmask = NULL, *gateway = NULL;
DBusMessageIter dict;
 
DBG(ipconfig %p, ipconfig);
@@ -1165,12 +1175,17 @@ int __connman_ipconfig_set_ipv4config(struct 
connman_ipconfig *ipconfig,
return -EINVAL;
 
dbus_message_iter_get_basic(entry, netmask);
-   }
+   } else if (g_str_equal(key, Gateway) == TRUE) {
+   if (type != DBUS_TYPE_STRING)
+   return -EINVAL;
 
+   dbus_message_iter_get_basic(entry, gateway);
+   }
dbus_message_iter_next(dict);
}
 
-   DBG(method %d address %s netmask %s, method, address, netmask);
+   DBG(method %d address %s netmask %s gateway %s,
+   method, address, netmask, gateway);
 
switch (method) {
case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
@@ -1183,7 +1198,8 @@ int __connman_ipconfig_set_ipv4config(struct 
connman_ipconfig *ipconfig,
return -EINVAL;
 
ipconfig-method = method;
-   connman_ipaddress_set(ipconfig-address, address, netmask);
+   connman_ipaddress_set(ipconfig-address,
+   address, netmask, gateway);
break;
 
case CONNMAN_IPCONFIG_METHOD_DHCP:
@@ -1269,6 +1285,11 @@ int __connman_ipconfig_load(struct connman_ipconfig 
*ipconfig,
keyfile, identifier, key, NULL);
g_free(key);
 
+   key = g_strdup_printf(%sgateway, prefix);
+   ipconfig-address-gateway = g_key_file_get_string(
+   keyfile, identifier, key, NULL);
+   g_free(key);
+
return 0;
 }
 
@@ -1306,7 +1327,13 @@ int __connman_ipconfig_save(struct connman_ipconfig 
*ipconfig,
key = g_strdup_printf(%sbroadcast_address, prefix);
if (ipconfig-address

[PATCH 3/3] Set netmask and gateway as the mandatory parameters of test/set-address

2010-03-24 Thread martin . xu
From: Martin Xu martin...@intel.com

---
 test/set-address |   14 +-
 1 files changed, 5 insertions(+), 9 deletions(-)

diff --git a/test/set-address b/test/set-address
index c80eaed..529b635 100755
--- a/test/set-address
+++ b/test/set-address
@@ -3,8 +3,8 @@
 import sys
 import dbus
 
-if (len(sys.argv)  2):
-   print Usage: %s address [netmask] % (sys.argv[0])
+if (len(sys.argv)  3):
+   print Usage: %s address netmask gateway % (sys.argv[0])
sys.exit(1)
 
 bus = dbus.SystemBus()
@@ -22,12 +22,8 @@ for path in properties[Services]:
 
print Setting address %s for %s % (sys.argv[1], path)
 
-   if len(sys.argv)  2:
-   service.SetProperty(IPv4.Configuration,
-   { Method: manual, Address: sys.argv[1],
-   Netmask: sys.argv[2] })
-   else:
-   service.SetProperty(IPv4.Configuration,
-   { Method: manual, Address: sys.argv[1] })
+   service.SetProperty(IPv4.Configuration,
+   { Method: manual, Address: sys.argv[1],
+   Netmask: sys.argv[2], Gateway: sys.argv[3]})
 
print
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/2] Use udev_device_get_devtype and __connman_inet_get_device_type

2010-03-23 Thread martin . xu
From: Martin Xu martin...@intel.com

We can not just use __connman_inet_get_device_type to acquire
connman_device_type, because it can't decide the Wireless WAN device and
Ethernet device. consequently, when inserting 3G card such as Dell 5530/5540
the 3G service and wired service will show at the same time and ConnMan
will mess up.
udev_device_get_devtype can get the devtype, such as Wireless WAN and
Wireless LAN device. But at some cases it just return NULL to Ethernet and
Bluetooth device. At this case, __connman_inet_get_device_type is used to
decide the Ethernet and Bluetooth device.
---
 src/udev.c |   32 +++-
 1 files changed, 31 insertions(+), 1 deletions(-)

diff --git a/src/udev.c b/src/udev.c
index fe814b8..c1cc490 100644
--- a/src/udev.c
+++ b/src/udev.c
@@ -54,6 +54,30 @@ static struct connman_device *find_device(int index)
return NULL;
 }
 
+static enum connman_device_type string2devtype(const char *devtype)
+{
+   if (g_strcmp0(devtype, wwan) == 0)
+   return CONNMAN_DEVICE_TYPE_CELLULAR;
+   else if (g_strcmp0(devtype, wlan) == 0)
+   return CONNMAN_DEVICE_TYPE_WIFI;
+   else if (g_strcmp0(devtype, wimax) == 0)
+   return CONNMAN_DEVICE_TYPE_WIMAX;
+
+   return CONNMAN_DEVICE_TYPE_UNKNOWN;
+}
+
+static enum connman_device_type get_device_type(
+   struct udev_device *udev_device, int index)
+{
+   const char *devtype = NULL;
+
+   devtype = udev_device_get_devtype(udev_device);
+   if (devtype == NULL)
+   return __connman_inet_get_device_type(index);
+
+   return string2devtype(devtype);
+}
+
 static void add_net_device(struct udev_device *udev_device)
 {
struct udev_list_entry *entry;
@@ -84,7 +108,10 @@ static void add_net_device(struct udev_device *udev_device)
if (index  0)
return;
 
-   devtype = __connman_inet_get_device_type(index);
+
+   devtype = get_device_type(udev_device, index);
+
+   DBG(devtype %d, devtype);
 
switch (devtype) {
case CONNMAN_DEVICE_TYPE_UNKNOWN:
@@ -325,6 +352,9 @@ static void print_device(struct udev_device *device, const 
char *action)
}
 
devtype = udev_device_get_devtype(device);
+
+   DBG(devtype %s, devtype);
+
sysname = udev_device_get_sysname(device);
 
driver = udev_device_get_driver(parent);
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/2] Use udev_device_get_devtype and __connman_inet_get_device_type

2010-03-23 Thread martin . xu
From: Martin Xu martin...@intel.com

__connman_inet_get_device_type can't be used to acquire connman_device_type
by itself, because it can't decide the Wireless WAN device and
Ethernet device. consequently, when inserting 3G card such as Dell 5530/5540
the 3G service and wired service will show at the same time and ConnMan
will mess up.
udev_device_get_devtype can get the devtype, such as Wireless WAN and
Wireless LAN device. But at some cases it just return NULL to Ethernet and
Bluetooth device. At this case, __connman_inet_get_device_type is used to
decide the Ethernet and Bluetooth device.
---
 src/udev.c |   32 +++-
 1 files changed, 31 insertions(+), 1 deletions(-)

diff --git a/src/udev.c b/src/udev.c
index fe814b8..ed17923 100644
--- a/src/udev.c
+++ b/src/udev.c
@@ -54,6 +54,30 @@ static struct connman_device *find_device(int index)
return NULL;
 }
 
+static enum connman_device_type string2devtype(const char *devtype)
+{
+   if (g_strcmp0(devtype, wlan) == 0)
+   return CONNMAN_DEVICE_TYPE_WIFI;
+   else if (g_strcmp0(devtype, wimax) == 0)
+   return CONNMAN_DEVICE_TYPE_WIMAX;
+   else if (g_strcmp0(devtype, wwan) == 0)
+   return CONNMAN_DEVICE_TYPE_CELLULAR;
+
+   return CONNMAN_DEVICE_TYPE_UNKNOWN;
+}
+
+static enum connman_device_type get_device_type(
+   struct udev_device *udev_device, int index)
+{
+   const char *devtype;
+
+   devtype = udev_device_get_devtype(udev_device);
+   if (devtype == NULL)
+   return __connman_inet_get_device_type(index);
+
+   return string2devtype(devtype);
+}
+
 static void add_net_device(struct udev_device *udev_device)
 {
struct udev_list_entry *entry;
@@ -84,7 +108,10 @@ static void add_net_device(struct udev_device *udev_device)
if (index  0)
return;
 
-   devtype = __connman_inet_get_device_type(index);
+
+   devtype = get_device_type(udev_device, index);
+
+   DBG(devtype %d, devtype);
 
switch (devtype) {
case CONNMAN_DEVICE_TYPE_UNKNOWN:
@@ -325,6 +352,9 @@ static void print_device(struct udev_device *device, const 
char *action)
}
 
devtype = udev_device_get_devtype(device);
+
+   DBG(devtype %s, devtype);
+
sysname = udev_device_get_sysname(device);
 
driver = udev_device_get_driver(parent);
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/2] Use udev_device_get_devtype and __connman_inet_get_device_type

2010-03-23 Thread martin . xu
From: Martin Xu martin...@intel.com

__connman_inet_get_device_type can't be used to acquire connman_device_type
by itself, because it can't decide the Wireless WAN device and
Ethernet device. consequently, when inserting 3G card such as Dell 5530/5540
the 3G service and wired service will show at the same time and ConnMan
will mess up.
udev_device_get_devtype can get the devtype, such as Wireless WAN and
Wireless LAN device. But at some cases it just return NULL to Ethernet and
Bluetooth device. At this case, __connman_inet_get_device_type is used to
decide the Ethernet and Bluetooth device.
---
 src/udev.c |   31 ++-
 1 files changed, 30 insertions(+), 1 deletions(-)

diff --git a/src/udev.c b/src/udev.c
index fe814b8..79df87c 100644
--- a/src/udev.c
+++ b/src/udev.c
@@ -54,6 +54,30 @@ static struct connman_device *find_device(int index)
return NULL;
 }
 
+static enum connman_device_type string2devtype(const char *devtype)
+{
+   if (g_strcmp0(devtype, wlan) == 0)
+   return CONNMAN_DEVICE_TYPE_WIFI;
+   else if (g_strcmp0(devtype, wimax) == 0)
+   return CONNMAN_DEVICE_TYPE_WIMAX;
+   else if (g_strcmp0(devtype, wwan) == 0)
+   return CONNMAN_DEVICE_TYPE_CELLULAR;
+
+   return CONNMAN_DEVICE_TYPE_UNKNOWN;
+}
+
+static enum connman_device_type get_device_type(
+   struct udev_device *udev_device, int index)
+{
+   const char *devtype;
+
+   devtype = udev_device_get_devtype(udev_device);
+   if (devtype == NULL)
+   return __connman_inet_get_device_type(index);
+
+   return string2devtype(devtype);
+}
+
 static void add_net_device(struct udev_device *udev_device)
 {
struct udev_list_entry *entry;
@@ -84,7 +108,9 @@ static void add_net_device(struct udev_device *udev_device)
if (index  0)
return;
 
-   devtype = __connman_inet_get_device_type(index);
+   devtype = get_device_type(udev_device, index);
+
+   DBG(devtype %d, devtype);
 
switch (devtype) {
case CONNMAN_DEVICE_TYPE_UNKNOWN:
@@ -325,6 +351,9 @@ static void print_device(struct udev_device *device, const 
char *action)
}
 
devtype = udev_device_get_devtype(device);
+
+   DBG(devtype %s, devtype);
+
sysname = udev_device_get_sysname(device);
 
driver = udev_device_get_driver(parent);
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/2] Set network-device as NULL when the deivce is destructed

2010-03-22 Thread martin . xu
From: Martin Xu martin...@intel.com

So ofono plugin can decide whether the modem is removed during active 
PrimaryContext
---
 plugins/ofono.c |4 +++-
 src/device.c|2 ++
 src/network.c   |3 ++-
 3 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/plugins/ofono.c b/plugins/ofono.c
index c5521ef..d31e6df 100644
--- a/plugins/ofono.c
+++ b/plugins/ofono.c
@@ -398,8 +398,10 @@ static gboolean pending_network_is_available(
 
/* Modem may be removed during waiting for active reply */
device  = connman_network_get_device(pending_network);
-   if (device == NULL)
+   if (device == NULL) {
+   connman_info(Modem is removed);
return FALSE;
+   }
 
identifier = connman_network_get_identifier(pending_network);
 
diff --git a/src/device.c b/src/device.c
index f9dbe86..6aeed01 100644
--- a/src/device.c
+++ b/src/device.c
@@ -656,6 +656,8 @@ static void unregister_network(gpointer data)
connman_element_unregister((struct connman_element *) network);
 
connman_network_unref(network);
+
+   __connman_network_set_device(network, NULL);
 }
 
 static void device_destruct(struct connman_element *element)
diff --git a/src/network.c b/src/network.c
index 3fca7bb..8fb0ea0 100644
--- a/src/network.c
+++ b/src/network.c
@@ -237,7 +237,8 @@ static void unregister_interface(struct connman_element 
*element)
 
network-registered = FALSE;
 
-   emit_networks_signal(network-device);
+   if (network-device != NULL)
+   emit_networks_signal(network-device);
 
g_dbus_unregister_interface(connection, element-path,
CONNMAN_NETWORK_INTERFACE);
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 2/2] Use udev_device_get_devtype and __connman_inet_get_device_type to get connman_device_type

2010-03-22 Thread martin . xu
From: Martin Xu martin...@intel.com

If udev_device_get_devtype returns the devtype, it will be used after 
tranfering to connman_device_type.
If udev_device_get_devtype returns NULL, __connman_inet_get_device_type is used 
to return connman_device_type.
---
 src/udev.c |   30 +-
 1 files changed, 29 insertions(+), 1 deletions(-)

diff --git a/src/udev.c b/src/udev.c
index fe814b8..51d61f3 100644
--- a/src/udev.c
+++ b/src/udev.c
@@ -54,6 +54,28 @@ static struct connman_device *find_device(int index)
return NULL;
 }
 
+static enum connman_device_type get_device_type(
+   struct udev_device *udev_device, int index)
+{
+   const char *devtype = NULL;
+
+   devtype = udev_device_get_devtype(udev_device);
+
+   if (g_strcmp0(devtype, wwan) == 0)
+   return CONNMAN_DEVICE_TYPE_CELLULAR;
+
+   if (g_strcmp0(devtype, wlan) == 0)
+   return CONNMAN_DEVICE_TYPE_WIFI;
+
+   if (g_strcmp0(devtype, wimax) == 0)
+   return CONNMAN_DEVICE_TYPE_WIMAX;
+
+   if (devtype == NULL)
+   return __connman_inet_get_device_type(index);
+
+   return CONNMAN_DEVICE_TYPE_UNKNOWN;
+}
+
 static void add_net_device(struct udev_device *udev_device)
 {
struct udev_list_entry *entry;
@@ -84,7 +106,10 @@ static void add_net_device(struct udev_device *udev_device)
if (index  0)
return;
 
-   devtype = __connman_inet_get_device_type(index);
+
+   devtype = get_device_type(udev_device, index);
+
+   DBG(devtype %d, devtype);
 
switch (devtype) {
case CONNMAN_DEVICE_TYPE_UNKNOWN:
@@ -325,6 +350,9 @@ static void print_device(struct udev_device *device, const 
char *action)
}
 
devtype = udev_device_get_devtype(device);
+
+   DBG(devtype %s, devtype);
+
sysname = udev_device_get_sysname(device);
 
driver = udev_device_get_driver(parent);
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/1] Use udev_device_get_devtype and __connman_inet_get_device_type

2010-03-22 Thread martin . xu
From: Martin Xu martin...@intel.com

We can not just use __connman_inet_get_device_type to acquire
connman_device_type, becuase it can't decide the wwan device and
eth device. consequently, when inserting 3G card such as Dell 5530/5540
the 3G service and wired service will show at the same time and ConnMan
will mess up.
udev_device_get_devtype can get the devtype, such as wwan and wlan device.
But at some cases it just return NULL to eth and bluetooth device.
At this case, __connman_inet_get_device_type is used to decide the
eth and bluetooth device.
---
 src/udev.c |   27 ++-
 1 files changed, 26 insertions(+), 1 deletions(-)

diff --git a/src/udev.c b/src/udev.c
index fe814b8..c16b523 100644
--- a/src/udev.c
+++ b/src/udev.c
@@ -54,6 +54,25 @@ static struct connman_device *find_device(int index)
return NULL;
 }
 
+static enum connman_device_type get_device_type(
+   struct udev_device *udev_device, int index)
+{
+   const char *devtype = NULL;
+
+   devtype = udev_device_get_devtype(udev_device);
+
+   if (devtype == NULL)
+   return __connman_inet_get_device_type(index);
+   else if (g_strcmp0(devtype, wwan) == 0)
+   return CONNMAN_DEVICE_TYPE_CELLULAR;
+   else if (g_strcmp0(devtype, wlan) == 0)
+   return CONNMAN_DEVICE_TYPE_WIFI;
+   else if (g_strcmp0(devtype, wimax) == 0)
+   return CONNMAN_DEVICE_TYPE_WIMAX;
+
+   return CONNMAN_DEVICE_TYPE_UNKNOWN;
+}
+
 static void add_net_device(struct udev_device *udev_device)
 {
struct udev_list_entry *entry;
@@ -84,7 +103,10 @@ static void add_net_device(struct udev_device *udev_device)
if (index  0)
return;
 
-   devtype = __connman_inet_get_device_type(index);
+
+   devtype = get_device_type(udev_device, index);
+
+   DBG(devtype %d, devtype);
 
switch (devtype) {
case CONNMAN_DEVICE_TYPE_UNKNOWN:
@@ -325,6 +347,9 @@ static void print_device(struct udev_device *device, const 
char *action)
}
 
devtype = udev_device_get_devtype(device);
+
+   DBG(devtype %s, devtype);
+
sysname = udev_device_get_sysname(device);
 
driver = udev_device_get_driver(parent);
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/1] Set network-device as NULL when the deivce is destructed

2010-03-22 Thread martin . xu
From: Martin Xu martin...@intel.com

oFono plugin can use network-device to decide whether
the modem is removed during active PrimaryContext. And fix
the segmenation issue when removing 3G modem.
---
 plugins/ofono.c |4 +++-
 src/device.c|2 ++
 src/network.c   |3 ++-
 3 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/plugins/ofono.c b/plugins/ofono.c
index c5521ef..2ad01f2 100644
--- a/plugins/ofono.c
+++ b/plugins/ofono.c
@@ -398,8 +398,10 @@ static gboolean pending_network_is_available(
 
/* Modem may be removed during waiting for active reply */
device  = connman_network_get_device(pending_network);
-   if (device == NULL)
+   if (device == NULL) {
+   DBG(Modem is removed);
return FALSE;
+   }
 
identifier = connman_network_get_identifier(pending_network);
 
diff --git a/src/device.c b/src/device.c
index f9dbe86..6aeed01 100644
--- a/src/device.c
+++ b/src/device.c
@@ -656,6 +656,8 @@ static void unregister_network(gpointer data)
connman_element_unregister((struct connman_element *) network);
 
connman_network_unref(network);
+
+   __connman_network_set_device(network, NULL);
 }
 
 static void device_destruct(struct connman_element *element)
diff --git a/src/network.c b/src/network.c
index 3fca7bb..8fb0ea0 100644
--- a/src/network.c
+++ b/src/network.c
@@ -237,7 +237,8 @@ static void unregister_interface(struct connman_element 
*element)
 
network-registered = FALSE;
 
-   emit_networks_signal(network-device);
+   if (network-device != NULL)
+   emit_networks_signal(network-device);
 
g_dbus_unregister_interface(connection, element-path,
CONNMAN_NETWORK_INTERFACE);
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/2] Correct the modem properties key name

2010-03-19 Thread martin . xu
From: Martin Xu martin...@intel.com

---
 plugins/ofono.c |2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/plugins/ofono.c b/plugins/ofono.c
index 75c4ca5..960753b 100644
--- a/plugins/ofono.c
+++ b/plugins/ofono.c
@@ -1089,7 +1089,7 @@ static void modem_properties_reply(DBusPendingCall *call, 
void *user_data)
modem_change_powered(path, TRUE);
break;
}
-   } else if (g_str_equal(key, Interface) == TRUE) {
+   } else if (g_str_equal(key, Interfaces) == TRUE) {
if (modem_has_gprs(value) == TRUE)
get_imsi(path);
}
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 2/2] Handle the case that MobileNetworkCodeLength is not provided by oFono

2010-03-19 Thread martin . xu
From: Martin Xu martin...@intel.com

ConnMan will not provide MNC and MCC at this case, but the 3G service
will still be created.
---
 plugins/ofono.c |   31 ---
 1 files changed, 16 insertions(+), 15 deletions(-)

diff --git a/plugins/ofono.c b/plugins/ofono.c
index 960753b..c5521ef 100644
--- a/plugins/ofono.c
+++ b/plugins/ofono.c
@@ -632,14 +632,15 @@ static void add_network(struct connman_device *device, 
const char *path)
connman_network_set_index(network, -1);
 
mcc_mnc = connman_device_get_string(device, MCC_MNC);
-
-   mcc = g_strndup(mcc_mnc, 3);
-   connman_network_set_string(network, Cellular.MCC, mcc);
-   g_free(mcc);
-
-   mnc = g_strdup(mcc_mnc + 3);
-   connman_network_set_string(network, Cellular.MNC, mnc);
-   g_free(mnc);
+   if (mcc_mnc != NULL) {
+   mcc = g_strndup(mcc_mnc, 3);
+   connman_network_set_string(network, Cellular.MCC, mcc);
+   g_free(mcc);
+
+   mnc = g_strdup(mcc_mnc + 3);
+   connman_network_set_string(network, Cellular.MNC, mnc);
+   g_free(mnc);
+   }
 
connman_device_add_network(device, network);
 }
@@ -854,9 +855,6 @@ static void add_device(const char *path, const char *imsi,
if (imsi == NULL)
return;
 
-   if (mnc_length != 2  mnc_length != 3)
-   return;
-
modem = g_hash_table_lookup(modem_hash, path);
if (modem == NULL)
return;
@@ -871,9 +869,11 @@ static void add_device(const char *path, const char *imsi,
 
connman_device_set_string(device, Path, path);
 
-   mcc_mnc = g_strndup(imsi, mnc_length + 3);
-   connman_device_set_string(device, MCC_MNC, mcc_mnc);
-   g_free(mcc_mnc);
+   if (mnc_length == 2 || mnc_length == 3) {
+   mcc_mnc = g_strndup(imsi, mnc_length + 3);
+   connman_device_set_string(device, MCC_MNC, mcc_mnc);
+   g_free(mcc_mnc);
+   }
 
if (connman_device_register(device)  0) {
connman_device_unref(device);
@@ -889,7 +889,8 @@ static void sim_properties_reply(DBusPendingCall *call, 
void *user_data)
 {
const char *path = user_data;
const char *imsi;
-   unsigned char mnc_length;
+   /* If MobileNetworkCodeLength is not provided, mnc_length is 0 */
+   unsigned char mnc_length = 0;
DBusMessage *reply;
DBusMessageIter array, dict;
 
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/1] export MCC and MNC

2010-03-08 Thread Martin Xu
---
 plugins/ofono.c |   41 +
 1 files changed, 33 insertions(+), 8 deletions(-)

diff --git a/plugins/ofono.c b/plugins/ofono.c
index c35f860..faa22d4 100644
--- a/plugins/ofono.c
+++ b/plugins/ofono.c
@@ -609,7 +609,8 @@ static struct connman_network_driver network_driver = {
 static void add_network(struct connman_device *device, const char *path)
 {
struct connman_network *network;
-   char *ident;
+   char *ident, *mcc, *mnc;
+   const char *mcc_mnc;
 
DBG(device %p path %s, device, path);
 
@@ -629,6 +630,17 @@ static void add_network(struct connman_device *device, 
const char *path)
connman_network_set_string(network, Path, path);
connman_network_set_available(network, TRUE);
connman_network_set_index(network, -1);
+
+   mcc_mnc = connman_device_get_string(device, MCC_MNC);
+
+   mcc = g_strndup(mcc_mnc, 3);
+   connman_network_set_string(network, Cellular.MCC, mcc);
+   g_free(mcc);
+
+   mnc = g_strdup(mcc_mnc + 3);
+   connman_network_set_string(network, Cellular.MNC, mnc);
+   g_free(mnc);
+
connman_device_add_network(device, network);
 }
 
@@ -827,12 +839,14 @@ done:
dbus_message_unref(message);
 }
 
-static void add_device(const char *path, const char *imsi)
+static void add_device(const char *path, const char *imsi,
+   unsigned char mnc_length)
 {
struct modem_data *modem;
struct connman_device *device;
+   char *mcc_mnc;
 
-   DBG(path %s imsi %s, path, imsi);
+   DBG(path %s imsi %s mnc_length %d, path, imsi, mnc_length);
 
if (path == NULL)
return;
@@ -840,6 +854,9 @@ static void add_device(const char *path, const char *imsi)
if (imsi == NULL)
return;
 
+   if (mnc_length != 2  mnc_length != 3)
+   return;
+
modem = g_hash_table_lookup(modem_hash, path);
if (modem == NULL)
return;
@@ -854,6 +871,10 @@ static void add_device(const char *path, const char *imsi)
 
connman_device_set_string(device, Path, path);
 
+   mcc_mnc = g_strndup(imsi, mnc_length + 3);
+   connman_device_set_string(device, MCC_MNC, mcc_mnc);
+   g_free(mcc_mnc);
+
if (connman_device_register(device)  0) {
connman_device_unref(device);
return;
@@ -867,6 +888,8 @@ static void add_device(const char *path, const char *imsi)
 static void sim_properties_reply(DBusPendingCall *call, void *user_data)
 {
const char *path = user_data;
+   const char *imsi;
+   unsigned char mnc_length;
DBusMessage *reply;
DBusMessageIter array, dict;
 
@@ -884,7 +907,7 @@ static void sim_properties_reply(DBusPendingCall *call, 
void *user_data)
 
while (dbus_message_iter_get_arg_type(dict) == DBUS_TYPE_DICT_ENTRY) {
DBusMessageIter entry, value;
-   const char *key, *imsi;
+   const char *key;
 
dbus_message_iter_recurse(dict, entry);
dbus_message_iter_get_basic(entry, key);
@@ -892,15 +915,17 @@ static void sim_properties_reply(DBusPendingCall *call, 
void *user_data)
dbus_message_iter_next(entry);
dbus_message_iter_recurse(entry, value);
 
-   if (g_str_equal(key, SubscriberIdentity) == TRUE) {
+   if (g_str_equal(key, SubscriberIdentity) == TRUE)
dbus_message_iter_get_basic(value, imsi);
-
-   add_device(path, imsi);
-   }
+   else if (g_str_equal(key, MobileNetworkCodeLength) == TRUE)
+   dbus_message_iter_get_basic(value,
+   (void *)mnc_length);
 
dbus_message_iter_next(dict);
}
 
+   add_device(path, imsi, mnc_length);
+
 done:
dbus_message_unref(reply);
 
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/6] add help some help functions to ipconfig module

2010-02-03 Thread Martin Xu
__connman_ipconfig_get_method():
  is used to return the method of ipconfig;
__connman_ipconfig_implement_device_config():
  is used to configure network device according to the type of method,
  currently, only implement MANUAL type to support static ip
__connman_ipconfig_clean_device_config():
  is used to remove the configure of the network device according to
  the type of method, currently, only implement MANUAL type to support static ip
---
 src/connman.h  |5 
 src/ipconfig.c |   64 
 2 files changed, 69 insertions(+), 0 deletions(-)

diff --git a/src/connman.h b/src/connman.h
index 593a517..4bb2f03 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -151,6 +151,11 @@ void __connman_ipconfig_append_proxy(struct 
connman_ipconfig *ipconfig,
DBusMessageIter *iter);
 void __connman_ipconfig_append_ethernet(struct connman_ipconfig *ipconfig,
DBusMessageIter *iter);
+enum connman_ipconfig_method __connman_ipconfig_get_method(
+   struct connman_ipconfig *ipconfig);
+int __connman_ipconfig_implement_device_config(
+   struct connman_ipconfig *ipconfig);
+int __connman_ipconfig_clean_device_config(struct connman_ipconfig *ipconfig);
 
 int __connman_ipconfig_load(struct connman_ipconfig *ipconfig,
GKeyFile *keyfile, const char *identifier, const char *prefix);
diff --git a/src/ipconfig.c b/src/ipconfig.c
index 38c317b..3499c1e 100644
--- a/src/ipconfig.c
+++ b/src/ipconfig.c
@@ -888,6 +888,15 @@ int connman_ipconfig_set_method(struct connman_ipconfig 
*ipconfig,
return 0;
 }
 
+enum connman_ipconfig_method __connman_ipconfig_get_method(
+   struct connman_ipconfig *ipconfig)
+{
+   if (ipconfig == NULL)
+   return CONNMAN_IPCONFIG_METHOD_UNKNOWN;
+
+   return ipconfig-method;
+}
+
 /**
  * connman_ipconfig_bind:
  * @ipconfig: ipconfig structure
@@ -907,6 +916,61 @@ void connman_ipconfig_bind(struct connman_ipconfig 
*ipconfig,
connman_inet_set_address(origin-index, origin-address);
 }
 
+static int start_dhcp()
+{
+   DBG();
+
+   return 0;
+}
+
+int __connman_ipconfig_implement_device_config(
+   struct connman_ipconfig *ipconfig)
+{
+   DBG();
+
+   switch (ipconfig-method) {
+   case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
+   case CONNMAN_IPCONFIG_METHOD_OFF:
+   case CONNMAN_IPCONFIG_METHOD_FIXED:
+   break;
+   case CONNMAN_IPCONFIG_METHOD_MANUAL:
+   return connman_inet_set_address(ipconfig-index,
+   ipconfig-address);
+   case CONNMAN_IPCONFIG_METHOD_DHCP:
+   start_dhcp();
+   break;
+   }
+
+   return 0;
+}
+
+static int stop_dhcp()
+{
+   DBG();
+
+   return 0;
+}
+
+int __connman_ipconfig_clean_device_config(struct connman_ipconfig *ipconfig)
+{
+   DBG();
+
+   switch (ipconfig-method) {
+   case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
+   case CONNMAN_IPCONFIG_METHOD_OFF:
+   case CONNMAN_IPCONFIG_METHOD_FIXED:
+   break;
+   case CONNMAN_IPCONFIG_METHOD_MANUAL:
+   return connman_inet_clear_address(ipconfig-index);
+   case CONNMAN_IPCONFIG_METHOD_DHCP:
+   stop_dhcp();
+   break;
+   }
+
+   return 0;
+
+}
+
 int __connman_ipconfig_enable(struct connman_ipconfig *ipconfig)
 {
struct connman_ipdevice *ipdevice;
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 3/6] check ipconfig-local and set default broadcast in function connman_inet_set_address

2010-02-03 Thread Martin Xu
---
 src/inet.c |   13 -
 1 files changed, 12 insertions(+), 1 deletions(-)

diff --git a/src/inet.c b/src/inet.c
index 5838008..4e79fe8 100644
--- a/src/inet.c
+++ b/src/inet.c
@@ -547,6 +547,11 @@ int connman_inet_set_address(int index, struct 
connman_ipaddress *ipaddress)
 
DBG(ifname %s, ifr.ifr_name);
 
+   if (ipaddress-local == NULL) {
+   close(sk);
+   return -1;
+   }
+
memset(addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(ipaddress-local);
@@ -569,7 +574,13 @@ int connman_inet_set_address(int index, struct 
connman_ipaddress *ipaddress)
 
memset(addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
-   addr.sin_addr.s_addr = inet_addr(ipaddress-broadcast);
+
+   if (ipaddress-broadcast != NULL)
+   addr.sin_addr.s_addr = inet_addr(ipaddress-broadcast);
+   else
+   addr.sin_addr.s_addr = inet_addr(ipaddress-local) |
+   htonl(0xlu  ipaddress-prefixlen);
+
memcpy(ifr.ifr_broadaddr, addr, sizeof(ifr.ifr_broadaddr));
 
err = ioctl(sk, SIOCSIFBRDADDR, ifr);
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 4/6] remove unref sevice-pending

2010-02-03 Thread Martin Xu
when setting static ip for ethernet service, unref service-pending here
will cause segment fault.
The reason is that it has been done in __connman_service_indicate_state() when
connect successufully, and service-pending is NULL.
---
 src/service.c |3 ---
 1 files changed, 0 insertions(+), 3 deletions(-)

diff --git a/src/service.c b/src/service.c
index c7e2325..2f2e8c7 100644
--- a/src/service.c
+++ b/src/service.c
@@ -1062,9 +1062,6 @@ static DBusMessage *connect_service(DBusConnection *conn,
return NULL;
}
 
-   dbus_message_unref(service-pending);
-   service-pending = NULL;
-
return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
 }
 
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 6/6] static IP can be set at any service state, but it only workable after reconnect

2010-02-03 Thread Martin Xu
---
 test/set-address |3 ---
 1 files changed, 0 insertions(+), 3 deletions(-)

diff --git a/test/set-address b/test/set-address
index cb3e203..c80eaed 100755
--- a/test/set-address
+++ b/test/set-address
@@ -20,9 +20,6 @@ for path in properties[Services]:
 
properties = service.GetProperties()
 
-   if properties[State] != ready:
-   continue
-
print Setting address %s for %s % (sys.argv[1], path)
 
if len(sys.argv)  2:
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/1] Remove system user from dbus config file

2010-01-27 Thread Martin Xu
Some system such as Moblin, system user does not exist. And the waning
message shows at system starting. In order to remove the wanning message
just remove the system user from dbus config file.
---
 src/connman-dbus.conf |3 ---
 1 files changed, 0 insertions(+), 3 deletions(-)

diff --git a/src/connman-dbus.conf b/src/connman-dbus.conf
index 345b87e..3b130d9 100644
--- a/src/connman-dbus.conf
+++ b/src/connman-dbus.conf
@@ -7,9 +7,6 @@
 allow send_interface=org.moblin.connman.Agent/
 allow send_interface=org.moblin.connman.Counter/
 /policy
-policy user=system
-allow send_destination=org.moblin.connman/
-/policy
 policy at_console=true
 allow send_destination=org.moblin.connman/
 /policy
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/2] drain the rfkill event

2010-01-18 Thread Martin Xu
to avoid the case that rfkill event happens in the following device
enable stage, and tend to cause racy issue.
---
 src/rfkill.c |   49 +++--
 1 files changed, 35 insertions(+), 14 deletions(-)

diff --git a/src/rfkill.c b/src/rfkill.c
index 4b6a61d..fd38db9 100644
--- a/src/rfkill.c
+++ b/src/rfkill.c
@@ -56,34 +56,31 @@ struct rfkill_event {
uint8_t  hard;
 };
 
-static gboolean rfkill_event(GIOChannel *chan,
-   GIOCondition cond, gpointer data)
+static GIOStatus rfkill_process(GIOChannel *chan)
 {
+   GIOStatus status = G_IO_STATUS_NORMAL;
unsigned char buf[32];
struct rfkill_event *event = (void *) buf;
char sysname[32];
connman_bool_t blocked;
gsize len;
-   GIOError err;
 
-   if (cond  (G_IO_NVAL | G_IO_HUP | G_IO_ERR))
-   return FALSE;
+   DBG();
 
memset(buf, 0, sizeof(buf));
 
-   err = g_io_channel_read(chan, (gchar *) buf, sizeof(buf), len);
-   if (err) {
-   if (err == G_IO_ERROR_AGAIN)
-   return TRUE;
-   return FALSE;
-   }
+   status = g_io_channel_read_chars(chan, (gchar *) buf,
+   sizeof(struct rfkill_event), len, NULL);
+
+   if (status != G_IO_STATUS_NORMAL)
+   return status;
 
if (len != sizeof(struct rfkill_event))
-   return TRUE;
+   return status;
 
DBG(idx %u type %u op %u soft %u hard %u,
-   event-idx, event-type, event-op,
-   event-soft, event-hard);
+   event-idx, event-type, event-op,
+   event-soft, event-hard);
 
snprintf(sysname, sizeof(sysname) - 1, rfkill%d, event-idx);
 
@@ -98,6 +95,21 @@ static gboolean rfkill_event(GIOChannel *chan,
break;
}
 
+   return status;
+}
+
+static gboolean rfkill_event(GIOChannel *chan,
+   GIOCondition cond, gpointer data)
+{
+   GIOStatus status;
+
+   if (cond  (G_IO_NVAL | G_IO_HUP | G_IO_ERR))
+   return FALSE;
+
+   status = rfkill_process(chan);
+   if (status == G_IO_STATUS_ERROR)
+   return FALSE;
+
return TRUE;
 }
 
@@ -105,6 +117,7 @@ static GIOChannel *channel = NULL;
 
 int __connman_rfkill_init(void)
 {
+   GIOFlags flags;
int fd;
 
DBG();
@@ -118,6 +131,14 @@ int __connman_rfkill_init(void)
channel = g_io_channel_unix_new(fd);
g_io_channel_set_close_on_unref(channel, TRUE);
 
+   flags = g_io_channel_get_flags(channel);
+   flags |= G_IO_FLAG_NONBLOCK;
+   g_io_channel_set_flags(channel, flags, NULL);
+
+   /* Process current RFKILL events sent on device open */
+   while (rfkill_process(channel) == G_IO_STATUS_NORMAL)
+   ;
+
g_io_add_watch(channel, G_IO_IN | G_IO_NVAL | G_IO_HUP | G_IO_ERR,
rfkill_event, NULL);
 
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 2/2] Check block state before enable the device

2010-01-18 Thread Martin Xu
On ConnMan starting, the device block state will be recored using
update_rfkill_state(). And at following device detection stage, before
enable the device, __connman_udev_get_blocked() should be used to check
the block state. If the device is blocked, it should not be enable. That
can avoid unnecessary enable and disable operation and racy issue.
---
 src/connman.h |1 +
 src/device.c  |3 ++
 src/udev-compat.c |5 
 src/udev.c|   60 +
 4 files changed, 69 insertions(+), 0 deletions(-)

diff --git a/src/connman.h b/src/connman.h
index a6619df..a704027 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -265,6 +265,7 @@ char *__connman_udev_get_devtype(const char *ifname);
 char *__connman_udev_get_mbm_devnode(const char *ifname);
 void __connman_udev_rfkill(const char *sysname, connman_bool_t blocked);
 void __connman_udev_enable_rfkill_processing(void);
+connman_bool_t __connman_udev_get_blocked(int phyindex);
 
 #include connman/device.h
 
diff --git a/src/device.c b/src/device.c
index 0d41863..875b197 100644
--- a/src/device.c
+++ b/src/device.c
@@ -545,6 +545,9 @@ static int setup_device(struct connman_device *device)
break;
}
 
+   if (__connman_udev_get_blocked(device-phyindex) == TRUE)
+   return 0;
+
if (device-offlinemode == FALSE 
device-powered_persistent == TRUE)
__connman_device_enable(device);
diff --git a/src/udev-compat.c b/src/udev-compat.c
index 70cc3bb..1156705 100644
--- a/src/udev-compat.c
+++ b/src/udev-compat.c
@@ -127,6 +127,11 @@ void __connman_udev_rfkill(const char *sysname, 
connman_bool_t blocked)
DBG(sysname %s blocked %d, sysname, blocked);
 }
 
+connman_bool_t __connman_udev_get_blocked(int phyindex)
+{
+   return FALSE;
+}
+
 int __connman_udev_init(void)
 {
DBG();
diff --git a/src/udev.c b/src/udev.c
index 59f36ea..676fe6f 100644
--- a/src/udev.c
+++ b/src/udev.c
@@ -155,6 +155,56 @@ static void remove_net_device(struct udev_device 
*udev_device)
connman_device_unref(device);
 }
 
+static GSList *rfkill_list = NULL;
+
+struct rfkill_data {
+   int phyindex;
+   connman_bool_t blocked;
+};
+
+connman_bool_t __connman_udev_get_blocked(int phyindex)
+{
+   GSList *list;
+
+   if (phyindex  0)
+   return FALSE;
+
+   for (list = rfkill_list; list; list = rfkill_list-next) {
+   struct rfkill_data *block = list-data;
+
+   if (block-phyindex == phyindex)
+   return block-blocked;
+   }
+
+   return FALSE;
+}
+
+static void update_rfkill_state(int phyindex, connman_bool_t blocked)
+{
+   GSList *list;
+   struct rfkill_data *block;
+
+   DBG(index %d blocked %d, phyindex, blocked);
+
+   for (list = rfkill_list; list; list = rfkill_list-next) {
+   block = list-data;
+
+   if (block-phyindex == phyindex) {
+   block-blocked = blocked;
+   return;
+   }
+   }
+
+   block = g_try_new0(struct rfkill_data, 1);
+   if (block == NULL)
+   return;
+
+   block-phyindex = phyindex;
+   block-blocked = blocked;
+
+   rfkill_list = g_slist_prepend(rfkill_list, block);
+}
+
 static void phyindex_rfkill(int phyindex, connman_bool_t blocked)
 {
GSList *list;
@@ -162,6 +212,8 @@ static void phyindex_rfkill(int phyindex, connman_bool_t 
blocked)
if (phyindex  0)
return;
 
+   update_rfkill_state(phyindex, blocked);
+
for (list = device_list; list; list = list-next) {
struct connman_device *device = list-data;
 
@@ -543,6 +595,14 @@ void __connman_udev_cleanup(void)
g_slist_free(device_list);
device_list = NULL;
 
+   for (list = rfkill_list; list; list = list-next) {
+   struct rfkill_data *block = list-data;
+   g_free(block);
+   }
+
+   g_slist_free(rfkill_list);
+   rfkill_list = NULL;
+
if (udev_ctx == NULL)
return;
 
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/2] drain the rfkill event

2010-01-17 Thread Martin Xu
to avoid the case that rfkill event happens in the following device
enable stage, and tend to cause racy issue.
---
 src/rfkill.c |   57 +++--
 1 files changed, 43 insertions(+), 14 deletions(-)

diff --git a/src/rfkill.c b/src/rfkill.c
index 4b6a61d..6ace483 100644
--- a/src/rfkill.c
+++ b/src/rfkill.c
@@ -56,34 +56,31 @@ struct rfkill_event {
uint8_t  hard;
 };
 
-static gboolean rfkill_event(GIOChannel *chan,
-   GIOCondition cond, gpointer data)
+static GIOStatus get_and_handle_rfkill_event(GIOChannel *chan)
 {
+   GIOStatus status = G_IO_STATUS_NORMAL;
unsigned char buf[32];
struct rfkill_event *event = (void *) buf;
char sysname[32];
connman_bool_t blocked;
gsize len;
-   GIOError err;
 
-   if (cond  (G_IO_NVAL | G_IO_HUP | G_IO_ERR))
-   return FALSE;
+   DBG();
 
memset(buf, 0, sizeof(buf));
 
-   err = g_io_channel_read(chan, (gchar *) buf, sizeof(buf), len);
-   if (err) {
-   if (err == G_IO_ERROR_AGAIN)
-   return TRUE;
-   return FALSE;
-   }
+   status = g_io_channel_read_chars(chan, (gchar *) buf,
+   sizeof(struct rfkill_event), len, NULL);
+
+   if (status != G_IO_STATUS_NORMAL)
+   return status;
 
if (len != sizeof(struct rfkill_event))
-   return TRUE;
+   return status;
 
DBG(idx %u type %u op %u soft %u hard %u,
-   event-idx, event-type, event-op,
-   event-soft, event-hard);
+   event-idx, event-type, event-op,
+   event-soft, event-hard);
 
snprintf(sysname, sizeof(sysname) - 1, rfkill%d, event-idx);
 
@@ -98,13 +95,39 @@ static gboolean rfkill_event(GIOChannel *chan,
break;
}
 
+   return status;
+}
+
+static gboolean rfkill_event(GIOChannel *chan,
+   GIOCondition cond, gpointer data)
+{
+   GIOStatus status = G_IO_STATUS_NORMAL;
+
+   if (cond  (G_IO_NVAL | G_IO_HUP | G_IO_ERR))
+   return FALSE;
+
+   status = get_and_handle_rfkill_event(chan);
+   if (status == G_IO_STATUS_ERROR)
+   return FALSE;
+
return TRUE;
 }
 
+static void drain_rfkill(GIOChannel *chan)
+{
+   GIOStatus status = G_IO_STATUS_NORMAL;
+
+   DBG();
+
+   while (status == G_IO_STATUS_NORMAL)
+   status = get_and_handle_rfkill_event(chan);
+}
+
 static GIOChannel *channel = NULL;
 
 int __connman_rfkill_init(void)
 {
+   GIOFlags flags;
int fd;
 
DBG();
@@ -118,6 +141,12 @@ int __connman_rfkill_init(void)
channel = g_io_channel_unix_new(fd);
g_io_channel_set_close_on_unref(channel, TRUE);
 
+   flags = g_io_channel_get_flags(channel);
+   flags |= G_IO_FLAG_NONBLOCK;
+   g_io_channel_set_flags(channel, flags, NULL);
+
+   drain_rfkill(channel);
+
g_io_add_watch(channel, G_IO_IN | G_IO_NVAL | G_IO_HUP | G_IO_ERR,
rfkill_event, NULL);
 
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 2/2] Check block state before enable the device

2010-01-17 Thread Martin Xu
On ConnMan starting, the device block state will be recored using
update_rfkill_state(). And at following device detection stage, before
enable the device, __connman_udev_get_blocked() should be used to check
the block state. If the device is blocked, it should not be enable. That
can avoid unnecessary enable and disable operation and racy issue.
---
 src/connman.h |1 +
 src/device.c  |3 ++
 src/udev-compat.c |5 
 src/udev.c|   60 +
 4 files changed, 69 insertions(+), 0 deletions(-)

diff --git a/src/connman.h b/src/connman.h
index a6619df..a704027 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -265,6 +265,7 @@ char *__connman_udev_get_devtype(const char *ifname);
 char *__connman_udev_get_mbm_devnode(const char *ifname);
 void __connman_udev_rfkill(const char *sysname, connman_bool_t blocked);
 void __connman_udev_enable_rfkill_processing(void);
+connman_bool_t __connman_udev_get_blocked(int phyindex);
 
 #include connman/device.h
 
diff --git a/src/device.c b/src/device.c
index 0d41863..875b197 100644
--- a/src/device.c
+++ b/src/device.c
@@ -545,6 +545,9 @@ static int setup_device(struct connman_device *device)
break;
}
 
+   if (__connman_udev_get_blocked(device-phyindex) == TRUE)
+   return 0;
+
if (device-offlinemode == FALSE 
device-powered_persistent == TRUE)
__connman_device_enable(device);
diff --git a/src/udev-compat.c b/src/udev-compat.c
index 70cc3bb..1156705 100644
--- a/src/udev-compat.c
+++ b/src/udev-compat.c
@@ -127,6 +127,11 @@ void __connman_udev_rfkill(const char *sysname, 
connman_bool_t blocked)
DBG(sysname %s blocked %d, sysname, blocked);
 }
 
+connman_bool_t __connman_udev_get_blocked(int phyindex)
+{
+   return FALSE;
+}
+
 int __connman_udev_init(void)
 {
DBG();
diff --git a/src/udev.c b/src/udev.c
index 59f36ea..676fe6f 100644
--- a/src/udev.c
+++ b/src/udev.c
@@ -155,6 +155,56 @@ static void remove_net_device(struct udev_device 
*udev_device)
connman_device_unref(device);
 }
 
+static GSList *rfkill_list = NULL;
+
+struct rfkill_data {
+   int phyindex;
+   connman_bool_t blocked;
+};
+
+connman_bool_t __connman_udev_get_blocked(int phyindex)
+{
+   GSList *list;
+
+   if (phyindex  0)
+   return FALSE;
+
+   for (list = rfkill_list; list; list = rfkill_list-next) {
+   struct rfkill_data *block = list-data;
+
+   if (block-phyindex == phyindex)
+   return block-blocked;
+   }
+
+   return FALSE;
+}
+
+static void update_rfkill_state(int phyindex, connman_bool_t blocked)
+{
+   GSList *list;
+   struct rfkill_data *block;
+
+   DBG(index %d blocked %d, phyindex, blocked);
+
+   for (list = rfkill_list; list; list = rfkill_list-next) {
+   block = list-data;
+
+   if (block-phyindex == phyindex) {
+   block-blocked = blocked;
+   return;
+   }
+   }
+
+   block = g_try_new0(struct rfkill_data, 1);
+   if (block == NULL)
+   return;
+
+   block-phyindex = phyindex;
+   block-blocked = blocked;
+
+   rfkill_list = g_slist_prepend(rfkill_list, block);
+}
+
 static void phyindex_rfkill(int phyindex, connman_bool_t blocked)
 {
GSList *list;
@@ -162,6 +212,8 @@ static void phyindex_rfkill(int phyindex, connman_bool_t 
blocked)
if (phyindex  0)
return;
 
+   update_rfkill_state(phyindex, blocked);
+
for (list = device_list; list; list = list-next) {
struct connman_device *device = list-data;
 
@@ -543,6 +595,14 @@ void __connman_udev_cleanup(void)
g_slist_free(device_list);
device_list = NULL;
 
+   for (list = rfkill_list; list; list = list-next) {
+   struct rfkill_data *block = list-data;
+   g_free(block);
+   }
+
+   g_slist_free(rfkill_list);
+   rfkill_list = NULL;
+
if (udev_ctx == NULL)
return;
 
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/3] Read /dev/rfkill before g_io_add_watch()

2010-01-14 Thread Martin Xu
To avoid the case that rfkill event happens in the following device
enable stage. It tends to cause racy issue in this case.
---
 src/rfkill.c |   49 +
 1 files changed, 49 insertions(+), 0 deletions(-)

diff --git a/src/rfkill.c b/src/rfkill.c
index 4b6a61d..e3f7bd9 100644
--- a/src/rfkill.c
+++ b/src/rfkill.c
@@ -101,11 +101,54 @@ static gboolean rfkill_event(GIOChannel *chan,
return TRUE;
 }
 
+static int drain_rfkill(GIOChannel *chan)
+{
+   unsigned char buf[32];
+   struct rfkill_event *event = (void *) buf;
+   char sysname[32];
+   connman_bool_t blocked;
+   gsize len;
+   GIOStatus status = G_IO_STATUS_NORMAL;
+
+   DBG();
+
+   while (status != G_IO_STATUS_AGAIN) {
+   memset(buf, 0, sizeof(buf));
+   status = g_io_channel_read_chars(chan, (gchar *) buf,
+   sizeof(struct rfkill_event), len, NULL);
+   if (status == G_IO_STATUS_ERROR)
+   return -EIO;
+
+   if (len != sizeof(struct rfkill_event))
+   continue;
+
+   DBG(idx %u type %u op %u soft %u hard %u,
+   event-idx, event-type, event-op,
+   event-soft, event-hard);
+
+   snprintf(sysname, sizeof(sysname) - 1, rfkill%d, event-idx);
+
+   blocked = (event-soft || event-hard) ? TRUE : FALSE;
+
+   switch (event-type) {
+   case RFKILL_TYPE_ALL:
+   case RFKILL_TYPE_WLAN:
+   __connman_udev_rfkill(sysname, blocked);
+   break;
+   default:
+   break;
+   }
+   }
+
+   return 0;
+}
+
 static GIOChannel *channel = NULL;
 
 int __connman_rfkill_init(void)
 {
int fd;
+   GIOFlags flags;
 
DBG();
 
@@ -118,6 +161,12 @@ int __connman_rfkill_init(void)
channel = g_io_channel_unix_new(fd);
g_io_channel_set_close_on_unref(channel, TRUE);
 
+   flags = g_io_channel_get_flags(channel);
+   flags |= G_IO_FLAG_NONBLOCK;
+   g_io_channel_set_flags(channel, flags, NULL);
+
+   drain_rfkill(channel);
+
g_io_add_watch(channel, G_IO_IN | G_IO_NVAL | G_IO_HUP | G_IO_ERR,
rfkill_event, NULL);
 
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 2/3] add update_rfkill_state() to record device block state

2010-01-14 Thread Martin Xu
__connman_udev_get_block_state() can be used to check block state.
---
 src/connman.h |1 +
 src/udev.c|   62 +
 2 files changed, 63 insertions(+), 0 deletions(-)

diff --git a/src/connman.h b/src/connman.h
index a6619df..7b9ab6a 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -265,6 +265,7 @@ char *__connman_udev_get_devtype(const char *ifname);
 char *__connman_udev_get_mbm_devnode(const char *ifname);
 void __connman_udev_rfkill(const char *sysname, connman_bool_t blocked);
 void __connman_udev_enable_rfkill_processing(void);
+connman_bool_t __connman_udev_get_block_state(int phyindex);
 
 #include connman/device.h
 
diff --git a/src/udev.c b/src/udev.c
index 59f36ea..783cdb3 100644
--- a/src/udev.c
+++ b/src/udev.c
@@ -155,6 +155,58 @@ static void remove_net_device(struct udev_device 
*udev_device)
connman_device_unref(device);
 }
 
+static GSList *block_list = NULL;
+
+struct block_data {
+   int phyindex;
+   connman_bool_t blocked;
+};
+
+connman_bool_t __connman_udev_get_block_state(int phyindex)
+{
+   GSList *list;
+
+   if (phyindex  0)
+   return FALSE;
+
+   for (list = block_list; list; list = block_list-next) {
+   struct block_data *block = list-data;
+
+   if (block-phyindex == phyindex)
+   return block-blocked;
+   }
+
+   return FALSE;
+}
+
+static void update_rfkill_state(int phyindex, connman_bool_t blocked)
+{
+   GSList *list;
+   struct block_data *block;
+
+   DBG(index %d blocked %d, phyindex, blocked);
+
+   for (list = block_list; list; list = block_list-next) {
+   block = list-data;
+
+   if (block-phyindex == phyindex) {
+   block-blocked = blocked;
+   return;
+   }
+   }
+
+   block = g_try_new0(struct block_data, 1);
+   if (block == NULL)
+   return;
+
+   block-phyindex = phyindex;
+   block-blocked = blocked;
+
+   block_list = g_slist_append(block_list, block);
+
+   return;
+}
+
 static void phyindex_rfkill(int phyindex, connman_bool_t blocked)
 {
GSList *list;
@@ -162,6 +214,8 @@ static void phyindex_rfkill(int phyindex, connman_bool_t 
blocked)
if (phyindex  0)
return;
 
+   update_rfkill_state(phyindex, blocked);
+
for (list = device_list; list; list = list-next) {
struct connman_device *device = list-data;
 
@@ -543,6 +597,14 @@ void __connman_udev_cleanup(void)
g_slist_free(device_list);
device_list = NULL;
 
+   for (list = block_list; list; list = list-next) {
+   struct block_data *block = list-data;
+   g_free(block);
+   }
+
+   g_slist_free(block_list);
+   block_list = NULL;
+
if (udev_ctx == NULL)
return;
 
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/6] remove network-associating = FALSE from function connman_network_set_error()

2009-12-30 Thread Martin Xu
---
 src/network.c |1 -
 1 files changed, 0 insertions(+), 1 deletions(-)

diff --git a/src/network.c b/src/network.c
index 7879f04..83b12fd 100644
--- a/src/network.c
+++ b/src/network.c
@@ -658,7 +658,6 @@ void connman_network_set_error(struct connman_network 
*network,
DBG(nework %p, error %d, network, error);
 
network-connecting = FALSE;
-   network-associating = FALSE;
 
switch (error) {
case CONNMAN_NETWORK_ERROR_UNKNOWN:
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 4/6] Add method handling into function set_connected()

2009-12-30 Thread Martin Xu
---
 src/network.c |  104 +++--
 1 files changed, 71 insertions(+), 33 deletions(-)

diff --git a/src/network.c b/src/network.c
index 226d3a7..22626ad 100644
--- a/src/network.c
+++ b/src/network.c
@@ -674,56 +674,92 @@ void connman_network_set_error(struct connman_network 
*network,
}
 }
 
-static gboolean set_connected(gpointer user_data)
+static void set_connected_manual(struct connman_network *network)
 {
-   struct connman_network *network = user_data;
struct connman_service *service;
 
+   DBG();
+
+   __connman_device_increase_connections(network-device);
+
+   __connman_device_set_network(network-device, network);
+
+   connman_device_set_disconnected(network-device, FALSE);
+
service = __connman_service_lookup_from_network(network);
 
-   if (network-connected == TRUE) {
-   struct connman_element *element;
-   enum connman_element_type type = CONNMAN_ELEMENT_TYPE_UNKNOWN;
-
-   switch (network-protocol) {
-   case CONNMAN_NETWORK_PROTOCOL_UNKNOWN:
-   return 0;
-   case CONNMAN_NETWORK_PROTOCOL_IP:
-   type = CONNMAN_ELEMENT_TYPE_DHCP;
-   break;
-   }
+   network-connecting = FALSE;
 
-   __connman_device_increase_connections(network-device);
+   connman_network_set_associating(network, FALSE);
 
-   __connman_device_set_network(network-device, network);
+   __connman_service_indicate_state(service, CONNMAN_SERVICE_STATE_READY);
+}
 
-   connman_device_set_disconnected(network-device, FALSE);
+static int set_connected_dhcp(struct connman_network *network)
+{
+   struct connman_element *element;
+   struct connman_service *service;
+   int error;
 
-   if (network-element.ipv4.method ==
-   CONNMAN_IPCONFIG_METHOD_MANUAL) {
-   network-connecting = FALSE;
+   DBG(network %p, network);
 
-   connman_network_set_associating(network, FALSE);
+   if (network-protocol != CONNMAN_NETWORK_PROTOCOL_IP)
+   return -EINVAL;
 
-   __connman_service_indicate_state(service,
-   CONNMAN_SERVICE_STATE_READY);
+   service = __connman_service_lookup_from_network(network);
 
-   return TRUE;
-   }
+   DBG(a);
+   element = connman_element_create(NULL);
+   if (element == NULL)
+   return -ENOMEM;
 
-   element = connman_element_create(NULL);
-   if (element != NULL) {
-   element-type  = type;
-   element-index = network-element.index;
+   element-type  = CONNMAN_ELEMENT_TYPE_DHCP;
+   element-index = network-element.index;
 
-   if (connman_element_register(element,
-   network-element)  0)
-   connman_element_unref(element);
+   error = connman_element_register(element, network-element);
+   if (error  0) {
+   connman_element_unref(element);
+   return error;
+   }
+
+   __connman_device_increase_connections(network-device);
+
+   __connman_device_set_network(network-device, network);
+
+   connman_device_set_disconnected(network-device, FALSE);
+
+   __connman_service_indicate_state(service,
+   CONNMAN_SERVICE_STATE_CONFIGURATION);
 
-   __connman_service_indicate_state(service,
-   CONNMAN_SERVICE_STATE_CONFIGURATION);
+   return 0;
+}
+
+static gboolean set_connected(gpointer user_data)
+{
+   struct connman_network *network = user_data;
+
+   DBG(network method %d, network-element.ipv4.method);
+
+   if (network-connected == TRUE) {
+   switch (network-element.ipv4.method) {
+   case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
+   case CONNMAN_IPCONFIG_METHOD_OFF:
+   return FALSE;
+   case CONNMAN_IPCONFIG_METHOD_MANUAL:
+   case CONNMAN_IPCONFIG_METHOD_FIXED:
+   set_connected_manual(network);
+   return TRUE;
+   case CONNMAN_IPCONFIG_METHOD_DHCP:
+   if (set_connected_dhcp(network)  0) {
+   connman_network_set_error(network,
+   CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL);
+   return FALSE;
+   }
}
+
} else {
+   struct connman_service *service;
+
connman_element_unregister_children(network-element);
 
__connman_device_set_network(network-device, NULL);
@@ -731,6 +767,8 @@ 

[PATCH 1/1] add netmask to hso gprs-context driver

2009-12-30 Thread Martin Xu
---
 drivers/hsomodem/gprs-context.c |4 +++-
 1 files changed, 3 insertions(+), 1 deletions(-)

diff --git a/drivers/hsomodem/gprs-context.c b/drivers/hsomodem/gprs-context.c
index 0526fcc..721a017 100644
--- a/drivers/hsomodem/gprs-context.c
+++ b/drivers/hsomodem/gprs-context.c
@@ -47,6 +47,8 @@
 #define AUTH_BUF_LENGTH OFONO_GPRS_MAX_USERNAME_LENGTH + \
OFONO_GPRS_MAX_PASSWORD_LENGTH + 128
 
+#define STATIC_IP_NETMASK 255.255.255.255
+
 static const char *none_prefix[] = { NULL };
 static const char *owandata_prefix[] = { _OWANDATA:, NULL };
 
@@ -274,7 +276,7 @@ static void owandata_cb(gboolean ok, GAtResult *result, 
gpointer user_data)
ofono_info(IP: %s, Gateway: %s, ip, gateway);
ofono_info(DNS: %s, %s, dns1, dns2);
 
-   CALLBACK_WITH_SUCCESS(gcd-up_cb, interface, TRUE, ip, NULL,
+   CALLBACK_WITH_SUCCESS(gcd-up_cb, interface, TRUE, ip, 
STATIC_IP_NETMASK,
gateway, dns, gcd-cb_data);
 
gcd-hso_state = HSO_NONE;
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/4] add function connman_network_get_element

2009-12-17 Thread Martin Xu
---
 include/network.h |3 +++
 src/network.c |   12 
 2 files changed, 15 insertions(+), 0 deletions(-)

diff --git a/include/network.h b/include/network.h
index 605d2f6..13cdccb 100644
--- a/include/network.h
+++ b/include/network.h
@@ -69,6 +69,9 @@ enum connman_network_type connman_network_get_type(struct 
connman_network *netwo
 const char *connman_network_get_identifier(struct connman_network *network);
 
 const char *connman_network_get_path(struct connman_network *network);
+
+struct connman_element *connman_network_get_element(
+   struct connman_network *network);
 void connman_network_set_index(struct connman_network *network, int index);
 int connman_network_get_index(struct connman_network *network);
 
diff --git a/src/network.c b/src/network.c
index cfde551..b6d0c1e 100644
--- a/src/network.c
+++ b/src/network.c
@@ -471,6 +471,18 @@ int connman_network_get_index(struct connman_network 
*network)
 }
 
 /**
+ * connman_network_get_element:
+ * @network: network structure
+ *
+ * Get connman_element of network
+ */
+struct connman_element *connman_network_get_element(
+   struct connman_network *network)
+{
+   return network-element;
+}
+
+/**
  * connman_network_set_protocol:
  * @network: network structure
  * @protocol: network protocol
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 2/4] clear associating and connecting state at connman_network_set_error

2009-12-17 Thread Martin Xu
---
 src/network.c |3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/src/network.c b/src/network.c
index b6d0c1e..0b2023c 100644
--- a/src/network.c
+++ b/src/network.c
@@ -666,6 +666,9 @@ void connman_network_set_error(struct connman_network 
*network,
 {
DBG(nework %p, error %d, network, error);
 
+   network-connecting = FALSE;
+   network-associating = FALSE;
+
switch (error) {
case CONNMAN_NETWORK_ERROR_UNKNOWN:
return;
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 4/4] add static ip support

2009-12-17 Thread Martin Xu
---
 plugins/ofono.c |  151 ---
 1 files changed, 144 insertions(+), 7 deletions(-)

diff --git a/plugins/ofono.c b/plugins/ofono.c
index 524eecf..fac7d50 100644
--- a/plugins/ofono.c
+++ b/plugins/ofono.c
@@ -30,6 +30,7 @@
 
 #define CONNMAN_API_SUBJECT_TO_CHANGE
 #include connman/plugin.h
+#include connman/element.h
 #include connman/device.h
 #include connman/network.h
 #include connman/dbus.h
@@ -1144,7 +1145,41 @@ static void manager_changed(DBusConnection *connection, 
DBusMessage *message)
update_modems(value);
 }
 
-static void update_settings(DBusMessageIter *array)
+static void get_dns(DBusMessageIter *array, struct connman_element *parent)
+{
+   DBusMessageIter entry;
+   gchar *nameserver = NULL, *nameserver_old = NULL;
+
+   DBG();
+
+   dbus_message_iter_recurse(array, entry);
+
+   while (dbus_message_iter_get_arg_type(entry) == DBUS_TYPE_STRING) {
+   const char *dns;
+
+   dbus_message_iter_get_basic(entry, dns);
+
+   DBG(dns %s, dns);
+
+   if (nameserver == NULL) {
+
+   nameserver = g_strdup(dns);
+   } else {
+
+   nameserver_old = nameserver;
+   nameserver = g_strdup_printf(%s %s,
+   nameserver_old, dns);
+   g_free(nameserver_old);
+   }
+
+   dbus_message_iter_next(entry);
+   }
+
+   parent-ipv4.nameserver = nameserver;
+}
+
+static void update_settings(DBusMessageIter *array,
+   struct connman_element *parent)
 {
DBusMessageIter dict;
const char *interface = NULL;
@@ -1187,19 +1222,44 @@ static void update_settings(DBusMessageIter *array)
 
dbus_message_iter_get_basic(value, method);
if (g_strcmp0(method, static) == 0) {
-   DBG(static);
+
+   parent-ipv4.method =
+   CONNMAN_IPCONFIG_METHOD_STATIC;
} else if (g_strcmp0(method, dhcp) == 0) {
-   DBG(dhcp);
+
+   parent-ipv4.method =
+   CONNMAN_IPCONFIG_METHOD_DHCP;
break;
}
-   } else if (g_str_equal(key, address) == TRUE) {
+   } else if (g_str_equal(key, Address) == TRUE) {
const char *address;
 
dbus_message_iter_get_basic(value, address);
 
DBG(address %s, address);
+
+   parent-ipv4.address = g_strdup(address);
+   } else if (g_str_equal(key, Netmask) == TRUE) {
+   const char *netmask;
+
+   dbus_message_iter_get_basic(value, netmask);
+
+   DBG(netmask %s, netmask);
+
+   parent-ipv4.netmask = g_strdup(netmask);
+   } else if (g_str_equal(key, DomainNameServers) == TRUE) {
+
+   get_dns(value, parent);
+   } else if (g_str_equal(key, Gateway) == TRUE) {
+   const char *gateway;
+
+   dbus_message_iter_get_basic(value, gateway);
+
+   DBG(gateway %s, gateway);
+
+   parent-ipv4.gateway = g_strdup(gateway);
}
-   /* FIXME: add static setting */
+
dbus_message_iter_next(dict);
}
 
@@ -1208,10 +1268,71 @@ static void update_settings(DBusMessageIter *array)
connman_network_set_index(pending_network, -1);
 }
 
+static void cleanup_ipconfig(struct connman_element *parent)
+{
+   g_free(parent-ipv4.address);
+   parent-ipv4.address = NULL;
+
+   g_free(parent-ipv4.netmask);
+   parent-ipv4.netmask = NULL;
+
+   g_free(parent-ipv4.nameserver);
+   parent-ipv4.nameserver = NULL;
+
+   g_free(parent-ipv4.gateway);
+   parent-ipv4.gateway = NULL;
+
+   parent-ipv4.method = CONNMAN_IPCONFIG_METHOD_UNKNOWN;
+}
+
+static int static_network_set_connected(
+   struct connman_network *pending_network,
+   struct connman_element *parent,
+   connman_bool_t connected)
+{
+   if (connected == TRUE) {
+   struct connman_element *element;
+
+   if (parent-ipv4.address == NULL)
+   goto error;
+
+   if (parent-ipv4.netmask == NULL)
+   goto error;
+
+   element = connman_element_create(NULL);
+   if (element == NULL) {
+   connman_error(Can not create connman_element);
+   return -ENOMEM;
+   }
+
+   element-type = 

[PATCH 4/5] add function connman_network_set_error

2009-11-23 Thread Martin Xu
---
 include/network.h |7 +++
 src/network.c |   29 +
 2 files changed, 36 insertions(+), 0 deletions(-)

diff --git a/include/network.h b/include/network.h
index ab3784f..c223f65 100644
--- a/include/network.h
+++ b/include/network.h
@@ -53,6 +53,11 @@ enum connman_network_protocol {
CONNMAN_NETWORK_PROTOCOL_PPP = 2,
 };
 
+enum connman_network_error {
+   CONNMAN_NETWORK_ERROR_UNKNOWN = 0,
+   CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL  = 1,
+};
+
 struct connman_network;
 
 struct connman_network *connman_network_create(const char *identifier,
@@ -78,6 +83,8 @@ int connman_network_set_available(struct connman_network 
*network,
 connman_bool_t connman_network_get_available(struct connman_network *network);
 int connman_network_set_associating(struct connman_network *network,
connman_bool_t associating);
+void connman_network_set_error(struct connman_network *network,
+   enum connman_network_error error);
 int connman_network_set_connected(struct connman_network *network,
connman_bool_t connected);
 connman_bool_t connman_network_get_connected(struct connman_network *network);
diff --git a/src/network.c b/src/network.c
index 6cdaa81..678a31a 100644
--- a/src/network.c
+++ b/src/network.c
@@ -687,6 +687,35 @@ int connman_network_set_associating(struct connman_network 
*network,
return 0;
 }
 
+static void set_associate_error(struct connman_network *network)
+{
+   struct connman_service *service;
+
+   if (network-associating == FALSE)
+   return ;
+
+   network-associating = FALSE;
+
+   service = __connman_service_lookup_from_network(network);
+
+   __connman_service_indicate_state(service,
+   CONNMAN_SERVICE_STATE_FAILURE);
+}
+
+void connman_network_set_error(struct connman_network *network,
+   enum connman_network_error error)
+{
+   DBG(nework %p, error %d, network, error);
+
+   switch (error) {
+   case CONNMAN_NETWORK_ERROR_UNKNOWN:
+   return;
+   case CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL:
+   set_associate_error(network);
+   break;
+   }
+}
+
 static gboolean set_connected(gpointer user_data)
 {
struct connman_network *network = user_data;
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 5/5] ofono plugin init submit

2009-11-23 Thread Martin Xu
---
 plugins/ofono.c | 1267 ++-
 1 files changed, 1264 insertions(+), 3 deletions(-)

diff --git a/plugins/ofono.c b/plugins/ofono.c
index d8af4b9..bf32d51 100644
--- a/plugins/ofono.c
+++ b/plugins/ofono.c
@@ -29,26 +29,998 @@
 
 #define CONNMAN_API_SUBJECT_TO_CHANGE
 #include connman/plugin.h
+#include connman/device.h
+#include connman/network.h
 #include connman/dbus.h
+#include connman/inet.h
 #include connman/log.h
 
 #define OFONO_SERVICE  org.ofono
 
+#define OFONO_MANAGER_INTERFACEOFONO_SERVICE .Manager
+#define OFONO_MODEM_INTERFACE  OFONO_SERVICE .Modem
+#define OFONO_GPRS_INTERFACE   OFONO_SERVICE .DataConnectionManager
+#define OFONO_SIM_INTERFACEOFONO_SERVICE .SimManager
+#define OFONO_PRI_CONTEXT_INTERFACEOFONO_SERVICE .PrimaryDataContext
+
+#define PROPERTY_CHANGED   PropertyChanged
+#define GET_PROPERTIES GetProperties
+#define SET_PROPERTY   SetProperty
+
+#define TIMEOUT 5000
+
 static DBusConnection *connection;
 
 static GHashTable *ofono_modems = NULL;
 
-static void unregister_modem(gpointer data)
+struct ofono_modem {
+   char *path;
+   struct connman_device *device;
+   gboolean available;
+};
+
+static int modem_probe(struct connman_device *device)
+{
+   DBG(device %p, device);
+
+   return 0;
+}
+
+static void modem_remove(struct connman_device *device)
+{
+   DBG(device %p, device);
+}
+
+static void powered_reply(DBusPendingCall *call, void *user_data)
+{
+   DBusMessage *reply;
+   DBusError error;
+
+   DBG();
+
+   dbus_error_init(error);
+
+   reply = dbus_pending_call_steal_reply(call);
+
+   if (dbus_set_error_from_message(error, reply)) {
+   connman_error(%s, error.message);
+   dbus_error_free(error);
+   }
+
+   dbus_message_unref(reply);
+}
+
+static int gprs_change_powered(const char *path, dbus_bool_t powered)
+{
+   DBusMessage *message;
+   DBusMessageIter iter;
+   DBusPendingCall *call;
+
+   DBG(path %s powered %d, path, powered);
+
+   if (path == NULL)
+   return -EINVAL;
+
+   message = dbus_message_new_method_call(OFONO_SERVICE, path,
+   OFONO_GPRS_INTERFACE, SET_PROPERTY);
+   if (message == NULL)
+   return -ENOMEM;
+
+   dbus_message_set_auto_start(message, FALSE);
+
+   dbus_message_iter_init_append(message, iter);
+   connman_dbus_property_append_variant(iter, Powered,
+   DBUS_TYPE_BOOLEAN, powered);
+
+   if (dbus_connection_send_with_reply(connection, message,
+   call, TIMEOUT) == FALSE) {
+   connman_error(Failed to change powered property);
+   dbus_message_unref(message);
+   return -EINVAL;
+   }
+
+   if (call == NULL) {
+   connman_error(D-Bus connection not available);
+   dbus_message_unref(message);
+   return -EINVAL;
+   }
+
+   dbus_pending_call_set_notify(call, powered_reply, (void *)path, NULL);
+
+   dbus_message_unref(message);
+
+   return -EINPROGRESS;
+}
+
+static int modem_enable(struct connman_device *device)
+{
+   const char *path = connman_device_get_string(device, Path);
+
+   DBG(device %p, path, %s, device, path);
+
+   return gprs_change_powered(path, TRUE);
+}
+
+static int modem_disable(struct connman_device *device)
+{
+   const char *path = connman_device_get_string(device, Path);
+
+   DBG(device %p, path %s, device, path);
+
+   return gprs_change_powered(path, FALSE);
+}
+
+static struct connman_device_driver modem_driver = {
+   .name   = modem,
+   .type   = CONNMAN_DEVICE_TYPE_CELLULAR,
+   .probe  = modem_probe,
+   .remove = modem_remove,
+   .enable = modem_enable,
+   .disable= modem_disable,
+};
+
+static char *get_ident(const char *path)
+{
+   char *ident = g_strdup(path);
+   char *re = ident;
+   while (*path != 0) {
+   if (*path++ == '/')
+   *ident = '_';
+
+   ident++;
+   }
+
+   return re;
+}
+
+static void config_network_reply(DBusPendingCall *call, void *user_data)
+{
+   struct connman_network *network = user_data;
+   DBusMessage *reply;
+   DBusMessageIter array, dict;
+   gboolean internet_type;
+
+   DBG(network %p, network);
+
+   reply = dbus_pending_call_steal_reply(call);
+   if (reply == NULL)
+   goto done;
+
+   if (dbus_message_iter_init(reply, array) == FALSE)
+   goto done;
+
+   if (dbus_message_iter_get_arg_type(array) != DBUS_TYPE_ARRAY)
+   goto done;
+
+   dbus_message_iter_recurse(array, dict);
+
+   while 

[PATCH 2/5] add network type CONNMAN_NETWORK_TYPE_CELLULAR

2009-11-23 Thread Martin Xu
---
 include/network.h |1 +
 src/network.c |5 +
 src/service.c |2 ++
 3 files changed, 8 insertions(+), 0 deletions(-)

diff --git a/include/network.h b/include/network.h
index 3558d5a..ab3784f 100644
--- a/include/network.h
+++ b/include/network.h
@@ -41,6 +41,7 @@ enum connman_network_type {
CONNMAN_NETWORK_TYPE_WIMAX = 2,
CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN = 8,
CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN = 9,
+   CONNMAN_NETWORK_TYPE_CELLULAR  = 10,
CONNMAN_NETWORK_TYPE_MBM   = 22,
CONNMAN_NETWORK_TYPE_HSO   = 23,
CONNMAN_NETWORK_TYPE_VENDOR= 1,
diff --git a/src/network.c b/src/network.c
index 7e842f8..ea347be 100644
--- a/src/network.c
+++ b/src/network.c
@@ -82,6 +82,7 @@ static const char *type2string(enum connman_network_type type)
case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
return bluetooth;
+   case CONNMAN_NETWORK_TYPE_CELLULAR:
case CONNMAN_NETWORK_TYPE_MBM:
case CONNMAN_NETWORK_TYPE_HSO:
return cellular;
@@ -555,6 +556,7 @@ void connman_network_set_group(struct connman_network 
*network,
return;
case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
+   case CONNMAN_NETWORK_TYPE_CELLULAR:
case CONNMAN_NETWORK_TYPE_MBM:
case CONNMAN_NETWORK_TYPE_HSO:
case CONNMAN_NETWORK_TYPE_WIFI:
@@ -609,6 +611,7 @@ connman_bool_t __connman_network_get_weakness(struct 
connman_network *network)
case CONNMAN_NETWORK_TYPE_VENDOR:
case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
+   case CONNMAN_NETWORK_TYPE_CELLULAR:
case CONNMAN_NETWORK_TYPE_MBM:
case CONNMAN_NETWORK_TYPE_HSO:
case CONNMAN_NETWORK_TYPE_WIMAX:
@@ -1306,6 +1309,7 @@ static int network_probe(struct connman_element *element)
break;
case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
+   case CONNMAN_NETWORK_TYPE_CELLULAR:
case CONNMAN_NETWORK_TYPE_MBM:
case CONNMAN_NETWORK_TYPE_HSO:
case CONNMAN_NETWORK_TYPE_WIFI:
@@ -1336,6 +1340,7 @@ static void network_remove(struct connman_element 
*element)
break;
case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
+   case CONNMAN_NETWORK_TYPE_CELLULAR:
case CONNMAN_NETWORK_TYPE_MBM:
case CONNMAN_NETWORK_TYPE_HSO:
case CONNMAN_NETWORK_TYPE_WIFI:
diff --git a/src/service.c b/src/service.c
index b2dc68d..59352b1 100644
--- a/src/service.c
+++ b/src/service.c
@@ -1536,6 +1536,7 @@ static connman_bool_t prepare_network(struct 
connman_service *service)
case CONNMAN_NETWORK_TYPE_WIMAX:
case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
+   case CONNMAN_NETWORK_TYPE_CELLULAR:
break;
case CONNMAN_NETWORK_TYPE_MBM:
case CONNMAN_NETWORK_TYPE_HSO:
@@ -2151,6 +2152,7 @@ static enum connman_service_type 
convert_network_type(struct connman_network *ne
case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
return CONNMAN_SERVICE_TYPE_BLUETOOTH;
+   case CONNMAN_NETWORK_TYPE_CELLULAR:
case CONNMAN_NETWORK_TYPE_MBM:
case CONNMAN_NETWORK_TYPE_HSO:
return CONNMAN_SERVICE_TYPE_CELLULAR;
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 2/5] add network type CONNMAN_NETWORK_TYPE_CELLULAR

2009-11-22 Thread Martin Xu
---
 include/network.h |1 +
 src/network.c |5 +
 src/service.c |2 ++
 3 files changed, 8 insertions(+), 0 deletions(-)

diff --git a/include/network.h b/include/network.h
index 3558d5a..ab3784f 100644
--- a/include/network.h
+++ b/include/network.h
@@ -41,6 +41,7 @@ enum connman_network_type {
CONNMAN_NETWORK_TYPE_WIMAX = 2,
CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN = 8,
CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN = 9,
+   CONNMAN_NETWORK_TYPE_CELLULAR  = 10,
CONNMAN_NETWORK_TYPE_MBM   = 22,
CONNMAN_NETWORK_TYPE_HSO   = 23,
CONNMAN_NETWORK_TYPE_VENDOR= 1,
diff --git a/src/network.c b/src/network.c
index 7e842f8..6cdaa81 100644
--- a/src/network.c
+++ b/src/network.c
@@ -83,6 +83,7 @@ static const char *type2string(enum connman_network_type type)
case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
return bluetooth;
case CONNMAN_NETWORK_TYPE_MBM:
+   case CONNMAN_NETWORK_TYPE_CELLULAR:
case CONNMAN_NETWORK_TYPE_HSO:
return cellular;
}
@@ -556,6 +557,7 @@ void connman_network_set_group(struct connman_network 
*network,
case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
case CONNMAN_NETWORK_TYPE_MBM:
+   case CONNMAN_NETWORK_TYPE_CELLULAR:
case CONNMAN_NETWORK_TYPE_HSO:
case CONNMAN_NETWORK_TYPE_WIFI:
case CONNMAN_NETWORK_TYPE_WIMAX:
@@ -610,6 +612,7 @@ connman_bool_t __connman_network_get_weakness(struct 
connman_network *network)
case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
case CONNMAN_NETWORK_TYPE_MBM:
+   case CONNMAN_NETWORK_TYPE_CELLULAR:
case CONNMAN_NETWORK_TYPE_HSO:
case CONNMAN_NETWORK_TYPE_WIMAX:
break;
@@ -1307,6 +1310,7 @@ static int network_probe(struct connman_element *element)
case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
case CONNMAN_NETWORK_TYPE_MBM:
+   case CONNMAN_NETWORK_TYPE_CELLULAR:
case CONNMAN_NETWORK_TYPE_HSO:
case CONNMAN_NETWORK_TYPE_WIFI:
case CONNMAN_NETWORK_TYPE_WIMAX:
@@ -1337,6 +1341,7 @@ static void network_remove(struct connman_element 
*element)
case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
case CONNMAN_NETWORK_TYPE_MBM:
+   case CONNMAN_NETWORK_TYPE_CELLULAR:
case CONNMAN_NETWORK_TYPE_HSO:
case CONNMAN_NETWORK_TYPE_WIFI:
case CONNMAN_NETWORK_TYPE_WIMAX:
diff --git a/src/service.c b/src/service.c
index b2dc68d..7e365a0 100644
--- a/src/service.c
+++ b/src/service.c
@@ -1536,6 +1536,7 @@ static connman_bool_t prepare_network(struct 
connman_service *service)
case CONNMAN_NETWORK_TYPE_WIMAX:
case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
+   case CONNMAN_NETWORK_TYPE_CELLULAR:
break;
case CONNMAN_NETWORK_TYPE_MBM:
case CONNMAN_NETWORK_TYPE_HSO:
@@ -2152,6 +2153,7 @@ static enum connman_service_type 
convert_network_type(struct connman_network *ne
case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
return CONNMAN_SERVICE_TYPE_BLUETOOTH;
case CONNMAN_NETWORK_TYPE_MBM:
+   case CONNMAN_NETWORK_TYPE_CELLULAR:
case CONNMAN_NETWORK_TYPE_HSO:
return CONNMAN_SERVICE_TYPE_CELLULAR;
}
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/1] remove retry on failure code

2009-10-31 Thread Martin Xu
---
 src/service.c |   13 -
 1 files changed, 0 insertions(+), 13 deletions(-)

diff --git a/src/service.c b/src/service.c
index db2076f..b2dc68d 100644
--- a/src/service.c
+++ b/src/service.c
@@ -29,7 +29,6 @@
 
 #include connman.h
 
-#define MAX_CONNECT_RETRIES2
 #define CONNECT_TIMEOUT120
 
 static DBusConnection *connection = NULL;
@@ -54,7 +53,6 @@ struct connman_service {
connman_bool_t userconnect;
GTimeVal modified;
unsigned int order;
-   unsigned int failcounter;
char *name;
char *passphrase;
char *profile;
@@ -1001,7 +999,6 @@ static DBusMessage *connect_service(DBusConnection *conn,
service-ignore = FALSE;
 
service-userconnect = TRUE;
-   service-failcounter = 0;
 
service-pending = dbus_message_ref(msg);
 
@@ -1457,7 +1454,6 @@ int __connman_service_indicate_state(struct 
connman_service *service,
reply_pending(service, 0);
 
service-userconnect = FALSE;
-   service-failcounter = 0;
 
g_get_current_time(service-modified);
__connman_storage_save_service(service);
@@ -1472,15 +1468,6 @@ int __connman_service_indicate_state(struct 
connman_service *service,
}
 
if (state == CONNMAN_SERVICE_STATE_FAILURE) {
-   if (service-failcounter++  MAX_CONNECT_RETRIES) {
-   connman_warn(Connecting again (try %d),
-   service-failcounter);
-   remove_timeout(service);
-   __connman_service_disconnect(service);
-   __connman_service_connect(service);
-   return 0;
-   }
-
reply_pending(service, EIO);
 
if (service-userconnect == FALSE)
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/5] add keep_connect state and its operate fuction

2009-10-23 Thread Martin Xu
---
 src/connman.h |4 
 src/device.c  |   13 +
 2 files changed, 17 insertions(+), 0 deletions(-)

diff --git a/src/connman.h b/src/connman.h
index 1fad19b..92f4382 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -272,6 +272,10 @@ int __connman_device_disconnect(struct connman_device 
*device);
 
 connman_bool_t __connman_device_has_driver(struct connman_device *device);
 
+void __connman_device_set_keep_connect(struct connman_device *device,
+   connman_bool_t keep_connect);
+connman_bool_t __connman_device_get_keep_connect(struct connman_device 
*device);
+
 const char *__connman_device_get_type(struct connman_device *device);
 const char *__connman_device_get_ident(struct connman_device *device);
 
diff --git a/src/device.c b/src/device.c
index 119255f..a529656 100644
--- a/src/device.c
+++ b/src/device.c
@@ -45,6 +45,7 @@ struct connman_device {
connman_bool_t carrier;
connman_bool_t scanning;
connman_bool_t disconnected;
+   connman_bool_t keep_connect;
connman_uint16_t scan_interval;
char *name;
char *node;
@@ -1790,6 +1791,18 @@ void __connman_device_set_network(struct connman_device 
*device,
}
 }
 
+void __connman_device_set_keep_connect(struct connman_device *device,
+   connman_bool_t keep_connect)
+{
+   device-keep_connect = keep_connect;
+}
+
+connman_bool_t  __connman_device_get_keep_connect(
+   struct connman_device *device)
+{
+   return device-keep_connect;
+}
+
 /**
  * connman_device_register:
  * @device: device structure
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/1] clean timer before reconnect

2009-10-22 Thread Martin Xu
---
 src/service.c |2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/src/service.c b/src/service.c
index 252ac29..9df6f08 100644
--- a/src/service.c
+++ b/src/service.c
@@ -1420,6 +1420,8 @@ int __connman_service_indicate_state(struct 
connman_service *service,
 
if (state == CONNMAN_SERVICE_STATE_FAILURE) {
if (service-failcounter++  MAX_CONNECT_RETRIES) {
+   reply_pending(service, 0);
+
connman_warn(Connecting again (try %d),
service-failcounter);
__connman_service_disconnect(service);
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 2/3] add function connman_device_cleanup_scanning()

2009-09-21 Thread Martin Xu
---
 include/device.h |2 ++
 src/device.c |   24 
 2 files changed, 26 insertions(+), 0 deletions(-)

diff --git a/include/device.h b/include/device.h
index 5da48bc..c98c022 100644
--- a/include/device.h
+++ b/include/device.h
@@ -89,6 +89,8 @@ int connman_device_set_carrier(struct connman_device *device,
connman_bool_t carrier);
 int connman_device_set_scanning(struct connman_device *device,
connman_bool_t scanning);
+int connman_device_cleanup_scanning(struct connman_device *device);
+
 int connman_device_set_disconnected(struct connman_device *device,
connman_bool_t disconnected);
 connman_bool_t connman_device_get_disconnected(struct connman_device *device);
diff --git a/src/device.c b/src/device.c
index 17bd652..7bc00ac 100644
--- a/src/device.c
+++ b/src/device.c
@@ -1468,6 +1468,30 @@ static int scanning_changed(struct connman_device 
*device)
return 0;
 }
 
+static void mark_network_available(gpointer key, gpointer value,
+   gpointer user_data)
+{
+   struct connman_network *network = value;
+
+   connman_network_set_available(network, TRUE);
+}
+
+int connman_device_cleanup_scanning(struct connman_device *device)
+{
+   int err;
+
+   device-scanning = FALSE;
+
+   err = scanning_changed(device);
+   if (err  0)
+   return err;
+
+   g_hash_table_foreach(device-networks,
+   mark_network_available, NULL);
+
+   return 0;
+}
+
 /**
  * connman_device_set_scanning:
  * @device: device structure
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/3] add internal helper scanning_changed function

2009-09-21 Thread Martin Xu
---
 src/device.c |   48 ++--
 1 files changed, 30 insertions(+), 18 deletions(-)

diff --git a/src/device.c b/src/device.c
index 1d66936..17bd652 100644
--- a/src/device.c
+++ b/src/device.c
@@ -1442,6 +1442,32 @@ void __connman_device_cleanup_networks(struct 
connman_device *device)
remove_unavailable_network, NULL);
 }
 
+static int scanning_changed(struct connman_device *device)
+{
+   DBusMessage *signal;
+   DBusMessageIter entry, value;
+   const char *key = Scanning;
+
+   signal = dbus_message_new_signal(device-element.path,
+   CONNMAN_DEVICE_INTERFACE, PropertyChanged);
+   if (signal == NULL)
+   return -ENOMEM;
+
+   dbus_message_iter_init_append(signal, entry);
+
+   dbus_message_iter_append_basic(entry, DBUS_TYPE_STRING, key);
+
+   dbus_message_iter_open_container(entry, DBUS_TYPE_VARIANT,
+   DBUS_TYPE_BOOLEAN_AS_STRING, value);
+   dbus_message_iter_append_basic(value, DBUS_TYPE_BOOLEAN,
+   device-scanning);
+   dbus_message_iter_close_container(entry, value);
+
+   g_dbus_send_message(connection, signal);
+
+   return 0;
+}
+
 /**
  * connman_device_set_scanning:
  * @device: device structure
@@ -1452,9 +1478,7 @@ void __connman_device_cleanup_networks(struct 
connman_device *device)
 int connman_device_set_scanning(struct connman_device *device,
connman_bool_t scanning)
 {
-   DBusMessage *signal;
-   DBusMessageIter entry, value;
-   const char *key = Scanning;
+   int err;
 
DBG(device %p scanning %d, device, scanning);
 
@@ -1466,21 +1490,9 @@ int connman_device_set_scanning(struct connman_device 
*device,
 
device-scanning = scanning;
 
-   signal = dbus_message_new_signal(device-element.path,
-   CONNMAN_DEVICE_INTERFACE, PropertyChanged);
-   if (signal == NULL)
-   return 0;
-
-   dbus_message_iter_init_append(signal, entry);
-
-   dbus_message_iter_append_basic(entry, DBUS_TYPE_STRING, key);
-
-   dbus_message_iter_open_container(entry, DBUS_TYPE_VARIANT,
-   DBUS_TYPE_BOOLEAN_AS_STRING, value);
-   dbus_message_iter_append_basic(value, DBUS_TYPE_BOOLEAN, scanning);
-   dbus_message_iter_close_container(entry, value);
-
-   g_dbus_send_message(connection, signal);
+   err = scanning_changed(device);
+   if (err  0)
+   return err;
 
if (scanning == TRUE) {
reset_scan_trigger(device);
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/3] add internal helper scanning_changed function

2009-09-21 Thread Martin Xu
---
 src/device.c |   44 +---
 1 files changed, 25 insertions(+), 19 deletions(-)

diff --git a/src/device.c b/src/device.c
index 1d66936..2427c68 100644
--- a/src/device.c
+++ b/src/device.c
@@ -1442,6 +1442,30 @@ void __connman_device_cleanup_networks(struct 
connman_device *device)
remove_unavailable_network, NULL);
 }
 
+static void scanning_changed(struct connman_device *device)
+{
+   DBusMessage *signal;
+   DBusMessageIter entry, value;
+   const char *key = Scanning;
+
+   signal = dbus_message_new_signal(device-element.path,
+   CONNMAN_DEVICE_INTERFACE, PropertyChanged);
+   if (signal == NULL)
+   return;
+
+   dbus_message_iter_init_append(signal, entry);
+
+   dbus_message_iter_append_basic(entry, DBUS_TYPE_STRING, key);
+
+   dbus_message_iter_open_container(entry, DBUS_TYPE_VARIANT,
+   DBUS_TYPE_BOOLEAN_AS_STRING, value);
+   dbus_message_iter_append_basic(value, DBUS_TYPE_BOOLEAN,
+   device-scanning);
+   dbus_message_iter_close_container(entry, value);
+
+   g_dbus_send_message(connection, signal);
+}
+
 /**
  * connman_device_set_scanning:
  * @device: device structure
@@ -1452,10 +1476,6 @@ void __connman_device_cleanup_networks(struct 
connman_device *device)
 int connman_device_set_scanning(struct connman_device *device,
connman_bool_t scanning)
 {
-   DBusMessage *signal;
-   DBusMessageIter entry, value;
-   const char *key = Scanning;
-
DBG(device %p scanning %d, device, scanning);
 
if (!device-driver || !device-driver-scan)
@@ -1466,21 +1486,7 @@ int connman_device_set_scanning(struct connman_device 
*device,
 
device-scanning = scanning;
 
-   signal = dbus_message_new_signal(device-element.path,
-   CONNMAN_DEVICE_INTERFACE, PropertyChanged);
-   if (signal == NULL)
-   return 0;
-
-   dbus_message_iter_init_append(signal, entry);
-
-   dbus_message_iter_append_basic(entry, DBUS_TYPE_STRING, key);
-
-   dbus_message_iter_open_container(entry, DBUS_TYPE_VARIANT,
-   DBUS_TYPE_BOOLEAN_AS_STRING, value);
-   dbus_message_iter_append_basic(value, DBUS_TYPE_BOOLEAN, scanning);
-   dbus_message_iter_close_container(entry, value);
-
-   g_dbus_send_message(connection, signal);
+   scanning_changed(device);
 
if (scanning == TRUE) {
reset_scan_trigger(device);
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/1] cleanup scanning when the scanning is halted

2009-09-18 Thread Martin Xu
---
 include/device.h |2 ++
 plugins/supplicant.c |2 +-
 src/device.c |   38 ++
 3 files changed, 41 insertions(+), 1 deletions(-)

diff --git a/include/device.h b/include/device.h
index 5da48bc..f1c12b1 100644
--- a/include/device.h
+++ b/include/device.h
@@ -89,6 +89,8 @@ int connman_device_set_carrier(struct connman_device *device,
connman_bool_t carrier);
 int connman_device_set_scanning(struct connman_device *device,
connman_bool_t scanning);
+void connman_device_cleanup_scanning(struct connman_device *device);
+
 int connman_device_set_disconnected(struct connman_device *device,
connman_bool_t disconnected);
 connman_bool_t connman_device_get_disconnected(struct connman_device *device);
diff --git a/plugins/supplicant.c b/plugins/supplicant.c
index 6134e03..eae81ee 100644
--- a/plugins/supplicant.c
+++ b/plugins/supplicant.c
@@ -1594,7 +1594,7 @@ static void state_change(struct supplicant_task *task, 
DBusMessage *msg)
return;
 
if (task-scanning == TRUE  state != WPA_SCANNING) {
-   connman_device_set_scanning(task-device, FALSE);
+   connman_device_cleanup_scanning(task-device);
task-scanning = FALSE;
}
 
diff --git a/src/device.c b/src/device.c
index 1d66936..66adf9f 100644
--- a/src/device.c
+++ b/src/device.c
@@ -1411,6 +1411,14 @@ int __connman_device_disconnect(struct connman_device 
*device)
return 0;
 }
 
+static void mark_network_available(gpointer key, gpointer value,
+   gpointer user_data)
+{
+   struct connman_network *network = value;
+
+   connman_network_set_available(network, TRUE);
+}
+
 static void mark_network_unavailable(gpointer key, gpointer value,
gpointer user_data)
 {
@@ -1442,6 +1450,36 @@ void __connman_device_cleanup_networks(struct 
connman_device *device)
remove_unavailable_network, NULL);
 }
 
+void connman_device_cleanup_scanning(struct connman_device *device)
+{
+   DBusMessage *signal;
+   DBusMessageIter entry, value;
+   const char *key = Scanning;
+
+   device-scanning = FALSE;
+
+   signal = dbus_message_new_signal(device-element.path,
+   CONNMAN_DEVICE_INTERFACE, PropertyChanged);
+   if (signal == NULL)
+   return;
+
+   dbus_message_iter_init_append(signal, entry);
+
+   dbus_message_iter_append_basic(entry, DBUS_TYPE_STRING, key);
+
+   dbus_message_iter_open_container(entry, DBUS_TYPE_VARIANT,
+   DBUS_TYPE_BOOLEAN_AS_STRING, value);
+   dbus_message_iter_append_basic(value, DBUS_TYPE_BOOLEAN,
+   device-scanning);
+   dbus_message_iter_close_container(entry, value);
+
+   g_dbus_send_message(connection, signal);
+
+   g_hash_table_foreach(device-networks,
+   mark_network_available, NULL);
+
+}
+
 /**
  * connman_device_set_scanning:
  * @device: device structure
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/1] only let auto_connect failure trigger another auto_connect

2009-09-11 Thread Martin Xu
---
 src/service.c |   16 ++--
 1 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/src/service.c b/src/service.c
index aa34684..bc325d3 100644
--- a/src/service.c
+++ b/src/service.c
@@ -48,6 +48,7 @@ struct connman_service {
connman_bool_t hidden;
connman_bool_t ignore;
connman_bool_t autoconnect;
+   connman_bool_t mannual;
GTimeVal modified;
unsigned int order;
char *name;
@@ -661,8 +662,10 @@ void __connman_service_auto_connect(void)
iter = g_sequence_iter_next(iter);
}
 
-   if (service != NULL)
+   if (service != NULL) {
+   service-mannual = FALSE;
__connman_service_connect(service);
+   }
 }
 
 static void reply_pending(struct connman_service *service, int error)
@@ -720,7 +723,7 @@ static gboolean connect_timeout(gpointer user_data)
__connman_service_indicate_state(service,
CONNMAN_SERVICE_STATE_FAILURE);
 
-   if (auto_connect == TRUE)
+   if (auto_connect == TRUE  service-mannual == FALSE)
__connman_service_auto_connect();
 
return FALSE;
@@ -752,6 +755,8 @@ static DBusMessage *connect_service(DBusConnection *conn,
 
service-ignore = FALSE;
 
+   service-mannual = TRUE;
+
service-pending = dbus_message_ref(msg);
 
err = __connman_service_connect(service);
@@ -986,6 +991,8 @@ static void __connman_service_initialize(struct 
connman_service *service)
 
service-ignore = FALSE;
 
+   service-mannual = TRUE;
+
service-order = 0;
 }
 
@@ -1181,6 +1188,9 @@ int __connman_service_indicate_state(struct 
connman_service *service,
if (state == CONNMAN_SERVICE_STATE_FAILURE) {
reply_pending(service, EIO);
 
+   if (service-mannual == FALSE)
+   __connman_service_auto_connect();
+
g_get_current_time(service-modified);
__connman_storage_save_service(service);
} else
@@ -1530,6 +1540,8 @@ done:
service-passphrase = g_strdup(passphrase);
}
 
+   service-mannual = TRUE;
+
err = __connman_service_connect(service);
if (err  0  err != -EINPROGRESS)
goto failed;
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/1] fix hidden service switching issue

2009-09-09 Thread Martin Xu
---
 src/network.c |   17 -
 1 files changed, 16 insertions(+), 1 deletions(-)

diff --git a/src/network.c b/src/network.c
index 932e1f2..24aeacd 100644
--- a/src/network.c
+++ b/src/network.c
@@ -377,6 +377,21 @@ static void network_destruct(struct connman_element 
*element)
}
 }
 
+static char *build_hidden_identifier(void)
+{
+   GString *str;
+   static unsigned int seed;
+
+   if (seed  1)
+   return NULL;
+
+   str = g_string_sized_new(12);
+
+   g_string_printf(str, hidden_%d, seed++);
+
+   return g_string_free(str, FALSE);
+}
+
 /**
  * connman_network_create:
  * @identifier: network identifier (for example an unqiue name)
@@ -405,7 +420,7 @@ struct connman_network *connman_network_create(const char 
*identifier,
 
//temp = connman_dbus_encode_string(identifier);
if (identifier == NULL) {
-   temp = g_strdup(hidden);
+   temp = build_hidden_identifier();
network-hidden = TRUE;
} else
temp = g_strdup(identifier);
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/1] fix hidden service switching issue

2009-09-09 Thread Martin Xu
---
 src/network.c |3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/src/network.c b/src/network.c
index 932e1f2..a32b5ef 100644
--- a/src/network.c
+++ b/src/network.c
@@ -405,7 +405,8 @@ struct connman_network *connman_network_create(const char 
*identifier,
 
//temp = connman_dbus_encode_string(identifier);
if (identifier == NULL) {
-   temp = g_strdup(hidden);
+   static unsigned int hidden_counter;
+   temp = g_strdup_printf(hidden_%d, hidden_counter++);
network-hidden = TRUE;
} else
temp = g_strdup(identifier);
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/1] resolve race condition of wifi driver binding and rfkill

2009-09-03 Thread Martin Xu
---
 src/device.c |8 ++--
 1 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/device.c b/src/device.c
index 2745893..65bb8f6 100644
--- a/src/device.c
+++ b/src/device.c
@@ -300,8 +300,6 @@ static int set_powered(struct connman_device *device, 
connman_bool_t powered)
if (device-powered_pending == powered)
return -EALREADY;
 
-   device-powered_pending = powered;
-
if (!driver)
return -EINVAL;
 
@@ -309,12 +307,18 @@ static int set_powered(struct connman_device *device, 
connman_bool_t powered)
 
if (powered == TRUE) {
if (driver-enable) {
+
+   device-powered_pending = powered;
+
err = driver-enable(device);
if (err == 0)
__connman_notifier_enable(type);
} else
err = -EINVAL;
} else {
+
+   device-powered_pending = powered;
+
clear_scan_trigger(device);
 
g_hash_table_remove_all(device-networks);
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/1] let loopback set up loop back device even it is up

2009-09-02 Thread Martin Xu
---
 plugins/loopback.c |6 --
 1 files changed, 0 insertions(+), 6 deletions(-)

diff --git a/plugins/loopback.c b/plugins/loopback.c
index 59716c2..44adfee 100644
--- a/plugins/loopback.c
+++ b/plugins/loopback.c
@@ -191,12 +191,6 @@ static int setup_loopback(void)
goto done;
}
 
-   if (ifr.ifr_flags  IFF_UP) {
-   err = -EALREADY;
-   connman_info(The loopback interface is already up);
-   goto done;
-   }
-
memset(addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(127.0.0.1);
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/1] check beofore load boolean type value from keyfile

2009-08-24 Thread Martin Xu
---
 src/service.c |   16 +++-
 1 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/src/service.c b/src/service.c
index df49a21..0dd7b15 100644
--- a/src/service.c
+++ b/src/service.c
@@ -2024,6 +2024,8 @@ static int service_load(struct connman_service *service)
gchar *pathname, *data = NULL;
gsize length;
gchar *str;
+   GError *g_err = NULL;
+   connman_bool_t tmp_bool;
unsigned int ssid_len;
int err = 0;
 
@@ -2110,11 +2112,15 @@ static int service_load(struct connman_service *service)
case CONNMAN_SERVICE_TYPE_WIMAX:
case CONNMAN_SERVICE_TYPE_BLUETOOTH:
case CONNMAN_SERVICE_TYPE_CELLULAR:
-   service-favorite = g_key_file_get_boolean(keyfile,
-   service-identifier, Favorite, NULL);
-
-   service-autoconnect = g_key_file_get_boolean(keyfile,
-   service-identifier, AutoConnect, NULL);
+   tmp_bool = g_key_file_get_boolean(keyfile,
+   service-identifier, Favorite, g_err);
+   if (g_err == NULL)
+   service-favorite = tmp_bool;
+
+   tmp_bool = g_key_file_get_boolean(keyfile,
+   service-identifier, AutoConnect, g_err);
+   if (g_err == NULL)
+   service-autoconnect = tmp_bool;
 
str = g_key_file_get_string(keyfile,
service-identifier, Failure, NULL);
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/2] save group for hidden network

2009-08-24 Thread Martin Xu
---
 plugins/supplicant.c |3 +-
 src/service.c|  110 --
 2 files changed, 107 insertions(+), 6 deletions(-)

diff --git a/plugins/supplicant.c b/plugins/supplicant.c
index 0fe931e..666d12d 100644
--- a/plugins/supplicant.c
+++ b/plugins/supplicant.c
@@ -1352,8 +1352,7 @@ static void properties_reply(DBusPendingCall *call, void 
*user_data)
connman_network_set_uint16(network, WiFi.Channel, channel);
connman_network_set_string(network, WiFi.Security, security);
 
-   if (result.ssid != NULL)
-   connman_network_set_group(network, group);
+   connman_network_set_group(network, group);
 
 done:
g_free(group);
diff --git a/src/service.c b/src/service.c
index 0dd7b15..1712de3 100644
--- a/src/service.c
+++ b/src/service.c
@@ -56,6 +56,7 @@ struct connman_service {
struct connman_ipconfig *ipconfig;
struct connman_device *device;
struct connman_network *network;
+   GList *network_list;
DBusMessage *pending;
guint timeout;
 };
@@ -910,6 +911,7 @@ static void service_free(gpointer user_data)
 {
struct connman_service *service = user_data;
char *path = service-path;
+   GList *list;
 
DBG(service %p, service);
 
@@ -930,6 +932,16 @@ static void service_free(gpointer user_data)
if (service-network != NULL)
connman_network_unref(service-network);
 
+   for (list = service-network_list; list; list = list-next) {
+   struct connman_network *network = list-data;
+
+   connman_network_unref(network);
+
+   list-data = NULL;
+   }
+
+   g_list_free(service-network_list);
+
if (service-ipconfig != NULL) {
connman_ipconfig_unref(service-ipconfig);
service-ipconfig = NULL;
@@ -1580,12 +1592,24 @@ static struct connman_service 
*__connman_service_get(const char *identifier)
 
__connman_storage_load_service(service);
 
-   iter = g_sequence_insert_sorted(service_list, service,
-   service_compare, NULL);
+   return service;
+}
 
-   g_hash_table_insert(service_hash, service-identifier, iter);
+static connman_bool_t is_hidden_wifi_service(struct connman_service *service)
+{
+   const unsigned char *ssid;
+   unsigned int ssid_len = 0;
 
-   return service;
+   if (service-type != CONNMAN_SERVICE_TYPE_WIFI)
+   return FALSE;
+
+   ssid = connman_network_get_blob(service-network,
+   WiFi.SSID, ssid_len);
+
+   if (ssid != NULL  ssid_len  0  ssid[0] != '\0')
+   return FALSE;
+
+   return TRUE;
 }
 
 static int service_register(struct connman_service *service)
@@ -1598,6 +1622,11 @@ static int service_register(struct connman_service 
*service)
if (service-path != NULL)
return -EALREADY;
 
+   iter = g_sequence_insert_sorted(service_list, service,
+   service_compare, NULL);
+
+   g_hash_table_insert(service_hash, service-identifier, iter);
+
service-path = g_strdup_printf(%s/%s, path, service-identifier);
 
DBG(path %s, service-path);
@@ -1870,6 +1899,22 @@ static enum connman_service_mode 
convert_wifi_security(const char *security)
return CONNMAN_SERVICE_SECURITY_UNKNOWN;
 }
 
+static void add_network(struct connman_service *service,
+   struct connman_network *network)
+{
+   struct connman_network *data = connman_network_ref(network);
+
+   service-network_list = g_list_append(service-network_list, data);
+}
+
+static void remove_network(struct connman_service *service,
+   struct connman_network *network)
+{
+   service-network_list = g_list_remove(service-network_list, network);
+
+   connman_network_unref(network);
+}
+
 static void update_from_network(struct connman_service *service,
struct connman_network *network)
 {
@@ -1945,6 +1990,8 @@ struct connman_service 
*__connman_service_create_from_network(struct connman_net
if (service == NULL)
return NULL;
 
+   add_network(service, network);
+
if (__connman_network_get_weakness(network) == TRUE)
return service;
 
@@ -1975,6 +2022,14 @@ struct connman_service 
*__connman_service_create_from_network(struct connman_net
 
setup_ipconfig(service, connman_network_get_index(network));
 
+   if (is_hidden_wifi_service(service) == TRUE) {
+   __connman_storage_save_service(service);
+
+   __connman_service_put(service);
+
+   return NULL;
+   }
+
service_register(service);
 
__connman_profile_changed(TRUE);
@@ -2014,6 +2069,8 @@ void __connman_service_remove_from_network(struct 
connman_network *network)
if 

[PATCH 2/2] set group for hidden network

2009-08-24 Thread Martin Xu
---
 src/service.c |   67 +
 1 files changed, 67 insertions(+), 0 deletions(-)

diff --git a/src/service.c b/src/service.c
index 1712de3..d2c7dbe 100644
--- a/src/service.c
+++ b/src/service.c
@@ -38,6 +38,7 @@ struct connman_service {
gint refcount;
char *identifier;
char *path;
+   char *previous_group;
enum connman_service_type type;
enum connman_service_mode mode;
enum connman_service_security security;
@@ -947,6 +948,7 @@ static void service_free(gpointer user_data)
service-ipconfig = NULL;
}
 
+   g_free(service-previous_group);
g_free(service-profile);
g_free(service-name);
g_free(service-passphrase);
@@ -1962,6 +1964,46 @@ static void update_from_network(struct connman_service 
*service,
g_sequence_sort_changed(iter, service_compare, NULL);
 }
 
+static struct connman_network *dup_hidden_network(
+   struct connman_network *network)
+{
+   struct connman_device *device;
+   struct connman_network *hidden_network;
+   const char *security, *mode;
+   int index;
+
+   DBG();
+
+   hidden_network = connman_network_create(NULL,
+   CONNMAN_NETWORK_TYPE_WIFI);
+   if (hidden_network == NULL)
+   return NULL;
+
+   device = connman_network_get_device(network);
+
+   index = connman_device_get_index(device);
+
+   connman_network_set_index(hidden_network, index);
+
+   connman_network_set_protocol(hidden_network,
+   CONNMAN_NETWORK_PROTOCOL_IP);
+
+   mode = connman_network_get_string(network, WiFi.Mode);
+   connman_network_set_string(hidden_network, WiFi.Mode, mode);
+
+   security = connman_network_get_string(network, WiFi.Security);
+   connman_network_set_string(hidden_network, WiFi.Security, security);
+
+   if (connman_device_add_network(device, hidden_network)  0) {
+   connman_network_unref(hidden_network);
+   return NULL;
+   }
+
+   connman_network_set_available(hidden_network, TRUE);
+
+   return hidden_network;
+}
+
 /**
  * __connman_service_create_from_network:
  * @network: network structure
@@ -2022,6 +2064,25 @@ struct connman_service 
*__connman_service_create_from_network(struct connman_net
 
setup_ipconfig(service, connman_network_get_index(network));
 
+   __connman_storage_load_service(service);
+
+   if (service-previous_group != NULL) {
+   struct connman_network *dup_network;
+   char *group = g_strdup(service-previous_group);
+
+   name = g_strdup_printf(%s_%s_%s,
+   __connman_network_get_type(network), ident, group);
+
+   if (__connman_service_lookup(name) == NULL) {
+   dup_network = dup_hidden_network(service-network);
+
+   if (dup_network != NULL)
+   connman_network_set_group(dup_network, group);
+   }
+
+   g_free(name);
+   }
+
if (is_hidden_wifi_service(service) == TRUE) {
__connman_storage_save_service(service);
 
@@ -2125,6 +2186,7 @@ static int service_load(struct connman_service *service)
if (name != NULL) {
g_free(service-name);
service-name = name;
+   service-hidden = FALSE;
}
 
if (service-network != NULL)
@@ -2164,6 +2226,11 @@ static int service_load(struct connman_service *service)
 
g_free(hex_ssid);
}
+
+   service-previous_group = g_key_file_get_string(keyfile,
+   service-identifier,
+   Group, NULL);
+
/* fall through */
 
case CONNMAN_SERVICE_TYPE_WIMAX:
-- 
1.6.0.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/1] save hidden networks group

2009-08-13 Thread Martin Xu
---
 plugins/supplicant.c |3 +-
 src/service.c|  121 +++---
 2 files changed, 116 insertions(+), 8 deletions(-)

diff --git a/plugins/supplicant.c b/plugins/supplicant.c
index 0fe931e..666d12d 100644
--- a/plugins/supplicant.c
+++ b/plugins/supplicant.c
@@ -1352,8 +1352,7 @@ static void properties_reply(DBusPendingCall *call, void 
*user_data)
connman_network_set_uint16(network, WiFi.Channel, channel);
connman_network_set_string(network, WiFi.Security, security);
 
-   if (result.ssid != NULL)
-   connman_network_set_group(network, group);
+   connman_network_set_group(network, group);
 
 done:
g_free(group);
diff --git a/src/service.c b/src/service.c
index 09d2534..d8ac4e2 100644
--- a/src/service.c
+++ b/src/service.c
@@ -56,6 +56,7 @@ struct connman_service {
struct connman_ipconfig *ipconfig;
struct connman_device *device;
struct connman_network *network;
+   GList *network_list;
DBusMessage *pending;
guint timeout;
 };
@@ -927,6 +928,7 @@ static void service_free(gpointer user_data)
 {
struct connman_service *service = user_data;
char *path = service-path;
+   GList *list;
 
DBG(service %p, service);
 
@@ -947,6 +949,16 @@ static void service_free(gpointer user_data)
if (service-network != NULL)
connman_network_unref(service-network);
 
+   for (list = service-network_list; list; list = list-next) {
+   struct connman_network *network = list-data;
+
+   connman_network_unref(network);
+
+   list-data = NULL;
+   }
+
+   g_list_free(service-network_list);
+
if (service-ipconfig != NULL) {
connman_ipconfig_unref(service-ipconfig);
service-ipconfig = NULL;
@@ -1589,12 +1601,24 @@ static struct connman_service 
*__connman_service_get(const char *identifier)
 
__connman_storage_load_service(service);
 
-   iter = g_sequence_insert_sorted(service_list, service,
-   service_compare, NULL);
+   return service;
+}
 
-   g_hash_table_insert(service_hash, service-identifier, iter);
+static connman_bool_t is_hidden_wifi_service(struct connman_service *service)
+{
+   const unsigned char *ssid;
+   unsigned int ssid_len = 0;
 
-   return service;
+   if (service-type != CONNMAN_SERVICE_TYPE_WIFI)
+   return FALSE;
+
+   ssid = connman_network_get_blob(service-network,
+   WiFi.SSID, ssid_len);
+
+   if (ssid != NULL  ssid_len  0  ssid[0] != '\0')
+   return FALSE;
+
+   return TRUE;
 }
 
 static int service_register(struct connman_service *service)
@@ -1607,6 +1631,16 @@ static int service_register(struct connman_service 
*service)
if (service-path != NULL)
return -EALREADY;
 
+   if (is_hidden_wifi_service(service) == TRUE) {
+   __connman_storage_save_service(service);
+   return -EINVAL;
+   }
+
+   iter = g_sequence_insert_sorted(service_list, service,
+   service_compare, NULL);
+
+   g_hash_table_insert(service_hash, service-identifier, iter);
+
service-path = g_strdup_printf(%s/%s, path, service-identifier);
 
DBG(path %s, service-path);
@@ -1662,6 +1696,7 @@ struct connman_service 
*__connman_service_create_from_device(struct connman_devi
struct connman_service *service;
const char *ident;
char *name;
+   int err;
 
ident = __connman_device_get_ident(device);
if (ident == NULL)
@@ -1686,7 +1721,11 @@ struct connman_service 
*__connman_service_create_from_device(struct connman_devi
 
service-device = device;
 
-   service_register(service);
+   err = service_register(service);
+   if (err == -EINVAL) {
+   __connman_service_put(service);
+   return NULL;
+   }
 
__connman_profile_changed(TRUE);
 
@@ -1819,6 +1858,22 @@ static enum connman_service_mode 
convert_wifi_security(const char *security)
return CONNMAN_SERVICE_SECURITY_UNKNOWN;
 }
 
+static void add_network(struct connman_service *service,
+   struct connman_network *network)
+{
+   struct connman_network *data = connman_network_ref(network);
+
+   service-network_list = g_list_append(service-network_list, data);
+}
+
+static void remove_network(struct connman_service *service,
+   struct connman_network *network)
+{
+   service-network_list = g_list_remove(service-network_list, network);
+
+   connman_network_unref(network);
+}
+
 static void update_from_network(struct connman_service *service,
struct connman_network *network)
 {
@@ -1877,6 +1932,7 @@ struct connman_service 

[PATCH 1/1] clear ssid when network restore back to hidden

2009-08-12 Thread Martin Xu
---
 plugins/supplicant.c |6 ++
 1 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/plugins/supplicant.c b/plugins/supplicant.c
index a6c9651..00c7aee 100644
--- a/plugins/supplicant.c
+++ b/plugins/supplicant.c
@@ -1337,10 +1337,8 @@ static void properties_reply(DBusPendingCall *call, void 
*user_data)
if (result.name != NULL  result.name[0] != '\0')
connman_network_set_name(network, result.name);
 
-   if (connman_network_get_blob(network, WiFi.SSID, ssid_len) == NULL) {
-   connman_network_set_blob(network, WiFi.SSID,
-result.ssid, result.ssid_len);
-   }
+   connman_network_set_blob(network, WiFi.SSID,
+   result.ssid, result.ssid_len);
 
connman_network_set_string(network, WiFi.Mode, mode);
 
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/1] save hidden networks group

2009-08-12 Thread Martin Xu
---
 plugins/supplicant.c |3 +-
 src/service.c|  124 +++--
 2 files changed, 119 insertions(+), 8 deletions(-)

diff --git a/plugins/supplicant.c b/plugins/supplicant.c
index 0fe931e..666d12d 100644
--- a/plugins/supplicant.c
+++ b/plugins/supplicant.c
@@ -1352,8 +1352,7 @@ static void properties_reply(DBusPendingCall *call, void 
*user_data)
connman_network_set_uint16(network, WiFi.Channel, channel);
connman_network_set_string(network, WiFi.Security, security);
 
-   if (result.ssid != NULL)
-   connman_network_set_group(network, group);
+   connman_network_set_group(network, group);
 
 done:
g_free(group);
diff --git a/src/service.c b/src/service.c
index 09d2534..b8edae5 100644
--- a/src/service.c
+++ b/src/service.c
@@ -56,6 +56,7 @@ struct connman_service {
struct connman_ipconfig *ipconfig;
struct connman_device *device;
struct connman_network *network;
+   GList *network_list;
DBusMessage *pending;
guint timeout;
 };
@@ -927,6 +928,7 @@ static void service_free(gpointer user_data)
 {
struct connman_service *service = user_data;
char *path = service-path;
+   GList *list;
 
DBG(service %p, service);
 
@@ -947,6 +949,16 @@ static void service_free(gpointer user_data)
if (service-network != NULL)
connman_network_unref(service-network);
 
+   for (list = service-network_list; list; list = list-next) {
+   struct connman_network *network = list-data;
+
+   connman_network_unref(network);
+
+   list-data = NULL;
+   }
+
+   g_list_free(service-network_list);
+
if (service-ipconfig != NULL) {
connman_ipconfig_unref(service-ipconfig);
service-ipconfig = NULL;
@@ -1589,12 +1601,27 @@ static struct connman_service 
*__connman_service_get(const char *identifier)
 
__connman_storage_load_service(service);
 
-   iter = g_sequence_insert_sorted(service_list, service,
-   service_compare, NULL);
+   return service;
+}
 
-   g_hash_table_insert(service_hash, service-identifier, iter);
+static connman_bool_t is_hidden_service(struct connman_service *service)
+{
+   const unsigned char *ssid;
+   unsigned int ssid_len = 0;
 
-   return service;
+   if (service-device != NULL)
+   return FALSE;
+
+   if (service-network == NULL)
+   return FALSE;
+
+   ssid = connman_network_get_blob(service-network,
+   WiFi.SSID, ssid_len);
+
+   if (ssid != NULL  ssid_len  0  ssid[0] != '\0')
+   return FALSE;
+
+   return TRUE;
 }
 
 static int service_register(struct connman_service *service)
@@ -1607,6 +1634,16 @@ static int service_register(struct connman_service 
*service)
if (service-path != NULL)
return -EALREADY;
 
+   if (is_hidden_service(service) == TRUE) {
+   __connman_storage_save_service(service);
+   return -EINVAL;
+   }
+
+   iter = g_sequence_insert_sorted(service_list, service,
+   service_compare, NULL);
+
+   g_hash_table_insert(service_hash, service-identifier, iter);
+
service-path = g_strdup_printf(%s/%s, path, service-identifier);
 
DBG(path %s, service-path);
@@ -1662,6 +1699,7 @@ struct connman_service 
*__connman_service_create_from_device(struct connman_devi
struct connman_service *service;
const char *ident;
char *name;
+   int err;
 
ident = __connman_device_get_ident(device);
if (ident == NULL)
@@ -1686,7 +1724,11 @@ struct connman_service 
*__connman_service_create_from_device(struct connman_devi
 
service-device = device;
 
-   service_register(service);
+   err = service_register(service);
+   if (err == -EINVAL) {
+   __connman_service_put(service);
+   return NULL;
+   }
 
__connman_profile_changed(TRUE);
 
@@ -1819,6 +1861,22 @@ static enum connman_service_mode 
convert_wifi_security(const char *security)
return CONNMAN_SERVICE_SECURITY_UNKNOWN;
 }
 
+static void add_network(struct connman_service *service,
+   struct connman_network *network)
+{
+   struct connman_network *data = connman_network_ref(network);
+
+   service-network_list = g_list_append(service-network_list, data);
+}
+
+static void remove_network(struct connman_service *service,
+   struct connman_network *network)
+{
+   service-network_list = g_list_remove(service-network_list, network);
+
+   connman_network_unref(network);
+}
+
 static void update_from_network(struct connman_service *service,
struct connman_network *network)
 {
@@ 

[PATCH 2/9] add favorite to connman_network

2009-08-05 Thread Martin Xu
---
 src/network.c |3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/src/network.c b/src/network.c
index fadb08c..95bf39d 100644
--- a/src/network.c
+++ b/src/network.c
@@ -66,6 +66,7 @@ struct connman_network {
} wifi;
 
char *service_identifier;
+   connman_bool_t favorite;
 };
 
 static const char *type2string(enum connman_network_type type)
@@ -429,6 +430,8 @@ struct connman_network *connman_network_create(const char 
*identifier,
network-secondary  = FALSE;
network-identifier = g_strdup(temp);
 
+   network-favorite   = FALSE;
+
network-ipconfig = connman_ipconfig_create();
if (network-ipconfig == NULL) {
connman_network_unref(network);
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 3/9] add network storage support

2009-08-05 Thread Martin Xu
---
 include/storage.h |3 +++
 src/connman.h |2 ++
 src/storage.c |   36 
 3 files changed, 41 insertions(+), 0 deletions(-)

diff --git a/include/storage.h b/include/storage.h
index 4cee761..d41eaf2 100644
--- a/include/storage.h
+++ b/include/storage.h
@@ -49,6 +49,9 @@ struct connman_storage {
enum connman_service_type service_type;
int (*service_load) (struct connman_service *service);
int (*service_save) (struct connman_service *service);
+   enum connman_network_type network_type;
+   int (*network_load) (struct connman_network *network);
+   int (*network_save) (struct connman_network *network);
enum connman_device_type device_type;
int (*device_load) (struct connman_device *device);
int (*device_save) (struct connman_device *device);
diff --git a/src/connman.h b/src/connman.h
index 848fe43..741 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -134,6 +134,8 @@ int __connman_storage_load_profile(struct connman_profile 
*profile);
 int __connman_storage_save_profile(struct connman_profile *profile);
 int __connman_storage_load_service(struct connman_service *service);
 int __connman_storage_save_service(struct connman_service *service);
+int __connman_storage_load_network(struct connman_network *network);
+int __connman_storage_save_network(struct connman_network *network);
 int __connman_storage_load_device(struct connman_device *device);
 int __connman_storage_save_device(struct connman_device *device);
 
diff --git a/src/storage.c b/src/storage.c
index 0472169..4e85bd4 100644
--- a/src/storage.c
+++ b/src/storage.c
@@ -270,6 +270,42 @@ int __connman_storage_save_device(struct connman_device 
*device)
return -ENOENT;
 }
 
+int __connman_storage_load_network(struct connman_network *network)
+{
+   GSList *list;
+
+   DBG(network %p, network);
+
+   for (list = storage_list; list; list = list-next) {
+   struct connman_storage *storage = list-data;
+
+   if (storage-network_load) {
+   if (storage-network_load(network) == 0)
+   return 0;
+   }
+   }
+
+   return -ENOENT;
+}
+
+int __connman_storage_save_network(struct connman_network *network)
+{
+   GSList *list;
+
+   DBG(network %p, network);
+
+   for (list = storage_list; list; list = list-next) {
+   struct connman_storage *storage = list-data;
+
+   if (storage-network_save) {
+   if (storage-network_save(network) == 0)
+   return 0;
+   }
+   }
+
+   return -ENOENT;
+}
+
 int __connman_storage_init(void)
 {
DBG();
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 5/9] update service_identifier and save network

2009-08-05 Thread Martin Xu
---
 src/service.c |5 +
 1 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/src/service.c b/src/service.c
index 1d52afe..65f79d3 100644
--- a/src/service.c
+++ b/src/service.c
@@ -1747,6 +1747,11 @@ static void update_from_network(struct connman_service 
*service,
GSequenceIter *iter;
const char *str;
 
+   __connman_network_set_service_identifer(network,
+   service-identifier);
+
+   __connman_storage_save_network(network);
+
if (service-state == CONNMAN_SERVICE_STATE_READY)
return;
 
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 6/9] export __connman_service_lookup

2009-08-05 Thread Martin Xu
---
 src/connman.h |1 +
 src/service.c |2 +-
 2 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/src/connman.h b/src/connman.h
index 741..e6a9734 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -302,6 +302,7 @@ struct connman_service 
*__connman_service_lookup_from_device(struct connman_devi
 struct connman_service *__connman_service_create_from_device(struct 
connman_device *device);
 void __connman_service_remove_from_device(struct connman_device *device);
 
+struct connman_service *__connman_service_lookup(const char *identifier);
 struct connman_service *__connman_service_lookup_from_network(struct 
connman_network *network);
 struct connman_service *__connman_service_create_from_network(struct 
connman_network *network);
 void __connman_service_update_from_network(struct connman_network *network);
diff --git a/src/service.c b/src/service.c
index 65f79d3..d49961a 100644
--- a/src/service.c
+++ b/src/service.c
@@ -1281,7 +1281,7 @@ int __connman_service_disconnect(struct connman_service 
*service)
  *
  * Look up a service by identifier (reference count will not be increased)
  */
-static struct connman_service *__connman_service_lookup(const char *identifier)
+struct connman_service *__connman_service_lookup(const char *identifier)
 {
GSequenceIter *iter;
 
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 7/9] add __connman_service_create_hidden_service

2009-08-05 Thread Martin Xu
---
 src/connman.h |1 +
 src/service.c |   25 +
 2 files changed, 26 insertions(+), 0 deletions(-)

diff --git a/src/connman.h b/src/connman.h
index e6a9734..200b4ac 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -299,6 +299,7 @@ const char *__connman_service_default(void);
 void __connman_service_put(struct connman_service *service);
 
 struct connman_service *__connman_service_lookup_from_device(struct 
connman_device *device);
+struct connman_service *__connman_service_create_hidden_service(struct 
connman_network *network);
 struct connman_service *__connman_service_create_from_device(struct 
connman_device *device);
 void __connman_service_remove_from_device(struct connman_device *device);
 
diff --git a/src/service.c b/src/service.c
index d49961a..ffd1e0a 100644
--- a/src/service.c
+++ b/src/service.c
@@ -1551,6 +1551,31 @@ static int service_register(struct connman_service 
*service)
return 0;
 }
 
+struct connman_service *__connman_service_create_hidden_service(
+   struct connman_network *network)
+{
+   struct connman_service *service;
+   const char *identifier;
+
+   identifier = __connman_network_get_service_identifier(network);
+
+   DBG(identifier %s, identifier);
+
+   service = __connman_service_get(identifier);
+   if (service == NULL)
+   return NULL;
+
+   service-type = CONNMAN_SERVICE_TYPE_WIFI;
+
+   service-state = CONNMAN_SERVICE_STATE_IDLE;
+
+   service-network = connman_network_ref(network);
+
+   service_register(service);
+
+   return service;
+}
+
 /**
  * __connman_service_lookup_from_device:
  * @device: device structure
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 8/9] add connman_network_load_hidden_network

2009-08-05 Thread Martin Xu
---
 include/network.h |2 +
 src/network.c |  114 +
 2 files changed, 116 insertions(+), 0 deletions(-)

diff --git a/include/network.h b/include/network.h
index b892d2b..06ff1d4 100644
--- a/include/network.h
+++ b/include/network.h
@@ -112,6 +112,8 @@ struct connman_device *connman_network_get_device(struct 
connman_network *networ
 void *connman_network_get_data(struct connman_network *network);
 void connman_network_set_data(struct connman_network *network, void *data);
 
+void connman_network_load_hidden_network(struct connman_network *network);
+
 struct connman_network_driver {
const char *name;
enum connman_network_type type;
diff --git a/src/network.c b/src/network.c
index 8683ea2..092c1d5 100644
--- a/src/network.c
+++ b/src/network.c
@@ -1214,6 +1214,120 @@ void connman_network_set_data(struct connman_network 
*network, void *data)
network-driver_data = data;
 }
 
+static char *set_hidden_network_group(struct connman_network *network)
+{
+   const char *mode, *security;
+   char *group;
+   const void *ssid;
+   unsigned int ssid_len;
+
+   security = connman_network_get_string(network, WiFi.Security);
+   if (security == NULL)
+   return NULL;
+
+   mode = connman_network_get_string(network, WiFi.Mode);
+   if (mode == NULL)
+   return NULL;
+
+   ssid = connman_network_get_blob(network, WiFi.SSID, ssid_len);
+   if (ssid_len == 0)
+   return NULL;
+
+   group = connman_wifi_build_group_name((unsigned char *) ssid,
+   ssid_len, mode, security);
+   if (group != NULL)
+   network-group = g_strdup(group);
+
+   return group;
+}
+
+static struct connman_network *dup_hidden_network(
+   struct connman_network *network)
+{
+   struct connman_device *device;
+   struct connman_network *hidden_network;
+   const char *security, *mode;
+   int index;
+
+   DBG();
+
+   hidden_network = connman_network_create(NULL,
+   CONNMAN_NETWORK_TYPE_WIFI);
+   if (hidden_network == NULL)
+   return NULL;
+
+   device = connman_network_get_device(network);
+
+   index = connman_device_get_index(device);
+
+   connman_network_set_index(hidden_network, index);
+
+   connman_network_set_protocol(hidden_network,
+   CONNMAN_NETWORK_PROTOCOL_IP);
+
+   mode = connman_network_get_string(network, WiFi.Mode);
+   connman_network_set_string(hidden_network, WiFi.Mode, mode);
+
+   security = connman_network_get_string(network, WiFi.Security);
+   connman_network_set_string(hidden_network, WiFi.Security, security);
+
+   hidden_network-service_identifier =
+   g_strdup(network-service_identifier);
+
+   if (connman_device_add_network(device, hidden_network)  0) {
+   connman_network_unref(hidden_network);
+   return NULL;
+   }
+
+   connman_network_set_available(hidden_network, TRUE);
+
+   return hidden_network;
+}
+
+void connman_network_load_hidden_network(struct connman_network *network)
+{
+   struct connman_network *hidden_network;
+   struct connman_service *service;
+   char *group;
+
+   __connman_storage_load_network(network);
+   if (network-service_identifier == NULL)
+   return;
+
+   if (network-favorite == FALSE)
+   return;
+
+   service = __connman_service_lookup(network-service_identifier);
+   if (service != NULL)
+   return;
+
+   hidden_network = dup_hidden_network(network);
+   if (hidden_network == NULL)
+   return;
+
+   service = __connman_service_create_hidden_service(hidden_network);
+   if (service == NULL)
+   goto fail;
+
+   group = set_hidden_network_group(hidden_network);
+   if (group == NULL)
+   goto fail;
+
+   g_free(group);
+
+   __connman_service_auto_connect();
+
+   return;
+
+fail:
+   connman_network_unref(hidden_network);
+
+   if (service != NULL)
+   __connman_service_put(service);
+
+   return;
+}
+
 static gboolean match_driver(struct connman_network *network,
struct connman_network_driver *driver)
 {
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 9/9] load hidden network

2009-08-05 Thread Martin Xu
---
 plugins/supplicant.c |2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/plugins/supplicant.c b/plugins/supplicant.c
index 7bbde7c..84aed4f 100644
--- a/plugins/supplicant.c
+++ b/plugins/supplicant.c
@@ -1357,6 +1357,8 @@ static void properties_reply(DBusPendingCall *call, void 
*user_data)
 
if (result.ssid != NULL)
connman_network_set_group(network, group);
+   else
+   connman_network_load_hidden_network(network);
 
 done:
g_free(group);
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/1] check security but mode

2009-08-03 Thread Martin Xu
---
 src/service.c |6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/service.c b/src/service.c
index f9cb020..b778472 100644
--- a/src/service.c
+++ b/src/service.c
@@ -1408,9 +1408,9 @@ int __connman_service_create_and_connect(DBusMessage *msg)
return -EINVAL;
 
if (g_strcmp0(security, none) != 0 
-   g_strcmp0(mode, wep) != 0 
-   g_strcmp0(mode, wpa) != 0 
-   g_strcmp0(mode, rsn) != 0)
+   g_strcmp0(security, wep) != 0 
+   g_strcmp0(security, wpa) != 0 
+   g_strcmp0(security, rsn) != 0)
return -EINVAL;
 
device = __connman_element_find_device(CONNMAN_SERVICE_TYPE_WIFI);
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/5] fix connman_service_create_and_connect

2009-07-17 Thread Martin Xu
---
 src/service.c |   78 +
 1 files changed, 67 insertions(+), 11 deletions(-)

diff --git a/src/service.c b/src/service.c
index 2cfbdb8..fbf9431 100644
--- a/src/service.c
+++ b/src/service.c
@@ -1148,6 +1148,19 @@ static struct connman_service 
*__connman_service_lookup(const char *identifier)
return NULL;
 }
 
+static void convert_name(const char *ssid, char *name,
+   unsigned int ssid_len)
+{
+   unsigned int i;
+
+   for (i = 0; i  ssid_len; i++) {
+   if (g_ascii_isprint(ssid[i]))
+   name[i] = ssid[i];
+   else
+   name[i] = ' ';
+   }
+}
+
 int __connman_service_create_and_connect(DBusMessage *msg)
 {
struct connman_service *service;
@@ -1155,6 +1168,7 @@ int __connman_service_create_and_connect(DBusMessage *msg)
DBusMessageIter iter, array;
const char *mode = managed, *security = none;
const char *type = NULL, *ssid = NULL, *passphrase = NULL;
+   unsigned int ssid_len = 0;
const char *ident;
char *name, *group;
int err;
@@ -1202,6 +1216,7 @@ int __connman_service_create_and_connect(DBusMessage *msg)
if (ssid == NULL)
return -EINVAL;
 
+   ssid_len = strlen(ssid);
device = __connman_element_find_device(CONNMAN_DEVICE_TYPE_WIFI);
if (device == NULL)
return -EOPNOTSUPP;
@@ -1211,14 +1226,12 @@ int __connman_service_create_and_connect(DBusMessage 
*msg)
return -EOPNOTSUPP;
 
group = connman_wifi_build_group_name((unsigned char *) ssid,
-   strlen(ssid), mode, security);
+   ssid_len, mode, security);
if (group == NULL)
return -EINVAL;
 
name = g_strdup_printf(%s_%s_%s, type, ident, group);
 
-   g_free(group);
-
service = __connman_service_lookup(name);
 
g_free(name);
@@ -1228,19 +1241,62 @@ int __connman_service_create_and_connect(DBusMessage 
*msg)
g_free(service-passphrase);
service-passphrase = g_strdup(passphrase);
}
+   } else {
+   struct connman_network *network;
+   char *net_name;
+   int index;
+
+   network = connman_network_create(00_00_00_00_00_00,
+   CONNMAN_NETWORK_TYPE_WIFI);
+   if (network == NULL) {
+   g_free(group);
+   return -ENOMEM;
+   }
 
-   err = __connman_service_connect(service);
-   if (err  0  err != -EINPROGRESS)
-   return err;
+   connman_network_set_blob(network, WiFi.SSID, ssid, ssid_len);
 
-   g_dbus_send_reply(connection, msg,
-   DBUS_TYPE_OBJECT_PATH, service-path,
-   DBUS_TYPE_INVALID);
+   net_name = g_try_malloc0(ssid_len + 1);
+   if (name == NULL) {
+   g_free(group);
+   return -ENOMEM;
+   }
 
-   return 0;
+   convert_name(ssid, net_name, ssid_len);
+   connman_network_set_name(network, net_name);
+   g_free(net_name);
+
+   connman_network_set_string(network, WiFi.Mode, mode);
+   connman_network_set_string(network, WiFi.Security, security);
+   connman_network_set_string(network, WiFi.Passphrase, 
passphrase);
+
+   connman_network_set_group(network, group);
+
+   index = connman_device_get_index(device);
+   connman_network_set_index(network, index);
+
+   connman_network_set_protocol(network,
+   CONNMAN_NETWORK_PROTOCOL_IP);
+
+   connman_device_add_network(device, network);
+
+   connman_network_set_available(network, TRUE);
+
+   service = __connman_service_lookup_from_network(network);
}
 
-   return -EOPNOTSUPP;
+   g_free(group);
+
+   if (service == NULL)
+   return -EOPNOTSUPP;
+
+   err = __connman_service_connect(service);
+   if (err  0  err != -EINPROGRESS)
+   return err;
+
+   g_dbus_send_reply(connection, msg,
+   DBUS_TYPE_OBJECT_PATH, service-path,
+   DBUS_TYPE_INVALID);
+   return 0;
 }
 
 /**
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 5/5] remove set bssid group when COMPLETED at supplicant

2009-07-17 Thread Martin Xu
---
 plugins/supplicant.c |   29 -
 1 files changed, 0 insertions(+), 29 deletions(-)

diff --git a/plugins/supplicant.c b/plugins/supplicant.c
index 67a0161..d785b30 100644
--- a/plugins/supplicant.c
+++ b/plugins/supplicant.c
@@ -1559,35 +1559,6 @@ static void state_change(struct supplicant_task *task, 
DBusMessage *msg)
 
switch (task-state) {
case WPA_COMPLETED:
-   if (connman_network_get_group(task-network) == NULL) {
-   const char *name, *mode, *security;
-   char *bssid;
-
-   /*
-* This is a hidden network, we need to set its
-* group based on the BSSID we just joined.
-*/
-   bssid = get_bssid(task-device);
-
-   name = connman_network_get_string(task-network,
-   Name);
-   mode = connman_network_get_string(task-network,
-   WiFi.Mode);
-   security = connman_network_get_string(task-network,
-   WiFi.Security);
-
-   if (bssid  name  mode  security) {
-   char *group;
-
-   group = build_group(bssid, name, NULL, 0,
-   mode, security);
-   connman_network_set_group(task-network, group);
-   g_free(group);
-   }
-
-   g_free(bssid);
-   }
-
/* carrier on */
connman_network_set_connected(task-network, TRUE);
connman_device_set_scanning(task-device, FALSE);
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 2/2] do not put active service

2009-07-16 Thread Martin Xu
---
 src/service.c |   20 
 1 files changed, 20 insertions(+), 0 deletions(-)

diff --git a/src/service.c b/src/service.c
index 710d295..e4a9c4b 100644
--- a/src/service.c
+++ b/src/service.c
@@ -783,6 +783,26 @@ void __connman_service_put(struct connman_service *service)
 {
DBG(service %p, service);
 
+   /*
+   * It is a workroud of below issue:
+   *   When a network belonging to a group is out of range
+   *   it will put/free the group service.
+   *
+   * The right way is:
+   *   1. Maintain a network list at the group service. When
+   *   of the group networks missing, just remove the network
+   *   from the list. put/free the group service only after
+   *   the service list is NULL.
+   *
+   *   2. The service state is updated by the active network.
+   *
+   * */
+   if (service-state == CONNMAN_SERVICE_STATE_READY)
+   return;
+
+   if (is_connecting(service) == TRUE)
+   return;
+
if (g_atomic_int_dec_and_test(service-refcount) == TRUE) {
GSequenceIter *iter;
 
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


[PATCH 1/2] add Manager.ConnectService

2009-07-16 Thread Martin Xu
---
 src/connman.h |2 +
 src/manager.c |   29 ++
 src/service.c |  180 +
 3 files changed, 187 insertions(+), 24 deletions(-)

diff --git a/src/connman.h b/src/connman.h
index 6a20ab4..5a7842c 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -272,6 +272,8 @@ int __connman_service_indicate_default(struct 
connman_service *service);
 int __connman_service_connect(struct connman_service *service);
 int __connman_service_disconnect(struct connman_service *service);
 
+int __connman_service_create_connect(DBusMessage *msg);
+
 #include connman/notifier.h
 
 int __connman_notifier_init(void);
diff --git a/src/manager.c b/src/manager.c
index 71430c8..8924d9b 100644
--- a/src/manager.c
+++ b/src/manager.c
@@ -247,34 +247,15 @@ static DBusMessage *remove_profile(DBusConnection *conn,
 static DBusMessage *connect_service(DBusConnection *conn,
DBusMessage *msg, void *data)
 {
-   DBusMessageIter iter, array;
+   int err;
 
DBG(conn %p, conn);
 
-   if (__connman_security_check_privilege(msg,
-   CONNMAN_SECURITY_PRIVILEGE_MODIFY)  0)
-   return __connman_error_permission_denied(msg);
-
-   dbus_message_iter_init(msg, iter);
-   dbus_message_iter_recurse(iter, array);
-
-   while (dbus_message_iter_get_arg_type(array) == DBUS_TYPE_DICT_ENTRY) {
-   DBusMessageIter entry, value;
-   const char *key;
-
-   dbus_message_iter_recurse(array, entry);
-   dbus_message_iter_get_basic(entry, key);
+   err = __connman_service_create_connect(msg);
+   if (err  0)
+   return __connman_error_failed(msg, -err);
 
-   dbus_message_iter_next(entry);
-   dbus_message_iter_recurse(entry, value);
-
-   switch (dbus_message_iter_get_arg_type(value)) {
-   }
-
-   dbus_message_iter_next(array);
-   }
-
-   return __connman_error_not_implemented(msg);
+   return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
 }
 
 static DBusMessage *register_agent(DBusConnection *conn,
diff --git a/src/service.c b/src/service.c
index 14f14c5..710d295 100644
--- a/src/service.c
+++ b/src/service.c
@@ -1098,6 +1098,186 @@ int __connman_service_connect(struct connman_service 
*service)
return 0;
 }
 
+static void convert_name(const unsigned char *ssid, char *name,
+   unsigned int ssid_len)
+{
+   unsigned int i;
+
+   for (i = 0; i  ssid_len; i++) {
+   if (g_ascii_isprint(ssid[i]))
+   name[i] = ssid[i];
+   else
+   name[i] = ' ';
+   }
+}
+
+static char *build_group(const unsigned char *ssid, unsigned int ssid_len,
+   const char *mode, const char *security)
+{
+   GString *str;
+   unsigned int i;
+
+   str = g_string_sized_new((ssid_len * 2) + 24);
+   if (str == NULL)
+   return NULL;
+
+   if (ssid_len  0  ssid[0] != '\0') {
+   for (i = 0; i  ssid_len; i++)
+   g_string_append_printf(str, %02x, ssid[i]);
+   }
+
+   g_string_append_printf(str, _%s_%s, mode, security);
+
+   return g_string_free(str, FALSE);
+}
+
+int __connman_service_create_connect(DBusMessage *msg)
+{
+   struct connman_service *service;
+   struct connman_network *network, *found_network;
+   struct connman_device *device;
+   DBusMessageIter iter, array;
+   DBusMessage *reply;
+   int index, err;
+   const unsigned char *ssid = NULL;
+   unsigned int ssid_len = 0;
+   char *name = NULL;
+   const char *address = NULL, *mode = NULL, *security = NULL,
+ *passphrase = NULL, *type = NULL, *group = NULL;
+
+   DBG();
+
+   if (msg == NULL)
+   return -EINVAL;
+
+   dbus_message_iter_init(msg, iter);
+   dbus_message_iter_recurse(iter, array);
+
+   while (dbus_message_iter_get_arg_type(array) == DBUS_TYPE_DICT_ENTRY) {
+   DBusMessageIter entry, value;
+   const char *key, *str;
+
+   dbus_message_iter_recurse(array, entry);
+   dbus_message_iter_get_basic(entry, key);
+
+   dbus_message_iter_next(entry);
+   dbus_message_iter_recurse(entry, value);
+
+   switch (dbus_message_iter_get_arg_type(value)) {
+   case DBUS_TYPE_STRING:
+   dbus_message_iter_get_basic(value, str);
+   if (g_str_equal(key, WiFi.SSID) == TRUE) {
+   ssid = (const unsigned char *) str;
+   ssid_len = strlen(str);
+   } else if (g_str_equal(key, WiFi.Mode) == TRUE)
+   mode = str;
+   else if (g_str_equal(key, 

[PATCH 1/1] This is the tmp-work on Manager.connet_service.

2009-07-15 Thread Martin Xu
---
 src/connman.h |   13 +
 src/device.c  |9 ++--
 src/element.c |   29 ++
 src/manager.c |   31 +--
 src/network.c |8 +++
 src/service.c |  167 +
 6 files changed, 235 insertions(+), 22 deletions(-)

diff --git a/src/connman.h b/src/connman.h
index 84ebf60..719d8e6 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -161,6 +161,8 @@ int __connman_element_count(struct connman_element *element,
 struct connman_service *__connman_element_get_service(struct connman_element 
*element);
 struct connman_device *__connman_element_get_device(struct connman_element 
*element);
 const char *__connman_element_get_device_path(struct connman_element *element);
+struct connman_device *__connman_element_find_device(
+   enum 
connman_device_type type);
 const char *__connman_element_get_network_path(struct connman_element 
*element);
 
 const char *__connman_element_type2string(enum connman_element_type type);
@@ -215,6 +217,11 @@ int __connman_device_set_offlinemode(connman_bool_t 
offlinemode);
 int __connman_profile_add_device(struct connman_device *device);
 int __connman_profile_remove_device(struct connman_device *device);
 
+struct connman_network *__connman_device_find_network(
+   struct 
connman_device *device,
+   const void 
*ssid, const char *address,
+   const char 
*security, const char *mode);
+
 #include connman/network.h
 
 int __connman_network_init(void);
@@ -223,6 +230,8 @@ void __connman_network_cleanup(void);
 void __connman_network_set_device(struct connman_network *network,
struct connman_device *device);
 
+connman_bool_t __connman_network_is_hidden(struct connman_network *network);
+
 int __connman_network_connect(struct connman_network *network);
 int __connman_network_disconnect(struct connman_network *network);
 
@@ -263,6 +272,10 @@ int __connman_service_indicate_default(struct 
connman_service *service);
 int __connman_service_connect(struct connman_service *service);
 int __connman_service_disconnect(struct connman_service *service);
 
+int __connman_service_create_connect(DBusMessage *msg, 
+   struct 
connman_service **service);
+char *__connman_service_get_path(struct connman_service *service);
+
 #include connman/notifier.h
 
 int __connman_notifier_init(void);
diff --git a/src/device.c b/src/device.c
index a7cf31e..e86ead4 100644
--- a/src/device.c
+++ b/src/device.c
@@ -493,9 +493,10 @@ static void convert_name(const char *ssid, char *name,
}
 }
 
-static struct connman_network *find_network(struct connman_device *device,
-   const void *ssid, const char *address,
-   const char *security, const char *mode)
+struct connman_network *__connman_device_find_network(
+   struct 
connman_device *device,
+   const void 
*ssid, const char *address,
+   const char 
*security, const char *mode)
 {
GHashTableIter network_iter;
gpointer key, value;
@@ -615,7 +616,7 @@ static DBusMessage *join_network(DBusConnection *conn,
mode = connman_network_get_string(network, WiFi.Mode);
address = connman_network_get_string(network, Address);
 
-   found_network = find_network(device, ssid, address, security, mode);
+   found_network = __connman_device_find_network(device, ssid, address, 
security, mode);
if (found_network != NULL) {
const char* passphrase;
 
diff --git a/src/element.c b/src/element.c
index 6ecd595..2d15598 100644
--- a/src/element.c
+++ b/src/element.c
@@ -318,6 +318,35 @@ const char *__connman_element_get_device_path(struct 
connman_element *element)
return connman_device_get_path(device);
 }
 
+struct find_data {
+   enum connman_device_type type;
+   struct connman_device *device;
+};
+
+static gboolean find_device(GNode *node, gpointer data)
+{
+   struct connman_element *element = node-data;
+   struct find_data *the_data = data;
+
+   if (element-type == the_data-type) {
+   the_data-device = element-device;
+   return TRUE;
+   }
+   
+   return FALSE;
+}
+
+struct connman_device *__connman_element_find_device(
+   enum 
connman_device_type type)
+{
+   struct find_data data= {.type = type, .device = NULL};
+   
+   g_node_traverse(element_root, G_PRE_ORDER,
+ 

[PATCH 1/2] add connman_network_get_associating()

2009-07-15 Thread Martin Xu
---
 include/network.h |2 ++
 src/network.c |   11 +++
 2 files changed, 13 insertions(+), 0 deletions(-)

diff --git a/include/network.h b/include/network.h
index 49a42d8..b892d2b 100644
--- a/include/network.h
+++ b/include/network.h
@@ -81,6 +81,8 @@ int connman_network_set_connected(struct connman_network 
*network,
connman_bool_t connected);
 connman_bool_t connman_network_get_connected(struct connman_network *network);
 
+connman_bool_t connman_network_get_associating(struct connman_network 
*network);
+
 int connman_network_set_address(struct connman_network *network,
const void *address, unsigned int size);
 int connman_network_set_name(struct connman_network *network,
diff --git a/src/network.c b/src/network.c
index afce285..8982cdd 100644
--- a/src/network.c
+++ b/src/network.c
@@ -825,6 +825,17 @@ connman_bool_t connman_network_get_connected(struct 
connman_network *network)
 }
 
 /**
+ * connman_network_get_associating:
+ * @network: network structure
+ *
+ * Get network associating status
+ */
+connman_bool_t connman_network_get_associating(struct connman_network *network)
+{
+   return network-associating;
+}
+
+/**
  * __connman_network_connect:
  * @network: network structure
  *
-- 
1.6.1.3

___
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman


  1   2   >