be53c81b93f1fd441722ce6dcc30fec7349bb58f
[openwrt.git] / package / ppp / patches / 105-debian_demand.patch
1 diff -Naur ppp-2.4.4.orig/pppd/demand.c ppp-2.4.4/pppd/demand.c
2 --- ppp-2.4.4.orig/pppd/demand.c        2005-08-25 08:14:18.000000000 -0400
3 +++ ppp-2.4.4/pppd/demand.c     2009-05-07 16:16:20.000000000 -0400
4 @@ -36,6 +36,8 @@
5  #include <errno.h>
6  #include <fcntl.h>
7  #include <netdb.h>
8 +#include <unistd.h>
9 +#include <syslog.h>
10  #include <sys/param.h>
11  #include <sys/types.h>
12  #include <sys/wait.h>
13 @@ -43,6 +45,8 @@
14  #include <sys/resource.h>
15  #include <sys/stat.h>
16  #include <sys/socket.h>
17 +#include <netinet/in.h>
18 +#include <arpa/inet.h>
19  #ifdef PPP_FILTER
20  #include <pcap-bpf.h>
21  #endif
22 @@ -221,6 +225,14 @@
23      int c, rv;
24  
25      rv = 0;
26 +
27 +/* check for synchronous connection... */
28 +
29 +    if ( (p[0] == 0xFF) && (p[1] == 0x03) ) {
30 +        rv = loop_frame(p,n);
31 +        return rv;
32 +    }
33 +
34      for (; n > 0; --n) {
35         c = *p++;
36         if (c == PPP_FLAG) {
37 @@ -299,17 +311,102 @@
38   * loopback, now that the real serial link is up.
39   */
40  void
41 -demand_rexmit(proto)
42 +demand_rexmit(proto, newip)
43      int proto;
44 +    u_int32_t newip;
45  {
46      struct packet *pkt, *prev, *nextpkt;
47 +    unsigned short checksum;
48 +    unsigned short pkt_checksum = 0;
49 +    unsigned iphdr;
50 +    struct timeval tv;
51 +    char cv = 0;
52 +    char ipstr[16];
53  
54      prev = NULL;
55      pkt = pend_q;
56      pend_q = NULL;
57 +    tv.tv_sec = 1;
58 +    tv.tv_usec = 0;
59 +    select(0,NULL,NULL,NULL,&tv);      /* Sleep for 1 Seconds */
60      for (; pkt != NULL; pkt = nextpkt) {
61         nextpkt = pkt->next;
62         if (PPP_PROTOCOL(pkt->data) == proto) {
63 +            if ( (proto == PPP_IP) && newip ) {
64 +               /* Get old checksum */
65 +
66 +               iphdr = (pkt->data[4] & 15) << 2;
67 +               checksum = *((unsigned short *) (pkt->data+14));
68 +                if (checksum == 0xFFFF) {
69 +                    checksum = 0;
70 +                }
71 +
72
73 +                if (pkt->data[13] == 17) {
74 +                    pkt_checksum =  *((unsigned short *) (pkt->data+10+iphdr));
75 +                   if (pkt_checksum) {
76 +                        cv = 1;
77 +                        if (pkt_checksum == 0xFFFF) {
78 +                            pkt_checksum = 0;
79 +                        }
80 +                    }
81 +                    else {
82 +                       cv = 0;
83 +                    }
84 +                }
85 +
86 +               if (pkt->data[13] == 6) {
87 +                   pkt_checksum = *((unsigned short *) (pkt->data+20+iphdr));
88 +                   cv = 1;
89 +                    if (pkt_checksum == 0xFFFF) {
90 +                        pkt_checksum = 0;
91 +                    }
92 +               }
93 +
94 +               /* Delete old Source-IP-Address */
95 +                checksum -= *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
96 +                checksum -= *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
97 +
98 +               pkt_checksum -= *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
99 +               pkt_checksum -= *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
100 +
101 +               /* Change Source-IP-Address */
102 +                * ((u_int32_t *) (pkt->data + 16)) = newip;
103 +
104 +               /* Add new Source-IP-Address */
105 +                checksum += *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
106 +                checksum += *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
107 +
108 +                pkt_checksum += *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
109 +                pkt_checksum += *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
110 +
111 +               /* Write new checksum */
112 +                if (!checksum) {
113 +                    checksum = 0xFFFF;
114 +                }
115 +                *((unsigned short *) (pkt->data+14)) = checksum;
116 +               if (pkt->data[13] == 6) {
117 +                   *((unsigned short *) (pkt->data+20+iphdr)) = pkt_checksum;
118 +               }
119 +               if (cv && (pkt->data[13] == 17) ) {
120 +                   *((unsigned short *) (pkt->data+10+iphdr)) = pkt_checksum;
121 +               }
122 +
123 +               /* Log Packet */
124 +               strcpy(ipstr,inet_ntoa(*( (struct in_addr *) (pkt->data+16))));
125 +               if (pkt->data[13] == 1) {
126 +                   syslog(LOG_INFO,"Open ICMP %s -> %s\n",
127 +                       ipstr,
128 +                       inet_ntoa(*( (struct in_addr *) (pkt->data+20))));
129 +               } else {
130 +                   syslog(LOG_INFO,"Open %s %s:%d -> %s:%d\n",
131 +                       pkt->data[13] == 6 ? "TCP" : "UDP",
132 +                       ipstr,
133 +                       ntohs(*( (short *) (pkt->data+iphdr+4))),
134 +                       inet_ntoa(*( (struct in_addr *) (pkt->data+20))),
135 +                       ntohs(*( (short *) (pkt->data+iphdr+6))));
136 +                }
137 +            }
138             output(0, pkt->data, pkt->length);
139             free(pkt);
140         } else {
141 diff -Naur ppp-2.4.4.orig/pppd/ipcp.c ppp-2.4.4/pppd/ipcp.c
142 --- ppp-2.4.4.orig/pppd/ipcp.c  2009-05-07 15:49:34.000000000 -0400
143 +++ ppp-2.4.4/pppd/ipcp.c       2009-05-07 16:16:20.000000000 -0400
144 @@ -1776,7 +1776,7 @@
145                     proxy_arp_set[f->unit] = 1;
146  
147         }
148 -       demand_rexmit(PPP_IP);
149 +       demand_rexmit(PPP_IP,go->ouraddr);
150         sifnpmode(f->unit, PPP_IP, NPMODE_PASS);
151  
152      } else {
153 diff -Naur ppp-2.4.4.orig/pppd/ipv6cp.c ppp-2.4.4/pppd/ipv6cp.c
154 --- ppp-2.4.4.orig/pppd/ipv6cp.c        2005-08-25 19:59:34.000000000 -0400
155 +++ ppp-2.4.4/pppd/ipv6cp.c     2009-05-07 16:16:20.000000000 -0400
156 @@ -1232,7 +1232,7 @@
157             }
158  
159         }
160 -       demand_rexmit(PPP_IPV6);
161 +       demand_rexmit(PPP_IPV6,0);
162         sifnpmode(f->unit, PPP_IPV6, NPMODE_PASS);
163  
164      } else {
165 diff -Naur ppp-2.4.4.orig/pppd/pppd.h ppp-2.4.4/pppd/pppd.h
166 --- ppp-2.4.4.orig/pppd/pppd.h  2009-05-07 15:49:34.000000000 -0400
167 +++ ppp-2.4.4/pppd/pppd.h       2009-05-07 16:16:20.000000000 -0400
168 @@ -565,7 +565,7 @@
169  void demand_block __P((void)); /* set all NPs to queue up packets */
170  void demand_unblock __P((void)); /* set all NPs to pass packets */
171  void demand_discard __P((void)); /* set all NPs to discard packets */
172 -void demand_rexmit __P((int)); /* retransmit saved frames for an NP */
173 +void demand_rexmit __P((int, u_int32_t)); /* retransmit saved frames for an NP*/
174  int  loop_chars __P((unsigned char *, int)); /* process chars from loopback */
175  int  loop_frame __P((unsigned char *, int)); /* should we bring link up? */
176