[patch 6/6] Allow gsmdial to use gatchat ppp support

kristen at linux.intel.com kristen at linux.intel.com
Thu Mar 11 14:00:50 PST 2010


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 },
 };
 



More information about the ofono mailing list