--- backup-stock-image-20100320/inc/interfaces.inc	2010-03-23 13:42:51.000000000 +0700
+++ interfaces.inc	2010-03-24 14:41:27.000000000 +0700
@@ -687,7 +687,7 @@
 	interfaces_qinq_configure();
 
 	/* Set up PPP interfaces */
-	interfaces_ppp_configure();
+	//interfaces_ppp_configure();
 
 	$iflist = get_configured_interface_with_descr();
 	$delayed_list = array();
@@ -824,8 +824,6 @@
 	unlink_if_exists("{$g['tmp_path']}/{$realif}up");
 	unlink_if_exists("{$g['vardb_path']}/{$interface}ip");
 	unlink_if_exists("{$g['tmp_path']}/{$realif}_router");
-	
-	interface_ppp_bring_down($realif);
 
 	switch ($ifcfg['ipaddr']) {
 	case "pppoe":
@@ -857,6 +855,10 @@
 			mwexec("/usr/sbin/arp -d -i {$realif} -a");
 		}
 		break;
+	case "ppp":
+		killbypid("{$g['varrun_path']}/{$realif}.pid");
+		sleep(2);
+		break;
 	default:
 		if(does_interface_exist("$realif")) {
 			mwexec("/sbin/ifconfig " . escapeshellarg($realif) . " delete", true);
@@ -873,7 +875,9 @@
 
 	return;
 }
-
+/* Now PPP functions are integrated into the structure of other functions better we don't need this
+	i.e. interface_ppp_configure is called by interface_configure, interface_bring_down, etc.
+	
 function interfaces_ppp_configure($write_config=true) {
 	global $config, $g;
 	if(!$g['booting']) 
@@ -882,8 +886,8 @@
 		echo "Configuring PPP interfaces...";
 	if($config['ppps']['ppp']) {
 		foreach($config['ppps']['ppp'] as $ppp) {
-			$dev = substr($ppp['port'], 5);
-			interface_ppp_configure($dev,$write_config);
+			$id = $ppp['id'];
+			interface_ppp_configure($id,$write_config);
 		}
 	}
 	if(!$g['booting']) 
@@ -891,110 +895,224 @@
 	if($g['booting'])
 		echo "done.\n";
 }
+*/
 
