<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">--- pppd/demand.c.orig	2004-11-04 11:02:26.000000000 +0100
+++ pppd/demand.c	2007-07-29 03:52:41.000000000 +0200
@@ -36,6 +36,8 @@
 #include &lt;errno.h&gt;
 #include &lt;fcntl.h&gt;
 #include &lt;netdb.h&gt;
+#include &lt;unistd.h&gt;
+#include &lt;syslog.h&gt;
 #include &lt;sys/param.h&gt;
 #include &lt;sys/types.h&gt;
 #include &lt;sys/wait.h&gt;
@@ -43,6 +45,8 @@
 #include &lt;sys/resource.h&gt;
 #include &lt;sys/stat.h&gt;
 #include &lt;sys/socket.h&gt;
+#include &lt;netinet/in.h&gt;
+#include &lt;arpa/inet.h&gt;
 #ifdef PPP_FILTER
 #include &lt;pcap-bpf.h&gt;
 #endif
@@ -221,6 +225,14 @@
     int c, rv;
 
     rv = 0;
+
+/* check for synchronous connection... */
+
+    if ( (p[0] == 0xFF) &amp;&amp; (p[1] == 0x03) ) {
+        rv = loop_frame(p,n);
+        return rv;
+    }
+
     for (; n &gt; 0; --n) {
 	c = *p++;
 	if (c == PPP_FLAG) {
@@ -299,17 +311,102 @@
  * loopback, now that the real serial link is up.
  */
 void
-demand_rexmit(proto)
+demand_rexmit(proto, newip)
     int proto;
+    u_int32_t newip;
 {
     struct packet *pkt, *prev, *nextpkt;
+    unsigned short checksum;
+    unsigned short pkt_checksum = 0;
+    unsigned iphdr;
+    struct timeval tv;
+    char cv = 0;
+    char ipstr[16];
 
     prev = NULL;
     pkt = pend_q;
     pend_q = NULL;
+    tv.tv_sec = 1;
+    tv.tv_usec = 0;
+    select(0,NULL,NULL,NULL,&amp;tv);	/* Sleep for 1 Seconds */
     for (; pkt != NULL; pkt = nextpkt) {
 	nextpkt = pkt-&gt;next;
 	if (PPP_PROTOCOL(pkt-&gt;data) == proto) {
+            if ( (proto == PPP_IP) &amp;&amp; newip ) {
+		/* Get old checksum */
+
+		iphdr = (pkt-&gt;data[4] &amp; 15) &lt;&lt; 2;
+		checksum = *((unsigned short *) (pkt-&gt;data+14));
+                if (checksum == 0xFFFF) {
+                    checksum = 0;
+                }
+
+ 
+                if (pkt-&gt;data[13] == 17) {
+                    pkt_checksum =  *((unsigned short *) (pkt-&gt;data+10+iphdr));
+		    if (pkt_checksum) {
+                        cv = 1;
+                        if (pkt_checksum == 0xFFFF) {
+                            pkt_checksum = 0;
+                        }
+                    }
+                    else {
+                       cv = 0;
+                    }
+                }
+
+		if (pkt-&gt;data[13] == 6) {
+		    pkt_checksum = *((unsigned short *) (pkt-&gt;data+20+iphdr));
+		    cv = 1;
+                    if (pkt_checksum == 0xFFFF) {
+                        pkt_checksum = 0;
+                    }
+		}
+
+		/* Delete old Source-IP-Address */
+                checksum -= *((unsigned short *) (pkt-&gt;data+16)) ^ 0xFFFF;
+                checksum -= *((unsigned short *) (pkt-&gt;data+18)) ^ 0xFFFF;
+
+		pkt_checksum -= *((unsigned short *) (pkt-&gt;data+16)) ^ 0xFFFF;
+		pkt_checksum -= *((unsigned short *) (pkt-&gt;data+18)) ^ 0xFFFF;
+
+		/* Change Source-IP-Address */
+                * ((u_int32_t *) (pkt-&gt;data + 16)) = newip;
+
+		/* Add new Source-IP-Address */
+                checksum += *((unsigned short *) (pkt-&gt;data+16)) ^ 0xFFFF;
+                checksum += *((unsigned short *) (pkt-&gt;data+18)) ^ 0xFFFF;
+
+                pkt_checksum += *((unsigned short *) (pkt-&gt;data+16)) ^ 0xFFFF;
+                pkt_checksum += *((unsigned short *) (pkt-&gt;data+18)) ^ 0xFFFF;
+
+		/* Write new checksum */
+                if (!checksum) {
+                    checksum = 0xFFFF;
+                }
+                *((unsigned short *) (pkt-&gt;data+14)) = checksum;
+		if (pkt-&gt;data[13] == 6) {
+		    *((unsigned short *) (pkt-&gt;data+20+iphdr)) = pkt_checksum;
+		}
+		if (cv &amp;&amp; (pkt-&gt;data[13] == 17) ) {
+		    *((unsigned short *) (pkt-&gt;data+10+iphdr)) = pkt_checksum;
+		}
+
+		/* Log Packet */
+		strcpy(ipstr,inet_ntoa(*( (struct in_addr *) (pkt-&gt;data+16))));
+		if (pkt-&gt;data[13] == 1) {
+		    syslog(LOG_INFO,"Open ICMP %s -&gt; %s\n",
+			ipstr,
+			inet_ntoa(*( (struct in_addr *) (pkt-&gt;data+20))));
+		} else {
+		    syslog(LOG_INFO,"Open %s %s:%d -&gt; %s:%d\n",
+			pkt-&gt;data[13] == 6 ? "TCP" : "UDP",
+			ipstr,
+			ntohs(*( (short *) (pkt-&gt;data+iphdr+4))),
+			inet_ntoa(*( (struct in_addr *) (pkt-&gt;data+20))),
+			ntohs(*( (short *) (pkt-&gt;data+iphdr+6))));
+                }
+            }
 	    output(0, pkt-&gt;data, pkt-&gt;length);
 	    free(pkt);
 	} else {
--- pppd/ipcp.c.orig	2007-07-29 03:52:41.000000000 +0200
+++ pppd/ipcp.c	2007-07-29 03:52:41.000000000 +0200
@@ -1796,7 +1796,7 @@
 		    proxy_arp_set[f-&gt;unit] = 1;
 
 	}
-	demand_rexmit(PPP_IP);
+	demand_rexmit(PPP_IP,go-&gt;ouraddr);
 	sifnpmode(f-&gt;unit, PPP_IP, NPMODE_PASS);
 
     } else {
--- pppd/ipv6cp.c.orig	2004-11-13 03:28:15.000000000 +0100
+++ pppd/ipv6cp.c	2007-07-29 03:52:41.000000000 +0200
@@ -1232,7 +1232,7 @@
 	    }
 
 	}
-	demand_rexmit(PPP_IPV6);
+	demand_rexmit(PPP_IPV6,0);
 	sifnpmode(f-&gt;unit, PPP_IPV6, NPMODE_PASS);
 
     } else {
--- pppd/pppd.h.orig	2007-07-29 03:52:41.000000000 +0200
+++ pppd/pppd.h	2007-07-29 03:52:41.000000000 +0200
@@ -563,7 +563,7 @@
 void demand_block __P((void));	/* set all NPs to queue up packets */
 void demand_unblock __P((void)); /* set all NPs to pass packets */
 void demand_discard __P((void)); /* set all NPs to discard packets */
-void demand_rexmit __P((int));	/* retransmit saved frames for an NP */
+void demand_rexmit __P((int, u_int32_t)); /* retransmit saved frames for an NP*/
 int  loop_chars __P((unsigned char *, int)); /* process chars from loopback */
 int  loop_frame __P((unsigned char *, int)); /* should we bring link up? */
 
</pre></body></html>