So that gsmdial and wvdial could talk to test-server and establish PPP
connection.
---
 gatchat/test-server.c |  131 ++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 123 insertions(+), 8 deletions(-)

diff --git a/gatchat/test-server.c b/gatchat/test-server.c
index 5c1cfa4..68371c2 100644
--- a/gatchat/test-server.c
+++ b/gatchat/test-server.c
@@ -35,6 +35,7 @@
 #include <arpa/inet.h>
 #include <signal.h>
 #include <sys/signalfd.h>
+#include <errno.h>
 
 #include <glib.h>
 #include <utmp.h>
@@ -44,6 +45,7 @@
 #include <sys/stat.h>
 
 #include "gatserver.h"
+#include "gatppp.h"
 #include "ringbuffer.h"
 
 #define DEFAULT_TCP_PORT 12346
@@ -61,6 +63,7 @@ struct sock_server{
 
 static GMainLoop *mainloop;
 static GAtServer *server;
+static GAtPPP *ppp;
 unsigned int server_watch;
 
 static gboolean server_cleanup()
@@ -68,6 +71,11 @@ static gboolean server_cleanup()
        if (server_watch)
                g_source_remove(server_watch);
 
+       if (ppp) {
+               g_at_ppp_unref(ppp);
+               ppp = NULL;
+       }
+
        g_at_server_unref(server);
        server = NULL;
 
@@ -83,6 +91,81 @@ static void server_debug(const char *str, void *data)
        g_print("%s: %s\n", (char *) data, str);
 }
 
+static void ppp_connect(const char *iface, const char *local, const char *peer,
+                       const char *dns1, const char *dns2,
+                       gpointer user)
+{
+       g_print("Network Device: %s\n", iface);
+       g_print("IP Address: %s\n", local);
+       g_print("Peer IP Address: %s\n", peer);
+       g_print("Primary DNS Server: %s\n", dns1);
+       g_print("Secondary DNS Server: %s\n", dns2);
+}
+
+static void ppp_disconnect(GAtPPPDisconnectReason reason, gpointer user)
+{
+       GAtServer *server = user;
+
+       g_print("PPP Link down: %d\n", reason);
+
+       g_at_ppp_unref(ppp);
+       ppp = NULL;
+
+       g_at_server_resume(server);
+       g_at_server_set_debug(server, server_debug, "Server");
+}
+
+static gboolean update_ppp(gpointer user)
+{
+       GAtPPP *ppp = user;
+       char local_ip[INET_ADDRSTRLEN] = "192.168.1.1";
+       char remote_ip[INET_ADDRSTRLEN] = "192.168.1.2";
+       char dns1[INET_ADDRSTRLEN] = "10.10.10.0";
+       char dns2[INET_ADDRSTRLEN] = "127.0.0.1";
+       guint32 l, r, d1, d2;
+
+       inet_pton(AF_INET, local_ip, &l);
+       inet_pton(AF_INET, remote_ip, &r);
+       inet_pton(AF_INET, dns1, &d1);
+       inet_pton(AF_INET, dns2, &d2);
+
+       g_at_ppp_set_server_info(ppp, l, r, d1, d2, 0, 0);
+
+       return FALSE;
+}
+
+static gboolean setup_ppp(gpointer user)
+{
+       GAtServer *server = user;
+       GAtIO *io;
+
+       io = g_at_server_get_io(server);
+
+       g_at_server_suspend(server);
+
+       /* open ppp */
+       ppp = g_at_ppp_new_from_io(io);
+       if (ppp == NULL) {
+               g_at_server_resume(server);
+               return FALSE;
+       }
+
+       g_at_ppp_set_debug(ppp, server_debug, "PPP");
+
+       g_at_ppp_set_credentials(ppp, "", "");
+
+       /* set connect and disconnect callbacks */
+       g_at_ppp_set_connect_function(ppp, ppp_connect, server);
+       g_at_ppp_set_disconnect_function(ppp, ppp_disconnect, server);
+
+       /* open the ppp connection */
+       g_at_ppp_open(ppp);
+
+       g_idle_add(update_ppp, ppp);
+
+       return FALSE;
+}
+
 static void cgmi_cb(GAtServerRequestType type, GAtResult *cmd, gpointer user)
 {
        GAtServer *server = user;
@@ -468,6 +551,7 @@ static void cgdata_cb(GAtServerRequestType type, GAtResult 
*cmd, gpointer user)
                break;
        case G_AT_SERVER_REQUEST_TYPE_SET:
                g_at_server_send_final(server, G_AT_SERVER_RESULT_CONNECT);
+               g_idle_add(setup_ppp, server);
                break;
        default:
                g_at_server_send_final(server, G_AT_SERVER_RESULT_ERROR);
@@ -671,6 +755,40 @@ static void cpbs_cb(GAtServerRequestType type, GAtResult 
*cmd, gpointer user)
        }
 }
 
+static void dial_cb(GAtServerRequestType type, GAtResult *cmd, gpointer user)
+{
+       GAtServer *server = user;
+       GAtServerResult res = G_AT_SERVER_RESULT_ERROR;
+       GAtResultIter iter;
+       const char *dial_str;
+       char c;
+
+       if (type != G_AT_SERVER_REQUEST_TYPE_SET)
+               goto error;
+
+       g_at_result_iter_init(&iter, cmd);
+
+       if (!g_at_result_iter_next(&iter, "D"))
+               goto error;
+
+       dial_str = g_at_result_iter_raw_line(&iter);
+       if (!dial_str)
+               goto error;
+
+       g_print("dial call %s\n", dial_str);
+
+       c = *dial_str;
+       if (c == '*' || c == '#' || c == 'T' || c == 't') {
+               g_at_server_send_final(server, G_AT_SERVER_RESULT_CONNECT);
+               g_idle_add(setup_ppp, server);
+       }
+
+       return;
+
+error:
+       g_at_server_send_final(server, res);
+}
+
 static void add_handler(GAtServer *server)
 {
        g_at_server_set_debug(server, server_debug, "Server");
@@ -695,6 +813,7 @@ static void add_handler(GAtServer *server)
        g_at_server_register(server, "+CSCS",    cscs_cb,    server, NULL);
        g_at_server_register(server, "+CMGL",    cmgl_cb,    server, NULL);
        g_at_server_register(server, "+CPBS",    cpbs_cb,    server, NULL);
+       g_at_server_register(server, "D",        dial_cb,    server, NULL);
 }
 
 static void server_destroy(gpointer user)
@@ -706,15 +825,11 @@ static void server_destroy(gpointer user)
 
 static void set_raw_mode(int fd)
 {
-       struct termios options;
-
-       tcgetattr(fd, &options);
-
-       /* Set TTY as raw mode to disable echo back of input characters
-        * when they are received from Modem to avoid feedback loop */
-       options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
+       struct termios ti;
 
-       tcsetattr(fd, TCSANOW, &options);
+       tcflush(fd, TCIOFLUSH);
+       cfmakeraw(&ti);
+       tcsetattr(fd, TCSANOW, &ti);
 }
 
 static gboolean create_tty(const char *modem_path)
-- 
1.6.3.3

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

Reply via email to