Change security level on demand when reading characteristic value

If a characteristic requires a higher security level, change it on
demand and re-send the GATT Charateristic Value Read. Request will not
be sent until the SMP negotiation finishes. This change doesn't affect
GATT over BR/EDR, since encryption is mandatory for BR/EDR.
diff --git a/attrib/client.c b/attrib/client.c
index 10bbf7d..3297a0c 100644
--- a/attrib/client.c
+++ b/attrib/client.c
@@ -744,6 +744,17 @@
 
 	if (status == 0)
 		characteristic_set_value(chr, pdu + 1, len - 1);
+	else if (status == ATT_ECODE_INSUFF_ENC) {
+		GIOChannel *io = g_attrib_get_channel(gatt->attrib);
+
+		if (bt_io_set(io, BT_IO_L2CAP, NULL,
+				BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_HIGH,
+				BT_IO_OPT_INVALID)) {
+			gatt_read_char(gatt->attrib, chr->handle,
+					update_char_value, current);
+			return;
+		}
+	}
 
 	g_attrib_unref(gatt->attrib);
 	g_free(current);
diff --git a/attrib/gattrib.c b/attrib/gattrib.c
index 9268001..dd7b1d7 100644
--- a/attrib/gattrib.c
+++ b/attrib/gattrib.c
@@ -202,6 +202,14 @@
 	g_free(attrib);
 }
 
+GIOChannel *g_attrib_get_channel(GAttrib *attrib)
+{
+	if (!attrib)
+		return NULL;
+
+	return attrib->io;
+}
+
 gboolean g_attrib_set_disconnect_function(GAttrib *attrib,
 		GAttribDisconnectFunc disconnect, gpointer user_data)
 {
diff --git a/attrib/gattrib.h b/attrib/gattrib.h
index 0940289..5c50bc9 100644
--- a/attrib/gattrib.h
+++ b/attrib/gattrib.h
@@ -44,6 +44,8 @@
 GAttrib *g_attrib_ref(GAttrib *attrib);
 void g_attrib_unref(GAttrib *attrib);
 
+GIOChannel *g_attrib_get_channel(GAttrib *attrib);
+
 gboolean g_attrib_set_disconnect_function(GAttrib *attrib,
 		GAttribDisconnectFunc disconnect, gpointer user_data);