[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"