-function interface_ppp_configure($ifcfg,$edit=false) {
+function interface_ppp_configure($ppp_int,$edit=false) {
 	global $config, $g;
 	
-	/* Remove  the /dev/ from the device name. */
-	$orig_dev = $ifcfg;
-
-	// ppp (userland) requires a /var/spool/lock directory
+	$serial_device = 0;
+	if ($ppp_int <> -1)
+		if (is_array($config['ppps']['ppp']) && count($config['ppps']['ppp'])) {
+			foreach ($config['ppps']['ppp'] as $ppp) {
+				if ($ppp_int == "ppp".$ppp['pppid'])
+					$serial_device = $ppp['port'];
+			}
+		}
+	
+	// mpd5 requires a /var/spool/lock directory
 	if(!is_dir("/var/spool/lock")) {
-		exec("mkdir -p /var/spool/lock");
-		exec("chmod a+rw /var/spool/lock/.");
+		exec("/bin/mkdir -p /var/spool/lock");
+		exec("/bin/chmod a+rw /var/spool/lock/.");
 	}
-	if ($edit){
-		// Construct the ppp.conf file
-		$peerfile .= "default:\n";
-		$peerfile .= " set log Phase Chat LCP IPCP CCP tun command\n";
-		$peerfile .= " ident user-ppp VERSION (built COMPILATIONDATE)\n";
-		$peerfile .= " set dial \"ABORT BUSY ABORT NO\\\sCARRIER TIMEOUT 5 \\\n";
-		$peerfile .= " 		\\\"\\\" AT OK-AT-OK ATE1Q0 OK \\\dATDT\\\T TIMEOUT 40 CONNECT\"\n";
-		$peerfile .= " enable dns\n";
-		$peerfile .= " nat enable yes\n";
-		$peerfile .= " set reconnect {$ifcfg['connect-max-attempts']} 5\n";
-		$peerfile .= " allow users root\n\n";
-	
-		// Loop variables
-    		$i = 0;
-		$startingip = 1;
-
-		// Start ppp.linkup file
-		$rclinkup = "default:\n";
-		// Start ppp.linkdown file
-		$rclinkdown = "default:\n";
+	if (!file_exists("{$g['varetc_path']}/mpd.script"))
+		if($g['booting'])
+		// Maybe make a symlink instead?
+			mwexec("/bin/cp /etc/ppp/mpd.script {$g['varetc_path']}/mpd.script");
+		
+	if ($edit || $g['booting']){
+		if($g['booting'])
+			echo " configuring PPP on {$ppp_int} interface...\n";
+		/* generate mpd.conf */
+		$fd = fopen("{$g['varetc_path']}/mpd-ppp.conf", "w");
+		if (!$fd) {
+			printf("Error: cannot open mpd-ppp.conf in interface_ppp_configure().\n");
+			return 1;
+		}
+		/* generate mpd.secret */
+		$fds = fopen("{$g['varetc_path']}/mpd.secret", "w");
+		if (!$fds) {
+			printf("Error: cannot open mpd.secret in interface_ppp_configure().\n");
+			return 1;
+		}
+		$fdlnkdn = fopen("{$g['varetc_path']}/ppp.linkdn", "w");
+		if (!$fdlnkdn) {
+			printf("Error: cannot open ppp.linkdn in interface_ppp_configure().\n");
+			return 1;
+		}
+		// Create mpd.secret file
+		
+		$secret = <<<EOD
+#################################################################
+#
+# MPD secrets file
+# Entries are for authentication in either or both directions, as well 
+# as telnet console login. Auto generated from /etc/inc/interfaces.inc
+# {$g['varetc_path']}/mpd.secret
+#
+##################################################################
+Mylogin	""
+
+EOD;
+		// Construct the mpd.conf file
+		$mpdconf = <<<EOD
+#################################################################
+#
+# MPD Configuration file
+# Auto generated by pfSense from /etc/inc/interfaces.inc
+# {$g['varetc_path']}/mpd_ppp.conf
+#
+##################################################################
+
+startup:
+	# configure mpd users
+	set user admin pfsense admin
+	set user user pfsense
+	# configure the console
+	set console self 127.0.0.1 5005
+	set console open
+	# configure the web server
+	#set web self 0.0.0.0 5006
+	#set web open
+
+default:
+
+EOD;
+
+		$ip = 1;
 
  	   	if (is_array($config['ppps']['ppp']) && count($config['ppps']['ppp'])) {
 			foreach ($config['ppps']['ppp'] as $ppp) {
-				$dev = substr($ppp['port'], 5);
-				$realif  = $ppp['port'];
-				$peerfile .= "{$dev}:\n";
-				$peerfile .= " set device {$realif}\n";
-				if($ppp['dialcmd']) {
-					$peerfile .= " set dial " . base64_decode($ppp['dialcmd']) . "\n";
-				} else
-					$peerfile .= " set dial \"\"\n";
-				$peerfile .= " set speed {$ppp['linespeed']}\n";
-				if (isset($ppp['defaultgw']))
-					$peerfile .= " add default HISADDR\n";
-				$peerfile .= " set timeout 0\n";
-				$peerfile .= " enable dns\n";
-				$endingip = $startingip+1;
+				//$dev = substr($ppp['port'], 5); //Device sans path
+				$id = $ppp['pppid'];
+				$ppp_port = "ppp{$id}";
+
+				$endingip = $ip+1;
 				if($ppp['localip'] && $ppp['gateway'])
-					$peerfile .= " set ifaddr {$ppp['localip']}/0 {$ppp['gateway']}/0 255.255.255.0 0.0.0.0\n";
+					$ranges = "set ipcp ranges {$ppp['localip']}/0 {$ppp['gateway']}/0";
 				if(!$ppp['localip'] && $ppp['gateway'])
-					$peerfile .= " set ifaddr 10.0.0.{$startingip}/0 {$ppp['gateway']}/0 255.255.255.0 0.0.0.0\n";
+					$ranges = "set ipcp ranges 10.0.0.{$ip}/0 {$ppp['gateway']}/0";
 				if($ppp['localip'] and !$ppp['gateway'])
-					$peerfile .= " set ifaddr {$ppp['localip']}/0 10.0.0.{$endingip}/0 255.255.255.0 0.0.0.0\n";
+					$ranges = "set ipcp ranges {$ppp['localip']}/0 10.0.0.{$endingip}/0";
 				if(!$ppp['localip'] and !$ppp['gateway'])	
-					$peerfile .= " set ifaddr 10.0.0.{$startingip}/0 10.0.0.{$endingip}/0 255.255.255.0 0.0.0.0\n";
-				//$peerfile .= " iface name ppp_{$orig_dev}\n";
-				$peerfile .= " set phone \"{$ppp['phone']}\"\n";
-				$peerfile .= " set authname \"{$ppp['username']}\"\n";
-				$peerfile .= " set authkey \"{$ppp['password']}\"\n";
-				// Add a local socket for the daemon so we can query it later
-				$peerfile .= " set server /var/run/{$dev}.sock \"\" 0177\n";
-				$peerfile .= "\n";
-				$i++;
-				$startingip++;
-				$rclinkup .= "{$dev}:\n";
-				$rclinkup .= "	! sh -c \"/etc/rc.conf_mount_rw\"\n";
- 				$rclinkup .= "	! sh -c \"/bin/echo `date -j +%Y.%m.%d-%H:%M:%S` 00:00:00 >> /conf/ppp-up.{$dev}.log\"\n";
-				$rclinkup .= "	! sh -c \"/sbin/ppp-script HISADDR INTERFACE DNS0 DNS1\"\n";
-				$rclinkup .= "	! sh -c \"/etc/rc.linkup INTERFACE start\"\n";
-				$rclinkup .= "	! sh -c \"/etc/rc.conf_mount_ro\"\n";
-				$rclinkup.= "	! sh -c \"/etc/rc.filter_configure_sync\"\n";
-				// Link down file
-				$rclinkdown .= "{$dev}:\n";
-				$rclinkdown .= "	! sh -c \"/etc/rc.conf_mount_rw\"\n";
-				$rclinkdown .= "	! sh -c \"/bin/echo `date -j +%Y.%m.%d-%H:%M:%S` UPTIME >> /conf/ppp-up.{$dev}.log\"\n";
-				$rclinkdown .= "	! sh -c \"/etc/rc.conf_mount_ro\"\n";
-				$rclinkdown .= "	! sh -c \"/bin/rm -f /var/run/{$dev}.if\"\n";
-			}	
-    		}
+					$ranges = "set ipcp ranges 10.0.0.{$ip}/0 10.0.0.{$endingip}/0";
+				if ($ppp['username'] <> ""){
+					$user = "{$ppp['username']}";
+				} else {
+					$user = "Mylogin";
+				}
+				
+				$mpdconf .= <<<EOD
+{$ppp_port}:
+	create bundle static B{$id}
+	{$ranges}
+	set ipcp yes req-pri-dns
+	set ipcp yes req-sec-dns
+	set iface name {$ppp_port}
 
-		// Write out configuration for ppp.conf
-		file_put_contents("/etc/ppp/ppp.conf", $peerfile);
+EOD;
+				if (isset($ppp['defaultgw'])){
+					$mpdconf .= <<<EOD
+	set iface route default
+
+EOD;
+				}
+				$mpdconf .= <<<EOD
+	set iface up-script /usr/local/sbin/ppp-linkup
+	set iface down-script /usr/local/sbin/ppp-linkdn
+# Create link.
+	create link static L{$ppp_port} modem
+	set modem device {$ppp['port']}
+	set modem var \$DialPrefix "DT"
+	set modem var \$Telephone "{$ppp['phone']}"
+
+EOD;
+				$ip++;
+				if (isset($ppp['connecttimeout'])){
+					$mpdconf .= <<<EOD
+	set modem var \$ConnectTimeout "25"
+
+EOD;
+				}
+				if (isset($ppp['initstr'])){
+					$mpdconf .= <<<EOD
+	set modem var \$InitString "{$ppp['initstr']}"
+
+EOD;
+				}
+				if (isset($ppp['apn'])){
+					$mpdconf .= <<<EOD
+	set modem var \$APN "{$ppp['apn']}"
+	set modem var \$APNum "{$ppp['apnum']}"
 
-		// Write out linkup file
-		file_put_contents("/etc/ppp/ppp.linkup", $rclinkup);
-		file_put_contents("/etc/ppp/ppp.linkdown", $rclinkdown);
-		// Make executable
-		exec("chmod a+rx /etc/ppp/ppp.linkup");
-		exec("chmod a+rx /etc/ppp/ppp.linkdown");
+EOD;
+				}
+				$mpdconf .= <<<EOD
+	set modem script DialPeer
+	set modem idle-script Ringback
+	set modem watch -cd
+# We expect to be authenticated by peer using any protocol.
+	set link disable chap pap
+	set link accept chap pap eap
+	set link enable no-orig-auth
+# Configure the account name. Password will be taken from mpd.secret.
+	set auth authname {$user}
+# To make Ringback work we should specify how to handle incoming calls originated by it.
+	#set link enable incoming
+	set link action bundle B{$id}
+	open
+
+EOD;
+
+				// Start interface down-script file - make new file for each configured PPP interface. 
+				// Then it's easy to associate an interface with a serial device.
+
+				$rclinkdown = <<<EOD
+#!/bin/sh
+
+# delete the node just in case mpd cannot do that
+/usr/sbin/ngctl shutdown $1:
+
+#rm -f /tmp/$1_route
+rm -f /tmp/$1up
+rm -f {$g['varetc_path']}/nameserver_$1
+#/etc/rc.conf_mount_rw
+#/bin/echo `date -j +%Y.%m.%d-%H:%M:%S` UPTIME >> /conf/$1.log
+#/etc/rc.conf_mount_ro
+
+EOD;
+				
+				if ($ppp['username'] <> ""){
+					$secret .= <<<EOD
+{$ppp['username']}	"{$ppp['password']}"
+
+EOD;
+				}
+
+				// Write out linkup file for each configured PPP interface.
+
+				fwrite($fdlnkdn, $rclinkdown);
+				fclose($fdlnkdn);		
+				// Make executable
+				exec("chmod a+rx {$g['varetc_path']}/ppp.linkdn");
+			}	
+    	}
+
+		// Write out configuration for mpd_ppp.conf and mpd.secret
+		fwrite($fd, $mpdconf);
+		fclose($fd);
+		log_error("wrote {$g['varetc_path']}/mpd-ppp.conf");
+		fwrite($fds, $secret);
+		fclose($fds);
+		sleep(1);
 	}
 	// Launch specified ppp instance
-	if( (!$edit || $g['booting']) && file_exists("/dev/{$orig_dev}")){
-		$running = `/bin/pgrep -f "ppp .* $orig_dev"`;
-		if(!$running)
-			mwexec_bg("/usr/sbin/ppp -background {$orig_dev}");
-	}
-}
+	if( (!$edit || $g['booting']) && file_exists("{$serial_device}")){
+		/* if mpd is active, lets take it down -> accomplished by starting mpd with the -k flag*/
+		/* fire up mpd */
+		mwexec("/usr/local/sbin/mpd5 -b -k -d {$g['varetc_path']} -f mpd-ppp.conf -p {$g['varrun_path']}/{$ppp_int}.pid -s ppp {$ppp_int}");
+		sleep(2);
+		
 
-function interface_ppp_bring_down($if) {
-	if(file_exists("/var/run/{$if}.pid")) {
-		$pid = trim(file_get_contents("/var/run/{$if}.pid"));
-		mwexec("kill -QUIT {$pid}");
 	}
 }
 
@@ -1904,7 +2022,9 @@
 		case 'pptp':
 			interface_pptp_configure($interface);
 			break;
-
+		case 'ppp':
+			interface_ppp_configure($realif);
+			break;
 		default:
 			if ($wancfg['ipaddr'] <> "" && $wancfg['subnet'] <> "") {
 				if (isset($wancfg['ispointtopoint']) && $wancfg['pointtopoint']) {
@@ -1929,9 +2049,6 @@
 	if (!$g['booting'])
 		interface_reload_carps($realif);
 	
-	if($wancfg['serialport'])
-		interface_ppp_configure($wancfg['serialport']);
-	
 	if (!$g['booting']) {
 		if (link_interface_to_gre($interface)) {
 			foreach ($config['gres']['gre'] as $gre)
@@ -2391,7 +2508,7 @@
  */
 function convert_real_interface_to_friendly_interface_name($interface = "wan") {
         global $config;
-
+		
         if (stristr($interface, "pppoe")) {
                 $index = substr($interface, 5);
                 if (intval($index) > 0)
@@ -2404,7 +2521,7 @@
                         return "opt{$index}";
                 else
                         return "wan";
-	} else if (stristr($interface, "vip")) {
+		} else if (stristr($interface, "vip")) {
                 $index = substr($interface, 3);
                 $counter = 0;
                 foreach ($config['virtualip']['vip'] as $vip) {
@@ -2446,7 +2563,7 @@
 
 /* attempt to resolve interface to friendly descr */
 function convert_friendly_interface_to_friendly_descr($interface) {
-        global $config;
+        global $config; 
 
         switch ($interface) {
                 case "l2tp":
@@ -2570,17 +2687,6 @@
 
 			if ($interface == $if || $interface == $ifdesc) {
 
-			// PPP Support
-			if($config['interfaces'][$if]['serialport']) {
-				$dev = $config['interfaces'][$if]['serialport'];
-				if(file_exists("/var/run/{$dev}.if")) {
-					$wanif = trim(file_get_contents("/var/run/{$dev}.if"));
-				} else
-					$wanif = "Not connected";
-
-				break;
-			}
-
 			$cfg = $config['interfaces'][$if];
 
 			// Wireless cloned NIC support (FreeBSD 8+)
@@ -2624,6 +2730,9 @@
 					else
 						$wanif = "pptp" . substr($if, 3);
 					break;
+				case "ppp":
+					$wanif = $cfg['if'];
+					break;
 				default:
 					$wanif = $cfg['if'];
 					break;
@@ -2923,16 +3032,14 @@
 
 	/* loop interfaces, check config for outbound */
 	foreach($config['interfaces'] as $ifdescr => $ifname) {
-		if($ifname['serialport']) {
-			$ints[] = $ifdescr;
-			continue;
-		}
+
 		switch ($ifname['ipaddr']) {
 			case "dhcp":
 			case "carpdev-dhcp":
 			case "pppoe":
 			case "pptp":
-			$ints[] = $ifdescr;
+			case "ppp";
+				$ints[] = $ifdescr;
 			break;
 			default:
 			if ($ifname['pointtopoint'])
