Add option to use PPP to gsmdial.

Index: ofono/gatchat/gsmdial.c
===================================================================
--- ofono.orig/gatchat/gsmdial.c        2010-03-10 16:58:09.773080389 -0800
+++ ofono/gatchat/gsmdial.c     2010-03-10 17:06:45.071975512 -0800
@@ -33,6 +33,9 @@
 #include <glib.h>
 #include <gatchat.h>
 #include <gattty.h>
+#include <arpa/inet.h>
+#include <net/if.h>
+#include <gatppp.h>
 
 static const char *none_prefix[] = { NULL };
 static const char *cgreg_prefix[] = { "+CGREG:", NULL };
@@ -45,10 +48,14 @@
 static gchar *option_apn = NULL;
 static gint option_offmode = 0;
 static gboolean option_legacy = FALSE;
+static gboolean option_ppp = FALSE;
+static gchar *option_username = NULL;
+static gchar *option_passwd = NULL;
 
 static GAtChat *control;
 static GAtChat *modem;
 static GMainLoop *event_loop;
+static struct ppp_link *ppp;
 
 enum state {
        STATE_NONE = 0,
@@ -220,6 +227,70 @@
        g_at_chat_send(modem, buf, none_prefix, NULL, NULL, NULL);
 }
 
+static void print_ip_address(guint32 ip_addr)
+{
+       struct in_addr addr;
+       addr.s_addr = ip_addr;
+       g_print("%s\n", inet_ntoa(addr));
+}
+
+static void ppp_connect(struct ppp_link *link, gint success, guint32 ip_addr,
+                guint32 dns1, guint32 dns2, gpointer user_data)
+{
+       if (success == PPP_CONNECT_SUCCESS) {
+               /* print out the negotiated address and dns server */
+               g_print("Negotiated IP Address: ");
+               print_ip_address(ip_addr);
+
+               g_print("Primary DNS Server: ");
+               print_ip_address(dns1);
+
+               g_print("Secondary DNS Server: ");
+               print_ip_address(dns2);
+       } else {
+               g_print("Failed to create PPP interface!\n");
+       }
+}
+
+static void ppp_disconnect(struct ppp_link *link, gpointer user_data)
+{
+       g_print("PPP Link down\n");
+}
+
+static void connect_cb(gboolean ok, GAtResult *result, gpointer user_data)
+{
+       GIOChannel *channel;
+
+       if (!ok) {
+               g_print("Unable to define context\n");
+               exit(1);
+       }
+
+       /* get the data IO channel */
+       channel = g_at_chat_get_channel(modem);
+       channel = g_io_channel_ref(channel);
+
+       /* shutdown gatchat */
+       g_at_chat_unref(control);
+       g_at_chat_unref(modem);
+
+       /* open ppp */
+       ppp = g_at_ppp_new(channel);
+       if (ppp) {
+               g_print("Setting PPP Credentials to %s, %s\n", option_username,
+                               option_passwd);
+               g_at_ppp_set_credentials(ppp, option_username,
+                                       option_passwd);
+
+               /* set connect and disconnect callbacks */
+               g_at_ppp_set_connect_function(ppp, ppp_connect, NULL);
+               g_at_ppp_set_disconnect_function(ppp, ppp_disconnect, NULL);
+
+               /* open the ppp connection */
+               g_at_ppp_open(ppp);
+       }
+}
+
 static void at_cgdcont_cb(gboolean ok, GAtResult *result, gpointer user_data)
 {
        char buf[64];
@@ -231,8 +302,14 @@
 
        if (option_legacy == TRUE) {
                        sprintf(buf, "ATD*99***%u#", option_cid);
-                       g_at_chat_send(modem, buf, none_prefix,
-                                       NULL, NULL, NULL);
+                       if (option_ppp == TRUE) {
+                               g_print("Option PPP enabled\n");
+                               g_at_chat_send(modem, buf, none_prefix,
+                                               connect_cb, NULL, NULL);
+                       }
+                       else
+                               g_at_chat_send(modem, buf, none_prefix,
+                                               NULL, NULL, NULL);
        } else {
                sprintf(buf, "AT+CGACT=1,%u", option_cid);
                g_at_chat_send(control, buf, none_prefix,
@@ -406,6 +483,12 @@
                                "Specify CFUN offmode" },
        { "legacy", 'l', 0, G_OPTION_ARG_NONE, &option_legacy,
                                "Use ATD*99***<cid>#" },
+       { "ppp", 'P', 0, G_OPTION_ARG_NONE, &option_ppp,
+                               "Connect using PPP" },
+       { "username", 'u', 0, G_OPTION_ARG_STRING, &option_username,
+                               "Specify PPP Username" },
+       { "password", 'w', 0, G_OPTION_ARG_STRING, &option_passwd,
+                               "Specifiy PPP Password" },
        { NULL },
 };
 

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

Reply via email to