It handles client ATD*99# request and then initiate the PPP negotiation.
IP forward through the new ppp interface is not done yet.

Initially based on patches from Zhenhua Zhang <zhenhua.zh...@intel.com>
---
 src/emulator.c |  123 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 123 insertions(+), 0 deletions(-)

diff --git a/src/emulator.c b/src/emulator.c
index 49b129b..f1a079d 100644
--- a/src/emulator.c
+++ b/src/emulator.c
@@ -32,11 +32,18 @@
 #include "ofono.h"
 #include "common.h"
 #include "gatserver.h"
+#include "gatppp.h"
+
+#define DUN_SERVER_ADDRESS     "192.168.1.1"
+#define DUN_PEER_ADDRESS       "192.168.1.2"
+#define DUN_DNS_SERVER_1       "10.10.10.10"
+#define DUN_DNS_SERVER_2       "10.10.10.11"
 
 struct ofono_emulator {
        struct ofono_modem *modem;
        struct ofono_atom *atom;
        GAtServer *server;
+       GAtPPP *ppp;
        struct ofono_emulator_driver *driver;
 };
 
@@ -55,10 +62,124 @@ void ofono_emulator_remove(struct ofono_emulator *emulator)
        __ofono_atom_free(emulator->atom);
 }
 
+static void ppp_connect(const char *iface, const char *local,
+                       const char *remote,
+                       const char *dns1, const char *dns2,
+                       gpointer user_data)
+{
+       DBG("Network Device: %s\n", iface);
+       DBG("IP Address: %s\n", local);
+       DBG("Remote IP Address: %s\n", remote);
+       DBG("Primary DNS Server: %s\n", dns1);
+       DBG("Secondary DNS Server: %s\n", dns2);
+}
+
+static void ppp_disconnect(GAtPPPDisconnectReason reason, gpointer user_data)
+{
+       struct ofono_emulator *e = user_data;
+
+       DBG("");
+
+       g_at_ppp_unref(e->ppp);
+       e->ppp = NULL;
+
+       if (e->server == NULL)
+               return;
+
+       g_at_server_resume(e->server);
+
+       g_at_server_send_final(e->server, G_AT_SERVER_RESULT_NO_CARRIER);
+}
+
+static gboolean setup_ppp(gpointer user_data)
+{
+       struct ofono_emulator *e = user_data;
+       GAtServer *server = e->server;
+       GAtIO *io;
+
+       DBG("");
+
+       io = g_at_server_get_io(server);
+
+       g_at_server_suspend(server);
+
+       e->ppp = g_at_ppp_server_new_from_io(io, DUN_SERVER_ADDRESS);
+       if (e->ppp == NULL) {
+               g_at_server_resume(server);
+               return FALSE;
+       }
+
+       g_at_ppp_set_server_info(e->ppp, DUN_PEER_ADDRESS,
+                                       DUN_DNS_SERVER_1, DUN_DNS_SERVER_2);
+
+       g_at_ppp_set_credentials(e->ppp, "", "");
+       g_at_ppp_set_debug(e->ppp, ofono_emulator_debug, "PPP");
+
+       g_at_ppp_set_connect_function(e->ppp, ppp_connect, e);
+       g_at_ppp_set_disconnect_function(e->ppp, ppp_disconnect, e);
+
+       return FALSE;
+}
+
+static gboolean dial_call(struct ofono_emulator *e, const char *dial_str)
+{
+       char c = *dial_str;
+
+       DBG("dial call %s", dial_str);
+
+       if (c == '*' || c == '#' || c == 'T' || c == 't') {
+
+               g_at_server_send_intermediate(e->server, "CONNECT");
+               g_idle_add(setup_ppp, e);
+       }
+
+       return TRUE;
+}
+
+static void dial_cb(GAtServerRequestType type, GAtResult *result,
+                                       gpointer user_data)
+{
+       struct ofono_emulator *e = user_data;
+       GAtServer *server = e->server;
+       GAtResultIter iter;
+       const char *dial_str;
+
+       DBG("");
+
+       if (type != G_AT_SERVER_REQUEST_TYPE_SET)
+               goto error;
+
+       g_at_result_iter_init(&iter, result);
+
+       if (!g_at_result_iter_next(&iter, "D"))
+               goto error;
+
+       dial_str = g_at_result_iter_raw_line(&iter);
+       if (!dial_str)
+               goto error;
+
+       if (e->ppp)
+               goto error;
+
+       if (!dial_call(e, dial_str))
+               goto error;
+
+       return;
+
+error:
+       g_at_server_send_final(server, G_AT_SERVER_RESULT_ERROR);
+}
+
 static void emulator_disable(struct ofono_emulator *e)
 {
        DBG("");
 
+       if (e->ppp) {
+               g_at_ppp_shutdown(e->ppp);
+               g_at_ppp_unref(e->ppp);
+               e->ppp = NULL;
+       }
+
        g_at_server_shutdown(e->server);
        g_at_server_unref(e->server);
        e->server = NULL;
@@ -93,6 +214,8 @@ int ofono_emulator_enable(struct ofono_emulator *e, int fd)
        g_at_server_set_disconnect_function(e->server,
                                                emulator_disconnect_cb, e);
 
+       g_at_server_register(e->server, "D", dial_cb, e, NULL);
+
        return 0;
 }
 
-- 
1.7.4

_______________________________________________
ofono mailing list
ofono@ofono.org
http://lists.ofono.org/listinfo/ofono

Reply via email to