[Feature][T8TSK-50][TCAM_T800_SW_262][wifi] connman 1.41 & add wifi_network prop

Change-Id: I7ba857268d964443b7505834f496f314bb60f120
diff --git a/meta/meta-mediatek-ivt/recipes-connectivity/connman/connman/0005-connman-build-plugin-telephon.c.patch b/meta/meta-mediatek-ivt/recipes-connectivity/connman/connman/0005-connman-build-plugin-telephon.c.patch
index 98ddb3a..6759f6b 100644
--- a/meta/meta-mediatek-ivt/recipes-connectivity/connman/connman/0005-connman-build-plugin-telephon.c.patch
+++ b/meta/meta-mediatek-ivt/recipes-connectivity/connman/connman/0005-connman-build-plugin-telephon.c.patch
@@ -33,7 +33,7 @@
 index 740e599..38becc1 100644
 --- a/configure.ac
 +++ b/configure.ac
-@@ -328,6 +328,10 @@ AC_ARG_ENABLE(ofono, AC_HELP_STRING([--disable-ofono],
+@@ -349,6 +349,10 @@ AC_ARG_ENABLE(ofono, AC_HELP_STRING([--disable-ofono],
  					[enable_ofono=${enableval}])
  AM_CONDITIONAL(OFONO, test "${enable_ofono}" != "no")
  
diff --git a/meta/meta-mediatek-ivt/recipes-connectivity/connman/connman/0007-connman-set-ccmnix-interface-to-cellular-type.patch b/meta/meta-mediatek-ivt/recipes-connectivity/connman/connman/0007-connman-set-ccmnix-interface-to-cellular-type.patch
index d445ed9..8c3e9f6 100644
--- a/meta/meta-mediatek-ivt/recipes-connectivity/connman/connman/0007-connman-set-ccmnix-interface-to-cellular-type.patch
+++ b/meta/meta-mediatek-ivt/recipes-connectivity/connman/connman/0007-connman-set-ccmnix-interface-to-cellular-type.patch
@@ -52,10 +52,11 @@
  	FILE *f;
  
  	name = connman_inet_ifname(interface->index);
-@@ -127,7 +127,12 @@ static void read_uevent(struct interface_data *interface)
+@@ -128,7 +128,12 @@ static void read_uevent(struct interface_data *interface)
  	if (ether_blacklisted(name)) {
  		interface->service_type = CONNMAN_SERVICE_TYPE_UNKNOWN;
  		interface->device_type = CONNMAN_DEVICE_TYPE_UNKNOWN;
+		goto out;
 -	} else {
 +	}else if (strncmp(name, "ccmni", 5) == 0){
 +		interface->service_type = CONNMAN_SERVICE_TYPE_CELLULAR;
diff --git a/meta/meta-mediatek-ivt/recipes-connectivity/connman/connman/0033-connman-fix-ipv6-tethering_V2.patch b/meta/meta-mediatek-ivt/recipes-connectivity/connman/connman/0033-connman-fix-ipv6-tethering_V2.patch
index f9ac28a..f06d3c9 100644
--- a/meta/meta-mediatek-ivt/recipes-connectivity/connman/connman/0033-connman-fix-ipv6-tethering_V2.patch
+++ b/meta/meta-mediatek-ivt/recipes-connectivity/connman/connman/0033-connman-fix-ipv6-tethering_V2.patch
@@ -228,1076 +228,4 @@
 +    __connman_ipv6_tethering_setup();
      return TRUE;
  }
- 
-diff --git a/src/tethering.c b/src/tethering.c
-index e358729..c3af44d 100644
---- a/src/tethering.c
-+++ b/src/tethering.c
-@@ -48,7 +48,7 @@
- 
- #define BRIDGE_NAME "tether"
- 
--#define DEFAULT_MTU	1500
-+#define DEFAULT_MTU    1500
- 
- static char *private_network_primary_dns = NULL;
- static char *private_network_secondary_dns = NULL;
-@@ -60,38 +60,38 @@ static DBusConnection *connection;
- static GHashTable *pn_hash;
- 
- struct connman_private_network {
--	char *owner;
--	char *path;
--	guint watch;
--	DBusMessage *msg;
--	DBusMessage *reply;
--	int fd;
--	char *interface;
--	int index;
--	guint iface_watch;
--	struct connman_ippool *pool;
--	char *primary_dns;
--	char *secondary_dns;
-+    char *owner;
-+    char *path;
-+    guint watch;
-+    DBusMessage *msg;
-+    DBusMessage *reply;
-+    int fd;
-+    char *interface;
-+    int index;
-+    guint iface_watch;
-+    struct connman_ippool *pool;
-+    char *primary_dns;
-+    char *secondary_dns;
- };
- 
- static void radvd_onoff(bool onoff)
- {
--	if(onoff){
--		system("radvd -C /var/lib/connman/radvd.conf");
--	}else{
--		system("killall radvd");
--	}
-+    if(onoff){
-+        system("radvd -C /var/lib/connman/radvd.conf");
-+    }else{
-+        system("killall radvd");
-+    }
- }
- 
- static int write_radvd_conf(char *prefix, int prefix_len,char *dnsaddr)
- {
--	FILE *fp=NULL;
--	fp=fopen("/var/lib/connman/radvd.conf","w");
--	if(fp==NULL)
--		return -1;
--	/*
--	interface tether
--	{
-+    FILE *fp=NULL;
-+    fp=fopen("/var/lib/connman/radvd.conf","w");
-+    if(fp==NULL)
-+        return -1;
-+    /*
-+    interface tether
-+    {
-         AdvSendAdvert on;
-         MinRtrAdvInterval 3;
-         MaxRtrAdvInterval 5;
-@@ -105,26 +105,26 @@ static int write_radvd_conf(char *prefix, int prefix_len,char *dnsaddr)
-         RDNSS 2409:894c:c36:54a3::bb{
-                 AdvRDNSSLifetime 3600;
-         };
--	};
--	*/
--	fprintf(fp,"interface %s\n",BRIDGE_NAME);
--	fprintf(fp,"{\n");
--	fprintf(fp,"  AdvSendAdvert on;\n");
--	fprintf(fp,"  MinRtrAdvInterval 3;\n");
--	fprintf(fp,"  MaxRtrAdvInterval 5;\n");
--	fprintf(fp,"  AdvManagedFlag off;\n");
--	fprintf(fp,"  AdvOtherConfigFlag off;\n");
--	fprintf(fp,"  AdvDefaultPreference high;\n");
--	fprintf(fp,"  prefix %s/%d{\n",prefix,prefix_len);
--	fprintf(fp,"    AdvValidLifetime 3600;\n");
--	fprintf(fp,"    AdvPreferredLifetime 3600;\n");
--	fprintf(fp,"  };\n");
--	fprintf(fp,"  RDNSS %s{\n",dnsaddr);
--	fprintf(fp,"    AdvRDNSSLifetime 3600;\n");
--	fprintf(fp,"  };\n");
--	fprintf(fp,"};\n");
--	fclose(fp);
--	return 0;
-+    };
-+    */
-+    fprintf(fp,"interface %s\n",BRIDGE_NAME);
-+    fprintf(fp,"{\n");
-+    fprintf(fp,"  AdvSendAdvert on;\n");
-+    fprintf(fp,"  MinRtrAdvInterval 3;\n");
-+    fprintf(fp,"  MaxRtrAdvInterval 5;\n");
-+    fprintf(fp,"  AdvManagedFlag off;\n");
-+    fprintf(fp,"  AdvOtherConfigFlag off;\n");
-+    fprintf(fp,"  AdvDefaultPreference high;\n");
-+    fprintf(fp,"  prefix %s/%d{\n",prefix,prefix_len);
-+    fprintf(fp,"    AdvValidLifetime 3600;\n");
-+    fprintf(fp,"    AdvPreferredLifetime 3600;\n");
-+    fprintf(fp,"  };\n");
-+    fprintf(fp,"  RDNSS %s{\n",dnsaddr);
-+    fprintf(fp,"    AdvRDNSSLifetime 3600;\n");
-+    fprintf(fp,"  };\n");
-+    fprintf(fp,"};\n");
-+    fclose(fp);
-+    return 0;
- }
- bool writeToFile(const char* filename, const char* value) {
-     int fd = open(filename, O_WRONLY);
-@@ -143,534 +143,539 @@ bool writeToFile(const char* filename, const char* value) {
- 
- int __connman_ipv6_tethering_setup()
- {
--	if(tethering_enabled && get_pdnstatus_is_connected())
--	{
--		radvd_onoff(false);
--		char prefix[INET6_ADDRSTRLEN + 1];
--		int prefix_len=0;
--		int index;
--		struct in6_addr src;
--		char addr_str[INET6_ADDRSTRLEN + 1];
--		index = connman_inet_ifindex(BRIDGE_NAME);
--		int ret = __connman_inet_get_interface_ll_address(index,AF_INET6,&src);
--		if(ret<0){
--			DBG("get interface link local address fail");
--			return -1;
--		}
--		inet_ntop(AF_INET6, &src, addr_str, INET6_ADDRSTRLEN);
--		DBG("ret %d address %s",ret,addr_str);
--
--		ret = get_ipv6_prefix_address(prefix,&prefix_len);
--		DBG("ret %d prefix %s %d",ret,prefix,prefix_len);
--		if(ret<0){
--			DBG("get interface prefix fail");
--			return -1;
--		}
--		//enable forwarding
--		writeToFile("/proc/sys/net/ipv6/conf/all/forwarding","1");
--		//set tether ip address
--		writeToFile("/proc/sys/net/ipv6/conf/tether/accept_ra","0");
--		char buffer[256];
--		sprintf(buffer,"ip -6 addr add %sbb/%d dev tether",prefix,prefix_len);
--        __connman_inet_add_fwmark_rule(1030, AF_INET6, 0);
--		system(buffer);
--		//write radvd conf
--		write_radvd_conf(prefix,prefix_len,addr_str);
--		//enable radvd
--		radvd_onoff(true);
--	}else{
--		radvd_onoff(false);
--		writeToFile("/proc/sys/net/ipv6/conf/all/forwarding","0");
--        __connman_inet_del_fwmark_rule(1030, AF_INET6, 0);
--	}
-+    int index;
-+    index = connman_inet_ifindex(BRIDGE_NAME);
-+    int table_num=1000+index;
-+
-+    if(tethering_enabled && get_pdnstatus_is_connected())
-+    {
-+        radvd_onoff(false);
-+        char prefix[INET6_ADDRSTRLEN + 1];
-+        int prefix_len=0;
-+
-+        struct in6_addr src;
-+        char addr_str[INET6_ADDRSTRLEN + 1];
-+
-+        int ret = __connman_inet_get_interface_ll_address(index,AF_INET6,&src);
-+        if(ret<0){
-+            DBG("get interface link local address fail");
-+            return -1;
-+        }
-+        inet_ntop(AF_INET6, &src, addr_str, INET6_ADDRSTRLEN);
-+        DBG("ret %d address %s",ret,addr_str);
-+
-+        ret = get_ipv6_prefix_address(prefix,&prefix_len);
-+        DBG("ret %d prefix %s %d",ret,prefix,prefix_len);
-+        if(ret<0){
-+            DBG("get interface prefix fail");
-+            return -1;
-+        }
-+        //enable forwarding
-+        writeToFile("/proc/sys/net/ipv6/conf/all/forwarding","1");
-+        //set tether ip address
-+        writeToFile("/proc/sys/net/ipv6/conf/tether/accept_ra","0");
-+        char buffer[256];
-+        sprintf(buffer,"ip -6 addr add %sbb/%d dev tether",prefix,prefix_len);
-+
-+        __connman_inet_add_fwmark_rule(table_num, AF_INET6, 0);
-+        system(buffer);
-+        //write radvd conf
-+        write_radvd_conf(prefix,prefix_len,addr_str);
-+        //enable radvd
-+        radvd_onoff(true);
-+    }else{
-+        radvd_onoff(false);
-+        writeToFile("/proc/sys/net/ipv6/conf/all/forwarding","0");
-+        __connman_inet_del_fwmark_rule(table_num, AF_INET6, 0);
-+    }
- }
- 
- 
- 
- const char *__connman_tethering_get_bridge(void)
- {
--	int sk, err;
--	unsigned long args[3];
--
--	sk = socket(AF_INET, SOCK_STREAM, 0);
--	if (sk < 0)
--		return NULL;
--
--	args[0] = BRCTL_GET_VERSION;
--	args[1] = args[2] = 0;
--	err = ioctl(sk, SIOCGIFBR, &args);
--	close(sk);
--	if (err == -1) {
--		connman_error("Missing support for 802.1d ethernet bridging");
--		return NULL;
--	}
--
--	return BRIDGE_NAME;
-+    int sk, err;
-+    unsigned long args[3];
-+
-+    sk = socket(AF_INET, SOCK_STREAM, 0);
-+    if (sk < 0)
-+        return NULL;
-+
-+    args[0] = BRCTL_GET_VERSION;
-+    args[1] = args[2] = 0;
-+    err = ioctl(sk, SIOCGIFBR, &args);
-+    close(sk);
-+    if (err == -1) {
-+        connman_error("Missing support for 802.1d ethernet bridging");
-+        return NULL;
-+    }
-+
-+    return BRIDGE_NAME;
- }
- 
- static void dhcp_server_debug(const char *str, void *data)
- {
--	connman_info("%s: %s\n", (const char *) data, str);
-+    connman_info("%s: %s\n", (const char *) data, str);
- }
- 
- static void dhcp_server_error(GDHCPServerError error)
- {
--	switch (error) {
--	case G_DHCP_SERVER_ERROR_NONE:
--		connman_error("OK");
--		break;
--	case G_DHCP_SERVER_ERROR_INTERFACE_UNAVAILABLE:
--		connman_error("Interface unavailable");
--		break;
--	case G_DHCP_SERVER_ERROR_INTERFACE_IN_USE:
--		connman_error("Interface in use");
--		break;
--	case G_DHCP_SERVER_ERROR_INTERFACE_DOWN:
--		connman_error("Interface down");
--		break;
--	case G_DHCP_SERVER_ERROR_NOMEM:
--		connman_error("No memory");
--		break;
--	case G_DHCP_SERVER_ERROR_INVALID_INDEX:
--		connman_error("Invalid index");
--		break;
--	case G_DHCP_SERVER_ERROR_INVALID_OPTION:
--		connman_error("Invalid option");
--		break;
--	case G_DHCP_SERVER_ERROR_IP_ADDRESS_INVALID:
--		connman_error("Invalid address");
--		break;
--	}
-+    switch (error) {
-+    case G_DHCP_SERVER_ERROR_NONE:
-+        connman_error("OK");
-+        break;
-+    case G_DHCP_SERVER_ERROR_INTERFACE_UNAVAILABLE:
-+        connman_error("Interface unavailable");
-+        break;
-+    case G_DHCP_SERVER_ERROR_INTERFACE_IN_USE:
-+        connman_error("Interface in use");
-+        break;
-+    case G_DHCP_SERVER_ERROR_INTERFACE_DOWN:
-+        connman_error("Interface down");
-+        break;
-+    case G_DHCP_SERVER_ERROR_NOMEM:
-+        connman_error("No memory");
-+        break;
-+    case G_DHCP_SERVER_ERROR_INVALID_INDEX:
-+        connman_error("Invalid index");
-+        break;
-+    case G_DHCP_SERVER_ERROR_INVALID_OPTION:
-+        connman_error("Invalid option");
-+        break;
-+    case G_DHCP_SERVER_ERROR_IP_ADDRESS_INVALID:
-+        connman_error("Invalid address");
-+        break;
-+    }
- }
- 
- static GDHCPServer *dhcp_server_start(const char *bridge,
--				const char *router, const char *subnet,
--				const char *start_ip, const char *end_ip,
--				unsigned int lease_time, const char *dns)
-+                const char *router, const char *subnet,
-+                const char *start_ip, const char *end_ip,
-+                unsigned int lease_time, const char *dns)
- {
--	GDHCPServerError error;
--	GDHCPServer *dhcp_server;
--	int index;
-+    GDHCPServerError error;
-+    GDHCPServer *dhcp_server;
-+    int index;
- 
--	DBG("");
-+    DBG("");
- 
--	index = connman_inet_ifindex(bridge);
--	if (index < 0)
--		return NULL;
-+    index = connman_inet_ifindex(bridge);
-+    if (index < 0)
-+        return NULL;
- 
--	dhcp_server = g_dhcp_server_new(G_DHCP_IPV4, index, &error);
--	if (!dhcp_server) {
--		dhcp_server_error(error);
--		return NULL;
--	}
-+    dhcp_server = g_dhcp_server_new(G_DHCP_IPV4, index, &error);
-+    if (!dhcp_server) {
-+        dhcp_server_error(error);
-+        return NULL;
-+    }
- 
--	g_dhcp_server_set_debug(dhcp_server, dhcp_server_debug, "DHCP server");
-+    g_dhcp_server_set_debug(dhcp_server, dhcp_server_debug, "DHCP server");
- 
--	g_dhcp_server_set_lease_time(dhcp_server, lease_time);
--	g_dhcp_server_set_option(dhcp_server, G_DHCP_SUBNET, subnet);
--	g_dhcp_server_set_option(dhcp_server, G_DHCP_ROUTER, router);
--	g_dhcp_server_set_option(dhcp_server, G_DHCP_DNS_SERVER, dns);
--	g_dhcp_server_set_ip_range(dhcp_server, start_ip, end_ip);
-+    g_dhcp_server_set_lease_time(dhcp_server, lease_time);
-+    g_dhcp_server_set_option(dhcp_server, G_DHCP_SUBNET, subnet);
-+    g_dhcp_server_set_option(dhcp_server, G_DHCP_ROUTER, router);
-+    g_dhcp_server_set_option(dhcp_server, G_DHCP_DNS_SERVER, dns);
-+    g_dhcp_server_set_ip_range(dhcp_server, start_ip, end_ip);
- 
--	g_dhcp_server_start(dhcp_server);
-+    g_dhcp_server_start(dhcp_server);
- 
--	return dhcp_server;
-+    return dhcp_server;
- }
- 
- static void dhcp_server_stop(GDHCPServer *server)
- {
--	if (!server)
--		return;
-+    if (!server)
-+        return;
- 
--	g_dhcp_server_unref(server);
-+    g_dhcp_server_unref(server);
- }
- 
- static void tethering_restart(struct connman_ippool *pool, void *user_data)
- {
--	DBG("pool %p", pool);
--	__connman_tethering_set_disabled();
--	__connman_tethering_set_enabled();
-+    DBG("pool %p", pool);
-+    __connman_tethering_set_disabled();
-+    __connman_tethering_set_enabled();
- }
- 
- int __connman_tethering_set_enabled(void)
- {
--	int index;
--	int err;
--	const char *gateway;
--	const char *broadcast;
--	const char *subnet_mask;
--	const char *start_ip;
--	const char *end_ip;
--	const char *dns;
--	unsigned char prefixlen;
--	char **ns;
--
--	DBG("enabled %d", tethering_enabled + 1);
--
--	if (__sync_fetch_and_add(&tethering_enabled, 1) != 0)
--		return 0;
--
--	err = __connman_bridge_create(BRIDGE_NAME);
--	if (err < 0) {
--		__sync_fetch_and_sub(&tethering_enabled, 1);
--		return -EOPNOTSUPP;
--	}
--
--	index = connman_inet_ifindex(BRIDGE_NAME);
--	dhcp_ippool = __connman_ippool_create(index, 2, 252,
--						tethering_restart, NULL);
--	if (!dhcp_ippool) {
--		connman_error("Fail to create IP pool");
--		__connman_bridge_remove(BRIDGE_NAME);
--		__sync_fetch_and_sub(&tethering_enabled, 1);
--		return -EADDRNOTAVAIL;
--	}
--
--	gateway = __connman_ippool_get_gateway(dhcp_ippool);
--	broadcast = __connman_ippool_get_broadcast(dhcp_ippool);
--	subnet_mask = __connman_ippool_get_subnet_mask(dhcp_ippool);
--	start_ip = __connman_ippool_get_start_ip(dhcp_ippool);
--	end_ip = __connman_ippool_get_end_ip(dhcp_ippool);
--
--	err = __connman_bridge_enable(BRIDGE_NAME, gateway,
--			connman_ipaddress_calc_netmask_len(subnet_mask),
--			broadcast);
--	if (err < 0 && err != -EALREADY) {
--		__connman_ippool_unref(dhcp_ippool);
--		__connman_bridge_remove(BRIDGE_NAME);
--		__sync_fetch_and_sub(&tethering_enabled, 1);
--		return -EADDRNOTAVAIL;
--	}
--
--	ns = connman_setting_get_string_list("FallbackNameservers");
--	if (ns) {
--		if (ns[0]) {
--			g_free(private_network_primary_dns);
--			private_network_primary_dns = g_strdup(ns[0]);
--		}
--		if (ns[1]) {
--			g_free(private_network_secondary_dns);
--			private_network_secondary_dns = g_strdup(ns[1]);
--		}
--
--		DBG("Fallback ns primary %s secondary %s",
--			private_network_primary_dns,
--			private_network_secondary_dns);
--	}
--
--	dns = gateway;
--	if (__connman_dnsproxy_add_listener(index) < 0) {
--		connman_error("Can't add listener %s to DNS proxy",
--								BRIDGE_NAME);
--		dns = private_network_primary_dns;
--		DBG("Serving %s nameserver to clients", dns);
--	}
--
--	tethering_dhcp_server = dhcp_server_start(BRIDGE_NAME,
--						gateway, subnet_mask,
--						start_ip, end_ip,
--						24 * 3600, dns);
--	if (!tethering_dhcp_server) {
--		__connman_bridge_disable(BRIDGE_NAME);
--		__connman_ippool_unref(dhcp_ippool);
--		__connman_bridge_remove(BRIDGE_NAME);
--		__sync_fetch_and_sub(&tethering_enabled, 1);
--		return -EOPNOTSUPP;
--	}
--
--	prefixlen = connman_ipaddress_calc_netmask_len(subnet_mask);
--	err = __connman_nat_enable(BRIDGE_NAME, start_ip, prefixlen);
--	if (err < 0) {
--		connman_error("Cannot enable NAT %d/%s", err, strerror(-err));
--		dhcp_server_stop(tethering_dhcp_server);
--		__connman_bridge_disable(BRIDGE_NAME);
--		__connman_ippool_unref(dhcp_ippool);
--		__connman_bridge_remove(BRIDGE_NAME);
--		__sync_fetch_and_sub(&tethering_enabled, 1);
--		return -EOPNOTSUPP;
--	}
-+    int index;
-+    int err;
-+    const char *gateway;
-+    const char *broadcast;
-+    const char *subnet_mask;
-+    const char *start_ip;
-+    const char *end_ip;
-+    const char *dns;
-+    unsigned char prefixlen;
-+    char **ns;
-+
-+    DBG("enabled %d", tethering_enabled + 1);
-+
-+    if (__sync_fetch_and_add(&tethering_enabled, 1) != 0)
-+        return 0;
-+
-+    err = __connman_bridge_create(BRIDGE_NAME);
-+    if (err < 0) {
-+        __sync_fetch_and_sub(&tethering_enabled, 1);
-+        return -EOPNOTSUPP;
-+    }
-+
-+    index = connman_inet_ifindex(BRIDGE_NAME);
-+    dhcp_ippool = __connman_ippool_create(index, 2, 252,
-+                        tethering_restart, NULL);
-+    if (!dhcp_ippool) {
-+        connman_error("Fail to create IP pool");
-+        __connman_bridge_remove(BRIDGE_NAME);
-+        __sync_fetch_and_sub(&tethering_enabled, 1);
-+        return -EADDRNOTAVAIL;
-+    }
-+
-+    gateway = __connman_ippool_get_gateway(dhcp_ippool);
-+    broadcast = __connman_ippool_get_broadcast(dhcp_ippool);
-+    subnet_mask = __connman_ippool_get_subnet_mask(dhcp_ippool);
-+    start_ip = __connman_ippool_get_start_ip(dhcp_ippool);
-+    end_ip = __connman_ippool_get_end_ip(dhcp_ippool);
-+
-+    err = __connman_bridge_enable(BRIDGE_NAME, gateway,
-+            connman_ipaddress_calc_netmask_len(subnet_mask),
-+            broadcast);
-+    if (err < 0 && err != -EALREADY) {
-+        __connman_ippool_unref(dhcp_ippool);
-+        __connman_bridge_remove(BRIDGE_NAME);
-+        __sync_fetch_and_sub(&tethering_enabled, 1);
-+        return -EADDRNOTAVAIL;
-+    }
-+
-+    ns = connman_setting_get_string_list("FallbackNameservers");
-+    if (ns) {
-+        if (ns[0]) {
-+            g_free(private_network_primary_dns);
-+            private_network_primary_dns = g_strdup(ns[0]);
-+        }
-+        if (ns[1]) {
-+            g_free(private_network_secondary_dns);
-+            private_network_secondary_dns = g_strdup(ns[1]);
-+        }
-+
-+        DBG("Fallback ns primary %s secondary %s",
-+            private_network_primary_dns,
-+            private_network_secondary_dns);
-+    }
-+
-+    dns = gateway;
-+    if (__connman_dnsproxy_add_listener(index) < 0) {
-+        connman_error("Can't add listener %s to DNS proxy",
-+                                BRIDGE_NAME);
-+        dns = private_network_primary_dns;
-+        DBG("Serving %s nameserver to clients", dns);
-+    }
-+
-+    tethering_dhcp_server = dhcp_server_start(BRIDGE_NAME,
-+                        gateway, subnet_mask,
-+                        start_ip, end_ip,
-+                        24 * 3600, dns);
-+    if (!tethering_dhcp_server) {
-+        __connman_bridge_disable(BRIDGE_NAME);
-+        __connman_ippool_unref(dhcp_ippool);
-+        __connman_bridge_remove(BRIDGE_NAME);
-+        __sync_fetch_and_sub(&tethering_enabled, 1);
-+        return -EOPNOTSUPP;
-+    }
-+
-+    prefixlen = connman_ipaddress_calc_netmask_len(subnet_mask);
-+    err = __connman_nat_enable(BRIDGE_NAME, start_ip, prefixlen);
-+    if (err < 0) {
-+        connman_error("Cannot enable NAT %d/%s", err, strerror(-err));
-+        dhcp_server_stop(tethering_dhcp_server);
-+        __connman_bridge_disable(BRIDGE_NAME);
-+        __connman_ippool_unref(dhcp_ippool);
-+        __connman_bridge_remove(BRIDGE_NAME);
-+        __sync_fetch_and_sub(&tethering_enabled, 1);
-+        return -EOPNOTSUPP;
-+    }
- #if 0
--	err = __connman_ipv6pd_setup(BRIDGE_NAME);
--	if (err < 0 && err != -EINPROGRESS)
--		DBG("Cannot setup IPv6 prefix delegation %d/%s", err,
--			strerror(-err));
-+    err = __connman_ipv6pd_setup(BRIDGE_NAME);
-+    if (err < 0 && err != -EINPROGRESS)
-+        DBG("Cannot setup IPv6 prefix delegation %d/%s", err,
-+            strerror(-err));
- #endif
--	__connman_ipv6_tethering_setup();
-+    __connman_ipv6_tethering_setup();
- 
--	DBG("tethering started");
-+    DBG("tethering started");
- 
--	return 0;
-+    return 0;
- }
- 
- void __connman_tethering_set_disabled(void)
- {
--	int index;
-+    int index;
- 
--	DBG("enabled %d", tethering_enabled - 1);
-+    DBG("enabled %d", tethering_enabled - 1);
- 
--	if (__sync_fetch_and_sub(&tethering_enabled, 1) != 1)
--		return;
-+    if (__sync_fetch_and_sub(&tethering_enabled, 1) != 1)
-+        return;
- 
--	__connman_ipv6pd_cleanup();
-+    __connman_ipv6pd_cleanup();
- 
--	index = connman_inet_ifindex(BRIDGE_NAME);
--	__connman_dnsproxy_remove_listener(index);
-+    index = connman_inet_ifindex(BRIDGE_NAME);
-+    __connman_dnsproxy_remove_listener(index);
- 
--	__connman_nat_disable(BRIDGE_NAME);
-+    __connman_nat_disable(BRIDGE_NAME);
- 
--	dhcp_server_stop(tethering_dhcp_server);
-+    dhcp_server_stop(tethering_dhcp_server);
- 
--	tethering_dhcp_server = NULL;
-+    tethering_dhcp_server = NULL;
- 
--	__connman_bridge_disable(BRIDGE_NAME);
-+    __connman_bridge_disable(BRIDGE_NAME);
- 
--	__connman_ippool_unref(dhcp_ippool);
-+    __connman_ippool_unref(dhcp_ippool);
- 
--	__connman_bridge_remove(BRIDGE_NAME);
-+    __connman_bridge_remove(BRIDGE_NAME);
- 
--	g_free(private_network_primary_dns);
--	private_network_primary_dns = NULL;
--	g_free(private_network_secondary_dns);
--	private_network_secondary_dns = NULL;
--	__connman_ipv6_tethering_setup();
-+    g_free(private_network_primary_dns);
-+    private_network_primary_dns = NULL;
-+    g_free(private_network_secondary_dns);
-+    private_network_secondary_dns = NULL;
-+    __connman_ipv6_tethering_setup();
- 
--	DBG("tethering stopped");
-+    DBG("tethering stopped");
- }
- 
- static void setup_tun_interface(unsigned int flags, unsigned change,
--		void *data)
-+        void *data)
- {
--	struct connman_private_network *pn = data;
--	unsigned char prefixlen;
--	DBusMessageIter array, dict;
--	const char *server_ip;
--	const char *peer_ip;
--	const char *subnet_mask;
--	int err;
--
--	DBG("index %d flags %d change %d", pn->index,  flags, change);
--
--	if (flags & IFF_UP)
--		return;
--
--	subnet_mask = __connman_ippool_get_subnet_mask(pn->pool);
--	server_ip = __connman_ippool_get_start_ip(pn->pool);
--	peer_ip = __connman_ippool_get_end_ip(pn->pool);
--	prefixlen = connman_ipaddress_calc_netmask_len(subnet_mask);
--
--	if ((__connman_inet_modify_address(RTM_NEWADDR,
--				NLM_F_REPLACE | NLM_F_ACK, pn->index, AF_INET,
--				server_ip, peer_ip, prefixlen, NULL)) < 0) {
--		DBG("address setting failed");
--		return;
--	}
-+    struct connman_private_network *pn = data;
-+    unsigned char prefixlen;
-+    DBusMessageIter array, dict;
-+    const char *server_ip;
-+    const char *peer_ip;
-+    const char *subnet_mask;
-+    int err;
-+
-+    DBG("index %d flags %d change %d", pn->index,  flags, change);
-+
-+    if (flags & IFF_UP)
-+        return;
-+
-+    subnet_mask = __connman_ippool_get_subnet_mask(pn->pool);
-+    server_ip = __connman_ippool_get_start_ip(pn->pool);
-+    peer_ip = __connman_ippool_get_end_ip(pn->pool);
-+    prefixlen = connman_ipaddress_calc_netmask_len(subnet_mask);
-+
-+    if ((__connman_inet_modify_address(RTM_NEWADDR,
-+                NLM_F_REPLACE | NLM_F_ACK, pn->index, AF_INET,
-+                server_ip, peer_ip, prefixlen, NULL)) < 0) {
-+        DBG("address setting failed");
-+        return;
-+    }
- 
--	connman_inet_ifup(pn->index);
-+    connman_inet_ifup(pn->index);
- 
--	err = __connman_nat_enable(BRIDGE_NAME, server_ip, prefixlen);
--	if (err < 0) {
--		connman_error("failed to enable NAT");
--		goto error;
--	}
-+    err = __connman_nat_enable(BRIDGE_NAME, server_ip, prefixlen);
-+    if (err < 0) {
-+        connman_error("failed to enable NAT");
-+        goto error;
-+    }
- 
--	dbus_message_iter_init_append(pn->reply, &array);
-+    dbus_message_iter_init_append(pn->reply, &array);
- 
--	dbus_message_iter_append_basic(&array, DBUS_TYPE_OBJECT_PATH,
--						&pn->path);
-+    dbus_message_iter_append_basic(&array, DBUS_TYPE_OBJECT_PATH,
-+                        &pn->path);
- 
--	connman_dbus_dict_open(&array, &dict);
-+    connman_dbus_dict_open(&array, &dict);
- 
--	connman_dbus_dict_append_basic(&dict, "ServerIPv4",
--					DBUS_TYPE_STRING, &server_ip);
--	connman_dbus_dict_append_basic(&dict, "PeerIPv4",
--					DBUS_TYPE_STRING, &peer_ip);
--	if (pn->primary_dns)
--		connman_dbus_dict_append_basic(&dict, "PrimaryDNS",
--					DBUS_TYPE_STRING, &pn->primary_dns);
-+    connman_dbus_dict_append_basic(&dict, "ServerIPv4",
-+                    DBUS_TYPE_STRING, &server_ip);
-+    connman_dbus_dict_append_basic(&dict, "PeerIPv4",
-+                    DBUS_TYPE_STRING, &peer_ip);
-+    if (pn->primary_dns)
-+        connman_dbus_dict_append_basic(&dict, "PrimaryDNS",
-+                    DBUS_TYPE_STRING, &pn->primary_dns);
- 
--	if (pn->secondary_dns)
--		connman_dbus_dict_append_basic(&dict, "SecondaryDNS",
--					DBUS_TYPE_STRING, &pn->secondary_dns);
-+    if (pn->secondary_dns)
-+        connman_dbus_dict_append_basic(&dict, "SecondaryDNS",
-+                    DBUS_TYPE_STRING, &pn->secondary_dns);
- 
--	connman_dbus_dict_close(&array, &dict);
-+    connman_dbus_dict_close(&array, &dict);
- 
--	dbus_message_iter_append_basic(&array, DBUS_TYPE_UNIX_FD, &pn->fd);
-+    dbus_message_iter_append_basic(&array, DBUS_TYPE_UNIX_FD, &pn->fd);
- 
--	g_dbus_send_message(connection, pn->reply);
-+    g_dbus_send_message(connection, pn->reply);
- 
--	return;
-+    return;
- 
- error:
--	pn->reply = __connman_error_failed(pn->msg, -err);
--	g_dbus_send_message(connection, pn->reply);
-+    pn->reply = __connman_error_failed(pn->msg, -err);
-+    g_dbus_send_message(connection, pn->reply);
- 
--	g_hash_table_remove(pn_hash, pn->path);
-+    g_hash_table_remove(pn_hash, pn->path);
- }
- 
- static void remove_private_network(gpointer user_data)
- {
--	struct connman_private_network *pn = user_data;
-+    struct connman_private_network *pn = user_data;
- 
--	__connman_nat_disable(BRIDGE_NAME);
--	connman_rtnl_remove_watch(pn->iface_watch);
--	__connman_ippool_unref(pn->pool);
-+    __connman_nat_disable(BRIDGE_NAME);
-+    connman_rtnl_remove_watch(pn->iface_watch);
-+    __connman_ippool_unref(pn->pool);
- 
--	if (pn->watch > 0) {
--		g_dbus_remove_watch(connection, pn->watch);
--		pn->watch = 0;
--	}
-+    if (pn->watch > 0) {
-+        g_dbus_remove_watch(connection, pn->watch);
-+        pn->watch = 0;
-+    }
- 
--	close(pn->fd);
-+    close(pn->fd);
- 
--	g_free(pn->interface);
--	g_free(pn->owner);
--	g_free(pn->path);
--	g_free(pn->primary_dns);
--	g_free(pn->secondary_dns);
--	g_free(pn);
-+    g_free(pn->interface);
-+    g_free(pn->owner);
-+    g_free(pn->path);
-+    g_free(pn->primary_dns);
-+    g_free(pn->secondary_dns);
-+    g_free(pn);
- }
- 
- static void owner_disconnect(DBusConnection *conn, void *user_data)
- {
--	struct connman_private_network *pn = user_data;
-+    struct connman_private_network *pn = user_data;
- 
--	DBG("%s died", pn->owner);
-+    DBG("%s died", pn->owner);
- 
--	pn->watch = 0;
-+    pn->watch = 0;
- 
--	g_hash_table_remove(pn_hash, pn->path);
-+    g_hash_table_remove(pn_hash, pn->path);
- }
- 
- static void ippool_disconnect(struct connman_ippool *pool, void *user_data)
- {
--	struct connman_private_network *pn = user_data;
-+    struct connman_private_network *pn = user_data;
- 
--	DBG("block used externally");
-+    DBG("block used externally");
- 
--	g_hash_table_remove(pn_hash, pn->path);
-+    g_hash_table_remove(pn_hash, pn->path);
- }
- 
- int __connman_private_network_request(DBusMessage *msg, const char *owner)
- {
--	struct connman_private_network *pn;
--	char *iface = NULL;
--	char *path = NULL;
--	int index, fd, err;
--
--	if (DBUS_TYPE_UNIX_FD < 0)
--		return -EINVAL;
--
--	fd = connman_inet_create_tunnel(&iface);
--	if (fd < 0)
--		return fd;
--
--	path = g_strdup_printf("/tethering/%s", iface);
--
--	pn = g_hash_table_lookup(pn_hash, path);
--	if (pn) {
--		g_free(path);
--		g_free(iface);
--		close(fd);
--		return -EEXIST;
--	}
--
--	index = connman_inet_ifindex(iface);
--	if (index < 0) {
--		err = -ENODEV;
--		goto error;
--	}
--	DBG("interface %s", iface);
--
--	err = connman_inet_set_mtu(index, DEFAULT_MTU);
--
--	pn = g_try_new0(struct connman_private_network, 1);
--	if (!pn) {
--		err = -ENOMEM;
--		goto error;
--	}
--
--	pn->owner = g_strdup(owner);
--	pn->path = path;
--	pn->watch = g_dbus_add_disconnect_watch(connection, pn->owner,
--					owner_disconnect, pn, NULL);
--	pn->msg = msg;
--	pn->reply = dbus_message_new_method_return(pn->msg);
--	if (!pn->reply)
--		goto error;
--
--	pn->fd = fd;
--	pn->interface = iface;
--	pn->index = index;
--	pn->pool = __connman_ippool_create(pn->index, 1, 1, ippool_disconnect, pn);
--	if (!pn->pool) {
--		errno = -ENOMEM;
--		goto error;
--	}
--
--	pn->primary_dns = g_strdup(private_network_primary_dns);
--	pn->secondary_dns = g_strdup(private_network_secondary_dns);
--
--	pn->iface_watch = connman_rtnl_add_newlink_watch(index,
--						setup_tun_interface, pn);
--
--	g_hash_table_insert(pn_hash, pn->path, pn);
--
--	return 0;
-+    struct connman_private_network *pn;
-+    char *iface = NULL;
-+    char *path = NULL;
-+    int index, fd, err;
-+
-+    if (DBUS_TYPE_UNIX_FD < 0)
-+        return -EINVAL;
-+
-+    fd = connman_inet_create_tunnel(&iface);
-+    if (fd < 0)
-+        return fd;
-+
-+    path = g_strdup_printf("/tethering/%s", iface);
-+
-+    pn = g_hash_table_lookup(pn_hash, path);
-+    if (pn) {
-+        g_free(path);
-+        g_free(iface);
-+        close(fd);
-+        return -EEXIST;
-+    }
-+
-+    index = connman_inet_ifindex(iface);
-+    if (index < 0) {
-+        err = -ENODEV;
-+        goto error;
-+    }
-+    DBG("interface %s", iface);
-+
-+    err = connman_inet_set_mtu(index, DEFAULT_MTU);
-+
-+    pn = g_try_new0(struct connman_private_network, 1);
-+    if (!pn) {
-+        err = -ENOMEM;
-+        goto error;
-+    }
-+
-+    pn->owner = g_strdup(owner);
-+    pn->path = path;
-+    pn->watch = g_dbus_add_disconnect_watch(connection, pn->owner,
-+                    owner_disconnect, pn, NULL);
-+    pn->msg = msg;
-+    pn->reply = dbus_message_new_method_return(pn->msg);
-+    if (!pn->reply)
-+        goto error;
-+
-+    pn->fd = fd;
-+    pn->interface = iface;
-+    pn->index = index;
-+    pn->pool = __connman_ippool_create(pn->index, 1, 1, ippool_disconnect, pn);
-+    if (!pn->pool) {
-+        errno = -ENOMEM;
-+        goto error;
-+    }
-+
-+    pn->primary_dns = g_strdup(private_network_primary_dns);
-+    pn->secondary_dns = g_strdup(private_network_secondary_dns);
-+
-+    pn->iface_watch = connman_rtnl_add_newlink_watch(index,
-+                        setup_tun_interface, pn);
-+
-+    g_hash_table_insert(pn_hash, pn->path, pn);
-+
-+    return 0;
- 
- error:
--	close(fd);
--	g_free(iface);
--	g_free(path);
--	if (pn)
--		g_free(pn->owner);
--	g_free(pn);
--	return err;
-+    close(fd);
-+    g_free(iface);
-+    g_free(path);
-+    if (pn)
-+        g_free(pn->owner);
-+    g_free(pn);
-+    return err;
- }
- 
- int __connman_private_network_release(const char *path)
- {
--	struct connman_private_network *pn;
-+    struct connman_private_network *pn;
- 
--	pn = g_hash_table_lookup(pn_hash, path);
--	if (!pn)
--		return -EACCES;
-+    pn = g_hash_table_lookup(pn_hash, path);
-+    if (!pn)
-+        return -EACCES;
- 
--	g_hash_table_remove(pn_hash, path);
--	return 0;
-+    g_hash_table_remove(pn_hash, path);
-+    return 0;
- }
- 
- int __connman_tethering_init(void)
- {
--	DBG("");
-+    DBG("");
- 
--	tethering_enabled = 0;
-+    tethering_enabled = 0;
- 
--	connection = connman_dbus_get_connection();
--	if (!connection)
--		return -EFAULT;
-+    connection = connman_dbus_get_connection();
-+    if (!connection)
-+        return -EFAULT;
- 
--	pn_hash = g_hash_table_new_full(g_str_hash, g_str_equal,
--						NULL, remove_private_network);
-+    pn_hash = g_hash_table_new_full(g_str_hash, g_str_equal,
-+                        NULL, remove_private_network);
- 
--	return 0;
-+    return 0;
- }
- 
- void __connman_tethering_cleanup(void)
- {
--	DBG("enabled %d", tethering_enabled);
--
--	__sync_synchronize();
--	if (tethering_enabled > 0) {
--		if (tethering_dhcp_server)
--			dhcp_server_stop(tethering_dhcp_server);
--		__connman_bridge_disable(BRIDGE_NAME);
--		__connman_bridge_remove(BRIDGE_NAME);
--		__connman_nat_disable(BRIDGE_NAME);
--	}
--
--	if (!connection)
--		return;
--
--	g_hash_table_destroy(pn_hash);
--	dbus_connection_unref(connection);
-+    DBG("enabled %d", tethering_enabled);
-+
-+    __sync_synchronize();
-+    if (tethering_enabled > 0) {
-+        if (tethering_dhcp_server)
-+            dhcp_server_stop(tethering_dhcp_server);
-+        __connman_bridge_disable(BRIDGE_NAME);
-+        __connman_bridge_remove(BRIDGE_NAME);
-+        __connman_nat_disable(BRIDGE_NAME);
-+    }
-+
-+    if (!connection)
-+        return;
-+
-+    g_hash_table_destroy(pn_hash);
-+    dbus_connection_unref(connection);
- }
+ 
\ No newline at end of file
diff --git a/meta/meta-mediatek-ivt/recipes-connectivity/connman/connman/0034-connman-change-default-rule.patch b/meta/meta-mediatek-ivt/recipes-connectivity/connman/connman/0034-connman-change-default-rule.patch
old mode 100755
new mode 100644
diff --git a/meta/meta-mediatek-ivt/recipes-connectivity/connman/connman/apmode.patch b/meta/meta-mediatek-ivt/recipes-connectivity/connman/connman/apmode.patch
deleted file mode 100644
index 27510f1..0000000
--- a/meta/meta-mediatek-ivt/recipes-connectivity/connman/connman/apmode.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/plugins/wifi.c b/plugins/wifi.c
-index 09869ad..84ce176 100644
---- a/plugins/wifi.c
-+++ b/plugins/wifi.c
-@@ -735,7 +735,7 @@ static void wifi_newlink(unsigned flags, unsigned change, void *user_data)
- 			DBG("interface down");
- 	}
- 
--	if ((wifi->flags & IFF_LOWER_UP) != (flags & IFF_LOWER_UP)) {
-+	if (((wifi->flags & IFF_LOWER_UP) != (flags & IFF_LOWER_UP))||(wifi->index==connman_inet_ifindex("ap0"))) {
- 		if (flags & IFF_LOWER_UP) {
- 			DBG("carrier on");
- 
diff --git a/meta/meta-mediatek-ivt/recipes-connectivity/connman/connman_%.bbappend b/meta/meta-mediatek-ivt/recipes-connectivity/connman/connman_%.bbappend
index 61c5b78..37f4891 100644
--- a/meta/meta-mediatek-ivt/recipes-connectivity/connman/connman_%.bbappend
+++ b/meta/meta-mediatek-ivt/recipes-connectivity/connman/connman_%.bbappend
@@ -1,7 +1,6 @@
 FILESEXTRAPATHS_append := ":${THISDIR}/${PN}"
 
 SRC_URI += "\
-            file://apmode.patch \
             file://0004-connman-add-telephony-plugin.patch \
             file://0005-connman-build-plugin-telephon.c.patch \
             file://0006-connman-disable-cellular-network-from-auto-connect.patch \
diff --git a/meta/meta-mediatek-mt2735/recipes-connectivity/connman/connman/lynq_wifi_ap_sta.patch b/meta/meta-mediatek-mt2735/recipes-connectivity/connman/connman/lynq_wifi_ap_sta.patch
old mode 100755
new mode 100644
diff --git a/meta/meta-mediatek-mt2735/recipes-connectivity/connman/connman/lynq_wifi_netmask.patch b/meta/meta-mediatek-mt2735/recipes-connectivity/connman/connman/lynq_wifi_netmask.patch
new file mode 100644
index 0000000..a3bc18d
--- /dev/null
+++ b/meta/meta-mediatek-mt2735/recipes-connectivity/connman/connman/lynq_wifi_netmask.patch
@@ -0,0 +1,147 @@
+--- connman-1.41/src/ippool.c	2022-01-28 22:48:01.000000000 +0800
++++ connman-1.41/src/ippool_new.c	2022-07-01 19:19:49.209647300 +0800
+@@ -321,6 +321,132 @@
+ 	g_free(info);
+ }
+ 
++static struct connman_ippool *__connman_ippool_create_special(int index,
++					unsigned int start,
++					unsigned int range,
++					ippool_collision_cb_t collision_cb,
++					void *user_data)
++{
++	struct connman_ippool *pool;
++	struct address_info *info;
++	uint32_t block;
++    FILE * fp;
++    char *buff, *p;
++	int i,len,mask_cnt,mask_range,mask;
++
++	DBG("");
++
++    fp = fopen("/etc/config/wifi_network", "rb");
++    if (NULL == fp) {
++        return NULL;
++    }
++
++    buff = malloc(1024);
++    len = fread(buff, 1, 1024, fp);
++    fclose(fp);
++	buff[len] = '\0';
++    connman_error("read cnt: %d\n", len);
++
++    connman_error("read: %s\n", buff);
++
++	p = NULL;
++	for(i=0; i<len; i++) {
++		if (buff[i] == '/') {
++			if (p != NULL) {
++				p = NULL;
++				break;
++			}
++    		connman_error("left: %s\n", buff + i);
++			buff[i] = '\0';
++			p=buff + i + 1;
++			connman_warn("find %s\n",p);
++		}
++		else if (buff[i] == ' ') {
++			buff[i] = '\0';
++			if (p != NULL && p == buff + i) {
++				p++;
++			}
++		}
++	}
++
++	if (p == NULL) {
++		free(buff);
++		return NULL;
++	}
++
++	block = ntohl(inet_addr(buff));
++	mask_cnt = atoi(p);
++	i = mask_cnt - 24;
++	mask_range = 0xff >> i;
++	sprintf(buff, "255.255.255.%d", (mask_range<<i));
++	connman_warn("netmask %s\n",buff);
++	mask = ntohl(inet_addr(buff));
++
++	free(buff);
++	if (mask_cnt < 24 || mask_cnt >= 32) {
++		return NULL;
++	}
++
++	if (start + range > mask_range ) {
++		range = mask_range - start - 1;
++	}
++
++	/*
++	 * The range is at max 255 and we don't support overlapping
++	 * blocks.
++	 */
++	if (start + range > 254) {
++		connman_error("IP pool does not support pool size larger than 254");
++		return NULL;
++	}
++
++	if (block == 0) {
++		connman_warn("Could not find a free IP block");
++		return NULL;
++	}
++
++	pool = g_try_new0(struct connman_ippool, 1);
++	if (!pool)
++		return NULL;
++
++	info = g_try_new0(struct address_info, 1);
++	if (!info) {
++		g_free(pool);
++		return NULL;
++	}
++
++	last_block = block;
++
++	info->index = index;
++	info->start = block;
++	info->end = block + range;
++
++	pool->info = info;
++	pool->collision_cb = collision_cb;
++	pool->user_data = user_data;
++
++	info->pool = pool;
++
++	if (range == 0)
++		range = 1;
++
++	pool->gateway = get_ip(info->start + 1);
++	pool->broadcast = get_ip(info->start + mask_range);
++	pool->subnet_mask = get_ip(mask);
++	pool->start_ip = get_ip(block + start);
++	pool->end_ip = get_ip(block + start + range);
++	connman_warn("gateway %s\n",pool->gateway);
++	connman_warn("broadcast %s\n",pool->broadcast);
++	connman_warn("subnet_mask %s\n",pool->subnet_mask);
++	connman_warn("start_ip %s\n",pool->start_ip);
++	connman_warn("end_ip %s\n",pool->end_ip);
++
++
++	allocated_blocks = g_slist_prepend(allocated_blocks, info);
++
++	return pool;
++}
++
+ struct connman_ippool *__connman_ippool_create(int index,
+ 					unsigned int start,
+ 					unsigned int range,
+@@ -333,6 +459,11 @@
+ 
+ 	DBG("");
+ 
++	pool = __connman_ippool_create_special(index, start, range, collision_cb, user_data);
++	if (pool != NULL) {
++		return pool;
++	}
++
+ 	/*
+ 	 * The range is at max 255 and we don't support overlapping
+ 	 * blocks.
diff --git a/meta/poky/meta/recipes-connectivity/connman/connman.inc b/meta/poky/meta/recipes-connectivity/connman/connman.inc
old mode 100755
new mode 100644
index 961a5da..f7e4749
--- a/meta/poky/meta/recipes-connectivity/connman/connman.inc
+++ b/meta/poky/meta/recipes-connectivity/connman/connman.inc
@@ -15,7 +15,7 @@
 
 inherit autotools pkgconfig systemd update-rc.d bluetooth update-alternatives
 
-DEPENDS  = "dbus glib-2.0 ppp readline"
+DEPENDS  = "dbus glib-2.0 ppp readline libmnl"
 
 INC_PR = "r20"
 
@@ -159,6 +159,7 @@
             ${sysconfdir} ${sharedstatedir} ${localstatedir} \
             ${base_bindir}/* ${base_sbindir}/* ${base_libdir}/*.so* ${datadir}/${PN} \
             ${datadir}/dbus-1/system-services/* \
+            ${datadir}/dbus-1/system.d/connman.conf \
             ${sysconfdir}/tmpfiles.d/connman_resolvconf.conf"
 
 FILES_${PN}-dev += "${libdir}/connman/*/*.la"
@@ -173,7 +174,7 @@
 provides a DBus API for managing VPN connections. All the different \
 VPN technogies are implemented using plug-ins."
 FILES_${PN}-vpn += "${sbindir}/connman-vpnd \
-                    ${sysconfdir}/dbus-1/system.d/connman-vpn-dbus.conf \
+                    ${datadir}/dbus-1/system.d/connman-vpn-dbus.conf \
                     ${datadir}/dbus-1/system-services/net.connman.vpn.service \
                     ${systemd_unitdir}/system/connman-vpn.service"
 
diff --git a/meta/poky/meta/recipes-connectivity/connman/connman_1.35.bb b/meta/poky/meta/recipes-connectivity/connman/connman_1.35.bb
deleted file mode 100644
index ff21181..0000000
--- a/meta/poky/meta/recipes-connectivity/connman/connman_1.35.bb
+++ /dev/null
@@ -1,22 +0,0 @@
-require connman.inc
-
-SRC_URI  = "${KERNELORG_MIRROR}/linux/network/${BPN}/${BP}.tar.xz \
-            file://0001-plugin.h-Change-visibility-to-default-for-debug-symb.patch \
-            file://0001-connman.service-stop-systemd-resolved-when-we-use-co.patch \
-            file://connman \
-            file://no-version-scripts.patch \
-            file://includes.patch \
-            file://0001-session-Keep-track-of-addr-in-fw_snat-session.patch \
-            file://0001-giognutls-Fix-a-crash-using-wispr-over-TLS.patch \
-            file://0001-inet-Add-prefixlen-to-iproute_default_function.patch \
-            file://0002-inet-Implement-subnet-route-creation-deletion-in-ipr.patch \
-            file://0003-inet-Implement-APIs-for-creating-and-deleting-subnet.patch \
-            file://0004-session-Use-subnet-route-creation-and-deletion-APIs.patch \
-            "
-SRC_URI_append_libc-musl = " file://0002-resolve-musl-does-not-implement-res_ninit.patch \
-                             "
-
-SRC_URI[md5sum] = "bae37b45ee9b3db5ec8115188f8a7652"
-SRC_URI[sha256sum] = "66d7deb98371545c6e417239a9b3b3e3201c1529d08eedf40afbc859842cf2aa"
-
-RRECOMMENDS_${PN} = "connman-conf"
diff --git a/meta/poky/meta/recipes-connectivity/connman/connman_1.41.bb b/meta/poky/meta/recipes-connectivity/connman/connman_1.41.bb
new file mode 100644
index 0000000..fba966f
--- /dev/null
+++ b/meta/poky/meta/recipes-connectivity/connman/connman_1.41.bb
@@ -0,0 +1,11 @@
+require connman.inc
+
+SRC_URI  = "${KERNELORG_MIRROR}/linux/network/${BPN}/${BP}.tar.xz \
+            "
+SRC_URI_append_libc-musl = " file://0002-resolve-musl-does-not-implement-res_ninit.patch \
+                             "
+
+SRC_URI[md5sum] = "7f0a05fef485d3679cd73c8808f763f9"
+SRC_URI[sha256sum] = "79fb40f4fdd5530c45aa8e592fb16ba23d3674f3a98cf10b89a6576f198de589"
+
+RRECOMMENDS_${PN} = "connman-conf"