]> git.ipfire.org Git - ipfire-2.x.git/blame - src/patches/ppp-2.4.1-oedod.patch
Pakfire laedt die Listen jetzt besser und hat eine veraenderte Oberflaeche bekommen.
[ipfire-2.x.git] / src / patches / ppp-2.4.1-oedod.patch
CommitLineData
cd1a2927
MT
1--- ppp/pppd/demand.c
2+++ ppp/pppd/demand.c 2000/06/28 14:54:04
3@@ -25,6 +25,8 @@
4 #include <errno.h>
5 #include <fcntl.h>
6 #include <netdb.h>
7+#include <unistd.h>
8+#include <syslog.h>
9 #include <sys/param.h>
10 #include <sys/types.h>
11 #include <sys/wait.h>
12@@ -32,6 +34,8 @@
13 #include <sys/resource.h>
14 #include <sys/stat.h>
15 #include <sys/socket.h>
16+#include <netinet/in.h>
17+#include <arpa/inet.h>
18 #ifdef PPP_FILTER
19 #include <net/if.h>
20 #include <net/bpf.h>
21@@ -210,6 +214,14 @@
22 int c, rv;
23
24 rv = 0;
25+
26+/* check for synchronous connection... */
27+
28+ if ( (p[0] == 0xFF) && (p[1] == 0x03) ) {
29+ rv = loop_frame(p,n);
30+ return rv;
31+ }
32+
33 for (; n > 0; --n) {
34 c = *p++;
35 if (c == PPP_FLAG) {
36@@ -288,17 +300,102 @@
37 * loopback, now that the real serial link is up.
38 */
39 void
40-demand_rexmit(proto)
41+demand_rexmit(proto, newip)
42 int proto;
43+ u_int32_t newip;
44 {
45 struct packet *pkt, *prev, *nextpkt;
46+ unsigned short checksum;
47+ unsigned short pkt_checksum = 0;
48+ unsigned iphdr;
49+ struct timeval tv;
50+ char cv = 0;
51+ char ipstr[16];
52
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--- ppp/pppd/ipcp.c
141+++ ppp/pppd/ipcp.c 2000/06/28 12:32:05
142@@ -1454,7 +1454,7 @@
143 proxy_arp_set[f->unit] = 1;
144
145 }
146- demand_rexmit(PPP_IP);
147+ demand_rexmit(PPP_IP,go->ouraddr);
148 sifnpmode(f->unit, PPP_IP, NPMODE_PASS);
149
150 } else {
151--- ppp/pppd/ipv6cp.c
152+++ ppp/pppd/ipv6cp.c 2000/06/28 12:32:06
153@@ -1153,7 +1153,7 @@
154 }
155
156 }
157- demand_rexmit(PPP_IPV6);
158+ demand_rexmit(PPP_IPV6,0);
159 sifnpmode(f->unit, PPP_IPV6, NPMODE_PASS);
160
161 } else {
162--- ppp/pppd/pppd.h
163+++ ppp/pppd/pppd.h 2000/06/28 12:32:06
164@@ -359,7 +359,7 @@
165 void demand_block __P((void)); /* set all NPs to queue up packets */
166 void demand_unblock __P((void)); /* set all NPs to pass packets */
167 void demand_discard __P((void)); /* set all NPs to discard packets */
168-void demand_rexmit __P((int)); /* retransmit saved frames for an NP */
169+void demand_rexmit __P((int, u_int32_t)); /* retransmit saved frames for an NP*/
170 int loop_chars __P((unsigned char *, int)); /* process chars from loopback */
171 int loop_frame __P((unsigned char *, int)); /* should we bring link up? */
172