---
 gatchat/gatppp.c |   38 ++++++++++++++++++++++++++++++++++++++
 gatchat/gatppp.h |    9 ++++++++-
 2 files changed, 46 insertions(+), 1 deletions(-)

diff --git a/gatchat/gatppp.c b/gatchat/gatppp.c
index c425eae..5a34535 100644
--- a/gatchat/gatppp.c
+++ b/gatchat/gatppp.c
@@ -64,6 +64,7 @@ struct _GAtPPP {
        struct pppcp_data *ipcp;
        struct pppcp_data *ipv6cp;
        struct ppp_net *net;
+       struct ppp_net *net6;
        struct ppp_chap *chap;
        GAtHDLC *hdlc;
        gint mru;
@@ -75,6 +76,10 @@ struct _GAtPPP {
        GAtPPPDisconnectFunc disconnect_cb;
        gpointer disconnect_data;
        GAtPPPDisconnectReason disconnect_reason;
+       GAtPPPConnect6Func connect6_cb;
+       gpointer connect6_data;
+       GAtPPPDisconnectFunc disconnect6_cb;
+       gpointer disconnect6_data;
        GAtDebugFunc debugf;
        gpointer debug_data;
        gboolean sta_pending;
@@ -454,7 +459,19 @@ void ppp_ipv6cp_up_notify(GAtPPP *ppp, const char *local, 
const char *peer)
 {
        DBG(ppp, "local: %s, peer: %s", local, peer);
 
+       ppp->net6 = ppp_net_new(ppp, -1);
+
+       if (ppp->net6 == NULL) {
+               ppp->disconnect_reason = G_AT_PPP_REASON_NET_FAIL;
+               pppcp_signal_close(ppp->lcp);
+               return;
+       }
+
        ppp_enter_phase(ppp, PPP_PHASE_LINK_UP);
+
+       if (ppp->connect6_cb)
+               ppp->connect6_cb(ppp_net_get_interface(ppp->net6),
+                                       local, peer, ppp->connect6_data);
 }
 
 void ppp_ipv6cp_down_notify(GAtPPP *ppp)
@@ -831,6 +848,27 @@ gboolean g_at_ppp_set_ipv6cp_info(GAtPPP *ppp, gboolean 
is_server,
        return TRUE;
 }
 
+void g_at_ppp_set_ipv6_connect_function(GAtPPP *ppp, GAtPPPConnect6Func func,
+                                                       gpointer user_data)
+{
+       if (func == NULL)
+               return;
+
+       ppp->connect6_cb = func;
+       ppp->connect6_data = user_data;
+}
+
+void g_at_ppp_set_ipv6_disconnect_function(GAtPPP *ppp,
+                                               GAtPPPDisconnectFunc func,
+                                               gpointer user_data)
+{
+       if (func == NULL)
+               return;
+
+       ppp->disconnect6_cb = func;
+       ppp->disconnect6_data = user_data;
+}
+
 static GAtPPP *ppp_init_common(gboolean is_server, guint32 ip)
 {
        GAtPPP *ppp;
diff --git a/gatchat/gatppp.h b/gatchat/gatppp.h
index a41bf08..8fa1cd4 100644
--- a/gatchat/gatppp.h
+++ b/gatchat/gatppp.h
@@ -50,7 +50,8 @@ typedef void (*GAtPPPConnectFunc)(const char *iface, const 
char *local,
                                        gpointer user_data);
 typedef void (*GAtPPPDisconnectFunc)(GAtPPPDisconnectReason reason,
                                        gpointer user_data);
-
+typedef void (*GAtPPPConnect6Func)(const char *iface, const char *local,
+                                       const char *peer, gpointer user_data);
 GAtPPP *g_at_ppp_new(void);
 GAtPPP *g_at_ppp_server_new(const char *local);
 GAtPPP *g_at_ppp_server_new_full(const char *local, int fd);
@@ -84,6 +85,12 @@ void g_at_ppp_set_acfc_enabled(GAtPPP *ppp, gboolean 
enabled);
 void g_at_ppp_set_pfc_enabled(GAtPPP *ppp, gboolean enabled);
 gboolean g_at_ppp_set_ipv6cp_info(GAtPPP *ppp, gboolean is_server,
                                        const char *local, const char *peer);
+void g_at_ppp_set_ipv6_connect_function(GAtPPP *ppp,
+                                       GAtPPPConnect6Func callback,
+                                       gpointer user_data);
+void g_at_ppp_set_ipv6_disconnect_function(GAtPPP *ppp,
+                                               GAtPPPDisconnectFunc func,
+                                               gpointer user_data);
 
 #ifdef __cplusplus
 }
-- 
1.7.5.4

_______________________________________________
ofono mailing list
[email protected]
http://lists.ofono.org/listinfo/ofono

Reply via email to