109-debian_demand.patch 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. Index: ppp-2.4.3/pppd/demand.c
  2. ===================================================================
  3. --- ppp-2.4.3.orig/pppd/demand.c 2007-06-04 13:22:08.217606016 +0200
  4. +++ ppp-2.4.3/pppd/demand.c 2007-06-04 13:22:11.613089824 +0200
  5. @@ -36,6 +36,8 @@
  6. #include <errno.h>
  7. #include <fcntl.h>
  8. #include <netdb.h>
  9. +#include <unistd.h>
  10. +#include <syslog.h>
  11. #include <sys/param.h>
  12. #include <sys/types.h>
  13. #include <sys/wait.h>
  14. @@ -43,6 +45,8 @@
  15. #include <sys/resource.h>
  16. #include <sys/stat.h>
  17. #include <sys/socket.h>
  18. +#include <netinet/in.h>
  19. +#include <arpa/inet.h>
  20. #ifdef PPP_FILTER
  21. #include <pcap-bpf.h>
  22. #endif
  23. @@ -221,6 +225,14 @@
  24. int c, rv;
  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. prev = NULL;
  54. pkt = pend_q;
  55. pend_q = NULL;
  56. + tv.tv_sec = 1;
  57. + tv.tv_usec = 0;
  58. + select(0,NULL,NULL,NULL,&tv); /* Sleep for 1 Seconds */
  59. for (; pkt != NULL; pkt = nextpkt) {
  60. nextpkt = pkt->next;
  61. if (PPP_PROTOCOL(pkt->data) == proto) {
  62. + if ( (proto == PPP_IP) && newip ) {
  63. + /* Get old checksum */
  64. +
  65. + iphdr = (pkt->data[4] & 15) << 2;
  66. + checksum = *((unsigned short *) (pkt->data+14));
  67. + if (checksum == 0xFFFF) {
  68. + checksum = 0;
  69. + }
  70. +
  71. +
  72. + if (pkt->data[13] == 17) {
  73. + pkt_checksum = *((unsigned short *) (pkt->data+10+iphdr));
  74. + if (pkt_checksum) {
  75. + cv = 1;
  76. + if (pkt_checksum == 0xFFFF) {
  77. + pkt_checksum = 0;
  78. + }
  79. + }
  80. + else {
  81. + cv = 0;
  82. + }
  83. + }
  84. +
  85. + if (pkt->data[13] == 6) {
  86. + pkt_checksum = *((unsigned short *) (pkt->data+20+iphdr));
  87. + cv = 1;
  88. + if (pkt_checksum == 0xFFFF) {
  89. + pkt_checksum = 0;
  90. + }
  91. + }
  92. +
  93. + /* Delete old Source-IP-Address */
  94. + checksum -= *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
  95. + checksum -= *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
  96. +
  97. + pkt_checksum -= *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
  98. + pkt_checksum -= *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
  99. +
  100. + /* Change Source-IP-Address */
  101. + * ((u_int32_t *) (pkt->data + 16)) = newip;
  102. +
  103. + /* Add new Source-IP-Address */
  104. + checksum += *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
  105. + checksum += *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
  106. +
  107. + pkt_checksum += *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
  108. + pkt_checksum += *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
  109. +
  110. + /* Write new checksum */
  111. + if (!checksum) {
  112. + checksum = 0xFFFF;
  113. + }
  114. + *((unsigned short *) (pkt->data+14)) = checksum;
  115. + if (pkt->data[13] == 6) {
  116. + *((unsigned short *) (pkt->data+20+iphdr)) = pkt_checksum;
  117. + }
  118. + if (cv && (pkt->data[13] == 17) ) {
  119. + *((unsigned short *) (pkt->data+10+iphdr)) = pkt_checksum;
  120. + }
  121. +
  122. + /* Log Packet */
  123. + strcpy(ipstr,inet_ntoa(*( (struct in_addr *) (pkt->data+16))));
  124. + if (pkt->data[13] == 1) {
  125. + syslog(LOG_INFO,"Open ICMP %s -> %s\n",
  126. + ipstr,
  127. + inet_ntoa(*( (struct in_addr *) (pkt->data+20))));
  128. + } else {
  129. + syslog(LOG_INFO,"Open %s %s:%d -> %s:%d\n",
  130. + pkt->data[13] == 6 ? "TCP" : "UDP",
  131. + ipstr,
  132. + ntohs(*( (short *) (pkt->data+iphdr+4))),
  133. + inet_ntoa(*( (struct in_addr *) (pkt->data+20))),
  134. + ntohs(*( (short *) (pkt->data+iphdr+6))));
  135. + }
  136. + }
  137. output(0, pkt->data, pkt->length);
  138. free(pkt);
  139. } else {
  140. Index: ppp-2.4.3/pppd/ipcp.c
  141. ===================================================================
  142. --- ppp-2.4.3.orig/pppd/ipcp.c 2007-06-04 13:22:11.387124176 +0200
  143. +++ ppp-2.4.3/pppd/ipcp.c 2007-06-04 13:22:11.614089672 +0200
  144. @@ -1796,7 +1796,7 @@
  145. proxy_arp_set[f->unit] = 1;
  146. }
  147. - demand_rexmit(PPP_IP);
  148. + demand_rexmit(PPP_IP,go->ouraddr);
  149. sifnpmode(f->unit, PPP_IP, NPMODE_PASS);
  150. } else {
  151. Index: ppp-2.4.3/pppd/ipv6cp.c
  152. ===================================================================
  153. --- ppp-2.4.3.orig/pppd/ipv6cp.c 2007-06-04 13:22:08.229604192 +0200
  154. +++ ppp-2.4.3/pppd/ipv6cp.c 2007-06-04 13:22:11.614089672 +0200
  155. @@ -1232,7 +1232,7 @@
  156. }
  157. }
  158. - demand_rexmit(PPP_IPV6);
  159. + demand_rexmit(PPP_IPV6,0);
  160. sifnpmode(f->unit, PPP_IPV6, NPMODE_PASS);
  161. } else {
  162. Index: ppp-2.4.3/pppd/pppd.h
  163. ===================================================================
  164. --- ppp-2.4.3.orig/pppd/pppd.h 2007-06-04 13:22:11.388124024 +0200
  165. +++ ppp-2.4.3/pppd/pppd.h 2007-06-04 13:22:11.615089520 +0200
  166. @@ -563,7 +563,7 @@
  167. void demand_block __P((void)); /* set all NPs to queue up packets */
  168. void demand_unblock __P((void)); /* set all NPs to pass packets */
  169. void demand_discard __P((void)); /* set all NPs to discard packets */
  170. -void demand_rexmit __P((int)); /* retransmit saved frames for an NP */
  171. +void demand_rexmit __P((int, u_int32_t)); /* retransmit saved frames for an NP*/
  172. int loop_chars __P((unsigned char *, int)); /* process chars from loopback */
  173. int loop_frame __P((unsigned char *, int)); /* should we bring link up? */